Month 3 retention: what moves it
Month 3 retention is the share of a month’s new Customers still paying in their third month.
Month 3 retention is the share of one month’s new Customers still paying in their third month. It feeds the ARR lost when Customers leave.
The number
What moved month 3 retention this week, and which Play moved it?
curl "https://api.sb/leaseline.app/customers?where=since%20%3E%3D%20%222026-07-01%22%20and%20since%20%3C%20%222026-08-01%22&total=true" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
curl -X POST https://api.sb/leaseline.app/metrics/query \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"metric":"month-3-retention","shape":"retention","breakdown":"play","window":"90d"}'import { $ } from 'startup-builder'
const { total } = await $.Customer.list({ where: 'since >= "2026-07-01" and since < "2026-08-01"', total: true }) // the July cohort
return await $.Metric.query({ metric: 'month-3-retention', shape: 'retention', breakdown: 'play', window: '90d' }) // by the Play credited
npx startup-builder do Customer.list --json '{"where":"since >= \"2026-07-01\" and since < \"2026-08-01\"","total":true}'
npx startup-builder do Metric.query --json '{"metric":"month-3-retention","shape":"retention","breakdown":"play","window":"90d"}'{
"name": "do",
"arguments": {
"code": "const { total } = await $.Customer.list({ where: 'since >= \"2026-07-01\" and since < \"2026-08-01\"', total: true }) // the July cohort\nreturn await $.Metric.query({ metric: 'month-3-retention', shape: 'retention', breakdown: 'play', window: '90d' }) // by the Play credited"
}
}application/json{
"metric": {
"$id": "https: //api.sb/ leaseline.app/ metrics/ month-3-retention",
"$type": "Metric",
"name": "Month-3 retention"
},
"cohort": "2026-07",
"value": 81,
"unit": "percent",
"rows": [
{
"play": "run-beside",
"value": 86,
"customers": 7
},
{
"play": null,
"value": 78,
"customers": 9
}
]
}
samplePreview81 % still paying in month 3 · ■■□□ Early sign · n 16 · path → churned-arr → arr
$.Metric.query({ metric: · sample
| Credited to | This window | Customers |
|---|---|---|
| Run it beside the old tool | 86 % | 7 |
| No Play credited | 78 % | 9 |
The hub defines it: month-3-retention. This page adds the Plays and seats that move it.
Owner
| Accountable | From |
|---|---|
team: · the hub’s Customer team, as the reused id keeps it | the hub Metric, unchanged |
Worked by
| Title | Its queue |
|---|---|
| Onboarding | POST /{namespace}/tasks/next on the Onboarding’s queue |
Moved here by
| How | Where |
|---|---|
| Play | Run it beside the old tool · Runs a new Customer’s work beside their old tool every day, fixes each difference you caused, and books the switch when the report reads zero. |
| Page | Onboarding |
| Title | Onboarding |
The leaves
| Under it | Moved by |
|---|---|
cutover-rate | Run it beside the old tool |
Compiled, not written: edit the records it reads (metrics/bridge.ts; cap), then regenerate. Every step runs from a sentence or a line of code. In your words: the CRM words you know, and where each lives here.