Skip to content

Proposed Deals: what moves them on

Proposed Deals: what closes one, who owns it, how long it sits, and the stall line that marks a quiet one.

A proposed Deal has its Quote. It ends won or lost, and the stall line marks one that goes quiet.

It moves on when

ToWhenThe callEvent
Wonthe buyer accepts the QuotePOST /{namespace}/deals/{deal}/winDeal.won
Lostthe buyer says no, with a reasonPOST /{namespace}/deals/{deal}/loseDeal.lost

Who owns it

TitleWhat it does here
AEcloses it, and holds every Discount approval under your Limit
You, as head of salesapproves a price below the floor

How long it sits

Median days in itDealsStall linePast it now
11 d322 d1

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

The call that moves it

Close a Proposed DealMode try
You, to your agent

Which proposals are stuck, and which can we close today? Mark Maple Street Homes won.

curl "https://api.sb/leaseline.app/deals?where=status%20%3D%20%22Proposed%22&sort=statusSince" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

curl -X PATCH "https://api.sb/leaseline.app/deals/deal_24?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"nextStep":"Call Oakmont Rentals’ owner on Oct 21 about the start date"}'

curl -X POST "https://api.sb/leaseline.app/deals/deal_27/win?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'

const { deals } = await $.Deal.list({ where: 'status = "Proposed"', sort: 'statusSince' })   // Oakmont Rentals has sat 26 days, past the 22-day stall line
await $.Deal.update({ id: 'deal_24', nextStep: 'Call Oakmont Rentals’ owner on Oct 21 about the start date' }, { mode: 'try' })   // a dated next step lifts the stall
return await $.Deal.win({ deal: 'deal_27' }, { mode: 'try' })   // Maple Street Homes signed
npx startup-builder do Deal.list --json '{"where":"status = \"Proposed\"","sort":"statusSince"}'
npx startup-builder do Deal.update --json '{"id":"deal_24","nextStep":"Call Oakmont Rentals’ owner on Oct 21 about the start date"}' --try
npx startup-builder do Deal.win --json '{"deal":"deal_27"}' --try
{
  "name": "do",
  "arguments": {
    "code": "const { deals } = await $.Deal.list({ where: 'status = \"Proposed\"', sort: 'statusSince' })   // Oakmont Rentals has sat 26 days, past the 22-day stall line\nawait $.Deal.update({ id: 'deal_24', nextStep: 'Call Oakmont Rentals’ owner on Oct 21 about the start date' }, { mode: 'try' })   // a dated next step lifts the stall\nreturn await $.Deal.win({ deal: 'deal_27' }, { mode: 'try' })   // Maple Street Homes signed",
    "mode": "try"
  }
}
Response200application/json
{
  "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"
  }
}
samplePreview

When it won’t move

The stall Stop on Oakmont Rentals · Not live yet, gaps #2 · sample
{
  "name": "Campaign.paused",
  "data": {
    "reason": {
      "limit": "stalled-deal",
      "observed": "26 d in Proposed, no dated next step",
      "bound": "22 d",
      "window": "statusSince"
    },
    "on": "deals/deal_24"
  }
}
StopPausesFixThen
stalled-deal · Not live yet, gaps #2every send to the Deal until a person actsAgree a dated next step with the buyer, or lose the Deal with its reason.PATCH /{namespace}/deals/{id}

Plays that unstick it

PlayWhat it does
Risk-reversal offersTakes the risk off the buyer: a written results-or-free bar, a 14-day top-tier trial with no card, a one-press refund and free data moves.
Paid pilotRuns your product on the buyer’s own data for a fee, against pass marks no higher than they already saw, signed before it starts.
Switch kitWins 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.
Closer handoffHands a large Deal that stalled twice to a commissioned closer, paid only on collected revenue, and tests it against the Deals your agent keeps.

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