Project Structure
Sources, staging, intermediate, marts. Naming conventions that survive personnel change. Re-usable macros that don't become a second language.
Models · Macros · SeedsTests, version control, lineage, CI, environments, contracts. dbt turned the data team into a real engineering team — and we've been shipping production dbt projects since it was a command-line tool with no UI.
Not just templated SQL — a proper application with structure, tests, CI and contracts.
Sources, staging, intermediate, marts. Naming conventions that survive personnel change. Re-usable macros that don't become a second language.
Models · Macros · SeedsGeneric + singular tests, dbt contracts with column-level types, freshness SLAs. The pipeline tells you it's broken before the dashboard does.
Tests · Contracts · ExpectationsLineage from source to BI dashboard. Exposures register the dashboards depending on your models — break one, the right Slack channel lights up.
DAG · Exposures · LineagePull-request CI with Slim builds, only modified DAG runs, defer to production state. Faster feedback, lower spend, fewer regressions.
CI · Slim CI · State Deferdbt Semantic Layer for metric definitions consumed by BI, embedded analytics and Vertex / Mosaic models. One definition, many consumers.
Semantic Layer · Metrics · MetricFlowCloud for the team that wants the IDE, scheduler and observability out of the box. Core for the team with strong infra muscle. Either way, opinionated.
Cloud · Core · Airflow · DagsterNaming conventions, layer separation, doc blocks, test density — the boring scaffolding that lets a dbt project hit 1,000+ models without becoming unmaintainable.
The point of dbt isn't SQL — it's the application around the SQL. Naming, layers, contracts, doc blocks: a few conventions, applied consistently, let a team of 12 analysts ship to 12 dashboards a day without breaking each other.
Staging is 1:1 with sources. Intermediate joins. Marts are business-ready. No layer-skipping.
Public-facing models have schemas with types. Breaking the contract is a CI failure, not a Monday morning page.
Every model has tests. unique, not_null, accepted_values, relationships. The tests describe the data better than the doc block.
Dashboards and ML models register as exposures. Lineage runs end-to-end, alerts notify the right team.
The tools we wire around dbt to make it the production system most teams underestimate it to be.
Three quick takes.
Replaced an unowned SQL view sprawl with a layered dbt project, 95% test coverage, Datafold-diff CI, and a quarterly governance review.
MetricFlow definitions wired to Looker, embedded BI, ML feature store and Slack queries. The "what is revenue" Slack thread finally died.
Slim CI defers to production state, only the modified DAG runs in CI, Datafold previews on the PR. Analysts merged 3× more often.
30 minutes. Bring your dbt project (or your view sprawl) — we'll point to the three structural fixes that'll change how the team works.