Upgrades: what moves it
Upgrades is the ARR gained from Customers who paid in both windows and now pay more.
Upgrades is the ARR gained from Customers who paid in both windows and pay more in this one. Grow each Customer moves it.
The number
What moved upgrades 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":"expansion-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 up
return await $.Metric.query({ metric: 'expansion-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":"expansion-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 up\nreturn await $.Metric.query({ metric: 'expansion-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/ expansion-arr",
"$type": "Metric",
"name": "Expansion ARR"
},
"week": "2026-10-19",
"value": 347,
"rows": [
{
"play": "usage-upsell",
"value": 347,
"customers": 1
}
]
}
sample · 1 Not live yetPreview+$347 ARR from upgrades · ■■■■ Clear · n 1 · path → net-new-arr → arr
$.Metric.query({ metric: · sample
| Credited to | This window | Customers |
|---|---|---|
| Usage upsell | +$347 ARR | 1 |
expansion-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 |
|---|---|
| Play | Signal expansion · Shows a growing Customer the seats they already use at the live Price, and names a successor within 5 business days when their champion leaves. |
| Play | Single sign-on upgrade · Answers each single sign-on ask within one business hour with the plan that includes it, and the admin tests sign-in before paying. |
| Play | Usage upsell · Offers the next Offer when a Customer’s use paces past its Limit, with today’s prorated charge; the Customer upgrades in one press. |
| Page | More seats and upgrades |
| Title | CSM |
The leaves
| Under it | Moved by |
|---|---|
hiring-expansion-arr | Signal expansion |
limit-upgrade-arr | Usage upsell |
tier-upgrade-rate | Single sign-on upgrade |
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.