What Is Customer-Facing Analytics? The Four Layers You Build
Customer-facing analytics is analytics you ship to paying customers inside your product, under your own service-level agreement. It commits you to four layers: query performance, governed metrics and permissions, an embedded runtime, and bounded self-serve.
Ship native customer-facing dashboards and self-serve reporting fast with Embeddable
Start buildingKey takeaways
- Customer-facing analytics is a production system your product depends on, not a reporting project bolted onto it.
- It differs from internal business intelligence, embedded analytics and customer analytics on who reads the output and who owns the uptime.
- Shipping it commits you to four layers: query performance under customer concurrency, trusted metrics and tenant isolation, the embedded runtime, and governed self-serve.
- Fast queries and correct-per-tenant queries are different guarantees, so a storage engine solves latency but leaves governance and embedding unsolved.
- AI assistance has made the first version of each layer cheap to scaffold while doing far less to reduce the cost of owning permissions, metric trust, versioning and auditability.
What Is Customer-Facing Analytics?
Customer-facing analytics is analytics delivered to a company's own paying customers inside its product, under that product's service-level agreement (SLA), rather than to internal teams in a separate business intelligence (BI) tool. It embeds insights directly into the user's application: interactive dashboards, per-tenant usage views, billing reporting and bounded exploration that lets external users work with their own data without exporting it to another tool.
Because the audience is external and paying, it carries obligations internal reporting doesn't: tenant isolation, metric definitions customers can trust, interactive performance under customer concurrency, and auditability of what was shown to whom. In practice that's four layers: query, governed metrics and permissions, embedded runtime, and self-serve surface.
The distinction that matters isn't visual. It's who absorbs the failure. When an internal dashboard is wrong, an analyst notices and fixes the model. When a customer-facing one is wrong, a customer disputes an invoice or asks why last month's number moved. When it's slow at month-end, that's a support queue. When it shows the wrong tenant's rows, that's a security incident, sometimes with a disclosure obligation attached. Every one of those is a product problem, on product timelines.
Two clarifications, because both get conflated constantly. This is not a BI licence resold to your customers: seat-priced internal tools can be embedded, and some do it well (Sigma Embedded has a genuinely strong governed modelling story), but you're then shipping someone else's product surface inside yours. It's also not a chart library. Recharts and ECharts render beautifully and solve none of the four layers above; they sit in the data visualization layer, and every guarantee your customers care about is enforced below it.
We built Embeddable because that gap is where teams get stuck: they own the experience, then discover they've also inherited the infrastructure underneath it. The moment analytics is pointed at paying customers, it stops being a report and joins your product's uptime, security and support surface permanently.
Customer-Facing Analytics vs Embedded Analytics vs Internal BI
Five terms get used as if they're synonyms. The differences that matter aren't about features — they're about who reads the output and who gets paged when it's wrong.
| Term | Who reads it | Who defines the metric | Who owns the SLA | What breaks when it's wrong |
|---|---|---|---|---|
| Customer-facing analytics | Your paying customers, inside your product | Your product and data teams, on your customers' behalf | You, under your product's SLA | A customer sees another tenant's rows, or bills a client off a wrong number. Churn, breach disclosure, escalation |
| Embedded analytics | Usually customers, sometimes internal users | Whoever configures the embedded tool | Shared: you for the host app, the vendor for the runtime | The surface renders but behaves like a different product; integration debt accumulates |
| User-facing analytics | Whoever the "user" is — used loosely for customers and staff alike | Ambiguous by construction | Ambiguous by construction | Nothing technical. The term itself misleads the roadmap conversation |
| Internal business intelligence (BI) | Your own analysts, operators and executives | Your data team, for themselves | Your data team, on best effort | A bad dashboard gets flagged in Slack and fixed. Recoverable, invisible to customers |
| Customer analytics | You. Analysis about your customers | Your growth, product or data team | Your data team | You act on a bad segmentation. Internal cost, no external blast radius |
Two of those rows describe the audience, one describes the delivery mechanism, and one describes the subject matter. That's the whole confusion in one sentence. "Embedded analytics" answers how the analytics reaches the screen; "customer-facing" answers who it's for and who's accountable.
The structural difference is worth stating plainly. Traditional BI tools serve internal teams, not external users, and they assume a trained analyst at the keyboard: complex modelling workflows, manual report building, a separate login. Customer-facing analytics assumes the opposite. It supports real-time data access and self-service for people who have never seen a semantic model, and it is optimised for high concurrency and low latency rather than for analyst flexibility.
That difference produces a predictable purchasing mistake. A platform built for internal BI is genuinely excellent at what it does: broad connector coverage, ad-hoc exploration, a mature modelling layer, analysts who already know the interface. Sisense and tools in its class have decades of that maturity behind them.
But excellence at "let a trained analyst answer any question" is a different guarantee from "let ten thousand untrained tenants each see exactly their own rows under your uptime commitment." We've sat in enough scoping calls to know how often a requirements doc says embedded analytics when the team has actually committed to a customer-facing production system with an SLA attached.
Test any vendor conversation against two questions: who reads the output, and who's on the hook when it's wrong. If you can't tell the terms apart, you can't tell which of your four layers a given analytics platform actually covers.
Why Customer-Facing Analytics Becomes a Production System
The first version always looks finished. A chart renders, the numbers look plausible, the filters work, and someone on the call says it looks great.
Then you put a customer on it. Now the dashboard has to answer correctly for a tenant nobody on your team has ever logged in as, at 9am on the first of the month when every account is pulling last month's numbers at once, against key metrics that finance, sales and the product team each describe slightly differently. None of those conditions exist in the demo. All of them exist in production.
What you discover is a second requirements list you never wrote down: tenant isolation that holds when a query joins three tables, metric definitions that survive being defined twice, query performance that degrades gracefully under concurrency, an audit trail that can answer which rows a given user saw on a given day, and guardrails on any surface where the customer builds their own view.
Each has a failure mode that isn't a bug in the ordinary sense. A common one: a permission scoped in the chart configuration rather than below the presentation layer, so a filter change at the front end widens the row set it returns. The customer sees data, the page loads, nothing errors. That's a breach discovered by a customer, not a ticket discovered by QA.
Teams take this on anyway because the commercial case is strong. Embedded analytics can enhance application value by 43%, and companies can charge 25% more on average for products with analytics features. That upside is what justifies the second requirements list — but it only survives contact with customers if the list gets built.
Nothing on that list is visible in a prototype, and every item on it is permanent. Many third-party tools will genuinely get a working embedded dashboard in front of someone quickly, and that speed is real. It just isn't the same thing as a system you can put under an SLA and sell.
The gap between a dashboard that renders and a dashboard you can sell has structure, and it sorts cleanly into four layers: the query layer that has to be fast under customer traffic, the governed layer where metrics and permissions live, the embedded runtime inside your application, and the self-serve surface your customers touch. The rest of this piece takes them one at a time.
Layer One: Performance and Concurrency for Customer Traffic
Customer-facing analytics is optimised for high concurrency and low latency, which is why the first thing that breaks is speed, not because your queries are badly written, but because the database your product runs on was never designed to scan three years of historical data while also serving a checkout.
This layer has one job: return the rows behind a chart fast enough that a customer keeps clicking, at the concurrency your customer base generates rather than the concurrency your internal analysts generate. That's a different shape of load. Internal BI might see forty analysts running heavy analytical queries on a Tuesday morning; a customer-facing dashboard in a product with ten thousand accounts sees spiky, mostly-repetitive traffic where every request has a human waiting on it.
The usual answer is to move analytical reads off the online transaction processing (OLTP) database onto a columnar store built for aggregation. ClickHouse, for instance, publishes its benchmark methodology openly at ClickBench, whose queries, datasets and results are public and reproducible (ClickBench on GitHub), worth reading precisely because it shows how much the answer depends on the shape of your query.
Then you add the judgement nobody benchmarks: what you pre-aggregate, what you materialise, what you cache and for how long, and how data freshness is maintained when a tenant's customer data changes mid-session. A cached figure that lags an hour is fine for a trend chart and unacceptable on a usage meter the customer is billed against.
This is the hardest layer to build well, and the one where a specialist engine earns its money. It has also solved exactly one of four problems.
A fast query and a correct-per-tenant query are separate guarantees, and conflating them is the most expensive mistake we see at this stage. The engine will happily return the wrong tenant's rows in eight milliseconds. It has no opinion on whether "active user" means the same thing in the dashboard as on the invoice, no view on whether this user's role should see revenue at all, no mechanism for embedding itself into your authentication and theming, and nothing to say about customers building their own views. Those are governance, runtime and product-surface problems sitting above the store.
Buy or build the fastest engine your workload justifies, and be clear-eyed that you've bought latency and scale, not trust.
Layer Two: Trusted Metrics and Tenant Isolation
A customer support lead opens her usage dashboard and sees 4,312 active users. Her finance team's invoice says 3,988. Both numbers are "correct": one counts any session, the other counts users who performed a billable action, and the two definitions live in different places, one in a chart's SQL, one in the billing service. Now you're on a call explaining arithmetic to a customer who is deciding whether to trust anything else you show them.
That's the first of two guarantees this layer owes. Every response that leaves your system has to mean what the customer thinks it means, and it has to contain only rows that belong to them. These are independent; you can get one right and the other catastrophically wrong.
The trust guarantee comes from a single governed definition of each metric that every surface reads from: the dashboard, the export, the API, the billing view. That role is often played by a semantic layer, and the teams who do this well keep those metrics and models defined in code in the repo, reviewed like any other change. dbt's Semantic Layer is a good example of centralising definitions so downstream tools stop re-deriving them. The mechanism matters less than the property: one definition, versioned, with a diff you can point at when a number moves.
The isolation guarantee is different work. It's usually row-level security plus access policies resolved from a verified identity claim, a tenant identifier carried in a signed token, not a value the browser can edit. Both must be enforced below the presentation layer, where the query is constructed, never in the chart config or a front-end filter. A filter in a dashboard component is a suggestion; anyone with developer tools can change it.
The common failure mode is not exotic. A tenant filter is applied in five places and forgotten in the sixth, an export endpoint, a drill-through, a newly added chart, and one customer sees another's rows. It ships because every test account the team used belonged to the same tenant.
Two habits close that gap. Enforce scope once, server-side, so a new chart inherits it by default instead of re-implementing it. And keep tracking what data was surfaced to which tenant per response, so a wrong permission is answerable after the fact rather than a matter of opinion. We built Embeddable's governed layer around exactly that split: definitions in code, scope resolved at query time from the token, not the client.
Layer one failing is a slow dashboard. Layer two failing is a breach or a false number in front of someone who pays you. Both are incidents, not bugs.
Shipping analytics to paying customers?
Get governed metrics and tenant isolation without building the layer yourself
Embeddable gives you metrics and models defined in code, row-level security resolved from a signed token at query time, and components that inherit your app's auth and theming.
Layer Three: The Embedded Runtime Inside Your Product
Your customer never logs into an analytics product. They log into yours. Everything in this layer exists to keep that true.
The embedded runtime carries your application's identity, routing, theming and release process into the analytics surface. Authentication is the first piece: the user has already signed in, often through single sign-on (SSO) against your identity provider (IdP), and that session has to translate into a scoped, short-lived credential the analytics layer can trust. In practice that's a signed token, commonly a JSON Web Token (JWT), minted server-side and carrying the tenant identifier plus whatever role or attribute claims drive row-level security.
If the browser can influence which tenant the token asserts, you don't have an embedded runtime; you have a client-side suggestion.
Then there's everything that isn't auth.
- Routing, so a deep link into a dashboard survives a refresh and a back button.
- Theming, so charts inherit your design tokens instead of approximating them, Highcharts and ECharts both expose full theme objects, which is why teams building their own data visualization layer reach for one of them.
- Release process, so analytics changes ship through the same pipeline as the rest of the product: per-tenant environments and promotion from staging to production, saved dashboard versions you can roll back, and a review step before a metric definition change reaches a paying customer.
Sisense has long done serious work on white-label embedding, and it shows in how far the surface can be restyled; the harder question with any vendor is whether their release model can be driven by your continuous integration rather than alongside it.
One clarification, because it gets muddled. Dashboards as code is a development workflow: definitions live in your repository, get reviewed, versioned and promoted. It is not an embedding mechanism. You still choose separately between an iframe, a software development kit, or a component API, and that choice determines whether the interactive dashboards can share your routing and auth context. We built Embeddable around the component route because the iframe boundary is exactly where a product stops feeling like one product.
Embedding isn't a rendering problem. It's the point where analytics either becomes part of your application or stays visibly bolted onto it.
Layer Four: Governed Self-Serve Without the Support Load
Self-serve is the layer everyone sells and almost nobody specifies. "Let your customers build their own reports" appears on every pricing page in this category; the interesting question is which reports, over which fields, joined how.
Every self-serve surface is defined by four decisions: which dimensions a customer can group by, which measures they can pull, which joins are legal, and which filters are always applied whether they ask for them or not.
Get those wrong in the permissive direction and you ship a query builder that can produce a cross-tenant join, a fan-out that scans a year of events, or a number that technically comes from your warehouse but doesn't match the invoice. Get them wrong in the restrictive direction and customers open tickets asking for the one breakdown you didn't permit. Both failure modes end at your support desk.
Support load is the honest metric here. When a customer can ask a question nobody designed an answer for, one of three things happens: an error, a slow response, or a plausible-looking number they quote back to you in a renewal conversation. The third is the expensive one.
The mechanism matters more than the interface. A truly open exploration surface, the direction ThoughtSpot has pushed hardest, and their natural-language search genuinely is good at it, assumes the question space is unbounded and the governance sits in the model underneath. A bounded surface assumes the opposite: a designed set of dimensions and measures, with filters and row scoping enforced below the presentation layer. Both are defensible. What isn't defensible is shipping the open version while assuming the bounded version's safety properties.
Done well, this is the layer that lets users explore their own data without exporting it to external tools, and it's where custom reports stop being a services engagement. Teams who get it right treat saved views as a product feature rather than a convenience: a customer-authored view is a definition someone else on their team will eventually trust, so it needs versioning and an owner. That's the thinking behind Custom Canvas for governed self-serve.
The most valuable analytics capabilities in this layer are the ones that don't wait to be opened. Proactive alerts notify customers of important events, a usage threshold crossed, an error rate spiking, a campaign underperforming, which turns analytics into an intervention mechanism rather than merely a reporting mechanism. A dashboard someone remembers to check is worth far less than a dashboard that reaches out.
Freedom to explore is only safe when the set of askable questions has been deliberately designed. Self-serve is a constraint problem, not a user-interface one.
Where Customers Actually See Analytics in a Product
The most useful customer-facing analytics examples are named products with named surfaces. Open Stripe's dashboard and look at Billing and Revenue Recognition: a customer sees their own charges, disputes, MRR movement and cohort retention, computed from Stripe's data, rendered inside Stripe's product, under Stripe's uptime commitment. Nobody calls it "embedded analytics." It's just part of the product people pay for.
The same surfaces recur across B2B software once you look for them. Cloudflare shows per-zone traffic, threat and cache-hit analytics to every customer on the plan. HubSpot ships campaign and email engagement metrics as a core feature, not an add-on tab. Twilio exposes message delivery and error breakdowns per subaccount, the multi-tenant case in its purest form, where the account boundary is the data boundary. Shopify gives merchants sales and conversion reporting alongside benchmarking against anonymised peer stores, the hardest of the lot because the aggregate has to be genuinely useful without being reverse-engineerable back to a single competing store.
Group those and you get the five surfaces that account for most of what teams are asked to build: per-tenant usage and consumption dashboards, billing and spend views, delivery or campaign reporting, benchmarking against anonymised peers, and white-label dashboards a reseller puts their own logo on.
Each loads the four layers differently. Consumption views are latency-heavy and permission-simple. Billing views are the reverse: modest query volume, but a wrong number is a finance conversation. Benchmarking is the only one where correct per-tenant scoping and a deliberately cross-tenant aggregate must coexist in the same response, which is why we treat it as the stress test when teams describe their roadmap. White-label is where theming and identity propagation stop being cosmetic.
These surfaces are also where the revenue model gets decided. Subscription models can offer tiered access to analytics features, with deeper historical data or more granular breakdowns at higher tiers. Usage-based pricing charges users according to their analytics interaction levels. Advanced capabilities, benchmarking, custom reports, alerting, API access, can be monetised as add-ons. And personalised analytics, tuned to a customer's own segments and thresholds, increases product value and differentiation in a way a generic reporting tab never does.
We'd push back on the vertical lists you'll see on this topic. "Fintech, edtech, logistics and healthcare benefit from analytics" tells an engineering leader nothing about what they're committing to build; a named product with a named surface tells them exactly which layer gets stressed first.
Why the Build Path Looks Cheaper Than It Is Right Now
Scaffolding the first version of all four layers is genuinely faster than it was two years ago. That part is real.
Point Claude Code or Cursor at your schema and you'll get a chart component, a query, a route and a passable theme. Anthropic's own Claude Code docs describe exactly this workflow: an agent operating on your repo, reading the codebase, writing the files. It works. A demo-quality per-tenant dashboard that reads from your warehouse is now a small piece of work, and every engineering leader who tries it comes away with a revised estimate.
The revised estimate is wrong, because it measures the wrong thing.
None of the ownership got cheaper. Someone still has to decide where a metric definition lives and what happens when finance changes it. Someone reviews the permission change that ships on a Thursday. Someone keeps row-level security correct as new tables arrive, promotes dashboard changes between environments without breaking a customer's saved view, keeps query latency acceptable when month-end concurrency spikes, and can answer an auditor asking which tenant saw which numbers on which date.
An agent can write that code. It cannot be accountable for it at 2am, and it cannot carry the decision about which analytics capabilities your product actually differentiates on.
AI made the prototype cheap. The maintenance inventory behind it has not got cheaper in anything like the same way. The build decision now gets made on the prototype number. That's the mistake.
If you want the architectural version of this argument, we've written it up as agentic analytics as an architectural pattern.
Build vs Buy, Layer by Layer: Questions for Your Next Roadmap Review
Build versus buy is not one decision. It's four, and treating it as one is how teams end up owning the layers they least wanted.
The rule we'd apply: own the layers your customers can tell apart, buy the ones they cannot. A customer notices whether the dashboard looks like your product, whether the chart they need exists, whether the numbers match their invoice. They never notice who wrote the tenant-scoping middleware.
- Layer one (query and concurrency): usually buy, sometimes already owned. If you're already running ClickHouse, Snowflake or BigQuery, you've bought this layer. Standing up a fresh analytical store for customer traffic is real engineering, but it's solved engineering, and none of it differentiates your product.
- Layer two (governed metrics, tenant isolation): buy the enforcement, own the definitions. Your metric definitions are domain knowledge and belong in your repo, reviewed like any other code. The machinery that enforces them per response, row-level security, scoped tokens, access policies, is pure maintenance burden with catastrophic failure modes. Buy that.
- Layer three (embedded runtime): own the components, buy the plumbing. Theming, layout and interaction are your product. Identity propagation, environment promotion and version-safe deploys are not.
- Layer four (self-serve surface): own the constraints, buy the canvas. Deciding which questions a customer may ask is a product decision only your team can make. Building a query builder that can't generate a hostile join is a project.
Vendors sit differently against this. Sisense gives you a mature end-to-end platform if you want more of the stack handled; Embeddable takes the code-first route, where components and models live in your repo and the governed runtime underneath is ours to operate. Neither is right in the abstract.
Whichever way you go, implementing customer-facing analytics should start small with a high-value use case: one surface, one tenant type, one set of key metrics your customers already ask for in support tickets. Ship that under real load, learn which layer it stresses, then widen. Teams who scope the full five-surface roadmap first spend a quarter building a query engine nobody asked for.
Take these into the roadmap review and make someone answer them out loud:
- Where does a metric definition live today? If the answer is "in three dashboards and one analyst's head," you have a layer-two problem before you have a build-vs-buy problem.
- What happens when one tenant needs a custom view? If the answer is a fork, a feature flag and a support escalation, your embedded runtime isn't designed yet.
- How would a wrong permission be caught before a customer sees it? If there's no test, no staging tenant and no audit trail, isolation is an intention rather than a guarantee.
- Who is on call at 9am on the first of the month when the dashboard is slow? Name the person. If nobody's name comes up, you haven't decided to build; you've decided to find out later.
Decide it layer by layer. The all-or-nothing version of this question is the one that produces regret.
Frequently asked questions
What is customer-facing analytics?
Analytics you ship to your own paying customers inside your product, under your product's SLA, rather than to internal teams in a separate BI tool.
What is the difference between customer-facing analytics and embedded analytics?
Embedded analytics describes the mechanism: analytics rendered inside a host application. Customer-facing analytics describes the audience and the obligation. You can embed a dashboard for internal staff and it is still not customer-facing.
Is customer-facing analytics the same as customer analytics?
No. Customer analytics is analysis about your customers, for you. Customer-facing analytics is analysis of their own data, for them.
Do you need a separate database for customer-facing analytics?
Usually, yes. Most teams move analytical reads off the transactional database onto a columnar or OLAP engine, because customer concurrency on the OLTP database degrades the product itself.
Should we build or buy customer-facing analytics?
Decide it layer by layer, not as one choice. Own the layers your customers can tell apart, such as the experience and the metric definitions, and buy the ones they cannot, such as tenant-scoped runtime and permission enforcement.