Skip to content

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

Month 3 retention
You, to your agent

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"
  }
}
Response200application/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
    }
  ]
}
samplePreview

81 % still paying in month 3 · ■■□□ Early sign · n 16 · path → churned-arr → arr

$.Metric.query({ metric: 'month-3-retention', shape: 'retention', breakdown: 'play', window: '90d' }) · sample

Credited toThis windowCustomers
Run it beside the old tool86 %7
No Play credited78 %9

The hub defines it: month-3-retention. This page adds the Plays and seats that move it.

Owner

AccountableFrom
team:customer · the hub’s Customer team, as the reused id keeps itthe hub Metric, unchanged

Worked by

TitleIts queue
OnboardingPOST /{namespace}/tasks/next on the Onboarding’s queue

Moved here by

HowWhere
PlayRun 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.
PageOnboarding
TitleOnboarding

The leaves

Under itMoved by
cutover-rateRun 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.

Contents