Skip to content

Won Deals: what moves them on

Won Deals: the first paid Order, the handoff to Onboarding, and the call that starts the Customer.

A won Deal is a buyer who said yes. It becomes a Customer when the first Order is paid, and Onboarding takes it from there.

It moves on when

ToWhenThe callEvent
A paying Customerthe first Order is paidPOST /{namespace}/orders/{order}/payOrder.paid
Onboardingthe Won Deal starts the hub Workflow onboard-customerPOST /{namespace}/customers/{customer}/activateCustomer.activated

Who owns it

TitleWhat it does here
AEhands over the Quote’s promises in the brief
Onboardinggets the Customer to its first outcome by day 14

How long it sits

DealsWindowMedian days to get hereStall line
990 dayssales cycle, Not live yet, gaps #2none: it is a final Deal status

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

The call that moves it

From Won to a paying CustomerMode try
You, to your agent

Maple Street Homes signed. Take their first payment and start onboarding. Charge nothing in this run.

curl "https://api.sb/leaseline.app/deals?where=status%20%3D%20%22Won%22%20and%20statusSince%20%3E%3D%20%222026-07-21%22&total=true" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

curl -X POST "https://api.sb/leaseline.app/orders/order_21/pay?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

curl -X POST "https://api.sb/leaseline.app/customers/customer_47/activate?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"offer":"offer_1"}'
import { $ } from 'startup-builder'

const { deals } = await $.Deal.list({ where: 'status = "Won" and statusSince >= "2026-07-21"', total: true })   // 9 won in 90 days
await $.Order.pay({ order: 'order_21' }, { mode: 'try' })   // the first $29
return await $.Customer.activate({ customer: 'customer_47', offer: 'offer_1' }, { mode: 'try' })   // Onboarding takes it from here, by day 14
npx startup-builder do Deal.list --json '{"where":"status = \"Won\" and statusSince >= \"2026-07-21\"","total":true}'
npx startup-builder do Order.pay --json '{"order":"order_21"}' --try
npx startup-builder do Customer.activate --json '{"customer":"customer_47","offer":"offer_1"}' --try
{
  "name": "do",
  "arguments": {
    "code": "const { deals } = await $.Deal.list({ where: 'status = \"Won\" and statusSince >= \"2026-07-21\"', total: true })   // 9 won in 90 days\nawait $.Order.pay({ order: 'order_21' }, { mode: 'try' })   // the first $29\nreturn await $.Customer.activate({ customer: 'customer_47', offer: 'offer_1' }, { mode: 'try' })   // Onboarding takes it from here, by day 14",
    "mode": "try"
  }
}
Response200application/json
{
  "customer": {
    "$id": "https://api.sb/leaseline.app/customers/customer_47",
    "$type": "Customer",
    "status": "activated",
    "since": "2026-10-19T10:12:00Z",
    "outside": true
  },
  "action": {
    "$id": "https://api.sb/leaseline.app/actions/action_23",
    "operation": "Customer.activate",
    "status": "done",
    "mode": "try"
  }
}
samplePreview

Plays that unstick it

PlayWhat it does
Run it beside the old toolRuns a new Customer’s work beside their old tool every day, fixes each difference you caused, and books the switch when the report reads zero.
Product-led growthGives free Customers enough to reach the result twice, then shows the upgrade inside the task at the Limit, with the real Price.
Waitlist interviewsInterviews each Waitlist signup with your disclosed agent, admits by fit under a published cap, and sends a result built on their company.

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