Quick Answer
Power BI Embedded lets SaaS builders embed dashboards and reports into their product without requiring Microsoft accounts for end users. The reference architecture is: one Fabric F SKU capacity, service principal authentication, dataset-per-tenant with dynamic RLS for most use cases, and cached embed tokens to reduce Entra round-trips. A well-designed embedded deployment handles 10,000+ end users on a single F64 capacity.
1. Licensing and Capacity Options
Three capacity SKUs support embedding: Fabric F SKUs, legacy A SKUs (Azure Power BI Embedded), and Premium P SKUs. In 2026 the guidance is straightforward: use F SKUs for new deployments.
| SKU | Pause/Resume | Reserved Instance | Fabric Features | Best For |
|---|---|---|---|---|
| F SKU | Yes | Yes (36-60%) | Full | New SaaS deployments |
| A SKU | Yes | No | No | Legacy embedding only |
| P SKU | No | No | No | Existing Premium customers |
For more on P-to-F migration, see the Fabric vs Premium migration guide.
2. Reference Architecture
The standard SaaS embedding architecture has six components:
- SaaS front-end: React, Angular, or plain JavaScript using the Power BI JavaScript SDK.
- Token-issuance service: server-side endpoint that authenticates as a service principal and returns an embed token.
- Service principal: Microsoft Entra application with a client secret or certificate, granted Power BI Service Admin tenant role and Contributor on the target workspace.
- Workspace: container for datasets, reports, and dashboards. For most deployments, one or a few workspaces are sufficient.
- Dataset with dynamic RLS: semantic model with a UserSecurity bridge table filtered by a tenant_id claim passed through the embed token.
- Fabric F SKU capacity: Azure-provisioned capacity backing all customer-facing content.
3. Authentication Pattern: Service Principal + Embed Tokens
// Node.js token issuance example
import { ConfidentialClientApplication } from '@azure/msal-node';
import axios from 'axios';
const msal = new ConfidentialClientApplication({
auth: {
clientId: process.env.PBI_CLIENT_ID!,
clientSecret: process.env.PBI_CLIENT_SECRET!,
authority: `https://login.microsoftonline.com/${process.env.PBI_TENANT_ID}`,
},
});
export async function generateEmbedToken(
reportId: string,
datasetId: string,
tenantId: string
) {
const accessToken = await msal.acquireTokenByClientCredential({
scopes: ['https://analysis.windows.net/powerbi/api/.default'],
});
const response = await axios.post(
`https://api.powerbi.com/v1.0/myorg/groups/${WORKSPACE_ID}/reports/${reportId}/GenerateToken`,
{
accessLevel: 'View',
identities: [
{
username: `tenant-${tenantId}`,
roles: ['TenantRole'],
datasets: [datasetId],
},
],
},
{ headers: { Authorization: `Bearer ${accessToken!.accessToken}` } }
);
return response.data.token;
}The identities array passes the effective identity for RLS enforcement. The username field feeds USERPRINCIPALNAME() in the RLS DAX expression and serves as the tenant key. Cache embed tokens for 55 minutes (tokens expire after 60 minutes) to minimize Entra round-trips.
4. Multi-Tenant Isolation
Option A: Dataset-per-tenant with dynamic RLS (recommended for most SaaS)
One shared dataset contains all tenants’ data. A UserSecurity table maps tenant IDs to row filters. The dynamic RLS expression filters every table by tenant ID based on the identity passed in the embed token. Scales to tens of thousands of tenants on a single dataset.
Option B: Workspace-per-tenant
Each customer gets their own workspace with their own dataset. Strongest possible isolation. Use for enterprise customers that require physical separation for compliance reasons. Does not scale beyond a few hundred workspaces due to operational complexity.
Option C: Hybrid
Default customers share a dataset with dynamic RLS. Enterprise tier customers get dedicated workspaces. The provisioning pipeline determines at signup time which pattern a customer uses based on their subscription plan.
5. Cost Model and Capacity Sizing
Capacity sizing depends on three variables: concurrent user load, query complexity, and refresh frequency. A useful starting point:
- F4 or F8: up to 100 concurrent users with simple report queries. ~$400 to $800 per month PAYG.
- F16: up to 500 concurrent users. ~$1,300 per month PAYG.
- F32: up to 2,000 concurrent users. ~$2,630 per month PAYG.
- F64: up to 10,000 concurrent users. ~$5,258 per month PAYG.
These numbers assume typical dashboard traffic (one or two visual interactions per user per minute during active sessions). Heavy analytic workloads can reduce user capacity by 30 to 50 percent. Monitor the Fabric Capacity Metrics app and scale up when sustained utilization exceeds 70 percent during peak hours.
6. Performance Best Practices
- Cache embed tokens server-side for 55 minutes. Do not request a new token on every page navigation.
- Use Direct Lake mode for large fact tables. It delivers Import-mode performance without refresh schedules.
- Pre-warm capacity before predictable traffic peaks (Monday morning, billing cycles) with synthetic queries.
- Separate development workspaces from customer-facing workspaces. Development refreshes should not contend with end-user queries.
- Enable auto-scale with a hard ceiling. Budget guardrails prevent runaway costs during anomalous traffic.
- Design visuals with paginated data (top 10 customers, last 30 days) rather than unbounded tables. Pagination dramatically reduces CU consumption.
Frequently Asked Questions
What is Power BI Embedded for SaaS?
Power BI Embedded for SaaS is the Embed for Your Customers scenario where a software vendor embeds Power BI content into their application so that end users (the vendor's customers) see dashboards and reports inside the SaaS product without needing Microsoft accounts or Power BI licenses. The vendor owns a Fabric capacity or A SKU capacity, develops reports in their tenant, and uses service principal authentication to generate embed tokens that render reports in the SaaS UI.
What capacity do I need for embedding?
Two options. Fabric F SKUs (F2 and above) support embedding with pay-as-you-go billing and Azure Reserved Instance discounts. Legacy A SKUs (A1 through A6) are the purpose-built embedding-only capacities, sold through Azure with pause/resume support and no user licenses required on the capacity. As of 2026, Fabric F SKUs are the recommended choice because they unlock the full Fabric feature set and are the path forward. A SKUs remain available for existing customers but will eventually be deprecated.
How does authentication work in embedded scenarios?
The most common pattern is App Owns Data: your application authenticates to Power BI as a service principal, generates an embed token scoped to a specific report, and passes the token to the browser. Users of your application never authenticate to Power BI. Row-level security is enforced by passing an effective identity with the embed token. For B2B scenarios where your customers already have Microsoft accounts, the User Owns Data pattern is also supported but is rarely used for SaaS.
How do I isolate tenants in a multi-tenant SaaS?
The two architectures are workspace-per-tenant and dataset-per-tenant with RLS. Workspace-per-tenant gives the strongest isolation (each customer gets their own workspace with their own dataset) but does not scale beyond a few hundred tenants because workspace count becomes unmanageable. Dataset-per-tenant with dynamic RLS scales to tens of thousands of tenants but requires careful RLS design to prevent data leakage. For most SaaS products, start with a single dataset, dynamic RLS keyed on tenant ID, and scale to workspace-per-tenant only for enterprise customers that require it contractually.
What does Power BI Embedded cost?
Capacity cost is the primary line item. F2 starts at about $263 per month pay-as-you-go ($0.36/hour). F64 costs about $5,258 per month and matches P1/A4 compute. You also need Power BI Pro licenses for content developers ($10/user/month). End users of your SaaS do not need licenses. For most SaaS products, plan for $500 to $5,000 per month in Power BI capacity plus $50 to $500 per month in Pro licenses for your development team. Reserved Instances cut that by 40 to 60 percent once utilization stabilizes.
Can I paginate Power BI Embedded capacity as my SaaS grows?
Yes. The scaling pattern is horizontal: start with a small F SKU (F4 or F8), monitor utilization in the Fabric Capacity Metrics app, and scale up or out as user load increases. F SKUs can be resized through the Azure portal in under a minute with zero downtime. For very large SaaS, split customers across multiple capacities grouped by tier (free, pro, enterprise) so that throttling in one tier does not affect others.
Does embedding require custom development?
Yes, but less than most teams expect. The Power BI JavaScript SDK handles the browser-side embedding, and Microsoft provides sample code in React, Angular, and plain JavaScript. The custom work is on the server side: a token-issuance endpoint that authenticates as the service principal and generates scoped embed tokens. A typical initial implementation is 1 to 2 weeks for a single-tenant proof of concept, 4 to 6 weeks for a production multi-tenant deployment with RLS, provisioning workflows, and monitoring.
What are common embedded performance pitfalls?
Four common issues. First, issuing a new embed token on every page load instead of caching tokens, which causes unnecessary Azure Entra round-trips. Second, not pre-warming capacity before user peaks, leading to cold-start latency on the first morning queries. Third, failing to separate content development from customer-facing capacity, causing dev refreshes to throttle production queries. Fourth, enabling auto-scale without budget guardrails, resulting in surprise bills during traffic spikes.
Building an Embedded Analytics SaaS?
Our consultants architect multi-tenant Power BI Embedded deployments with RLS, token caching, and capacity sizing. Contact us for a design review.