Embedded analytics
Embedded analytics for developers: build or buy
How to put customer-facing dashboards into your product: when embedding a BI tool is the right call, when to build on a code-first layer, how to keep tenants apart, and what eight tools offer today.
Definition
What is embedded analytics?
Embedded analytics is reporting that lives inside your own product: charts, dashboards and exports that your customers see in your app, each scoped to their own data. A usage page in a developer tool, a sales report in a store admin and a spend chart in a billing portal are all embedded analytics.
It differs from internal BI in two ways. The audience is your customers, so every query must be limited to one tenant. And the charts are part of your product, so they have to load fast and look like the rest of your UI.
The main decision
Embed a BI tool, or build with your own components
Embedding a BI tool means building dashboards in a vendor’s editor and placing them in your app with an iframe, a web component or the vendor’s SDK. The vendor runs the queries, draws the charts and handles filtering.
Building means your backend serves the numbers through an API and your frontend draws them with the components you already use. A code-first layer such as hypequery covers the backend half: metric definitions, tenant scoping, typed endpoints and React hooks. The charts are yours.
| Embed a BI tool | Build on a code-first layer | |
|---|---|---|
| Who draws the charts | The vendor. You pick chart types and theme them. | You, with your own components or a chart library. |
| Time to first dashboard | Short: connect a database, build a dashboard, embed it. | Longer: you write the API, the components and the layout. |
| Look and feel | Themeable within what the vendor exposes. | Whatever your design system already does. |
| Where metrics are defined | In the vendor’s model or dashboard editor. | In your codebase, reviewed and versioned like other code. |
| Tenant isolation | Signed embed tokens or row-level rules set in the vendor. | Enforced in your backend from the authenticated session. |
| Self-serve exploration | Often included: filters, drill-down, sometimes a query editor. | Only what you build. |
| Cost model | Platform fee, per user, per viewer or usage based. | Engineering time plus your database and hosting. |
Tenant isolation
Every query scoped to one customer, enforced in one place
The bug that matters in embedded analytics is a missing tenant filter. If each query adds WHERE tenant_id = ? by hand, the one that forgets it shows a customer someone else’s data. The fix is the same whichever route you take: read the tenant from the authenticated session on the server, apply it centrally, and reject queries that arrive without it.
BI tools do this with signed embed tokens or row-level rules configured in the vendor. ClickHouse itself offers row policies (CREATE ROW POLICY) and separate tables or databases per tenant; the ClickHouse embedded analytics guide compares those models. With hypequery, the tenant key is part of the dataset definition and execution fails closed when tenant context is missing.
What the backend guarantees
- The tenant filter is injected from runtime context, not written per query.
- A query against a tenant-scoped dataset without tenant context throws instead of running.
- Explicit filters on the tenant column are rejected, so callers cannot widen their own scope.
- Over HTTP, Serve extracts the tenant from your auth result and can require it on every request. See the Serve multi-tenancy docs.
Performance
Fast dashboards on ClickHouse
Customer dashboards run the same few queries for many tenants, so the table layout matters more than the tool on top. Three habits cover most of it.
Lead the sorting key with the tenant
With ORDER BY (tenant_id, ts), ClickHouse uses the primary index to skip other tenants’ granules. On a 2 million row test table with 100 tenants, a one-tenant count read 4 of 245 granules; with ORDER BY ts it read all 245.
Pre-aggregate the heavy charts
Materialized views and projections move aggregation to insert time, so a dashboard reads daily rollups instead of raw events. The materialized views guide covers the tradeoffs.
Cache and rate limit per tenant
Dashboards repeat queries, and one large customer can crowd out the rest. Cache repeated results with a TTL and put limits on the API in front of ClickHouse. See dataset caching and rate limiting.
Vendor comparison
Embedded analytics tools compared
How each tool gets analytics into your app, whether you can read and run the code yourself, and how it is priced. Each cell was checked against the vendor’s own site on November 8, 2026; prices change, so confirm on the vendor’s pricing page before you decide.
| Tool | How it embeds | Open source | Self-host | Pricing (published) |
|---|---|---|---|---|
| Metabase | iframe (full app or guest embeds), web components, React SDK | Partly: open source edition under AGPL; paid editions under a commercial license | Yes | Open source free. Starter $100/mo plus $6/user, Pro $575/mo plus $12/user, Enterprise from $20,000/yr |
| Luzmo | Web components by default, iframe option, React, Vue and Angular components, Flex SDK for charts from code | No | Not by default; private deployments by arrangement on Enterprise | From €1,995/mo billed annually, scaling with usage |
| Embeddable | Web component, with guides for React, Next.js, Vue and Angular | Partly: the Remarkable UI component library and CLI are MIT | No: the platform is hosted; the Cube data layer it uses can run in your environment | Quote on request; fixed price with unlimited usage |
| GoodData | iframe, web components, React SDK (GoodData.UI), raw data from the JS and Python SDKs | Partly: Python SDK is MIT; GoodData.UI is under a commercial license | Enterprise only, on demand | Professional: platform fee plus per workspace. Enterprise: custom. No public prices |
| Explo | Web component, iframe | Not stated | Enterprise only (on-premise deployment) | Pro from $1,995/mo; Enterprise on request |
| Sisense | iframe, Embed SDK, Compose SDK (React, Angular, Vue, web components), REST API | No: Compose SDK source is public under an end user license agreement | Enterprise: your own cloud or on-prem | No public prices: Enterprise through sales, Self-Serve free trial |
| Cube | iframe and React Embed SDK (Premium and Enterprise plans), headless REST, GraphQL and SQL APIs | Yes: Cube Core, Apache 2.0 | Yes (Cube Core) | Free tier. Starter $40 and Premium $80 per developer per month. Enterprise custom |
| hypequery | Headless: typed HTTP API and React hooks over your datasets; you render the charts | Yes: Apache 2.0 | Yes: a library that runs in your own backend | Open source, free. A hosted option is on a waitlist |
All eight document a ClickHouse connection. Embeddable connects to databases through Cube. hypequery is listed last because it is ours.
An honest answer
When a BI embed is the better choice
Building on a code-first layer is not always the right call. Embed a BI tool such as Metabase, Luzmo or GoodData when:
- You need many dashboards soon and have no frontend engineers to build them.
- Customers expect to explore data themselves: build their own charts, drill down, or write queries.
- Non-engineers on your team should be able to create and change customer dashboards without a deploy.
- Analytics is a reporting add-on rather than part of the product’s core experience.
- You already run that BI tool internally and the same models can serve customers.
Build when the charts are part of the product, need to match your design system, are also served through an API or to AI agents, or when per-viewer pricing grows faster than your revenue per customer. Many teams start with an embed and move the most-used views into their own components later.
Questions
Embedded analytics FAQ
What is embedded analytics?
Embedded analytics means showing charts, dashboards and reports inside your own product, to your own customers, scoped to their data. It differs from internal BI, where employees look at data across the whole company.
Should I embed a BI tool or build my own dashboards?
Embed a BI tool when you need many dashboards fast, want customers to explore data on their own, or have no frontend capacity. Build when analytics is part of the core product, needs to match your design system, or is served through an API as well as a UI.
How do I keep one customer from seeing another customer’s data?
Take the tenant from the authenticated session on the server, apply it to every query in one place, and reject queries that arrive without it. With a BI embed, that usually means a signed token carrying the tenant; with a code-first layer, it is a tenant key on the dataset.
Is ClickHouse a good database for embedded analytics?
ClickHouse suits customer-facing analytics because it aggregates large tables quickly. Put the tenant column first in the table’s sorting key so single-tenant queries read only that tenant’s granules, and pre-aggregate heavy dashboards with materialized views or projections.
What does embedded analytics cost?
In the table on this page, published starting prices run from free open source editions to about 2,000 a month (Luzmo from €1,995, Explo Pro from $1,995), and several vendors quote only on request. Building costs engineering time instead of license fees.
Which embedded analytics tools are open source?
Of the tools compared here, Metabase (AGPL open source edition), Cube (Cube Core, Apache 2.0) and hypequery (Apache 2.0) have open-source cores. Embeddable and GoodData publish parts of their SDKs under MIT.
Guides
Embedded analytics guides and docs
Deeper reading on each part of an embedded analytics stack on ClickHouse. For the metric definitions behind the dashboards, see the ClickHouse semantic layer; for clients and SQL patterns, see ClickHouse for TypeScript and Python developers.
Embedded analytics with ClickHouse
The long guide: isolation models, row policies, projections, quotas and a reference architecture.
Read
ClickHouse multi-tenant analytics
Tenant isolation for SaaS when ClickHouse powers customer-facing features.
Read
ClickHouse SaaS analytics
A multi-tenant analytics layer for SaaS products on ClickHouse.
Read
ClickHouse dashboard data layer
The API and data layer behind React and TypeScript dashboards.
Read
ClickHouse with React
Typed hooks for dashboard components, built on TanStack Query.
Read
Multi-tenant SaaS use case
Customer-facing analytics with tenant scoping and role checks in one backend path.
Read
Usage-based billing on ClickHouse
Meter customer usage in ClickHouse and show it back to customers.
Read
Power BI Embedded pricing
What A and F SKU capacity costs, who needs a license, and cheaper alternatives.
Read
hypequery vs Metabase
A BI tool you embed compared with a code-first layer you build on.
Read
Dataset multi-tenancy docs
How tenant keys work, why they fail closed, and how runtime tenant context is passed.
Read
Serve multi-tenancy docs
Extract the tenant from auth and require it on every HTTP request.
Read
Python multi-tenancy docs
The same tenant rules for FastAPI, Django and Flask backends.
Read
Dataset caching docs
A semantic-query cache with a TTL, for dashboards that repeat the same queries.
Read
Sources
Vendor pages used for the comparison table, all fetched on November 8, 2026.
- Metabase
- www.metabase.com/pricing/
- www.metabase.com/docs/latest/embedding/introduction
- github.com/metabase/metabase
- Luzmo
- www.luzmo.com/pricing
- developer.luzmo.com/guide/embedding--component-api-reference
- developer.luzmo.com/
- www.luzmo.com/compare/metabase
- Embeddable
- embeddable.com/pricing
- docs.embeddable.com/deployment/embedding
- embeddable.com/security
- github.com/embeddable-hq
- GoodData
- www.gooddata.ai/pricing/
- www.gooddata.ai/docs/cloud/embed-visualizations/
- github.com/gooddata/gooddata-ui-sdk
- github.com/gooddata/gooddata-python-sdk
Next step
Serve one tenant-scoped chart from your own backend
Define a dataset with a tenant key, serve it over HTTP and render it with a React hook. Open source, and it runs in your own backend. Want it hosted?