When the number is real enough
Analytics is a stack, not a dashboard
Ask → name → define → consume
Question, grain, truth layer, and consume path are layers. Tools are lanes. Most teams need fewer products than the roadmap implies — add complexity only when the decision actually requires it.
ASKQuestion — what decision does this number serve?GRAINUnit — customer, account, day, claim… named onceTRUTHDefinitions — where the number becomes officialUSEConsume — notebook, model, scorecard, or APIProblem → use → example
| If the real problem is… | Use | Example case |
|---|---|---|
| Nobody agrees what “active customer” means | Metrics / semantic layer | One definition of active_30d owned upstream; every BI tool and notebook reads it — no local COUNT DISTINCT remixes |
| Raw dumps keep breaking Monday reports | Curated / gold tables | SQL or Python builds a typed fact table with tests; dashboards read gold, not the landing zone |
| Shape of the question is still fuzzy | Notebook + SQL | Spike in churn last week — slice in a notebook first; graduate joins and metrics only after the grain holds |
| Leadership needs a cold-open decision pack | Scorecard / KPI pack | Five measures, one page, named owner; exploration dashboards stay off this path |
| Self-serve without rewriting business rules in every report | Governed semantic model | Star schema + measures in the model; pages compose, they don’t redefine PD or ECL |
| Heavy joins or volume that local SQL can’t finish | Warehouse / lakehouse | Multi-year transaction history for RFM; compute close to storage, publish a narrow gold table out |
| Fast local analysis that still needs to share | DuckDB / MotherDuck | Parquet on disk for a credit cohort study; push the reproducible query, not a mystery workbook |
| Regulated / risk number must be auditable | Versioned inputs + assumptions | PD scorecard run: freeze feature store cut, document exclusions, store the model ID next to the ECL output |
| One-off exec ask by Friday | Spreadsheet (then graduate) | Board slide number from a controlled extract; if it recurs twice, promote grain + definition to gold |
| Don’t know if the number moved for the right reason | Reconciliation / lineage | Compare source counts vs gold vs semantic measure; block publish when the gap has no named cause |
| Ops needs near-now status, not last night’s batch | Near-real-time path | Queue depth and fail rate on a 5-minute lag; keep strategic KPIs on the batch truth layer |
Default build order: name the question and grain → curated tables with tests → shared definitions → consume surface → lineage/reconcile before you scale tools.
Tool picker
dbtVersioned transforms + tests as code
DatabricksVolume, lakehouse, shared compute
Semantic layerShared metrics across tools
OpenLineageWhere did this number come from?
Definition vs report
Definitions · travel
Grain, keys, and measures that other systems can reuse. Own them upstream of any single dashboard.
Reports · compose
Layout and audience. A page should not invent PD, ECL, or “active” — it should bind to named definitions.
Memory check
ASK = decision. GRAIN = unit. TRUTH = official number. USE = how humans see it.
Ladder + gates
- Named question + grain
- Trusted extract / spreadsheet (time-boxed)
- Curated tables + tests
- Shared definitions / semantic model
- Scorecard or governed self-serve
- Lineage + reconcile before scale
Kill switch
If you can’t name the grain, the owner, and how to stop a bad publish, you don’t ship the number.
Anti-patterns
- Dashboard first, question never
- Redefining metrics inside every report
- Landing-zone tables as the semantic layer
- Tool shopping before grain is named
- Treating Excel as forever when it recurs
- Real-time paths for strategic KPIs
- Unowned “source of truth” with no tests
- Publishing when reconcile gaps are unexplained
Always on
SecurityWho can see and change the number
GovernanceNamed owner of grain and definitions
ObservabilityLineage from source to published measure
EvalsTests on gold before a number ships
Human ApproveStop a bad publish; unexplained gaps stay dark