KPI Tree

dbt Core logodbt Core Integration

Your dbt Core semantic layer defines the metrics. KPI Tree shows how they drive each other, who owns them, and what to do when they move.

You have spent months defining metrics, dimensions, time grains, and aggregations in dbt Core. That work gives you governed, version-controlled definitions. It does not tell you which metrics drive which with confidence, who is accountable when a number moves, or whether the last thing anyone tried actually worked. KPI Tree reads your semantic manifest and renders the SQL from it directly, so there is no dbt Cloud API and no subscription in the loop. It runs that SQL against your own warehouse, imports every definition exactly as written, and adds the layer above: a causal metric tree with statistical significance on every edge, RACI ownership tied to real people, and a closed loop from anomaly to verified impact. Your dbt project stays the single source of truth for how metrics are calculated.

Live in minutes, not weeks

Compile your semantic manifest, upload it, and link the warehouse your models are materialised in. Every metric is then ready to organise into a tree with clear ownership.

1

Compile and upload your semantic manifest

Run dbt parse (or dbt build) to produce semantic_manifest.json in your target/ directory, then upload it. Drag and drop through the UI, or automate it with curl, a Python script, or the ready-made GitHub Actions workflow. Include manifest.json in a ZIP of the target/ directory to also unlock data model exploration: upstream tables, columns, and lineage.

2

Link the warehouse your models run in

dbt Core defines the metrics but does not execute anything. KPI Tree renders each metric as MetricFlow SQL in your warehouse's own dialect and runs it against a linked warehouse connection: Snowflake, BigQuery, Databricks, Redshift, or PostgreSQL. One aggregation query per metric, on a schedule you set.

3

Build your metric trees

Every metric and dimension from your dbt project is imported automatically, with its aggregation type read straight from the model. Arrange them into a tree that reflects real cause and effect, assign RACI owners, and route anomalies. When your dbt project evolves, re-sync and KPI Tree applies a diff, preserving your existing trees, ownership, and action history.

Everything your semantic layer defines, plus the layer it was never designed to carry

KPI Tree is a first-class consumer of the open-source dbt semantic layer. It starts from the governed definitions you have already built and extends them into operational territory the semantic layer does not cover: causation, ownership, and verified outcomes.

Your governed definitions, imported exactly as written

Every metric, dimension, entity, measure, and time grain imports with its labels and descriptions intact. Nothing is re-mapped or translated. Aggregation type is read directly from the model, so sum, average, first, and last behave the way your dbt definition says, including a First Value aggregation for point-in-time metrics.

One query per metric, all downstream analytics off-warehouse

Each metric runs a single aggregation query on a schedule you set, returned as Apache Arrow and cached. Comparison periods, week and quarter rollups, correlations, regressions, and outlier detection all run in KPI Tree's own compute engine, and per-metric results are cached again in the browser, so exploring never re-hits your warehouse. The warehouse bill stays flat as you add metrics.

Continuous, diff-based sync from your repo

Wire your repo up once and every merge to main keeps KPI Tree current. Because each re-sync applies as a diff rather than a rebuild, definition changes flow straight through while your trees, ownership, and action history stay exactly where you left them.

See which metrics drive which across your entire business.

Your dbt project defines metrics one at a time. KPI Tree connects them into a causal model. Arrange metrics into a tree that reflects real business causation, from operational inputs up to revenue, then trace any movement down to the specific driver that moved. Every driver edge is scored by proprietary ML models and statistical tests, using Pearson and lagged cross-correlation, partial correlation, and Granger causality with Benjamini-Hochberg correction, so each relationship carries a confidence level and you are working from evidence that survives significance testing, not assumption. When a number breaches its baseline, root-cause detection traces the anomaly down the tree automatically.

  • Every metric and dimension from your dbt project, imported automatically
  • Drag-and-drop tree builder for cause-and-effect relationships
  • Driver edges scored by proprietary ML models and statistical tests, with a confidence level on every edge
  • Root-cause detection traces anomalies down the tree automatically
0:00

Your metric trees update every time your dbt project changes.

The connection wizard generates a complete GitHub Actions workflow. On every push to main it runs dbt build and posts the artifacts to KPI Tree, so new metrics are added, removed ones are flagged, and changed definitions are updated. Your workspace domain and connection ID are set as workflow variables, so the only secret you add to the repo is a single scoped API key. Four upload methods cover any workflow: GitHub Actions, curl, a Python script, or drag-and-drop through the UI. Re-syncs are diff-based, so your trees, ownership assignments, and action history are never rebuilt.

  • Ready-made GitHub Actions workflow generated in the connection wizard
  • Automatic sync on every merge to main
  • One scoped API key secret, no other credentials in the repo
  • Four upload methods for teams with different CI/CD setups
Semantic layer sync loading

Break any metric down by dimension without changing your dbt project.

Your dbt project already declares which dimensions apply to each metric. KPI Tree reads those declarations, queries their distinct values on your warehouse, and generates a child metric for each value. Each child appears as its own node on the tree with its own owner and its own tracking, so when Revenue by Region dips you see exactly which region moved and who is accountable. High-cardinality dimensions are detected and skipped automatically to keep the tree navigable. No changes to your dbt YAML required.

  • Reads dimensions directly from your existing dbt definitions
  • Auto-generates a child metric for each dimension value
  • High-cardinality dimensions detected and skipped to keep trees navigable
  • Each dimension metric gets its own ownership and tracking
Metric tree visualisation loading

dbt defines the metrics. KPI Tree closes the loop from movement to verified impact.

Your dbt project is the source of truth for how metrics are calculated, and that never changes. KPI Tree adds what a semantic layer does not attempt to provide. Every metric gets full RACI ownership tied to a real person, their team, and their manager, not an owner text field. When a metric breaches its baseline, the anomaly is pushed to the Accountable owner across Slack, email, WhatsApp, or SMS, with org-chart escalation if it is not picked up. Actions are tracked against the metric they target, and impact is verified against the statistical baseline rather than self-reported. Business-model budgets and forecasts run through the same pipeline as actuals.

  • dbt project remains the sole source of truth for calculations
  • Full RACI ownership per metric, tied to team and manager
  • Anomalies pushed to the accountable owner across Slack, email, WhatsApp, and SMS with escalation
  • The MCP server exposes RACI, significance-tested drivers, and verified impact to AI assistants
RACI accountability matrix loading

What makes this different from a dashboard on your dbt metrics

Most tools that consume dbt metrics display them in charts or flat catalogues. Portable-semantics standards such as OSI, and the trend toward shared metric definitions, only standardise what a metric is: its aggregation, dimensions, and time grain. None of that standardises who owns a metric, what drives it with confidence, or whether the last action moved it. That is the layer KPI Tree adds, and it grows more valuable as the substrate below it becomes a commodity.

causal · q < 0.05lag 3dq < 0.01Revenue-15%Conversion-23%Traffic+2%AOV-4%Checkout-31%PricingPaidOrganicBasket sizeDiscountsPayment errorsPage speed

Every source resolves onto one causal tree.

No dbt Cloud subscription, no dbt Cloud API

Teams on dbt Core get full semantic-layer consumption with no extra SaaS dependency. KPI Tree renders the SQL from your semantic manifest itself, so your open-source investment is all you need. If you later migrate to dbt Cloud, there is a dedicated dbt Cloud integration that connects through the Semantic Layer API instead.

A causal layer, not a flat metric list

A dashboard shows what happened. KPI Tree shows why. Your dbt metrics become a tree where every edge carries a confidence level from statistical tests, not a hand-drawn diagram or a graph-walk. When a number moves unexpectedly, you trace the cause through the tree instead of guessing.

Owned, routed, and verified action

dbt governs how metrics are calculated. KPI Tree adds who owns each one, routes the anomaly to that person on the channel they actually read, and verifies whether their action moved the number against the baseline. Every tool claims insights to action; KPI Tree closes the loop and shows the proof.

Related integrations. More sources that work with KPI Tree.

Common questions

Do I need a dbt Cloud subscription?
No. KPI Tree works directly with your dbt Core project. It renders the metric SQL from your semantic manifest itself, so there is no dependency on dbt Cloud or its Semantic Layer API. If you later migrate to dbt Cloud, KPI Tree has a dedicated dbt Cloud integration that connects through the Semantic Layer API instead.
Which versions of dbt Core are supported?
dbt Core 1.6 or later, the point at which MetricFlow and the semantic manifest were introduced. KPI Tree reads both manifest shapes, the measures-based format from earlier releases and the simpler metric-with-aggregation format from newer ones, so it follows your dbt version rather than pinning you to one.
Where does the metric SQL actually run?
On your own warehouse. A dbt Core connection holds the definitions but does not execute anything, so you link a warehouse connection where the compiled SQL runs. KPI Tree renders each metric as MetricFlow SQL in that warehouse's dialect, runs one aggregation query per metric on your schedule, and computes every comparison, rollup, correlation, and drill-down off-warehouse in its own engine.
Does KPI Tree respect my metric's aggregation?
Yes. The aggregation type is read directly from your dbt model, so sum, average, first, and last behave exactly as defined, including a First Value aggregation for point-in-time metrics. You never re-declare aggregations in KPI Tree.
How does the automatic sync work?
When you create the connection, the wizard hands you a GitHub Actions workflow ready to commit. On each push to main it runs dbt build and posts the artifacts to the KPI Tree API. Your workspace domain and connection ID travel as workflow variables, which leaves one scoped API key as the sole repository secret. Your definitions then stay synchronised with every merge.
What happens when my dbt project changes?
Each sync compares the incoming manifest against the previous version. Anything new appears as a fresh metric, anything deleted is flagged rather than silently dropped, and edited definitions carry their changes through. Your existing tree structures, ownership assignments, and action history are preserved.
Which warehouses can KPI Tree run the metric SQL against?
The linked warehouse connection can be Snowflake, BigQuery, Databricks, Redshift, or PostgreSQL. KPI Tree renders the MetricFlow SQL in that warehouse's dialect, so your models keep running wherever they already materialise.
How do dimension breakdowns work?
When enabled, KPI Tree reads each metric's dimensions from your dbt project, queries their distinct values on your warehouse, and generates a child metric for each one. Revenue with a Region dimension becomes Revenue (Region: EMEA), Revenue (Region: APAC), and so on. High-cardinality dimensions are detected and skipped automatically to keep trees navigable.
Can I also upload the standard manifest.json?
Yes. Including manifest.json alongside the semantic manifest, for example as a ZIP of your target/ directory, unlocks data model exploration: upstream tables, columns, and DAG lineage. It gives your team visibility into where each metric comes from at the model level. Metric sync itself is driven entirely by the semantic manifest.
Should I use this or the dbt Cloud integration?
If you have a dbt Cloud Team or Enterprise plan, use the dbt Cloud integration. It connects directly to the Semantic Layer API and needs no manifest uploads. This integration is for teams running dbt Core without dbt Cloud.

Your dbt metrics already exist. Now give them causal structure, ownership, and a closed loop.

Connect your dbt Core project to KPI Tree. It renders the SQL against your own warehouse, imports every governed definition, and adds statistically significant drivers, RACI ownership, and verified impact in minutes. No dbt Cloud required.

Experience That Matters

Built by a team that's been in your shoes

Our team brings deep experience from leading Data, Growth and People teams at some of the fastest growing scaleups in Europe through to IPO and beyond. We've faced the same challenges you're facing now.

Checkout.com
Planet
UK Government
Travelex
BT
Sainsbury's
Goldman Sachs
Dojo
Redpin
Farfetch
Just Eat for Business