Open Deals: what moves them on
Open Deals: what qualifies one, who owns it, how long it waits and the call that moves it on.
An open Deal has a buyer and a value, and waits to be qualified. Most wait 6 days.
It moves on when
| To | When | The call | Event |
|---|---|---|---|
| Qualified | a value, a close date and a dated next step are set | POST /{namespace}/deals/{deal}/advance | Deal.advanced |
| Lost | the buyer says no, with a reason | POST /{namespace}/deals/{deal}/lose | Deal.lost |
Who owns it
| Title | What it does here |
|---|---|
| SDR | opens it from an Interested reply or a form, through POST /{namespace}/leads/{lead}/qualify and POST /{namespace}/leads/{lead}/assign |
| AE | takes it once POST /{namespace}/deals/{deal}/assign sets owner to a person |
How long it sits
| Median days in it | Deals | Stall line | Past it now |
|---|---|---|---|
6 d | 8 | 12 d | 1 |
The stall line is twice the median, read from each Deal’s statusSince · sample
The call that moves it
You, to your agent
Which open deals are ready to qualify, and what is missing? Move Birchway Properties on.
curl "https://api.sb/leaseline.app/deals?where=status%20%3D%20%22Open%22&sort=statusSince" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
curl -X POST "https://api.sb/leaseline.app/deals/deal_36/advance?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
curl -X PATCH "https://api.sb/leaseline.app/deals/deal_36?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"closesOn":"2026-11-14","nextStep":"Demo with the 4 owners on Oct 22"}'
curl -X POST "https://api.sb/leaseline.app/deals/deal_36/advance?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"import { $ } from 'startup-builder'
const { deals } = await $.Deal.list({ where: 'status = "Open"', sort: 'statusSince' }) // oldest first
await $.Deal.advance({ deal: 'deal_36' }, { mode: 'try' }) // 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' })
return await $.Deal.advance({ deal: 'deal_36' }, { mode: 'try' }) // again, with both fields filled
npx startup-builder do Deal.list --json '{"where":"status = \"Open\"","sort":"statusSince"}'
npx startup-builder do Deal.advance --json '{"deal":"deal_36"}' --try
npx startup-builder do Deal.update --json '{"id":"deal_36","closesOn":"2026-11-14","nextStep":"Demo with the 4 owners on Oct 22"}' --try
npx startup-builder do Deal.advance --json '{"deal":"deal_36"}' --try{
"name": "do",
"arguments": {
"code": "const { deals } = await $.Deal.list({ where: 'status = \"Open\"', sort: 'statusSince' }) // oldest first\nawait $.Deal.advance({ deal: 'deal_36' }, { mode: 'try' }) // Open to Qualified\n// 422 · Birchway Properties did not move to Qualified: closesOn and nextStep are empty.\n// stage-fields: Fill each field the refusal names, then move the Deal on again. · then Deal.update\nawait $.Deal.update({ id: 'deal_36', closesOn: '2026-11-14', nextStep: 'Demo with the 4 owners on Oct 22' }, { mode: 'try' })\nreturn await $.Deal.advance({ deal: 'deal_36' }, { mode: 'try' }) // again, with both fields filled",
"mode": "try"
}
}Response200
application/json{
"deal": {
"$id": "https: //api.sb/ leaseline.app/ deals/ deal_36",
"$type": "Deal",
"status": "Qualified",
"value": {
"amount": 348,
"currency": "USD"
},
"closesOn": "2026-11-14",
"nextStep": "Demo with the 4 owners on Oct 22",
"statusSince": "2026-10-19T09: 41: 00Z",
"owner": "worker_3"
}
}
samplePreviewWhen it won’t move
| Check | Fix | Then |
|---|---|---|
stage-fields fail | Fill each field the refusal names, then move the Deal on again. | PATCH /{namespace}/deals/{id} |
JSON
{
"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"
}
]
}It says no, says why, and names the fix.
Plays that unstick it
| Play | What it does |
|---|---|
| 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 | Writes once to each old Lead nobody works, only when something new answers what they asked, from their last contact at the Startup. |
| 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. |
| Outbound calling | A disclosed voice agent calls back anyone who asks within 60 seconds and answers your number; a person dials every cold call. |
Compiled, not written: edit its page, 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.