Skip to content

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

ToWhenThe callEvent
Qualifieda value, a close date and a dated next step are setPOST /{namespace}/deals/{deal}/advanceDeal.advanced
Lostthe buyer says no, with a reasonPOST /{namespace}/deals/{deal}/loseDeal.lost

Who owns it

TitleWhat it does here
SDRopens it from an Interested reply or a form, through POST /{namespace}/leads/{lead}/qualify and POST /{namespace}/leads/{lead}/assign
AEtakes it once POST /{namespace}/deals/{deal}/assign sets owner to a person

How long it sits

Median days in itDealsStall linePast it now
6 d812 d1

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

The call that moves it

Qualify an Open DealMode try
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"
  }
}
Response200application/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"
  }
}
samplePreview

When it won’t move

422RefusedBirchway Properties did not move to Qualified: closesOn and nextStep are empty.
CheckFixThen
stage-fields failFill 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

PlayWhat it does
Instant responseAnswers 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 reactivationWrites once to each old Lead nobody works, only when something new answers what they asked, from their last contact at the Startup.
Buying committeeWrites to 3 or more roles at each named company, one a week, and hands each engaged company to your AE within a day.
Outbound callingA 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.

Contents