---
file: metrics.md
owner_role: <revenue-operations-lead>
approver_role: <head-of-growth>
status: draft
version: 1
effective_from: <YYYY-MM-DD>
last_reviewed: <YYYY-MM-DD>
review_by: <YYYY-MM-DD>
review_cadence: quarterly per metric, and before each board cycle for board metrics
change_triggers: [pricing or plan change, lifecycle stage change, new product line, new data source]
open_items: 0
---

# Metrics

Copy to `martech-context/metrics.md`. Start with three to five metrics that drive recurring decisions. Each metric is a contract: two competent people given the same input must get the same result without negotiating.

When a broad word ("revenue", "conversion", "customer") could mean more than one metric below, ask which one. Do not choose.

Metric IDs: `<base_name>_v<n>`. The base name never changes. The suffix changes only with a change in meaning; a correction that restores the agreed meaning keeps the ID. Cite the full ID.

## Open items

- <metric_id>: <unresolved question> | owner: <role> | due: <YYYY-MM-DD>

## <Display name>

```yaml
metric_id: <base_name>_v1
display_name: <name used in meetings>
status: draft                      # draft | approved | deprecated
last_reviewed: <YYYY-MM-DD>
review_by: <YYYY-MM-DD>
decision: <the recurring decision this number supports>
not_for: <conclusions it must not be used to draw>
entity: <account | workspace | person | order | subscription>
grain: <what exactly is counted once>
numerator: <qualifying rule>
denominator: <qualifying rule>
time_basis: <which timestamp defines the period>
timezone: <IANA zone>
window: <for example created_at inclusive to created_at plus 168 hours exclusive>
maturity: <only cohorts whose full window is inside the complete-data cutoff>
complete_data_cutoff: <how the report knows data has fully arrived>
exclusions:
  - <internal accounts, flagged at creation>
  - <test accounts, flagged at creation>
  - <duplicates, refunds, cancellations>
unknown_inputs: <kept in denominator and reported separately | excluded and counted>
missing_source: <mark result unavailable; never report zero>
zero_denominator: null
segments_overlap: <no | yes: which dimensions can place one entity in several segments>
aggregation: <disjoint segments: sum numerators and denominators, then divide | overlapping segments: recompute from the deduplicated eligible population; never average segment rates>
time_additivity: <additive across time | not additive: closing or average only>
dimensions:
  <dimension>: <fixed at milestone (for example plan at signup) | current value>
  <channel>: <scope: first-user, session or event (GA4 traffic-source scopes), or a named attribution rule; unattributed handling>
not_equivalent_to:
  - <similar metric that must not be substituted>
implementation: <dbt metric name | semantic view and metric | LookML measure | SQL file path>
freshness: <latest complete period the source guarantees>
revision_policy: <when results are provisional; how late data is handled>
business_owner: <role>
technical_owner: <role>
effective_from: <YYYY-MM-DD>
```

Worked example (synthetic, agreed by the business owner):

- <Input records or counts>
- Expected result: <value and the unknown share if relevant>

Acceptance fixtures:

- <record> -> <included in both | denominator only | excluded, reason>
- Boundary: <event exactly at the window end> -> <expected>
- Time zone boundary: <event just after midnight UTC on the 1st> -> <period it falls in, in the metric's time zone>
- Duplicate delivery of the same event -> counted once.
- Missing ID -> <expected>

Changelog:

- <YYYY-MM-DD> <metric_id>: created. Approved by <role>.

## Ad platform conversion actions

Which platform actions count, so platform numbers can be read against the contracts above.

- <platform> | <action name> | <primary | secondary> | used for bidding: <yes | no> | maps to: <metric_id or none> | source: <tag, import, API>

## Targets

Goals change more often than definitions, so they are versioned separately. A target cites the metric ID it applies to.

- <metric_id> | target: <value, for example target CPA USD 150 or target ROAS 400%> | scope: <campaign class, channel, market> | effective: <YYYY-MM-DD> to <YYYY-MM-DD> | set by: <role> | decision: <ID>

## Archive

Superseded versions with `effective_to` and the historical treatment (restated, kept as a separate series, or bridged).
