The first time I set up dbt, I dumped every model into one folder. Six months later it was unmaintainable. Here’s the structure I use now:
models/
staging/ -- 1:1 with source tables, light renaming
intermediate/-- reusable joins and logic
marts/ -- business-facing tables
Test as you go
The single highest-leverage habit is adding tests from day one:
models:
- name: stg_orders
columns:
- name: order_id
tests: [unique, not_null]
These catch broken assumptions before they reach a dashboard someone trusts.