Snowflake Semantic Views logoSnowflake Semantic Views integration

Your Snowflake Semantic View defines the metric. KPI Tree explains the movement, names the owner and proves the fix.

Pick a Semantic View on your Snowflake connection. KPI Tree reads every metric it defines, queries each one through SEMANTIC_VIEW() so Snowflake computes the value, and creates a child metric for every dimension value you care about.

What Snowflake Semantic Views are, and where they stop.

Snowflake’s semantic layer, defined in the warehouse itself.

A Snowflake Semantic View is a schema-level object that declares the business meaning of your tables: the logical tables, the dimensions, the facts and the metrics, with each metric as an aggregation expression over the tables it joins. It is Snowflake's semantic layer. Cortex Analyst, Cortex Agents and Snowflake CoWork read it to answer questions, and any SQL client can query it with the SEMANTIC_VIEW() table function, so every tool gets the same governed number.

It settles what Revenue is. It does not say why Revenue fell, who owns the driver, or whether the fix worked. Those questions live in a layer above the semantic layer, and that is the layer this integration adds. The definition stays in Snowflake and Snowflake keeps doing the maths. The causal tree, the owners and the verified outcomes live in KPI Tree, and Canopy hands all of it to your people and your agents.

Governed in Snowflake. Explained in KPI Tree. One Semantic View, the whole loop.

The sync runs on your existing Snowflake connection. KPI Tree lists the Semantic Views in the connection's default database, reads the one you pick with DESCRIBE SEMANTIC VIEW, and turns every metric and derived metric into a tracked metric queried through SEMANTIC_VIEW() at day grain. Snowflake computes every value, so the number here is the number your Semantic View gives Cortex Analyst and every other consumer. dbt metrics that build into Snowflake can sit on the same tree.

What your Semantic View does not know is why Revenue fell, who owns Conversion, or whether Monday's release moved it. That is the layer KPI Tree adds: a causal metric tree re-tested every night, RACI ownership on every node, action plans measured against a forecast, and Canopy, the business context layer that hands all of it to your people and to the agents they already use over MCP. Your Semantic View stays the single source of truth for how a metric is calculated. KPI Tree becomes the source of truth for what to do about it.

Every metric, as defined, nothing re-declared

Metrics and derived metrics come across with their expressions, and the dimensions each one can be grouped by, read with SHOW SEMANTIC DIMENSIONS. The rollup for weeks and months is inferred from each expression and you can change it in KPI Tree without touching the view.

Sync a Semantic View

Create Dimension Metrics · on
Semantic ViewANALYTICS.MARTS.SALES_SV

DESCRIBE SEMANTIC VIEW analytics.marts.sales_sv

METRICrevenueSUM(order_total)sum
METRICordersCOUNT(order_id)sum
DERIVED_METRICaovrevenue / orderslast
DIMENSIONregionVARCHAR
DIMENSIONorder_dateDATEday grain

Snowflake computes every value. Rollup inferred from each expression.

One query per metric, everything else in memory

Each metric is one SEMANTIC_VIEW() query at day grain, returned as Arrow and cached. Comparisons, rollups, breakdowns and the nightly correlation and causality sweep run in KPI Tree’s own engine, so the credit bill stays flat as the tree grows.

Warehouse queries · last sync

4 total
Revenue1 query · 1.8s · 412 rows
Orders1 query · 1.2s · 412 rows
Average order value1 query · 1.6s · 412 rows
Active customers1 query · 2.3s · 412 rows

0 warehouse queries for

period comparisons, weekly and monthly rollups, dimension breakdowns, nightly correlation and causality tests. All computed in memory from those four results.

Dimension metrics, created automatically

Switch on Create Dimension Metrics and every dimension you chose becomes a child metric per value: Revenue (Region: EMEA), Revenue (Region: APAC), and so on, filtered inside the SEMANTIC_VIEW() call so Snowflake still does the maths. Each child gets its own owner, baseline and nightly driver tests.

Revenue

Create Dimension Metrics · on

dimensions: region, channel · 5 child metrics created

Revenue (Region: EMEA)£612k4%
Revenue (Region: APAC)£318k21%
Revenue (Region: UK)£350k2%
Revenue (Channel: Web)£880k1%
Revenue (Channel: App)£400k9%

Each child has its own owner, baseline and nightly driver tests. No YAML changes.

Re-sync as a diff, trees and owners untouched

Every sync is compared with the last. New metrics appear, changed ones update in place, removed ones retire with their history kept. Ownership, trees, action history and any rollup you set by hand stay exactly where you left them.

Sync summary

Completed 06:14

42

Found

3

Created

38

Updated

1

Archived

0

Skipped

Dimension metrics created118

customer__customer_id skipped: 48,211 values, above the 50 value limit

Trees, owners and action history preserved · gross_margin renamed in place

Connected in three steps. The connection you already have, the view you already govern.

The sync rides on an existing Snowflake connection. Grant SELECT on the view, pick it from the list, and Snowflake does the rest.

Grant SELECT on your Semantic Views

The connection wizard’s setup SQL already grants SELECT on all current and future Semantic Views in the connection’s default database. If your connection predates that, run the two grants and you are done. The sync only ever reads.
  • SELECT on current and future Semantic Views
  • The connection’s default database is where the sync looks
  • The same read-only role, the same network policy
grants.sqltwo statements

GRANT SELECT ON ALL SEMANTIC VIEWS IN DATABASE ANALYTICS TO ROLE KPITREE_ROLE;

GRANT SELECT ON FUTURE SEMANTIC VIEWS IN DATABASE ANALYTICS TO ROLE KPITREE_ROLE;

-- Then, on sync:

SHOW SEMANTIC VIEWS IN DATABASE ANALYTICS;

DESCRIBE SEMANTIC VIEW analytics.marts.sales_sv;

SHOW SEMANTIC DIMENSIONS IN analytics.marts.sales_sv FOR METRIC orders.revenue;

Pick a view and sync

KPI Tree lists the Semantic Views it can see and reads the one you choose with DESCRIBE SEMANTIC VIEW. Choose the metrics and dimensions to keep on the Metrics tab, switch on Create Dimension Metrics if you want breakdowns, and start the sync. It runs as a background job and reports what it created, updated, retired and skipped, one view per run.
  • Views discovered for you, chosen from a list
  • Selective sync: pick metrics and dimensions one at a time
  • Runs as a background job, so large views complete reliably

Sync a Semantic View

Create Dimension Metrics · on
Semantic ViewANALYTICS.MARTS.SALES_SV

DESCRIBE SEMANTIC VIEW analytics.marts.sales_sv

METRICrevenueSUM(order_total)sum
METRICordersCOUNT(order_id)sum
DERIVED_METRICaovrevenue / orderslast
DIMENSIONregionVARCHAR
DIMENSIONorder_dateDATEday grain

Snowflake computes every value. Rollup inferred from each expression.

Snowflake does the maths

Each metric becomes one SEMANTIC_VIEW() query grouped by the view’s date dimension. Dimension metrics carry their filter inside the call. Snowflake computes every value under your role, so the numbers match what Cortex Analyst and every other consumer of the view returns.
  • Native SEMANTIC_VIEW() queries, one per metric
  • Day grain from the view’s DATE or TIMESTAMP dimension
  • Results returned as Arrow, deep-linked to query history
revenue.sqlrun by Snowflake

-- One query per metric, at day grain, run by Snowflake

SELECT order_date AS metric_date,

revenue AS metric_value

FROM SEMANTIC_VIEW(

analytics.marts.sales_sv

METRICS orders.revenue

DIMENSIONS orders.order_date

)

ORDER BY metric_date;

What comes across from a Semantic View. And what stays exactly where it is.

The view carries everything KPI Tree needs to query a metric. Snowflake keeps the calculation. Nothing is written back.

Metrics and derived metrics with their expressions

Every metric with a DATE or TIMESTAMP dimension to group by. Metrics with no date axis are reported as skipped rather than guessed at. Facts, comments and synonyms are not read yet, and the metric name is what appears in KPI Tree.

Dimensions child metrics created for you

The dimensions each metric can be grouped by, read with SHOW SEMANTIC DIMENSIONS. Pick the ones that matter, up to five per metric, and KPI Tree probes their distinct values and creates a child metric per value, within a cardinality limit of 15 by default, adjustable between 2 and 200.

Rollups inferred, then yours

A Semantic View carries no rollup rule, so KPI Tree infers one from each expression: sums and counts add up across weeks and months, averages, ratios and distinct counts take the latest value, min and max carry through. The sync report shows every inference, and a rollup you set by hand is never overwritten.

Ask an agent the same question twice. Once on Cortex Analyst, once on Canopy above it.

You already have Cortex Analyst on this Semantic View, and it comes back with a governed number. The fair question is what Canopy adds. The pair below shows the shape of the difference, and the benchmark beneath it measures exactly this: Cortex Analyst on a semantic model against Canopy on Snowflake Semantic Views, on eight real business questions.

The semantic layer alone

A correct number, and a dead end.

Cortex Analyst on a Semantic View gets the definition right every time. It does not get the cause, the owner or the follow-up, so the question goes back to the data team.

Why is revenue down this month?
Revenue is £1.28m month to date, 15% below last month. The metric is defined as the sum of order_total where status is complete.
I do not have information about what caused the change or who is responsible. Would you like me to break it down by region?

Canopy on top of dbt

The driver, the owner, the build check and the next step.

Canopy reads the causal tree, the RACI, the build history from your dbt artifacts and the open tasks, so the first answer is the one people act on.

Why is revenue down this month?
Conversion rate is the driver, down 23%, Granger-causal at a three day lag. Traffic and order value are flat. The drop starts the day after Monday's checkout release.
The data is sound: fct_orders built at 06:12 and every source passed freshness. Sarah Chen is Accountable and a rollback task is already open. Shall I attach this analysis to it?
driver · q < 0.05owner · Sarah Chenbuild · freshtask · open

Part of the Snowflake integration. SQL metrics and Cortex Analyst on the same connection, dbt beside it.

The Snowflake page covers the connection, the generated setup SQL, SQL metrics and Cortex Analyst drafts. If your definitions live in dbt and build into Snowflake, the dbt Semantic Layer integration reads them and runs the SQL on this same warehouse.

Common questions

What is a Snowflake Semantic View?

A schema-level object in Snowflake that declares the business meaning of your tables: logical tables, dimensions, facts and metrics, with each metric as an aggregation expression. It is Snowflake’s semantic layer. Cortex Analyst reads it to answer questions, and any SQL client can query it with the SEMANTIC_VIEW() table function, so every consumer computes the same number.

What do I need before I can sync a Semantic View?

A Snowflake connection whose role has SELECT on the view. The wizard’s setup SQL grants SELECT on all current and future Semantic Views in the connection’s default database. The sync uses the same read-only role and network policy as the connection.

How does the sync turn a Semantic View into metrics?

KPI Tree runs SHOW SEMANTIC VIEWS in the connection’s default database, lists them for you to pick from, and reads the chosen view with DESCRIBE SEMANTIC VIEW and SHOW SEMANTIC DIMENSIONS. Every metric and derived metric with a date dimension becomes a tracked metric, queried through a native SEMANTIC_VIEW() call at day grain. Snowflake computes every value.

Does the sync scan every database on the connection?

No. Discovery looks in the default database set on the Snowflake connection, and each sync run handles one view. If your Semantic Views live elsewhere, point the connection’s default database at them, and sync each view you want.

How does KPI Tree decide whether to sum or take the last value across a week or a month?

A Semantic View carries no rollup rule, so KPI Tree infers one from each metric’s expression: sums and counts add up across weeks and months, averages, ratios, distinct counts and derived metrics take the latest value, and min and max carry through. The sync report shows every inference, and a rollup you set by hand in KPI Tree is never overwritten by a later sync.

What are dimension metrics?

With Create Dimension Metrics on, KPI Tree probes the distinct values of each dimension you chose and creates a child metric per value, filtered inside the SEMANTIC_VIEW() call, so Revenue with a Region dimension gains Revenue (Region: EMEA), Revenue (Region: APAC) and so on, each with its own owner, baseline and nightly driver tests. Up to five dimensions per metric are expanded, and a dimension with more distinct values than the limit, 15 by default and adjustable between 2 and 200, is skipped and reported.

Are comments, synonyms, facts and verified queries read?

Not at present. The sync reads metrics, derived metrics, dimensions and their expressions and types. Facts are not turned into metrics, comments and synonyms are not imported, and Cortex Analyst verified queries are not used. Descriptions can be added in KPI Tree and survive re-syncs.

Can I use Cortex Analyst alongside a Semantic View?

Yes. On the same Snowflake connection the metric editor has a Cortex mode: describe a metric in plain English, choose a Semantic View, and Cortex Analyst drafts the SQL, which KPI Tree runs on your warehouse for you to review before saving. Semantic View sync covers the governed metrics; Cortex covers the ad hoc ones.

What happens when the Semantic View changes?

Sync it again from the connection page. The run is compared with the previous one and the report lists what was created, updated, retired and skipped. Trees, ownership, action history and any rollup you set by hand are preserved.

How does this affect my Snowflake costs?

One SEMANTIC_VIEW() query per metric on your schedule, returned as Arrow and cached for a TTL you set. Every comparison, rollup, correlation and drill-down runs in KPI Tree’s own engine, so exploration adds no Snowflake load. A small dedicated warehouse keeps the sync traffic on its own line of the bill.

Can Semantic View metrics share a tree with dbt or SQL metrics?

Yes. Metrics from Semantic Views, from SQL on the same Snowflake connection, from dbt and from other warehouses all sit on the same tree, each keeping its own calculation source.

Related integrations. More sources that work with KPI Tree.

You governed the definition. Now govern the decision.

Sync a Snowflake Semantic View and see your own metrics as a causal tree with named owners and verified actions, in a demo on your data.

The guide

Semantic layer vs business context layer: what a definition settles, and what it cannot.

Read the guide

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