Row-level security you can see
One page. Three views. Every agent sees only their own rows.
Switch roles below. Nothing else on the page changes — the same semantic model, the same visuals — but the rows that come back are governed by a security table, not by a copy of the report. This is how each agent securely accesses only their individual performance metrics.
Client program
Period
12-week trend
What this board answers
Program × channel breakdown
Contacts handled, by client program and channel
Team table
How the tenancy works — one model, RLS lanes, six refreshes a day
SQL environment + two client APIs → one semantic model → each role sees only its lane. Highlighted lane follows the role switcher above.
Licensing-savvy design
- One semantic model, not 225 reports. A security table (agent → UPN → team → program) drives RLS, so a new hire is a row insert, not a new report.
- Import mode with incremental refresh. Only the last 48 hours are re-queried from SQL and the client APIs each cycle; history stays cached.
- 6 scheduled refreshes/day fits a Pro workspace. Pro allows up to 8 per day; Fabric capacity is only needed for sub-hour cadence or very large models — neither is in this brief.
- Agents need read-only access. Row filtering happens in the model, so the same shared link works for every role.
- Path to Fabric later, if needed: the model, RLS and reports move unchanged onto capacity when scale or cadence demands it.













