Markdown Editor

Metric Definition Template (KPI)

One certified metric or KPI: question, definition, formula, grain, SQL sketch, filters, targets, owners, certification, MetricFlow type mapping

数据工程与治理标准dbt MetricFlow metric types (Apache-2.0)metricdefinitionmath

使用方法: Use it when a KPI must give the same number wherever it is computed. Fill the plain definition, formula and filters first, then the owners, certification and semantic layer mapping. The main pitfall is hidden dashboard filters that turn one metric into several.

预览

Metric Definition: [Metric name]

Definition of one business metric or KPI, written so that anyone who computes it gets the same number: the question it answers, the plain definition, the formula, grain and dimensions, source tables with a SQL sketch, filters, freshness, targets, caveats, ownership and certification, the mapping to a semantic layer metric type (dbt MetricFlow, Apache-2.0) and change history. Replace every [bracketed] value and every item marked Example. Worked examples use a 30-day customer retention rate at Corvid Commerce, a fictional SaaS retailer.

Document control

FieldValue
Metric ID[MET-RET-030]
Metric name[30-day customer retention rate]
Short name / code[retention_30d]
Document version[1.2]
Status[Proposed / Certified / Deprecated]
Metric type (business)[KPI / Health metric / Guardrail / Diagnostic]
Semantic layer metric type[simple / ratio / cumulative / derived / conversion] (see section 12)
Unit[Percent]
Desired direction[Higher is better]
Business owner[@metric-owner], [team]
Technical owner[@analytics-engineer]
Data steward[@steward]
Certification status[Not certified / Certified / Certification suspended]
Certified by and date[@certifier], YYYY-MM-DD
Next certification reviewYYYY-MM-DD
Certified in[Semantic layer or BI tool name and object]
Semantic model[Semantic model ID, see data/semantic-model-specification]
Approvers/reviewers[@metric-owner], [@steward], [@finance-partner]
Classification[Internal]
Last updatedYYYY-MM-DD

Approvals

RoleNameDecisionDate
Business owner[@name][Approve / Reject]YYYY-MM-DD
Technical owner[@name][Approve / Reject]YYYY-MM-DD
Data steward (certification)[@name][Certify / Reject]YYYY-MM-DD

Revision history

VersionDateAuthorChange summary
1.0YYYY-MM-DD[@name]Example: First certified definition
1.22026-10-24Template maintainersUpdated to add Document control, owner and certification fields, the mapping to MetricFlow metric types, and the Corvid Orders contract IDs
[x.y]YYYY-MM-DD[@name][Change summary]

Contents

1. Business question

[Example: "Are new customers finding enough value to come back within a month of their first purchase? Used by the growth team to judge onboarding changes and by leadership in the monthly business review."]

AudienceDecision informed
Example: Growth teamKeep or roll back onboarding experiments
Example: LeadershipAllocation between acquisition and retention spending
[Audience][Decision]

2. Definition in plain words

[Example: "Of all customers who made their first purchase in a given week, the share who made at least one more purchase within 30 days after that first purchase."]

3. Formula

For a cohort CwC_w of customers whose first purchase falls in week ww, and tct_c the time of customer cc's first purchase:

Retention30(w)=∣{ c∈Cw:∃ purchase by c in (tc,  tc+30 days] }∣∣Cw∣×100%\text{Retention}_{30}(w) = \frac{\left|\{\, c \in C_w : \exists \text{ purchase by } c \text{ in } (t_c,\; t_c + 30\text{ days}] \,\}\right|}{|C_w|} \times 100\%
SymbolMeaning
CwC_wCustomers with first valid purchase in ISO week ww (UTC)
tct_cTimestamp of the first valid purchase of customer cc
Valid purchaseOrder with status not cancelled, see section 6

Worked example: in week 2026-W14, 4 820 customers made a first valid purchase, and 1 470 of them bought again within 30 days, so

Retention30(2026-W14)=1 4704 820×100%≈30.5%\text{Retention}_{30}(\text{2026-W14}) = \frac{1\,470}{4\,820} \times 100\% \approx 30.5\%

Validation: [Example: "The certified implementation reproduces this value for cohorts 2026-W10 to 2026-W14 within 0.1 points of an independent notebook calculation by a second analyst; evidence in ticket ANL-482."]

Edge cases: [Example: "A cohort is reported only after 30 full days have passed for its last member. If ∣Cw∣=0|C_w| = 0 the value is null, not zero."]

4. Grain and dimensions

ItemValue
GrainExample: Weekly first-purchase cohort
Allowed dimensionsExample: Acquisition channel, country, first-order product category, platform
Not allowedExample: Customer age: not reliably collected; small cohorts reveal individuals
Aggregation across dimensionsExample: Recompute from customer level; never average percentages
Minimum cohort size for displayExample: 100 customers

5. Source tables and SQL sketch

TableRoleContract
lakehouse.sales.ordersPurchases (Orders data product, output port orders 2.1.0)corvid-orders-orders
core.customersCustomer attributes, test-account and employee flagscorvid-customers-customers
[Table][Role][Contract]
-- Sketch: 30-day retention by weekly first-purchase cohort (UTC)
WITH valid_orders AS (
  SELECT o.customer_id, o.order_ts
  FROM lakehouse.sales.orders AS o
  JOIN core.customers AS c ON c.customer_id = o.customer_id
  WHERE o.status <> 'cancelled'
    AND c.is_test_account = FALSE
    AND c.is_employee = FALSE
),
first_purchase AS (
  SELECT customer_id, MIN(order_ts) AS first_ts
  FROM valid_orders
  GROUP BY customer_id
),
cohort AS (
  SELECT customer_id, first_ts, DATE_TRUNC('week', first_ts) AS cohort_week
  FROM first_purchase
  WHERE first_ts < CURRENT_TIMESTAMP - INTERVAL '30 days'
),
returned AS (
  SELECT DISTINCT k.customer_id
  FROM cohort AS k
  JOIN valid_orders AS v
    ON v.customer_id = k.customer_id
   AND v.order_ts >  k.first_ts
   AND v.order_ts <= k.first_ts + INTERVAL '30 days'
)
SELECT
  k.cohort_week,
  COUNT(*)                                  AS cohort_size,
  COUNT(r.customer_id)                      AS retained,
  100.0 * COUNT(r.customer_id) / COUNT(*)   AS retention_30d_pct
FROM cohort AS k
LEFT JOIN returned AS r ON r.customer_id = k.customer_id
GROUP BY k.cohort_week
HAVING COUNT(*) >= 100
ORDER BY k.cohort_week;

Note: the cohort filter above excludes customers with fewer than 30 days of history; the published metric additionally drops whole cohort weeks until all members are complete (section 3).

6. Filters and exclusions

IDExclusionReason
EX-01Example: Cancelled ordersNot a completed purchase
EX-02Example: Test and employee accountsNot real customers
EX-03Example: Orders fully refunded within 24 hoursTreated as cancelled by finance policy
EX-04Example: B2B accountsDifferent buying cycle; tracked by MET-RET-B2B
[EX-nn][Exclusion][Reason]

7. Freshness and availability

ItemValue
RefreshExample: Daily by 07:00 UTC
Latency to finalExample: A cohort week is final 37 days after the week starts
Upstream dependencyExample: Orders data product, port orders (contract corvid-orders-orders, previous day complete by 06:00 UTC per SLA-ORD-003), built by pipeline DPS-PIPELINE-001
Restatement policyExample: Final values change only with a definition version change, announced in section 11

8. Targets and thresholds

ItemValueSet byValid until
TargetExample: at least 32% by Q4[@leadership]YYYY-MM-DD
Healthy rangeExample: 28% to 36%[@metric-owner]Ongoing
AlertExample: Weekly value more than 3 points below 8-week median[@analytics]Ongoing
BenchmarkExample: 29.5% average in the previous yearHistorical datan/a

9. Known caveats

  • [Example: Customers who check out as guests get a new customer_id each time, so retention is understated by an estimated 2 to 3 points.]
  • [Example: Cohorts in late November include holiday shoppers who return less often; compare year over year, not week over week.]
  • [Example: Before YYYY-MM-DD, app orders were missing for two days; affected cohorts are flagged.]

10. Related metrics

MetricRelationship
Example: MET-RET-090 90-day retentionLonger-horizon version
Example: MET-ACQ-001 New customersDenominator size; mix shifts can move retention
Example: MET-REV-020 Revenue per retained customerValue of retention
[Metric ID][Relationship]

11. Change log

VersionDateAuthorChangeHistory restated
1.0YYYY-MM-DD[@name]Example: First certified definitionn/a
1.1YYYY-MM-DD[@name]Example: Added EX-03 (refunds within 24 h) after finance reviewYes, from YYYY-MM-DD
[x.y]YYYY-MM-DD[@name][Change][Yes / No]

12. Semantic layer mapping

dbt MetricFlow, the engine behind the dbt Semantic Layer, has been released under the Apache License 2.0 since version 0.209.0. It defines five metric types: simple, ratio, cumulative, derived and conversion. Pick the type that matches the formula in section 3, and record the semantic model it reads from. Exact YAML field names differ between dbt releases, so check docs.getdbt.com for the release you run; other semantic layers use different names for the same ideas.

MetricFlow typeUse whenExample at Corvid Commerce
simpleThe metric aggregates one measure, optionally filteredExample: Count of confirmed orders
ratioThe metric divides one metric by another, each with its own filterExample: Average order value: net revenue divided by order count
cumulativeThe metric accumulates a measure over a window or since a start dateExample: Rolling 28-day active customers
derivedThe metric is an expression over other metrics, including offsets in timeExample: Week-over-week change in net revenue
conversionThe metric counts entities that perform a base event and then a conversion event within a windowExample: Share of first-time buyers who buy again within 30 days
ItemValue
Semantic layer[Example: dbt Semantic Layer with MetricFlow]
Metric object name[retention_30d]
Metric typeExample: conversion (base event: first valid purchase; conversion event: repeat valid purchase; entity: customer; window: 30 days)
Alternative implementationExample: ratio of two simple metrics over a cohort model, if conversion metrics are not available
Base and conversion measuresExample: base measure first_purchases (one per customer, from a first-purchase model); conversion measure repeat_purchases (valid orders after the first)
Input metrics or measures[Names]
Semantic model[ID and link, see data/semantic-model-specification]
Filters implemented in the layerExample: EX-01 to EX-04 from section 6
ValidationExample: Layer output equals the SQL sketch in section 5 within 0.1 points for five recent cohorts

Model the base event as a first-purchase measure, one row per customer, so that the base and conversion events are different measures. If both events read the same "orders" measure, every repeat purchase also counts as a new base event, and the metric becomes "customers who ordered twice within any 30 days" rather than retention of new customers. Check the conversion window boundaries against section 3: the formula excludes the first purchase itself and includes a purchase exactly 30 days later.

When the semantic layer and the SQL sketch disagree, the SQL sketch and the formula in section 3 are the reference until the difference is explained. Record the explanation in the change log, fix whichever side is wrong, and re-run the validation in the table above before the metric keeps its certified status. Keep the semantic layer object name identical to the short name in Document control, so that search, lineage and dashboards find one object.

The Apache Ossie specification (incubating, formerly Open Semantic Interchange) aims to make such definitions portable between tools. Its core specification is a draft as of October 2026; treat it as emerging and check its maturity before relying on it.

13. Ownership and certification

Certification tells readers that the definition is approved, the implementation matches it, and someone is accountable for both. Display the certified metric only from the semantic layer object in the Document control table; dashboards built to the Dashboard Specification (data/dashboard-specification) reference the metric ID instead of copying the formula.

CriterionEvidence required
Definition approved by the business ownerApproval row in Document control
Implementation reproduces section 3Validation record in section 3 and section 12
Source datasets under contractData Contract (data/data-contract) IDs in section 5
Data quality checks in placeRules per the Data Quality Standard (data/data-quality-standard)
Owners and steward namedDocument control

Certification is suspended when a source contract has a breaking change, a critical quality rule fails for more than [2] consecutive days, or the review date passes. Show the suspended state on every dashboard that uses the metric until it is restored.

Standard and licence note

Based on common industry practice for metric and KPI definitions, with metric type names from dbt MetricFlow (Apache License 2.0, https://github.com/dbt-labs/metricflow). Original text written for this collection; no text is copied from dbt documentation. Check the current dbt and MetricFlow documentation for field names before implementing. Template licence: MIT.

相关模板