learn · funnel and metrics
Metric definitions
Every metric defined once.
In Funnel and metrics
rule 1 — One definition · One id, one formula, one window.
rule 2 — Versioned · A changed formula is a new version.
rule 3 — Counts below the minimum · No rate on six people.
what it is, in industry terms
Every number has one definition, one version, and one owner.
Industry names: metric layer, semantic layer, metric store. A metric is a named formula over events, with a window and a grain. Defining it once means a dashboard, the Monday report and an experiment readout can't disagree.
Numerator / denominator — ratio metric · Both sides named as events, with the join between them.
Grain — unit of analysis · What one row of the computation is: touch, lead, post, week.
Window — conversion window · How long after the denominator event the numerator still counts.
Primary — goal metric · What a test tries to move.
Guardrail — counter-metric · Must not get worse while the primary moves.
Diagnostic — driver metric · Explains why a primary moved.
Min sample — reporting threshold · Below it, show the count, not the rate.
how it works
Writing a metric that stays honest.
- A question — in plain words
- Events — numerator + denominator
- Window and grain — per touch, 7 days
- Kind and direction — primary, up
- Min sample — hide noise
- Version 1 — in the catalog
- A question — in plain words
- Events — numerator + denominator
- Window and grain — per touch, 7 days
- Kind and direction — primary, up
- Min sample — hide noise
- Version 1 — in the catalog
A metric is code-reviewed like any other change. Change the formula and the version goes up.
Start with the question — If you can't write the question, drop the metric.
Name both sides as events — Read events from the tracking plan, never a mutable table.
Fix the window and the grain — A reply rate without a window changes every day as late replies arrive.
Choose kind and direction — Primary, guardrail or diagnostic; higher or lower is better.
Set a minimum sample — Rates on 6 people are noise. The report shows counts below it.
Version it — Old readouts stay comparable because they cite the version they used.
the object
The metric definition.
metric
| Field | Type | What it holds |
|---|---|---|
id | string | met.<name> |
version | integer | Bumped on any formula, window or event change. |
question | sentence | |
numerator | event + filter | |
denominator | event + filter | |
join | id | What links the two sides (touch_id, lead_id). |
unit | rate | count | hours | dollars | |
grain | string | |
window | duration | |
kind | primary | guardrail | diagnostic | |
direction | up | down | |
judges_stage | stage | |
rhythm | live | daily | weekly | |
min_sample | integer |
{
"id": "met.reply_rate_7d",
"version": 1,
"question": "Do the messages get answered?",
"numerator": "reply.received within 7 days of touch.sent",
"denominator": "touch.sent",
"join": "touch_id",
"unit": "rate",
"grain": "touch",
"window": "7 days",
"kind": "primary",
"direction": "up",
"judges_stage": "sequence",
"rhythm": "weekly",
"min_sample": 30
}the catalog
All 26 metrics, defined once.
The same definitions the Funnel and metrics page uses.
stage 4 · trigger — 1
diagnostic
Detection lag
How fresh is what we catch?
- formula
- median hours from the source post's own timestamp to capture
- unit
- hours · per signal · lower is better
- window
- at capture · read daily
- events
item_matched
stage 5 · detector — 2
primary
Signal precision
Of what a detector catches, how much is real?
- formula
- matches the founder labels real ÷ matches labeled
- unit
- rate · per detector · higher is better
- window
- 30 days · read weekly
- events
match_labeled
primary
Yield per detector dollar
Which detectors earn their cost?
- formula
- leads (or replies) from a detector's signals ÷ its run cost in dollars
- unit
- rate · per detector · higher is better
- window
- 30 days · read weekly
- events
detector_run_completed, lead events
stage 6 · signal — 1
diagnostic
Judge agreement
Does the match judge agree with the founder?
- formula
- matches where judge verdict = founder label ÷ labeled matches
- unit
- rate · per judge version · higher is better
- window
- 30 days · read weekly
- events
match_judged, match_labeled
stage 7 · lead — 1
diagnostic
Lead accept rate
Does the founder agree the lead fits?
- formula
- leads accepted ÷ leads reviewed (accept, skip, never)
- unit
- rate · per lead · higher is better
- window
- at review · read weekly
- events
lead_reviewed
stage 9 · campaign — 2
primary
Waitlist offer to join
When we point someone at the waitlist, do they join?
- formula
- waitlist sign-ups ÷ leads offered the waitlist
- unit
- rate · per lead · higher is better
- window
- 14 days · read weekly
- events
waitlist offered, signup_created
primary
Campaign lift
What did the campaign cause?
- formula
- conversion in the treatment arm − conversion in the holdout
- unit
- rate · per campaign · higher is better
- window
- campaign window · read weekly
- events
lead_assigned, signup_created
stage 10 · sequence — 8
primary
Reply rate per touch
Do the messages get answered?
- formula
- touches with a reply within 7 days ÷ touches sent
- unit
- rate · per touch · higher is better
- window
- 7 days · read weekly
- events
touch_sent, reply_received
primary
Positive reply rate
Are the answers good ones?
- formula
- replies classed positive or question ÷ touches sent
- unit
- rate · per touch · higher is better
- window
- 7 days · read weekly
- events
reply_received (class)
diagnostic
Time to first reply
How fast do people answer?
- formula
- median hours from touch sent to its first reply
- unit
- hours · per touch · lower is better
- window
- 7 days · read weekly
- events
touch_sent, reply_received
guardrail
Stop requests per 100 touches
Are we annoying people?
- formula
- stop, block or report events ÷ touches sent × 100
- unit
- rate · per touch · lower is better
- window
- 7 days · read daily
- events
negative_feedback
primary
Drafts shipped unedited
How often is the draft good enough as written?
- formula
- drafts decided shipped ÷ drafts decided (shipped, shipped edited, discarded)
- unit
- rate · per draft · higher is better
- window
- at decision · read weekly
- events
draft.decided
diagnostic
Median edit distance
How much does the founder rewrite?
- formula
- median normalized edit distance of drafts shipped edited, split by edit locus (hook, body, ending)
- unit
- rate · per draft · lower is better
- window
- at decision · read weekly
- events
draft.decided
diagnostic
Time to decide
How long does a draft wait on the founder?
- formula
- median seconds from draft generated to decided
- unit
- seconds · per draft · lower is better
- window
- at decision · read weekly
- events
draft.generated, draft.decided
diagnostic
Short-link clicks per touch
Did the message make them click?
- formula
- short-link clicks ÷ touches that carried a link
- unit
- rate · per touch · higher is better
- window
- 7 days · read weekly
- events
link_clicked
stage 11 · funnel — 10
primary
Waitlist joins per week
Are we on pace for the goal?
- unit
- count · per week · higher is better
- window
- 7 days · read weekly
- events
signup_created (waitlist)
diagnostic
Rung conversion
What share of people move from one rung to the next?
- formula
- people reaching rung n+1 ÷ people reaching rung n, among those entering rung n in the window
- unit
- rate · per rung, week · higher is better
- window
- 14 days · read weekly
- events
ladder rung events
diagnostic
Impressions at 24 hours
How far did a post travel?
- formula
- impressions from the 1,440-minute snapshot
- unit
- count · per post · higher is better
- window
- 24 hours · read daily
primary
Profile clicks per 100 impressions
Did the post make people want to know who wrote it?
- formula
- profile clicks ÷ impressions × 100, at the 1,440-minute snapshot
- unit
- rate · per post · higher is better
- window
- 24 hours · read weekly
diagnostic
30-minute forecast error
Does the 30-minute number predict the 7-day number?
- formula
- error of a 7-day impressions forecast made from the 30-minute snapshot
- unit
- rate · per post · lower is better
- window
- 7 days · read weekly
primary
Visit to sign-up
Does the page convert the people we send?
- formula
- sign-ups ÷ visits that carry a touch id
- unit
- rate · per visit · higher is better
- window
- 7 days · read weekly
- events
visit_started, signup_created
primary
Activation within 7 days
Do new sign-ups do the thing that predicts paying?
- formula
- sign-ups with the activation action within 7 days ÷ sign-ups
- unit
- rate · per account · higher is better
- window
- 7 days · read weekly
- events
signup_created, activation_reached
primary
Trial to paid
Do trials become payments?
- formula
- accounts with invoice.paid within 14 days of trial start ÷ trials started
- unit
- rate · per account · higher is better
- window
- 14 days · read weekly
- events
invoice.paid
guardrail
Monthly churn
Are customers leaving?
- formula
- subscriptions canceled in the month ÷ active at the start of the month
- unit
- rate · per month · lower is better
- window
- 1 month · read weekly
- events
customer.subscription.deleted
diagnostic
Failed payment recovery
Do failed payments get recovered?
- formula
- failed invoices later paid ÷ failed invoices
- unit
- rate · per invoice · higher is better
- window
- 14 days · read weekly
- events
invoice.payment_failed, invoice.paid
stage 12 · loop — 1
guardrail
Founder minutes per join
What does each join cost in your time?
- formula
- founder minutes spent (reviewing, editing, sending) ÷ joins
- unit
- minutes · per week · lower is better
- window
- 7 days · read weekly
- events
draft.decided, lead activity
failure modes
How metrics drift away from the truth.
| Failure | Symptom | Catch | Fix |
|---|---|---|---|
| Two definitions | dashboard and report disagree | one id per metric, no copies | read from the catalog only |
| Open window | rates rise for days after the week | window on every rate metric | count only closed windows |
| Denominator drift | rate improves because fewer were counted | show the denominator beside every rate | fix the population definition |
| Silent formula change | a jump with no cause | version shown in reports | bump the version on change |
| Ratio of small numbers | wild swings | min_sample | show counts below the minimum |
data to capture
What this component records, and what that data trains.
record
- each metric definition as versioned code
- each computed value with version, window close time and sample size
label
- metrics aren't labels; primaries are what experiments score
trains
- experiment readouts, the Monday report, alerts
test
- recompute last month from events: same values for the same versions