Build customer analytics in your app when customers need a few fixed charts that your own queries already produce. Embed Metabase when customers want to explore their own data and build and save their own reports. Guest embeds are free on every edition, including open source, and self-service embedded analytics, with the query builder and row and column security, is part of the Pro and Enterprise plans.
This guide answers seven questions in turn: the tenant boundary, one more service to run, small data, a second copy of the data, cost, privacy, and a few fixed charts. The answers say when building in your app fits and what embedding changes.
Will embedded analytics break the multi-tenant boundary my app enforces?
It’s the right first question, because one missing filter can show one customer another customer’s data. With Metabase, your app keeps its tenant rule, and the embed only carries the result. Your server reads the tenant id from its own session and signs it into the embed token, so the browser can’t change it.
In a guest embed, which works on every edition, the tenant id goes into a locked parameter. Metabase refuses a token that leaves a locked parameter out, and the person viewing the embed can’t see or edit its value. Connect the tenant filter to every card on the dashboard. To turn a locked parameter off for a given token, pass [] as its value. The token still has to name the parameter; the filter just doesn’t apply. 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.
With Modular Embedding on Pro or Enterprise, your app sends the tenant id with the other user attributes when the person signs in, and Metabase saves it as a user attribute. Row and column security then puts a filtered version of each secured table in place of the original, everywhere Metabase uses that table. That rule covers the new questions customers build in the query builder, not only the charts you made. For SQL questions, connection impersonation lets your database’s own row-level security policies decide what each person sees.
Do I have to run another service?
Yes, Metabase runs as its own service. On Metabase Cloud, Metabase handles setup, backups and upgrades. To self-host, you run one container, and in production you give Metabase a Postgres database for its own application data. This command from the Docker docs, with the image pinned to v0.64.1, starts Metabase with that database:
docker run -d -p 3000:3000 \
-e "MB_DB_TYPE=postgres" \
-e "MB_DB_DBNAME=metabaseappdb" \
-e "MB_DB_PORT=5432" \
-e "MB_DB_USER=name" \
-e "MB_DB_PASS=password" \
-e "MB_DB_HOST=my-database-host" \
--name metabase metabase/metabase:v0.64.1
Metabase then reads the database your app already uses, so there’s no pipeline to build. If your team can’t run a new service and can’t use a hosted one, build the charts in your app.
Is my data too small for an embedded analytics tool?
Small data is a good reason to skip a data warehouse, and Metabase doesn’t need one. It connects to the PostgreSQL or MySQL database your app already uses, and the docs recommend a dedicated database user with read-only access. So the size of the data doesn’t decide this question. What decides it is whether customers only read your charts or also want to make their own.
Does embedding copy my data or show stale numbers?
No. Metabase runs queries against the database you connect, so you don’t build a sync job or keep a second copy of your tables. The guest embeds docs say that dashboards and charts in guest embeds always show live data from your database. If a query is slow, a default caching policy can serve stored results on every plan. Caching policies for a single question, dashboard or database are part of the Pro and Enterprise plans.
What does embedded analytics cost? Metabase pricing in 2026
Guest embeds are free on the open-source edition, and guest viewers don’t count as billed users on any plan. On the open-source and Starter plans, guest embeds show a “Powered by Metabase” banner, and removing it needs Pro or Enterprise.
Self-service embedding needs Pro or Enterprise. Pro costs $575 a month with 10 users included, then $12 a month for each extra user. Every customer user who signs in through SSO counts as a user. Enterprise starts at $20,000 a year, with custom pricing for apps that serve many end customers.
| Plan | Price (checked 2026-10-07) | Customer-facing analytics |
|---|---|---|
| Open Source | Free, self-hosted, unlimited users | Guest embeds with locked parameters |
| Starter | $100 a month, or $90 a month billed yearly | Guest embeds with locked parameters |
| Pro | $575 a month, 10 users included, $12 per extra user | Guest and SSO embeds, query builder, row and column security, tenants |
| Enterprise | From $20,000 a year | Same features as Pro, with custom pricing |
Hand-rolling your own analytics from scratch has a price too, which you pay in developer time for each chart, filter, export and permission check, at launch and at every change. For a few fixed charts, that time is small, and building costs less.
Can embedded analytics meet privacy and compliance rules?
You can self-host the open-source edition, Pro or Enterprise on your own servers, and Metabase queries your data where it already lives. Enterprise also offers air-gapped deployment, for an additional fee. Metabase holds SOC 2 Type II and SOC 1 certifications and complies with regulations such as GDPR and CCPA. In an embed, each customer sees only what its signed token or its permissions allow.
When is a page of charts in your app enough?
Build it yourself when three things are true: customers see a fixed set of numbers, your app already computes them, and nobody asks for new filters, exports or custom reports. A query per chart and a chart library such as Chart.js (open source, MIT license) or Apache ECharts will do the job, and your tenant checks stay in one place.
Watch for requests that repeat, such as one more filter, a CSV export, a breakdown by a new column, or a saved view for one customer. Each of those is a feature that you build, test and secure for every tenant, and a steady stream of them is the sign that it’s time to embed.
When do customers need self-service analytics?
Customers who want to explore their own data need four things: a way to ask a question without SQL, drill-through from any chart, a place to save what they made, and permissions that follow them into each new question. Built from scratch, that is a second product inside your product.
In Metabase, these features are part of SSO embeds on Pro and Enterprise. The query builder embeds as <metabase-question question-id="new">, saving turns on with is-save-enabled="true", and dashboards in SSO embeds support drill-through. With tenants, each customer gets its own collection, where its users save questions that other customers never see. Metabase needs a signed-in account for these features, because it has to know who is asking before it runs a new query.
What does a guest embed take in code?
A guest embed takes two pieces: an element on your page and one endpoint that signs the token. The page part follows the guest embeds docs, and the Express endpoint follows the token endpoint on the “Embed a dashboard” docs page. The guide to multi-tenant embedded analytics has the same endpoint for Next.js, Django and Rails, plus the SSO version.
<script defer src="https://metabase.example.com/app/embed.js"></script>
<script>
window.metabaseConfig = {
isGuest: true,
instanceUrl: "https://metabase.example.com",
guestEmbedProviderUri: "/api/metabase/guest-token",
};
</script>
<metabase-dashboard dashboard-id="12" with-title="true"></metabase-dashboard>
// server.js (Express, after your session middleware)
const express = require("express");
const jwt = require("jsonwebtoken");
const app = express();
app.use(express.json());
const METABASE_SECRET_KEY = process.env.METABASE_SECRET_KEY;
// Items you published as guest embeds, each with a locked tenant_id filter.
const PUBLISHED = new Set(["dashboard:12"]);
app.post("/api/metabase/guest-token", (req, res) => {
const user = req.session?.user; // your app's existing session
if (!user) return res.status(403).json({ error: "Not signed in" });
const { entityType, entityId } = req.body;
const id = Number(entityId);
if (!PUBLISHED.has(`${entityType}:${id}`)) {
return res.status(403).json({ error: "Not allowed" });
}
const payload = {
resource: { [entityType]: id },
params: { tenant_id: [user.tenantId] }, // set by your server, never by the browser
exp: Math.round(Date.now() / 1000) + 10 * 60, // 10 minutes
};
res.json({ jwt: jwt.sign(payload, METABASE_SECRET_KEY) });
});
In Metabase, set the dashboard’s Tenant ID filter to Locked in the embed settings and publish the dashboard. Then store the embedding secret key in your app as METABASE_SECRET_KEY.
Build or embed: a short checklist
- Build in your app when customers need a few fixed charts, your app already computes the numbers, and nobody asks for filters, exports or custom reports.
- Use a guest embed, on any edition including the free open-source one, when customers need dashboards with filters on live data and your server can set the tenant filter.
- Use an SSO embed on Pro or Enterprise when customers want to explore, drill through, and build and save their own reports, with row and column security or tenants.