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

# Qualified Deals: what moves them on

> Qualified Deals: what moves one to a proposal, who owns it, how long it waits and what holds it.

A qualified [Deal](https://startupbuilder.dev/business/nouns/deal) has a value, a close date and a next step. It moves on when a call is held and a [Quote](https://startupbuilder.dev/business/nouns/quote) goes out.

## It moves on when
| To | When | The call | Event |
| --- | --- | --- | --- |
| [Proposed](/revenue/deals/status/proposed) | a call with the buyer was held and a Quote is attached | <Op verb="Deal.propose" /> | `Deal.proposed` |
| [Lost](/revenue/deals/status/lost) | the buyer says no, with a reason | <Op verb="Deal.lose" /> | `Deal.lost` |

## Who owns it
| Title | What it does here |
| --- | --- |
| [AE](/capabilities/how-your-agents-act#ae) | runs the call and drafts the Quote |
| [SE](/capabilities/how-your-agents-act#se) | joins when the buyer asks security or setup questions |

## How long it sits
| Median days in it | Deals | Stall line | Past it now |
| --- | --- | --- | --- |
| `9 d` | `6` | `18 d` | `1` |

The stall line is twice the median, read from each Deal’s `statusSince` · sample

## The call that moves it

```text title="Propose to a Qualified Deal · Ask"
Send Harbor Row its proposal. If a call with the buyer comes first, book it. Send nothing.
```

```ts title="Propose to a Qualified Deal · SDK"
import { $ } from 'startup-builder'

const { deals } = await $.Deal.list({ where: 'status = "Qualified"', sort: 'statusSince' })
await $.Deal.propose({ deal: 'deal_33', quote: 'quote_5' }, { mode: 'try' })   // no call held with Harbor Row
// 422 · Harbor Row’s proposal did not send: no Meeting with the buyer has been held.
// no-meeting-held: Book a call with the buyer and hold it, then send the proposal again. · then Meeting.book
return await $.Meeting.book({ contact: 'contact_22', at: '2026-10-23T16:00:00Z' }, { mode: 'try' })   // the demo with the owner
```

```json title="Propose to a Qualified Deal · Response · sample"
{
  "meeting": {
    "$id": "https://api.sb/leaseline.app/meetings/meeting_17",
    "$type": "Meeting",
    "at": "2026-10-23T16:00:00Z",
    "agenda": "Demo for Harbor Row’s owner: renewals and late-rent reminders"
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_21",
    "operation": "Meeting.book",
    "status": "pending",
    "reason": "awaitingApproval",
    "mode": "try"
  }
}
```

## When it won’t move

```json title="422 · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "Harbor Row’s proposal did not send: no Meeting with the buyer has been held.",
  "checks": [
    {
      "check": "no-meeting-held",
      "status": "fail",
      "observed": "0 Meetings held, 0 booked",
      "doc": "/code/refusals#check-no-meeting-held",
      "fix": "Book a call with the buyer and hold it, then send the proposal again.",
      "then": "Meeting.book"
    }
  ]
}
```

`no-meeting-held` is Not live yet, [gaps #2](/code/reference#not-live-yet); the card renders from the sample.

## Plays that unstick 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. |
| [Trust pack](/plays/trust-pack) | Sends the trust page and prefilled security answers with every large Quote, and releases the security report only after a click-through Agreement. |
| [Written references](/plays/written-references) | Answers a buyer’s reference request within days with a reference an opted-in Customer writes and signs, its credit shown on it. |