URL: /revenue · Id: `page:/revenue`

# Revenue: where ARR moved, and which Deals close next

> From the first reply to ARR.

Where ARR moved this week, and which [Deals](https://startupbuilder.dev/business/nouns/deal) close next. The six moves add up to the change, and your SDR, AE and CSM each get one next step.

```text title="The revenue line · week of 2026-10-19 · sample"
New Customers $2,082 + Won back $0 + Upgrades $347 − Downgrades $0 − Lost Customers $1,041 − One-time sales ending $0 + Not yet traced $0 = ARR added this week +$1,388
Sent by your other Startups: 0 % · ARR $9,021 · target +$1,800 a week
```


```text title="ARR added each week · Ask"
Where did ARR move this week, and which Deals close next?
```

```ts title="ARR added each week · SDK"
import { $ } from 'startup-builder'

return await $.Metric.query({ metric: 'net-new-arr', shape: 'trend', window: '56d' })   // eight Mondays, each split into the six moves · Not live yet, gaps #4
```

```json title="ARR added each week · Response · sample"
{
  "metric": {
    "$id": "https://api.sb/leaseline.app/metrics/net-new-arr",
    "$type": "Metric",
    "name": "Net new ARR"
  },
  "asOf": "2026-10-19T00:00:00Z",
  "rows": [
    {
      "week": "2026-08-31",
      "value": 694
    },
    {
      "week": "2026-09-07",
      "value": 347
    },
    {
      "week": "2026-09-14",
      "value": 1041
    },
    {
      "week": "2026-09-21",
      "value": 347
    },
    {
      "week": "2026-09-28",
      "value": 694
    },
    {
      "week": "2026-10-05",
      "value": 1041
    },
    {
      "week": "2026-10-12",
      "value": 694
    },
    {
      "week": "2026-10-19",
      "value": 1388,
      "newArr": 2082,
      "reactivatedArr": 0,
      "expansionArr": 347,
      "contractionArr": 0,
      "churnedArr": -1041,
      "oneTimeRolloffArr": 0,
      "unexplained": 0,
      "arr": 9021,
      "siblingSourcedShare": 0
    }
  ]
}
```

`+$1,388 ARR added this week · ■■■■ Clear · n 26 Customers · path → arr`

`$.Metric.query({ metric: 'net-new-arr', shape: 'trend', window: '56d' })` · sample

## Monday review
| Move | This week | Worked by |
| --- | --- | --- |
| [New Customers](/revenue/new-arr) | `+$2,082 ARR` | [You, as head of sales](/capabilities/how-your-agents-act#founder) |
| [Won back](/revenue/reactivated-arr) | `$0 ARR` | [Head of customers](/capabilities/how-your-agents-act#head-of-customers) |
| [Upgrades](/revenue/expansion-arr) | `+$347 ARR` | [CSM](/capabilities/how-your-agents-act#csm) |
| [Downgrades](/revenue/contraction-arr) | `$0 ARR` | [CSM](/capabilities/how-your-agents-act#csm) |
| [Lost Customers](/revenue/churned-arr) | `−$1,041 ARR` | [CSM](/capabilities/how-your-agents-act#csm) |
| [One-time sales ending](/revenue/one-time-rolloff-arr) | `$0 ARR` | [Head of customers](/capabilities/how-your-agents-act#head-of-customers) |
| [Not yet traced](/revenue/credit#not-yet-traced) | `$0 ARR` | [You, as head of sales](/capabilities/how-your-agents-act#founder) |
| **ARR added this week** | **`+$1,388 ARR`** | [You, as head of sales](/capabilities/how-your-agents-act#founder) |

**Biggest mover:** [Lost Customers](/revenue/churned-arr), `−$1,041 ARR`: 3 Customers, 2 of them at risk a week earlier. Against your number, the week is `$412 ARR` short of the `+$1,800 ARR` a week it needs.

| Title | Hours this week | What it does | Expected | The call that starts it |
| --- | --- | --- | --- | --- |
| [CSM](/capabilities/how-your-agents-act#csm) | `2 h` | the 4 Customers now at risk, Juniper Homes first: it renews Nov 3 | [Lost Customers](/revenue/churned-arr) better than `−$400 ARR` by Oct 26 | <Op verb="Renewal.open" /> |
| [AE](/capabilities/how-your-agents-act#ae) | `1 h` | Northgate Rentals: approve 30 % off the $2,400 plan on a two-year term | [New Customers](/revenue/new-arr) `+$1,675 ARR` once Northgate Rentals is won | <Op verb="Approval.approve" /> |
| [SDR](/capabilities/how-your-agents-act#sdr) | `1 h` | approve the first wave to the 18 Leads lead reactivation re-opened | [Deals and trials opened](/revenue/opened-deals-and-trials) `+4` by Oct 26 | <Op verb="Approval.approve" /> |

```text title="Monday: the next step for SDR, AE and CSM · Ask"
Where is the number this week, and what do we change? Start the next step for our SDR, AE and CSM in try mode.
```

```ts title="Monday: the next step for SDR, AE and CSM · SDK"
import { $ } from 'startup-builder'

const { renewal } = await $.Renewal.open({ subscription: 'subscription_7' }, { mode: 'try' })   // CSM · 2 h · the 4 Customers now at risk, Juniper Homes first (renews Nov 3)
const discount = await $.Approval.approve({ approval: 'approval_3', note: 'Two-year term' }, { mode: 'try' })   // AE · 1 h · 30 % off for Northgate Rentals on a two-year term
const wave = await $.Approval.approve({ approval: 'approval_5' }, { mode: 'try' })   // SDR · 1 h · the first wave to the 18 re-opened Leads
return await $.Metric.query({ metric: 'net-new-arr', shape: 'trend', window: '7d', breakdown: 'node' })   // the week, by move · Not live yet, gaps #4
```

```json title="Monday: the next step for SDR, AE and CSM · Response · sample"
{
  "week": "2026-10-19",
  "moves": {
    "newArr": 2082,
    "reactivatedArr": 0,
    "expansionArr": 347,
    "contractionArr": 0,
    "churnedArr": -1041,
    "oneTimeRolloffArr": 0,
    "unexplained": 0,
    "netNewArr": 1388,
    "arr": 9021
  },
  "target": {
    "keyResult": "key-results/key_result_1",
    "weekly": 1800,
    "gap": -412
  },
  "biggestMover": {
    "metric": "churned-arr",
    "value": -1041,
    "customers": 3,
    "atRiskAWeekEarlier": 2
  },
  "next": [
    {
      "seat": "csm",
      "hours": 2,
      "call": "Renewal.open",
      "on": "subscriptions/subscription_7",
      "expected": {
        "metric": "churned-arr",
        "above": -400,
        "by": "2026-10-26"
      }
    },
    {
      "seat": "ae",
      "hours": 1,
      "call": "Approval.approve",
      "on": "approvals/approval_3",
      "expected": {
        "metric": "new-arr",
        "add": 1675,
        "when": "deals/deal_31 is won"
      }
    },
    {
      "seat": "sdr",
      "hours": 1,
      "call": "Approval.approve",
      "on": "approvals/approval_5",
      "expected": {
        "metric": "opened-deals-and-trials",
        "add": 4,
        "by": "2026-10-26"
      }
    }
  ]
}
```

The hub runs this review as the Workflow [`monday-role-review`](https://startupbuilder.dev/workflows/processes/role-review/monday-role-review).

## Deal review
| Lost reason | Deals | ARR lost | The Play that answers it |
| --- | --- | --- | --- |
| `price` | `5` | `−$5,827 ARR` | [Risk-reversal offers](/plays/risk-reversal-offers) |
| `no-decision` | `3` | `−$3,087 ARR` | [Buying committee](/plays/buying-committee) |
| `missing-capability` | `2` | `−$694 ARR` | [Lead reactivation](/plays/lead-reactivation) |
| `timing` | `2` | `−$694 ARR` | [Lead nurture](/plays/lead-nurture) |
| `competitor` | `1` | `−$347 ARR` | [Switch kit](/plays/switch-kit) |
| `no-fit` | `1` | `−$347 ARR` | [Positioning tournament](/plays/positioning-tournament) |

The typed reason is Not live yet, [gaps #2](/code/reference#not-live-yet); today <Op verb="Deal.lose" /> keeps the free text, and the window reads it from the `Deal.lost` Events.

```text title="Why Deals were lost · Ask"
Why are we losing deals, and what do we change?
```

```ts title="Why Deals were lost · SDK"
import { $ } from 'startup-builder'

const { events } = await $.Event.list({ where: 'name = "Deal.lost" and at >= "2026-07-21"', limit: 14 })   // 14 Deals lost in 90 days, each with its free-text reason
return await $.Deal.list({ where: 'status = "Lost"', facets: 'lostReason' })   // the typed reason, ranked by ARR · Not live yet, gaps #2
```

```json title="Why Deals were lost · Response · sample"
{
  "total": 14,
  "facets": {
    "lostReason": [
      {
        "value": "price",
        "deals": 5,
        "arr": 5827,
        "answeredBy": "risk-reversal-offers"
      },
      {
        "value": "no-decision",
        "deals": 3,
        "arr": 3087,
        "answeredBy": "buying-committee"
      },
      {
        "value": "missing-capability",
        "deals": 2,
        "arr": 694,
        "answeredBy": "lead-reactivation"
      },
      {
        "value": "timing",
        "deals": 2,
        "arr": 694,
        "answeredBy": "lead-nurture"
      },
      {
        "value": "competitor",
        "deals": 1,
        "arr": 347,
        "answeredBy": "switch-kit"
      },
      {
        "value": "no-fit",
        "deals": 1,
        "arr": 347,
        "answeredBy": "positioning-tournament"
      }
    ]
  }
}
```

## Expected from open Deals
**Expected from open Deals:** `+$1,388 ARR` from `17` open Deals worth `$7,945 ARR` if all were won · Not live yet, [gaps #2](/code/reference#not-live-yet) · sample.

| Deal | Deal status | ARR if won | Buyer decides | Next step | The call that moves it |
| --- | --- | --- | --- | --- | --- |
| `deal_28` | [Proposed](/revenue/deals/status/proposed) | `+$347 ARR` | `2026-10-24` | Pinecrest Lofts: signing call on Oct 22 | <Op verb="Deal.win" /> |
| `deal_33` | [Qualified](/revenue/deals/status/qualified) | `+$347 ARR` | `2026-10-29` | Harbor Row: demo with the owner on Oct 23 | <Op verb="Deal.propose" /> |
| `deal_31` | [Qualified](/revenue/deals/status/qualified) | `+$2,393 ARR` | `2026-10-30` | Northgate Rentals: the two-year Quote once the discount is approved | <Op verb="Deal.propose" /> |
| `deal_35` | [Open](/revenue/deals/status/open) | `+$347 ARR` | `2026-10-31` | Elm Court: security answers by Oct 27 | <Op verb="Deal.advance" /> |

It is each open Deal’s ARR times the 90-day win rate of its Deal status. It feeds [the cash projection](https://startupbuilder.dev/business/nouns/forecast), whose spend state sets what Your Play mix buys.

```text title="Deals likely to close this month · Ask"
Which of my open deals are likely to close this month?
```

```ts title="Deals likely to close this month · SDK"
import { $ } from 'startup-builder'

const { deals } = await $.Deal.list({ where: 'status in ("Open", "Qualified", "Proposed") and closesOn <= "2026-10-31"', sort: 'closesOn' })   // open Deals the buyer expects to decide this month
return await $.Metric.query({ metric: 'weighted-pipeline', shape: 'trend', window: '90d' })   // each open Deal’s ARR times its status’s 90-day odds · Not live yet, gaps #2
```

```json title="Deals likely to close this month · Response · sample"
{
  "deals": [
    {
      "$id": "https://api.sb/leaseline.app/deals/deal_28",
      "$type": "Deal",
      "status": "Proposed",
      "value": {
        "amount": 348,
        "currency": "USD"
      },
      "closesOn": "2026-10-24",
      "statusSince": "2026-10-16T14:10:00Z",
      "nextStep": "Pinecrest Lofts: signing call on Oct 22"
    },
    {
      "$id": "https://api.sb/leaseline.app/deals/deal_33",
      "$type": "Deal",
      "status": "Qualified",
      "value": {
        "amount": 348,
        "currency": "USD"
      },
      "closesOn": "2026-10-29",
      "statusSince": "2026-10-13T09:30:00Z",
      "nextStep": "Harbor Row: demo with the owner on Oct 23"
    },
    {
      "$id": "https://api.sb/leaseline.app/deals/deal_31",
      "$type": "Deal",
      "status": "Qualified",
      "value": {
        "amount": 2400,
        "currency": "USD"
      },
      "closesOn": "2026-10-30",
      "statusSince": "2026-10-15T16:45:00Z",
      "nextStep": "Northgate Rentals: the two-year Quote once the discount is approved"
    },
    {
      "$id": "https://api.sb/leaseline.app/deals/deal_35",
      "$type": "Deal",
      "status": "Open",
      "value": {
        "amount": 348,
        "currency": "USD"
      },
      "closesOn": "2026-10-31",
      "statusSince": "2026-10-17T11:00:00Z",
      "nextStep": "Elm Court: security answers by Oct 27"
    }
  ],
  "expected": {
    "metric": "weighted-pipeline",
    "value": 1388,
    "openDeals": 17,
    "openArr": 7945
  }
}
```

## Seat scorecards

`Your number · 4 of 6 · target 6 by Dec 31 · gap 2 · ■■■□ Likely · n 31`

`$.Metric.query({ metric: 'opened-deals-and-trials', shape: 'trend', window: '7d' })` · sample

| Title | Its number | Now | Target | Short by |
| --- | --- | --- | --- | --- |
| [You, as head of sales](/capabilities/how-your-agents-act#founder) | [ARR added each week](/revenue/net-new-arr) | `+$1,388 ARR` | `+$1,800 ARR` by Dec 31 | `$412 ARR` |
| [SDR](/capabilities/how-your-agents-act#sdr) | [Deals and trials opened](/revenue/opened-deals-and-trials) a week | `4` | `6` by Dec 31 | `2` |
| [AE](/capabilities/how-your-agents-act#ae) | [New paying Customers](/revenue/new-paying-customers) from Deals, a week | `2` | `3` by Dec 31 | `1` |
| [CSM](/capabilities/how-your-agents-act#csm) | [Net revenue retention](/revenue/net-revenue-retention) on its book | `85 %` | `100 %` by Dec 31 | `15 points` |

Coverage, how many times open Deals cover a gap, prints once the hub holds it (Not live yet, [gaps #2](/code/reference#not-live-yet)).

```text title="The SDR, AE and CSM numbers · Ask"
How far am I from my target this quarter?
```

```ts title="The SDR, AE and CSM numbers · SDK"
import { $ } from 'startup-builder'

const { keyResults } = await $.KeyResult.list({ where: 'deadline = "2026-12-31"' })   // the quarter’s four Key Results, three of them held by a seat
return await $.Metric.query({ metric: 'opened-deals-and-trials', shape: 'trend', window: '7d' })   // the SDR’s number this week · Not live yet, gaps #4
```

```json title="The SDR, AE and CSM numbers · Response · sample"
{
  "keyResults": [
    {
      "$id": "https://api.sb/leaseline.app/key-results/key_result_1",
      "$type": "KeyResult",
      "metric": "net-new-arr",
      "baseline": 0,
      "target": 1800,
      "deadline": "2026-12-31",
      "now": 1388
    },
    {
      "$id": "https://api.sb/leaseline.app/key-results/key_result_2",
      "$type": "KeyResult",
      "metric": "opened-deals-and-trials",
      "baseline": 2,
      "target": 6,
      "deadline": "2026-12-31",
      "now": 4,
      "role": "roles/prospector"
    },
    {
      "$id": "https://api.sb/leaseline.app/key-results/key_result_3",
      "$type": "KeyResult",
      "metric": "new-paying-customers",
      "baseline": 1,
      "target": 3,
      "deadline": "2026-12-31",
      "now": 2,
      "role": "roles/sales-lead"
    },
    {
      "$id": "https://api.sb/leaseline.app/key-results/key_result_4",
      "$type": "KeyResult",
      "metric": "net-revenue-retention",
      "baseline": 85,
      "target": 100,
      "deadline": "2026-12-31",
      "now": 85,
      "role": "roles/success-manager"
    }
  ]
}
```

## The tree
| Number | This week | Owner | Worked by |
| --- | --- | --- | --- |
| [ARR](/revenue/arr) | `$9,021 ARR` | `founder` | [You, as head of sales](/capabilities/how-your-agents-act#founder) |
| [ARR added each week](/revenue/net-new-arr) | `+$1,388 ARR` | `founder` | [You, as head of sales](/capabilities/how-your-agents-act#founder) |
| [New Customers](/revenue/new-arr) | `+$2,082 ARR` | `founder` | [You, as head of sales](/capabilities/how-your-agents-act#founder) |
| [People reached](/revenue/icp-reached) | `412` | `marketing-lead` | [Content Lead](/capabilities/how-your-agents-act#content-lead) |
| [New Leads](/revenue/new-leads) | `38` | `marketing-lead` | [SDR](/capabilities/how-your-agents-act#sdr) |
| [Deals and trials opened](/revenue/opened-deals-and-trials) | `11` | `sales-lead` | [SDR](/capabilities/how-your-agents-act#sdr) |
| [New paying Customers](/revenue/new-paying-customers) | `6` | `sales-lead` | [AE](/capabilities/how-your-agents-act#ae) |
| [First order size](/revenue/first-order-arr) | `+$347 ARR` | `sales-lead` | [AE](/capabilities/how-your-agents-act#ae) |
| [Activation rate](/revenue/activation-rate) | `65 %` | `team:product` | [Onboarding](/capabilities/how-your-agents-act#onboarding) |
| [Referred Customers](/revenue/referral-share) | `4 %` | `team:marketing` | [Partnerships](/capabilities/how-your-agents-act#partnerships) |
| [Sent by your other Startups](/revenue/sibling-sourced-share) | `0 %` | `marketing-lead` | [Partnerships](/capabilities/how-your-agents-act#partnerships) |
| [Won back](/revenue/reactivated-arr) | `$0 ARR` | `customer-lead` | [Head of customers](/capabilities/how-your-agents-act#head-of-customers) |
| [Upgrades](/revenue/expansion-arr) | `+$347 ARR` | `customer-lead` | [CSM](/capabilities/how-your-agents-act#csm) |
| [Downgrades](/revenue/contraction-arr) | `$0 ARR` | `customer-lead` | [CSM](/capabilities/how-your-agents-act#csm) |
| [Lost Customers](/revenue/churned-arr) | `−$1,041 ARR` | `customer-lead` | [CSM](/capabilities/how-your-agents-act#csm) |
| [Month 3 retention](/revenue/month-3-retention) | `81 %` | `team:customer` | [Onboarding](/capabilities/how-your-agents-act#onboarding) |
| [One-time sales ending](/revenue/one-time-rolloff-arr) | `$0 ARR` | `customer-lead` | [Head of customers](/capabilities/how-your-agents-act#head-of-customers) |
| [Not yet traced](/revenue/credit#not-yet-traced) | `$0 ARR` | `founder` | [You, as head of sales](/capabilities/how-your-agents-act#founder) |

Each number links its page, with the Plays, pages and title that move it.

## Net revenue retention
| Reading | 90 days | Customers |
| --- | --- | --- |
| [Net revenue retention](/revenue/net-revenue-retention) | `85 %` | `13` |
| The gross line, before upgrades and win-backs (Not live yet, [gaps #4](/code/reference#not-live-yet)) | `69 %` | `13` |
| [`logo-churn`](https://startupbuilder.dev/agents/customer#logo-churn) | `31 %` | `4 of 13` |

`85 % net revenue retention · ■■□□ Early sign · n 13 Customers · 90 days`

`$.Metric.query({ metric: 'net-revenue-retention', shape: 'retention', window: '90d' })` · sample

## Credit
| How they first arrived | New ARR this week |
| --- | --- |
| `outbound` | `+$694 ARR` |
| `direct` | `+$694 ARR` |
| `referral` | `+$347 ARR` |
| `search` | `+$347 ARR` |
| `answer` | `$0 ARR` |
| `ad` | `$0 ARR` |
| `agent` | `$0 ARR` |
| [Not yet traced](/revenue/credit#not-yet-traced) | `$0 ARR` |
| **New Customers** | **`+$2,082 ARR`** |

Credited new ARR plus Not yet traced equals New Customers every week. [Credit](/revenue/credit) splits it by page and by Play.

## Where Deals wait
| Deal status | Deals | Median days in it | Stall line | Past the stall line | The call that moves it |
| --- | --- | --- | --- | --- | --- |
| [Open](/revenue/deals/status/open) | `8` | `6 d` | `12 d` | `1` | <Op verb="Deal.advance" /> |
| [Qualified](/revenue/deals/status/qualified) | `6` | `9 d` | `18 d` | `1` | <Op verb="Deal.propose" /> |
| [Proposed](/revenue/deals/status/proposed) | `3` | `11 d` | `22 d` | `1` | <Op verb="Deal.win" /> |

| Handoff | Window | Waiting now | The call |
| --- | --- | --- | --- |
| Marketing Lead to [SDR](/capabilities/how-your-agents-act#sdr) | answered within 5 minutes | first answer `40 s` on [`first-response-time`](https://startupbuilder.dev/agents/customer#first-response-time); speed to lead is Not live yet, [gaps #6](/code/reference#not-live-yet) | <Op verb="Lead.assign" /> |
| [SDR](/capabilities/how-your-agents-act#sdr) to [AE](/capabilities/how-your-agents-act#ae) | a call booked within 60 minutes of an Interested reply | `1` · the `unanswered-positive` Stop holds it | <Op verb="Meeting.book" /> |
| [AE](/capabilities/how-your-agents-act#ae) to [Onboarding](/capabilities/how-your-agents-act#onboarding) | the Won Deal starts `onboard-customer` | `0` | <Op verb="Customer.activate" /> |
| [CSM](/capabilities/how-your-agents-act#csm) to [AE](/capabilities/how-your-agents-act#ae) | an upgrade signal opens a Deal | `1` | <Op verb="Deal.advance" /> |

Meetings held is Not live yet, [gaps #6](/code/reference#not-live-yet), so no row counts it.

## Your quarter
| Goal or Key Result | Baseline | Now | Target | By |
| --- | --- | --- | --- | --- |
| Reach $25k ARR by year end | `$0` | `$9,021 ARR` | `$25,000 ARR` | `2026-12-31` |
| [ARR added each week](/revenue/net-new-arr), a week | `$0 ARR` | `+$1,388 ARR` | `+$1,800 ARR` | `2026-12-31` |
| [Deals and trials opened](/revenue/opened-deals-and-trials), a week ([SDR](/capabilities/how-your-agents-act#sdr)) | `2` | `4` | `6` | `2026-12-31` |

Ten weeks remain: `$15,979 ARR` to go, `+$1,598 ARR` a week against a Key Result of `+$1,800 ARR`.

```text title="The quarter · Ask"
How far are we from $25k ARR by year end?
```

```ts title="The quarter · SDK"
import { $ } from 'startup-builder'

const goal = await $.Goal.get({ id: 'goal_1' })   // Reach $25k ARR by year end
return await $.KeyResult.get({ id: 'key_result_1' })   // ARR added each week, against 1,800
```

```json title="The quarter · Response · sample"
{
  "$id": "https://api.sb/leaseline.app/key-results/key_result_1",
  "$type": "KeyResult",
  "goal": "goals/goal_1",
  "metric": "net-new-arr",
  "baseline": 0,
  "target": 1800,
  "deadline": "2026-12-31"
}
```

## Offers and Deals
| Page | What it holds | Its first call |
| --- | --- | --- |
| [Offers and trials](/revenue/offers) | the price floor, the trial and the first Order | <Op verb="Offer.publish" /> |
| [Quotes and discount approval](/revenue/quotes) | a Quote below the floor, and your OK on it | <Op verb="Quote.send" /> |
| [Open Deals](/revenue/deals) | every Deal status with its count, ARR and call | <Op verb="Deal.advance" /> |
| [Open](/revenue/deals/status/open) | `8` Deals | <Op verb="Deal.advance" /> |
| [Qualified](/revenue/deals/status/qualified) | `6` Deals | <Op verb="Deal.propose" /> |
| [Proposed](/revenue/deals/status/proposed) | `3` Deals | <Op verb="Deal.win" /> |
| [Won](/revenue/deals/status/won) | `9` Deals in 90 days | <Op verb="Customer.activate" /> |
| [Lost](/revenue/deals/status/lost) | `14` Deals in 90 days | <Op verb="Deal.create" /> |