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

# Open Deals: next step, close month, stall line

> Open Deals by Deal status: each count, ARR, median days and the call that moves it, with lost reasons ranked.

Every open [Deal](https://startupbuilder.dev/business/nouns/deal), by Deal status, with its next step, the month the buyer decides and the line where it stalls.

## The record
| Deal status | Deals | ARR | Conversion to Won | Median days | The call that moves it |
| --- | --- | --- | --- | --- | --- |
| [Open](/revenue/deals/status/open) | `8` | `$2,776 ARR` | win rate by Deal status, Not live yet, [gaps #2](/code/reference#not-live-yet) | `6 d, stall at 12 d` | <Op verb="Deal.advance" /> |
| [Qualified](/revenue/deals/status/qualified) | `6` | `$4,128 ARR` | win rate by Deal status, Not live yet, [gaps #2](/code/reference#not-live-yet) | `9 d, stall at 18 d` | <Op verb="Deal.propose" /> |
| [Proposed](/revenue/deals/status/proposed) | `3` | `$1,041 ARR` | win rate by Deal status, Not live yet, [gaps #2](/code/reference#not-live-yet) | `11 d, stall at 22 d` | <Op verb="Deal.win" /> |
| [Won](/revenue/deals/status/won) | `9 in 90 days` | `$5,169 ARR` | none: a final Deal status | sales cycle, Not live yet, [gaps #2](/code/reference#not-live-yet) | <Op verb="Customer.activate" /> |
| [Lost](/revenue/deals/status/lost) | `14 in 90 days` | `$10,996 ARR` | none: a final Deal status | sales cycle, Not live yet, [gaps #2](/code/reference#not-live-yet) | <Op verb="Deal.create" /> |

Count, ARR and median days from `statusSince` · from <Op verb="Deal.list" /> in the window below · sample

<a id="expected-from-open-deals"></a>**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. It is each open Deal’s ARR times its Deal status’s 90-day win rate, and it feeds [the cash projection](https://startupbuilder.dev/business/nouns/forecast).

| 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" /> |

| Lost reason, ranked | 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) |

## Run it

```text title="Move today’s Deals on · Ask"
Show me every Deal by status, then move today’s three on: qualify Birchway Properties, send Pinecrest Lofts its proposal and mark Maple Street Homes won. Send nothing.
```

```ts title="Move today’s Deals on · SDK"
import { $ } from 'startup-builder'

const { facets } = await $.Deal.list({ facets: 'status', total: true })   // count, ARR and median days in status, from statusSince
await $.Deal.advance({ deal: 'deal_36' }, { mode: 'try' })   // Birchway Properties, Open to Qualified
// 422 · Birchway Properties did not move to Qualified: closesOn and nextStep are empty.
// stage-fields: Fill each field the refusal names, then move the Deal on again. · then Deal.update
await $.Deal.update({ id: 'deal_36', closesOn: '2026-11-14', nextStep: 'Demo with the 4 owners on Oct 22' }, { mode: 'try' })   // the two fields the refusal named
await $.Deal.propose({ deal: 'deal_28', quote: 'quote_4' }, { mode: 'try' })   // Pinecrest Lofts, call held Oct 15
return await $.Deal.win({ deal: 'deal_27' }, { mode: 'try' })   // Maple Street Homes signed the $29 plan
```

```json title="Move today’s Deals on · Response · sample"
{
  "deal": {
    "$id": "https://api.sb/leaseline.app/deals/deal_27",
    "$type": "Deal",
    "status": "Won",
    "value": {
      "amount": 348,
      "currency": "USD"
    },
    "closesOn": "2026-10-19",
    "statusSince": "2026-10-19T10:12:00Z",
    "owner": "worker_3"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_15",
    "operation": "Deal.win",
    "status": "done",
    "mode": "try"
  },
  "facets": {
    "status": [
      {
        "value": "Open",
        "deals": 8,
        "arr": 2776,
        "medianDays": 6,
        "stallLine": 12,
        "pastIt": 1
      },
      {
        "value": "Qualified",
        "deals": 6,
        "arr": 4128,
        "medianDays": 9,
        "stallLine": 18,
        "pastIt": 1
      },
      {
        "value": "Proposed",
        "deals": 3,
        "arr": 1041,
        "medianDays": 11,
        "stallLine": 22,
        "pastIt": 1
      },
      {
        "value": "Won",
        "deals": 9,
        "arr": 5169,
        "window": "90d"
      },
      {
        "value": "Lost",
        "deals": 14,
        "arr": 10996,
        "window": "90d"
      }
    ]
  }
}
```

## Refuses when

```json title="422 · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "Birchway Properties did not move to Qualified: closesOn and nextStep are empty.",
  "checks": [
    {
      "check": "stage-fields",
      "status": "fail",
      "observed": "closesOn, nextStep",
      "doc": "/code/refusals#check-stage-fields",
      "fix": "Fill each field the refusal names, then move the Deal on again.",
      "then": "Deal.update"
    }
  ]
}
```

| Code | On | Refuses | Then |
| --- | --- | --- | --- |
| [`stage-fields`](/code/refusals#check-stage-fields) | <Op verb="Deal.advance" /> | a field the next Deal status needs is empty | <Op verb="Deal.update" /> |
| [`no-meeting-held`](/revenue/deals/status/qualified#when-it-wont-move) · Not live yet, [gaps #2](/code/reference#not-live-yet) | <Op verb="Deal.propose" /> | a proposal before any call with the buyer was held | <Op verb="Meeting.book" /> |
| [`stalled-deal`](/revenue/deals/status/proposed#when-it-wont-move) · Stop · Not live yet, [gaps #2](/code/reference#not-live-yet) | every send to the Deal | twice its Deal status’s median days with no dated next step | <Op verb="Deal.update" /> |

## Plays that use it
| Play | What it does |
| --- | --- |
| [Closer handoff](/plays/closer-handoff) | Hands a large Deal that stalled twice to a commissioned closer, paid only on collected revenue, and tests it against the Deals your agent keeps. |
| [Buying committee](/plays/buying-committee) | Writes to 3 or more roles at each named company, one a week, and hands each engaged company to your AE within a day. |
| [Instant response](/plays/instant-response) | Answers every form and email within 5 minutes from your own pages, books the call, starts the trial or hands it to the right person. |
| [Lead reactivation](/plays/lead-reactivation) | Writes once to each old Lead nobody works, only when something new answers what they asked, from their last contact at the Startup. |
| [Switch kit](/plays/switch-kit) | Wins your rival’s users with an importer tested on its exports and a dry run they see first, stating no rival fact without a source. |