The pitch for a semantic layer vendor goes like this: your dashboards disagree because metrics are defined in too many places, so let us be the place. Pay us, point your BI tools at our API, and the disagreement disappears. The pitch works because the underlying observation is correct. The conclusion — that you need to buy a product to fix it — is not.
A semantic layer is a contract. A contract does not require a vendor. It requires three things: a single canonical definition for each metric, a single execution path that produces it, and a mechanism that prevents anyone from going around the contract. You can buy these. You can also build them in dbt, ship them in two weeks, and own them forever.
What a semantic layer actually is
Strip away the marketing and a semantic layer is a typed interface in front of your warehouse. revenue.monthly_recurring is defined once, computed one way, and exposed under a stable name. Consumers — dashboards, exports, reverse-ETL — call the interface. They do not reach behind it to assemble the number themselves.
Vendors sell this as a query engine plus a YAML schema plus a governance UI. The query engine matters less than the schema and the governance. The schema is just a directory of metric definitions. The governance is just “you can’t ship a dashboard that bypasses the schema.”
Both are achievable in your existing stack.
The three-folder build
In your dbt project, carve out three top-level folders that mirror the three-tier model: models/source/, models/metrics/, models/consumption/. Wire dbt’s project config so models in consumption/ cannot reference models in source/ directly — only through metrics/. dbt does not enforce this natively; a CI check that parses the manifest and rejects forbidden refs does. Forty lines of Python.
That single constraint is the semantic layer. Everything else is decoration.
In metrics/, every materialized model represents one canonical metric or one conformed dimension. Naming is strict: mrr, arr, active_customers, gross_revenue, net_revenue. The model file contains the definition, the tests, the exclusions, and the changelog comment when the math evolves. One file, one source of truth, one git history per metric.
The contract enforcement
Three controls hold the line. First, the CI check above: consumption cannot bypass metrics. Second, dashboard tooling is configured to read only from a schema named analytics_consumption, which is exactly the materialization target of the consumption layer. Analysts physically cannot point a Looker explore at a raw source model — the credentials don’t permit it. Third, every metric model has a description field and a tag, and your BI tool surfaces those descriptions in the field picker. When someone goes to add “MRR” to a chart, the tooltip shows the exact business definition.
None of this requires a vendor. It requires writing the CI check, scoping the warehouse roles correctly, and using your BI tool’s native description fields.
What you give up
You give up the vendor’s query engine. For most mid-market companies this is fine — your warehouse is already fast enough, and pre-aggregating in the consumption layer covers the cases where it isn’t. You give up the vendor’s governance UI, which means metric reviews happen in pull requests instead of a web app. This is an upgrade, not a downgrade: PRs leave a permanent audit trail in git, run through code review, and don’t require yet another login.
You also give up the option to swap BI tools without re-pointing them. This is the strongest argument for a vendor — if you genuinely expect to change BI tools every two years, a metrics API in front is leverage. Most companies do not change BI tools every two years. They change them every six.
What you gain
You own the contract. You own the execution. The number that lands on the CFO’s dashboard came out of a model file that lives in your git history, was reviewed by a human, and can be diffed against last quarter’s version line by line. There is no vendor between you and your own definitions.
The semantic layer was never a product. It was always a discipline. The product just sells the discipline back to you.