See all articles

Is Metabase embedding free?

Yes, Metabase embedding is free with guest embeds, which work on every edition, including the free open-source edition. Your server signs a JWT for a dashboard or chart, and locked parameters in that JWT show each customer only their own rows. Guest embed viewers don’t need a Metabase account, so they don’t count as users, and no plan charges for them.

Modular Embedding, the React SDK, full-app embedding, requires the user to log in with SSO for multi-tenant analytics with row and column security, and white-labeling are part of the Pro and Enterprise plans. Pro costs $575 a month with 10 users included, and each person who signs in through an SSO embed counts as a user.

Metabase embedding pricing: what does each plan include?

The open-source edition is free, and you host it yourself. It includes unlimited users, guest embeds of dashboards and questions through web components, editable and locked parameters, public links, and a light or dark theme for embeds. Guest embeds on this edition show a “Powered by Metabase” banner.

Starter is Metabase Cloud for $100 a month. The price includes 5 users, each extra user costs $6 a month, and yearly billing lowers the price to $90 a month. Metabase hosts, upgrades, and backs up the instance for you. For embedding, Starter includes the same guest embeds as the open-source edition, with the same light or dark theme and the same banner.

Pro costs $575 a month, on Metabase Cloud or on your own servers. The price includes 10 users, each extra user costs $12 a month, and yearly billing lowers the price to $517.50 a month. Pro adds SSO embeds with JWT or SAML, the React SDK, and full-app embedding. In SSO embeds, your customers can drill through charts, build questions in the query builder, ask questions in AI chat, and browse collections. Pro also adds tenants, row and column security, impersonation, and native support for one database per tenant. It adds white-labeling, custom colors and fonts, guest embeds without the banner, and the option to turn off downloads.

Enterprise starts at $20,000 a year and has the same features as Pro. It adds a dedicated success engineer, a 1-day support SLA, help with procurement, and custom pricing. For embedding, that custom pricing can be per tenant or a flat fee instead of per seat. Air-gapped and single-tenant hosting are available on Enterprise for an extra fee.

Prices are in US dollars, exclude taxes, and were checked on October 7, 2026. This table repeats the plan facts above.

What you get for embeddingPlans that include it
Guest embeds with locked parameters, no viewer accountsOpen Source, Starter, Pro, Enterprise
Guest embeds without the “Powered by Metabase” bannerPro, Enterprise
Light or dark theme for embedsOpen Source, Starter, Pro, Enterprise
Custom colors, fonts, and saved themesPro, Enterprise
SSO embeds (JWT or SAML) with web componentsPro, Enterprise
React SDK (@metabase/embedding-sdk-react)Pro, Enterprise
Full-app embeddingPro, Enterprise
Query builder, drill-through, and AI chat in embedsPro, Enterprise
Tenants, row and column security, impersonationPro, Enterprise
White-label with your logo, colors, name, and domainPro, Enterprise
Users included in the priceOpen Source: unlimited. Starter: 5. Pro: 10. Enterprise: custom.
PriceOpen Source: free. Starter: $100 a month. Pro: $575 a month. Enterprise: from $20,000 a year.

Are guest embeds with locked parameters free on open source?

Guest embeds are free on the open-source edition, and on every paid plan too. Guest embeds load a dashboard or question for anonymous viewers, meaning people who have no Metabase account. They replace static embedding, the older way to embed with a signed JWT, and use the same kind of token. Metabase loads the embed only when the request carries a JWT signed with the secret key that your app and your Metabase share. The JWT names the item to load and the values of its parameters, and the charts always show live data from your database.

A locked parameter is hidden from the viewer, and your server sets its value inside the signed JWT. A viewer can’t change that value, because the JWT signature would no longer match. This is how each customer sees only their own rows on the free edition: your app takes the customer ID from its own session, not from the browser. For sensitive data, the docs recommend a method that enforces access in permissions or in the database, such as row and column security in SSO embeds. Both are part of the Pro and Enterprise plans.

To set up a guest embed:

  1. In Metabase, go to Admin > Embedding (on paid plans, open the Guest embeds tab) and turn on Enable guest embeds.
  2. Open the dashboard, click the Share icon, select Embed, and choose Guest under Authentication.
  3. Under Parameters, set your customer filter to Locked, then click Publish.
  4. Copy the server code that the wizard generates, and sign a fresh JWT on your server for each page load.

This Node.js server follows the guest embedding docs. It signs a JWT with a locked customer_id parameter and renders the embed. The key in params must match the filter you locked, and the wizard’s server code shows the exact key.

// server.js (npm install express jsonwebtoken)
// Follows https://www.metabase.com/docs/latest/embedding/guest-embedding
const express = require("express");
const jwt = require("jsonwebtoken");

const METABASE_URL = process.env.METABASE_URL; // for example http://localhost:3000
const METABASE_SECRET_KEY = process.env.METABASE_SECRET_KEY; // your embedding secret key
const DASHBOARD_ID = 10; // the number in the dashboard's URL

// Replace this with your app's own session lookup.
function currentCustomerId(req) {
  return "42";
}

const app = express();

app.get("/analytics", (req, res) => {
  const token = jwt.sign(
    {
      resource: { dashboard: DASHBOARD_ID },
      params: { customer_id: [currentCustomerId(req)] }, // locked parameter
      exp: Math.round(Date.now() / 1000) + 10 * 60, // 10 minute expiration
    },
    METABASE_SECRET_KEY
  );

  res.send(`<!doctype html>
<html>
  <body>
    <script defer src="${METABASE_URL}/app/embed.js"></script>
    <script>
      window.metabaseConfig = { isGuest: true, instanceUrl: "${METABASE_URL}" };
    </script>
    <metabase-dashboard token="${token}" with-title="true"></metabase-dashboard>
  </body>
</html>`);
});

app.listen(4000);

The same JWT works from any backend that signs HS256 tokens. In Python, with PyJWT:

# pip install pyjwt
import os
import time

import jwt

token = jwt.encode(
    {
        "resource": {"dashboard": 10},
        "params": {"customer_id": ["42"]},  # locked parameter
        "exp": round(time.time()) + 10 * 60,  # 10 minute expiration
    },
    os.environ["METABASE_SECRET_KEY"],
    algorithm="HS256",
)

Guest embeds show the dashboards you build, with the filters you choose to make editable. When your customers should drill through charts, build their own questions, or chat with AI, use SSO embeds on Pro or Enterprise.

What does Pro add: SSO embeds, the React SDK, tenants, and row and column security?

With SSO embeds, each viewer has their own Metabase account, and they sign in through your app with JWT or SAML. Metabase creates the account the first time someone signs in with JWT, so you don’t add people by hand. Because Metabase knows who is viewing, it applies your data permissions, and each person only sees the data they’re allowed to see. The docs put it this way: “Authentication is a setting on what you embed, not a different kind of embedding.” This means the web components you use for guest embeds also work with SSO.

The React SDK gives you React components for charts, dashboards, the query builder, AI chat, and a collection browser, and you can build custom layouts and change behavior with plugins. It needs React 19 and Node.js 20 or higher.

Tenants group each customer’s users, so you share one set of dashboards with every customer, and each tenant only sees its own data. Once you turn on tenants, your JWT SSO backend puts the tenant in the token, so your app stays the place that decides who belongs to which customer. This Next.js route handler is the JWT endpoint that you enter as the JWT Identity Provider URI under Admin > Settings > Authentication > JWT:

// app/api/metabase/sso/route.ts (Pro and Enterprise)
// Follows https://www.metabase.com/docs/latest/embedding/authentication
// and https://www.metabase.com/docs/latest/embedding/tenants
import jwt from "jsonwebtoken";

const METABASE_JWT_SHARED_SECRET = process.env.METABASE_JWT_SHARED_SECRET || "";

// Replace this with your app's own session lookup.
async function currentUser() {
  return { email: "rene@example.com", firstName: "Rene", lastName: "Descartes", customerSlug: "acme" };
}

export async function GET() {
  const user = await currentUser();
  const token = jwt.sign(
    {
      email: user.email,
      first_name: user.firstName,
      last_name: user.lastName,
      "@tenant": user.customerSlug, // the tenant's slug in Metabase
      exp: Math.round(Date.now() / 1000) + 10 * 60, // 10 minute expiration
    },
    METABASE_JWT_SHARED_SECRET
  );
  return Response.json({ jwt: token });
}

Row and column security then filters each table by a user attribute, such as the tenant slug, and it can hide or edit columns for each group. When each customer has their own database, Pro can route queries to the right database, and impersonation can apply the roles you defined in your database. Pro and Enterprise also let you match your product’s look, with your brand colors, fonts, saved themes, and full white-labeling with your logo, name, and domain.

Does Metabase charge per embed viewer?

Guest embed viewers never count as users, on any plan, so showing a guest embed to more customers doesn’t change your bill. The compare plans page says it this way: “Modular embedding with Guest auth doesn’t require viewers to sign in, which means they won’t count as additional users for billing purposes.”

SSO embeds, whether you build them with web components or the React SDK, and full-app embedding work differently, because each viewer signs in to Metabase. Each of those viewers counts as a user on your plan, the same way as your own team. On Pro, the first 10 users are included, and each extra user costs $12 a month, or $130 a year with yearly billing. You can add or deactivate users at any time, and Metabase prorates the bill.

If you plan to give many customers self-service access through SSO, Enterprise offers custom embedding pricing, such as a price per tenant or a flat fee.

Can you try Pro embedding for free?

Yes, Pro starts with a 14-day free trial, on Metabase Cloud or on your own servers. The Metabase Store describes the trial this way: “Trials are free, with no obligation to buy. Cancel any time.” To try Pro on your own servers, run the metabase/metabase-enterprise Docker image and activate the license token from your trial. Starter and Pro are paid by credit card through the Metabase Store, and Pro also offers a 10% discount on annual billing. If you sign up with a card, Metabase charges it only when the trial ends.

Which plan do you need for multi-tenant embedded analytics?

  • Use the open-source edition, or Starter if you want Metabase to host it, when customers view dashboards you build, filtered to their own rows with a locked parameter.
  • Choose Pro when your customers should explore data and build their own reports, or when you need SSO embeds, tenants, row and column security, and your own branding.
  • Choose Enterprise when you embed for many customers and want pricing per tenant or a flat fee, or when you need air-gapped or single-tenant hosting.

You can start with guest embeds and add SSO later, because authentication is a setting on each embed.

Next steps

# Is Metabase embedding free?

Yes, Metabase embedding is free with guest embeds, which work on every edition, including the free open-source edition. Your server signs a JWT for a dashboard or chart, and locked parameters in that JWT show each customer only their own rows. Guest embed viewers don't need a Metabase account, so they don't count as users, and no plan charges for them.

Modular Embedding, the React SDK, full-app embedding, requires the user to log in with SSO for multi-tenant analytics with row and column security, and white-labeling are part of the Pro and Enterprise plans. Pro costs $575 a month with 10 users included, and each person who signs in through an SSO embed counts as a user.

## Metabase embedding pricing: what does each plan include?

**The open-source edition is free, and you host it yourself.** It includes unlimited users, guest embeds of dashboards and questions through web components, editable and locked parameters, public links, and a light or dark theme for embeds. Guest embeds on this edition show a "Powered by Metabase" banner.

**Starter is Metabase Cloud for $100 a month.** The price includes 5 users, each extra user costs $6 a month, and yearly billing lowers the price to $90 a month. Metabase hosts, upgrades, and backs up the instance for you. For embedding, Starter includes the same guest embeds as the open-source edition, with the same light or dark theme and the same banner.

**Pro costs $575 a month, on Metabase Cloud or on your own servers.** The price includes 10 users, each extra user costs $12 a month, and yearly billing lowers the price to $517.50 a month. Pro adds SSO embeds with JWT or SAML, the React SDK, and full-app embedding. In SSO embeds, your customers can drill through charts, build questions in the query builder, ask questions in AI chat, and browse collections. Pro also adds tenants, row and column security, impersonation, and native support for one database per tenant. It adds white-labeling, custom colors and fonts, guest embeds without the banner, and the option to turn off downloads.

**Enterprise starts at $20,000 a year and has the same features as Pro.** It adds a dedicated success engineer, a 1-day support SLA, help with procurement, and custom pricing. For embedding, that custom pricing can be per tenant or a flat fee instead of per seat. Air-gapped and single-tenant hosting are available on Enterprise for an extra fee.

Prices are in US dollars, exclude taxes, and were checked on October 7, 2026. This table repeats the plan facts above.

| What you get for embedding | Plans that include it |
|---|---|
| Guest embeds with locked parameters, no viewer accounts | Open Source, Starter, Pro, Enterprise |
| Guest embeds without the "Powered by Metabase" banner | Pro, Enterprise |
| Light or dark theme for embeds | Open Source, Starter, Pro, Enterprise |
| Custom colors, fonts, and saved themes | Pro, Enterprise |
| SSO embeds (JWT or SAML) with web components | Pro, Enterprise |
| React SDK (`@metabase/embedding-sdk-react`) | Pro, Enterprise |
| Full-app embedding | Pro, Enterprise |
| Query builder, drill-through, and AI chat in embeds | Pro, Enterprise |
| Tenants, row and column security, impersonation | Pro, Enterprise |
| White-label with your logo, colors, name, and domain | Pro, Enterprise |
| Users included in the price | Open Source: unlimited. Starter: 5. Pro: 10. Enterprise: custom. |
| Price | Open Source: free. Starter: $100 a month. Pro: $575 a month. Enterprise: from $20,000 a year. |

## Are guest embeds with locked parameters free on open source?

Guest embeds are free on the open-source edition, and on every paid plan too. Guest embeds load a dashboard or question for anonymous viewers, meaning people who have no Metabase account. They replace static embedding, the older way to embed with a signed JWT, and use the same kind of token. Metabase loads the embed only when the request carries a JWT signed with the secret key that your app and your Metabase share. The JWT names the item to load and the values of its parameters, and the charts always show live data from your database.

A locked parameter is hidden from the viewer, and your server sets its value inside the signed JWT. A viewer can't change that value, because the JWT signature would no longer match. This is how each customer sees only their own rows on the free edition: your app takes the customer ID from its own session, not from the browser. For sensitive data, the docs recommend a method that enforces access in permissions or in the database, such as row and column security in SSO embeds. Both are part of the Pro and Enterprise plans.

To set up a guest embed:

1. In Metabase, go to **Admin > Embedding** (on paid plans, open the **Guest embeds** tab) and turn on **Enable guest embeds**.
2. Open the dashboard, click the **Share** icon, select **Embed**, and choose **Guest** under **Authentication**.
3. Under **Parameters**, set your customer filter to **Locked**, then click **Publish**.
4. Copy the server code that the wizard generates, and sign a fresh JWT on your server for each page load.

This Node.js server follows the [guest embedding docs](/docs/latest/embedding/guest-embedding). It signs a JWT with a locked `customer_id` parameter and renders the embed. The key in `params` must match the filter you locked, and the wizard's server code shows the exact key.

```javascript
// server.js (npm install express jsonwebtoken)
// Follows https://www.metabase.com/docs/latest/embedding/guest-embedding
const express = require("express");
const jwt = require("jsonwebtoken");

const METABASE_URL = process.env.METABASE_URL; // for example http://localhost:3000
const METABASE_SECRET_KEY = process.env.METABASE_SECRET_KEY; // your embedding secret key
const DASHBOARD_ID = 10; // the number in the dashboard's URL

// Replace this with your app's own session lookup.
function currentCustomerId(req) {
  return "42";
}

const app = express();

app.get("/analytics", (req, res) => {
  const token = jwt.sign(
    {
      resource: { dashboard: DASHBOARD_ID },
      params: { customer_id: [currentCustomerId(req)] }, // locked parameter
      exp: Math.round(Date.now() / 1000) + 10 * 60, // 10 minute expiration
    },
    METABASE_SECRET_KEY
  );

  res.send(`<!doctype html>
<html>
  <body>
    <script defer src="${METABASE_URL}/app/embed.js"></script>
    <script>
      window.metabaseConfig = { isGuest: true, instanceUrl: "${METABASE_URL}" };
    </script>
    <metabase-dashboard token="${token}" with-title="true"></metabase-dashboard>
  </body>
</html>`);
});

app.listen(4000);
```

The same JWT works from any backend that signs HS256 tokens. In Python, with PyJWT:

```python
# pip install pyjwt
import os
import time

import jwt

token = jwt.encode(
    {
        "resource": {"dashboard": 10},
        "params": {"customer_id": ["42"]},  # locked parameter
        "exp": round(time.time()) + 10 * 60,  # 10 minute expiration
    },
    os.environ["METABASE_SECRET_KEY"],
    algorithm="HS256",
)
```

Guest embeds show the dashboards you build, with the filters you choose to make editable. When your customers should drill through charts, build their own questions, or chat with AI, use SSO embeds on Pro or Enterprise.

## What does Pro add: SSO embeds, the React SDK, tenants, and row and column security?

With SSO embeds, each viewer has their own Metabase account, and they sign in through your app with JWT or SAML. Metabase creates the account the first time someone signs in with JWT, so you don't add people by hand. Because Metabase knows who is viewing, it applies your data permissions, and each person only sees the data they're allowed to see. The docs put it this way: "Authentication is a setting on what you embed, not a different kind of embedding." This means the web components you use for guest embeds also work with SSO.

The React SDK gives you React components for charts, dashboards, the query builder, AI chat, and a collection browser, and you can build custom layouts and change behavior with plugins. It needs React 19 and Node.js 20 or higher.

Tenants group each customer's users, so you share one set of dashboards with every customer, and each tenant only sees its own data. Once you turn on tenants, your JWT SSO backend puts the tenant in the token, so your app stays the place that decides who belongs to which customer. This Next.js route handler is the JWT endpoint that you enter as the JWT Identity Provider URI under **Admin > Settings > Authentication > JWT**:

```typescript
// app/api/metabase/sso/route.ts (Pro and Enterprise)
// Follows https://www.metabase.com/docs/latest/embedding/authentication
// and https://www.metabase.com/docs/latest/embedding/tenants
import jwt from "jsonwebtoken";

const METABASE_JWT_SHARED_SECRET = process.env.METABASE_JWT_SHARED_SECRET || "";

// Replace this with your app's own session lookup.
async function currentUser() {
  return { email: "rene@example.com", firstName: "Rene", lastName: "Descartes", customerSlug: "acme" };
}

export async function GET() {
  const user = await currentUser();
  const token = jwt.sign(
    {
      email: user.email,
      first_name: user.firstName,
      last_name: user.lastName,
      "@tenant": user.customerSlug, // the tenant's slug in Metabase
      exp: Math.round(Date.now() / 1000) + 10 * 60, // 10 minute expiration
    },
    METABASE_JWT_SHARED_SECRET
  );
  return Response.json({ jwt: token });
}
```

Row and column security then filters each table by a user attribute, such as the tenant slug, and it can hide or edit columns for each group. When each customer has their own database, Pro can route queries to the right database, and impersonation can apply the roles you defined in your database. Pro and Enterprise also let you match your product's look, with your brand colors, fonts, saved themes, and full white-labeling with your logo, name, and domain.

## Does Metabase charge per embed viewer?

Guest embed viewers never count as users, on any plan, so showing a guest embed to more customers doesn't change your bill. The compare plans page says it this way: "Modular embedding with Guest auth doesn't require viewers to sign in, which means they won't count as additional users for billing purposes."

SSO embeds, whether you build them with web components or the React SDK, and full-app embedding work differently, because each viewer signs in to Metabase. Each of those viewers counts as a user on your plan, the same way as your own team. On Pro, the first 10 users are included, and each extra user costs $12 a month, or $130 a year with yearly billing. You can add or deactivate users at any time, and Metabase prorates the bill.

If you plan to give many customers self-service access through SSO, Enterprise offers custom embedding pricing, such as a price per tenant or a flat fee.

## Can you try Pro embedding for free?

Yes, Pro starts with a 14-day free trial, on Metabase Cloud or on your own servers. The Metabase Store describes the trial this way: "Trials are free, with no obligation to buy. Cancel any time." To try Pro on your own servers, run the `metabase/metabase-enterprise` Docker image and activate the license token from your trial. Starter and Pro are paid by credit card through the Metabase Store, and Pro also offers a 10% discount on annual billing. If you sign up with a card, Metabase charges it only when the trial ends.

## Which plan do you need for multi-tenant embedded analytics?

- Use the open-source edition, or Starter if you want Metabase to host it, when customers view dashboards you build, filtered to their own rows with a locked parameter.
- Choose Pro when your customers should explore data and build their own reports, or when you need SSO embeds, tenants, row and column security, and your own branding.
- Choose Enterprise when you embed for many customers and want pricing per tenant or a flat fee, or when you need air-gapped or single-tenant hosting.

You can start with guest embeds and add SSO later, because authentication is a setting on each embed.

## Next steps

- [Compare Metabase plans and prices](/pricing)
- [Read the embedding introduction](/docs/latest/embedding/introduction)
- [Set up guest embeds with locked parameters](/docs/latest/embedding/guest-embedding)
- [Set up modular embedding with SSO](/docs/latest/embedding/modular-embedding)
- [Start with the React SDK](/docs/latest/embedding/sdk/introduction)
- [Group customers with tenants](/docs/latest/embedding/tenants)