Downgrades: what moves it
Downgrades is the ARR lost from Customers who still pay, but less than in the last window.
No Play moves this yet. Today the hub runs change-plan; the proposed Play is downgrade-save (Not live yet, gaps #4).
The number
What moved downgrades this week, and which Play moved it?
curl "https://api.sb/leaseline.app/events?where=name%20%3D%20%22Subscription.resized%22%20and%20at%20%3E%3D%20%222026-10-12%22&total=true" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
# Not live yet (gaps #4)
curl -X POST https://api.sb/leaseline.app/metrics/query \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"metric":"contraction-arr","shape":"trend","breakdown":"play","window":"7d"}'import { $ } from 'startup-builder'
const { total } = await $.Event.list({ where: 'name = "Subscription.resized" and at >= "2026-10-12"', total: true }) // seat and plan changes down; Willow Park’s 10 to 6 lands Nov 1
return await $.Metric.query({ metric: 'contraction-arr', shape: 'trend', breakdown: 'play', window: '7d' }) // by the Play credited · Not live yet, gaps #4
npx startup-builder do Event.list --json '{"where":"name = \"Subscription.resized\" and at >= \"2026-10-12\"","total":true}'
npx startup-builder do Metric.query --json '{"metric":"contraction-arr","shape":"trend","breakdown":"play","window":"7d"}' # Not live yet (gaps #4){
"name": "do",
"arguments": {
"code": "const { total } = await $.Event.list({ where: 'name = \"Subscription.resized\" and at >= \"2026-10-12\"', total: true }) // seat and plan changes down; Willow Park’s 10 to 6 lands Nov 1\nreturn await $.Metric.query({ metric: 'contraction-arr', shape: 'trend', breakdown: 'play', window: '7d' }) // by the Play credited · Not live yet, gaps #4"
}
}application/json{
"metric": {
"$id": "https: //api.sb/ leaseline.app/ metrics/ contraction-arr",
"$type": "Metric",
"name": "Contraction ARR"
},
"week": "2026-10-19",
"value": 0,
"rows": [],
"pending": [
{
"customer": "customers/ customer_12",
"from": 10,
"to": 6,
"on": "2026-11-01",
"value": -1388
}
]
}
sample · 1 Not live yetPreview$0 ARR from downgrades · ■■■■ Clear · n 0 · next:
$.Metric.query({ metric: · sample
Nothing moved it in the window: $0 ARR.
contraction-arr is this site’s proposal to the hub (Not live yet, gaps #4), so the figure above is a sample until the hub holds it.
Owner
| Accountable | From |
|---|---|
customer-lead · Customer Lead | the filed bridge item, word for word |
Worked by
| Title | Its queue |
|---|---|
| CSM | POST /{namespace}/tasks/next on the CSM’s queue |
Moved here by
| How | Where |
|---|---|
| Today | the hub Workflow change-plan · Change a plan |
| Proposed Play | downgrade-save · Not live yet, gaps #4 |
| Page | More seats and upgrades |
| Page | When someone cancels |
| Title | CSM |
The leaves
| Under it | Moved by |
|---|---|
| none | no leaf Metric sits under it; its Plays move it directly |
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.