A sales VP asks for the executive scorecard to live inside Dynamics so the team does not have to switch tabs. You build it in an afternoon, demo it Friday, and on Monday three reps complain that the dashboard takes 12 seconds to load. The embedding works; the performance and licensing reality is what most teams underestimate.
Embedding Options
Power BI reports and dashboards embed in model-driven app dashboards and form components. User clicks, sees the visual in context. The embed is an iframe that authenticates the user against Power BI through their Entra ID token. The iframe negotiates the token on each load; cached embeds are not a thing.
There are three placement options: full dashboard, dashboard tile inside a Dynamics dashboard, and report visual inside a form section. The form section pattern is the fastest because it loads only one visual, not the whole report.
Licensing
Users viewing embedded Power BI need Power BI licenses (Pro or Premium Per User). Free D365 viewers cannot see embedded Power BI without that license. The license check happens at iframe load; the user sees a polite error rather than a broken visual when they lack the license.
License options for the viewer:
- Power BI Pro per user
- Power BI Premium Per User (PPU)
- Premium capacity that covers the report workspace
The capacity option is the cheapest at scale because viewers do not need individual licenses, but it requires a Premium SKU on the workspace and capacity capacity planning.
Performance
Embedded reports hit Power BI’s service. Dataset size and query complexity affect load time. Pre-aggregate where you can; avoid heavy calculations at render. The most common performance fix is to move DAX measures into the underlying dataset as pre-aggregated columns.
Slow: DAX SUMX over 2M-row fact table at render
Fast: pre-aggregated daily summary table, simple SUM at render
Profile the report with Performance Analyzer in Power BI Desktop before embedding. A report that takes 3 seconds standalone will take 5 seconds embedded; one that takes 8 seconds standalone is unusable embedded.
Row-Level Security
Power BI RLS integrates with Dataverse security via Azure AD user context. Configure RLS up front; retrofitting is painful. The DAX role definition references the username and filters the model accordingly.
[Account Owner] = USERPRINCIPALNAME()
The Dataverse Account.ownerid maps through the systemuser to the UPN. Validate with at least three test users across different territories before going live.
Cost Management
Power BI Premium capacity affects embedded performance. Monitor capacity usage. Oversubscribed capacity equals slow dashboards. Use the Capacity Metrics app to track CPU, memory, and dataset refresh load. The standard pattern is to keep Capacity utilization below 70 percent at peak; above that, rendering latency starts to spike.
Capacity Metrics signals to watch:
- CPU utilization above 70% sustained
- Refresh queue length above 5
- Throttled requests in the last hour
If you cross the thresholds repeatedly, either resize the capacity or move the heaviest workspace to its own capacity.
Refresh Schedule and Freshness
Embedded dashboards show data as fresh as the last dataset refresh. For a sales scorecard, hourly refresh is usually enough. For an operations dashboard, real-time queries through DirectQuery or live connection are worth the complexity. DirectQuery shifts the load to the source, which for Dataverse means the storage capacity, not the Power BI capacity.
Mobile Behavior
Power BI embeds render in the Dynamics mobile app, but the responsive layout has to be set up in the report. Without phone layout configured, the visuals shrink to the point of being unreadable on a phone screen. Build phone layouts for any report that field reps will open on mobile.
What to do this week
Audit your embedded reports for load time, identify the slow ones, and either pre-aggregate the dataset or move the visual to a form section. Verify the license model matches your viewer count and confirm RLS works for users in three different territories.