Compare

hypequery vs Metabase for Embedded ClickHouse Analytics

Metabase is a BI tool with a ClickHouse connector and embedding features — the fast path for internal dashboards. hypequery is the code-first route for customer-facing product analytics you own. Here's how to choose.

Decision type

Architecture and workflow fit

Audience

TypeScript teams building on ClickHouse

Outcome

Choose a path and move into implementation

Category

Code-first embedded analytics library

Best for

Customer-facing product analytics you ship and own

The UI

Your own React components on typed contracts

Multi-tenancy

Tenant rules in your app's auth context, per request

Type safety

Types generated from your live ClickHouse schema

What this page is for

Use this page when the real question is how one tool changes the shape of your ClickHouse application code, not just which syntax looks nicer.

What this page is not

It is not a broad ecosystem roundup. It stays narrow on the tradeoff a ClickHouse-heavy TypeScript team is actually deciding.

Recommended next move

If the tradeoff already looks clear, stop reading comparisons and test the fit against one real query in your own schema.

Dimension
hypequery
Alternative
Category
Code-first embedded analytics library
BI tool with a ClickHouse connector and embeds
Best for
Customer-facing product analytics you ship and own
Internal dashboards and fast chart-in-front-of-people
The UI
Your own React components on typed contracts
Metabase's charts, embedded via iframe or SDK
Multi-tenancy
Tenant rules in your app's auth context, per request
Sandboxing / row-level permissions (paid tiers)
Type safety
Types generated from your live ClickHouse schema
Not code — queries authored in the BI UI
Back to comparisons

Short answer: if you want a chart in front of people this week, Metabase is the faster path — it's a mature BI tool with a native ClickHouse connector and real embedding features. If you're building customer-facing product analytics that ships inside your app, with type-safe queries, per-tenant rules enforced in your own auth stack, and a UI that matches your product, that's code-first territory, and hypequery is built for it.

These aren't the same category, and pretending they are does nobody any favors. Metabase is a BI application. hypequery is a TypeScript library you point at the ClickHouse you already run. This page is about which shape fits the job, not a feature war.

What Metabase does well

Metabase is genuinely good, and for a large set of analytics jobs it's the right answer.

  • Fast time-to-chart. Connect ClickHouse via the official connector, build a "question" in the UI, and you have a dashboard. No code, no deploy, no schema generation step.
  • Non-engineers can self-serve. Analysts, PMs, and support staff can slice data, save questions, and build dashboards without waiting on the eng team. That's the whole point of a BI tool, and it's a real capability hypequery does not have.
  • Embedding exists. Static iframe embeds are free. Interactive embedding — with SSO and row-level sandboxing so each customer sees only their data — is available on paid tiers, along with an embedding SDK for more control over the frame.
  • Batteries included. Alerts, scheduled emails, a permissions model, a query editor with a visual and SQL mode. You don't build any of this.

If the job is "put an internal revenue dashboard in front of the leadership team," or "let ops explore event data without writing SQL," Metabase wins on almost every axis. Reaching for a library there would be over-engineering.

Where the BI-embed model gets expensive

The friction shows up when the dashboard is your product, shipped to your customers, rather than an internal tool.

The UI is Metabase's, not yours. Embedded Metabase looks like embedded Metabase. You can theme it, and the SDK gives you more room, but you're styling someone else's charts inside a frame rather than composing your own React components. For a polished, customer-facing surface that has to match your product's design system, that ceiling gets real.

Per-tenant governance lives in Metabase. Interactive embedding with sandboxing does enforce row-level rules — but those rules live in the BI tool's permission model, configured separately from the authentication and authorization your application already has. For a multi-tenant SaaS product, that's a second source of truth for "who can see what," and it's a paid-tier feature. When your app already knows the tenant from the request, injecting that scope in your own code is often simpler and easier to audit.

Queries aren't code. Questions authored in the Metabase UI don't live in your repo, don't go through code review, and aren't covered by your CI. There are no compile-time types tying a chart to your ClickHouse schema, so a column rename surfaces as a broken dashboard at runtime rather than a type error at build time.

Pricing scales with embedding. The free tier covers internal use and static embeds. The moment you need interactive embedding, SSO, and sandboxing for customer-facing analytics, you're on a paid plan — a line item that grows with the product.

None of these are bugs. They're the natural shape of a BI tool. They just point at a different set of jobs than product analytics.

What hypequery does instead

hypequery assumes you own the ClickHouse and you're building the analytics surface yourself, in TypeScript.

  1. Run hypequery generate against your live ClickHouse. It introspects the schema and produces TypeScript types with correct runtime mappings — DateTime comes back as a string, UInt64 as a string, Nullable(T) as T | null.
  2. Write queries with a fully typed builder. Runtime parameters — date ranges, tenant IDs, filters — are just function arguments.
  3. Serve them as typed REST endpoints with input validation and generated OpenAPI docs via @hypequery/serve.
  4. Build the dashboard from your own components, consuming the same typed contract through @hypequery/react hooks.

A tenant-scoped query looks like ordinary application code:

The tenant_id filter comes from your request context — the same auth you already trust for the rest of the app. There's no second permission system to keep in sync. And because the return type is generated from the real schema, renaming total in ClickHouse and re-running generate turns every stale query into a compile error, not a broken customer dashboard.

Serving it is a small step from there:

That endpoint is validated, documented, and consumed by typed React hooks in your own charts. The trade you're making: you build the UI and wire the auth, instead of getting them from a BI tool.

The honest comparison

Metabasehypequery
CategoryBI tool with a ClickHouse connectorCode-first embedded analytics library
Best forInternal dashboards, self-serve explorationCustomer-facing product analytics
Who authors queriesAnyone, in the UIEngineers, in TypeScript
The UIMetabase charts, embedded via iframe / SDKYour own React components
Type safetyNone — queries live in the BI UIGenerated from your ClickHouse schema
Multi-tenancySandboxing / row-level rules (paid tiers)Tenant scope from your auth, per request
In your repo / code reviewNoYes
OpsRun Metabase (or Metabase Cloud)Add npm packages to your existing app
PricingFree tier; interactive embedding is paidOpen source — you pay for your infra

How to actually decide

Is the audience internal? Metabase, almost every time. Self-serve exploration for non-engineers is exactly what it's for, and building that with a library would be wasted effort.

Is the dashboard a feature of your product, shipped to customers? This is hypequery's home turf. When the analytics surface has to match your design system, respect your existing auth, and ship through your normal review-and-deploy pipeline, owning it in code pays off. The ClickHouse dashboard guide walks through building one, and ClickHouse React covers the hooks side of the contract.

Do per-tenant rules already live in your app? If your backend already knows the tenant from the request, enforcing that scope in your own query code keeps one source of truth. Our write-up on multi-tenant embedded analytics covers the isolation patterns, and ClickHouse SaaS analytics covers the broader tenant story.

Do non-engineers need to build their own charts? Metabase — that's a job hypequery deliberately doesn't do.

Can you use both?

Yes, and it's a common, sensible split. Metabase for internal BI and ad-hoc exploration; hypequery for the customer-facing analytics baked into the product. Both point at the same ClickHouse, and they serve genuinely different audiences from it. Running both isn't redundant the way two application layers would be — one is for your team, one is for your users.

Getting started with hypequery

If the customer-facing, code-first side is the one you're weighing, the quick start takes you from schema introspection to a typed, served endpoint in a few minutes — enough to see whether owning the analytics layer in your repo fits how your team ships. From there, ClickHouse React shows the dashboard hooks, and the multi-tenant analytics write-up covers per-tenant governance in your own stack.

Decision checkpoint

If the tradeoff is already clear, move into implementation

Most teams do not need another round of comparison content after this point. The better test is whether the workflow holds up on your own schema and your own query complexity.

Related content

Continue into implementation

FAQ

Is Metabase or hypequery faster to get a first dashboard?

Metabase, clearly. Connect ClickHouse, build a question, publish an embed, and a chart is live in an afternoon with no code. hypequery is faster over the long run only when you need typed queries, per-tenant governance, and UI that matches your product.

Can I embed Metabase in a customer-facing SaaS product?

Yes, with caveats. Static iframe embeds are free; interactive embedding with SSO and row-level sandboxing is a paid tier. The UI is still Metabase's look and feel, and per-tenant rules live in Metabase rather than your own auth stack.

Do I have to choose one?

No. A common split is Metabase for internal BI and ad-hoc exploration, and hypequery for the customer-facing analytics baked into your product. Both point at the same ClickHouse.

Next step

Move from evaluation into a typed ClickHouse workflow

Generate schema types, define your first reusable query, and decide whether it should run locally or over HTTP.