Deposits before you build
Sells refundable deposits for what you have not built, for 72 hours after one creator post, and builds only past a pass mark set first.
- Step
- Make the sale
- Channel
- Offers and Deals
- Kind
- Partners
- Summary
- startupbuilder.dev
Be our Marketing Lead: take refundable deposits for Leaseline Inspect after one post by our creator partner, 72 hours, three tranches, and build only if 25 outside people put money down. Show me what’s missing; don’t publish.
# Not live yet (gaps #2)
curl -X POST "https://api.sb/leaseline.app/campaigns?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"reserve-drop"}'import { $ } from 'startup-builder'
return await $.Campaign.create({ play: 'reserve-drop' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2
npx startup-builder do Campaign.create --json '{"play":"reserve-drop"}' --try # Not live yet (gaps #2){
"name": "do",
"arguments": {
"code": "return await $.Campaign.create({ play: 'reserve-drop' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2",
"mode": "try"
}
}application/json{
"type": "https: //startupbuilder.dev/ errors/ refused",
"title": "Refused",
"status": 422,
"detail": "reserve-drop can’t start yet: 1 check fails and 2 warn.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "a signed creator Agreement; Inspect has a build plan",
"doc": "/plays/ reserve-drop#check-use-when",
"fix": "Sign one creator whose audience buys from you, or run creator-probe.",
"then": "Metric.query"
},
…
Hand the drop at its close to the Marketing Lead agent and show me what it chose and why. Don’t capture.
curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Agreement.signed%22%2C%20%22Post.published%22%2C%20%22Order.placed%22%2C%20%22Order.paid%22%2C%20%22Offer.exhausted%22%2C%20%22Order.started%22%2C%20%22Refund.requested%22%2C%20%22Monitor.checked%22%2C%20%22Claim.flagged%22%2C%20%22Schedule.fired%22%2C%20%22Forecast.slipped%22%2C%20%22Dispute.opened%22%2C%20%22Decision.recorded%22)&limit=1" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
# Not live yet (gaps #7)
curl -X POST "https://api.sb/leaseline.app/triggers/fire?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"like":"event_7088"}'
# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/decisions?where=on%20%3D%20%22offer_14%22" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/actions?where=on%20%3D%20%22offer_14%22" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"import { $ } from 'startup-builder'
const { events: [last] } = await $.Event.list({ where: 'name in ("Agreement.signed", "Post.published", "Order.placed", "Order.paid", "Offer.exhausted", "Order.started", "Refund.requested", "Monitor.checked", "Claim.flagged", "Schedule.fired", "Forecast.slipped", "Dispute.opened", "Decision.recorded")', limit: 1 }) // { play } compiled to this Play’s Trigger Events
const { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' }) // the same Event again, in try mode · Not live yet, gaps #7
const { decisions: [decision] } = await $.Decision.list({ where: `on = "${subject}"` }) // what it chose, and why · Not live yet, gaps #7
const { actions } = await $.Action.list({ where: `on = "${subject}"` }) // what it did, with its checks · Not live yet, gaps #7
return { decision, actions }
npx startup-builder do Event.list --json '{"where":"name in (\"Agreement.signed\", \"Post.published\", \"Order.placed\", \"Order.paid\", \"Offer.exhausted\", \"Order.started\", \"Refund.requested\", \"Monitor.checked\", \"Claim.flagged\", \"Schedule.fired\", \"Forecast.slipped\", \"Dispute.opened\", \"Decision.recorded\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_7088"}' --try # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"offer_14\""}' # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"offer_14\""}' # Not live yet (gaps #7){
"name": "do",
"arguments": {
"code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Agreement.signed\", \"Post.published\", \"Order.placed\", \"Order.paid\", \"Offer.exhausted\", \"Order.started\", \"Refund.requested\", \"Monitor.checked\", \"Claim.flagged\", \"Schedule.fired\", \"Forecast.slipped\", \"Dispute.opened\", \"Decision.recorded\")', limit: 1 }) // { play } compiled to this Play’s Trigger Events\nconst { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' }) // the same Event again, in try mode · Not live yet, gaps #7\nconst { decisions: [decision] } = await $.Decision.list({ where: `on = \"${subject}\"` }) // what it chose, and why · Not live yet, gaps #7\nconst { actions } = await $.Action.list({ where: `on = \"${subject}\"` }) // what it did, with its checks · Not live yet, gaps #7\nreturn { decision, actions }",
"mode": "try"
}
}application/json{
"decision": {
"$id": "https: //api.sb/ leaseline.app/ decisions/ decision_655",
"$type": "Decision",
"choice": "capture-on-pass",
"reason": "34 outside deposits at the 18: 00 Central close on Oct 9, against the pass mark of 25; 3 insider Orders excluded",
"stakes": "medium",
"options": [
"capture-on-pass",
"release-on-miss",
"open-next-tranche",
"pause-checkout",
"refund-first",
"kill-the-drop"
…
sample · 4 Not live yetPreviewOn PATCH /{namespace}/campaigns/{id}Off PATCH /{namespace}/campaigns/{id}Take this one POST /{namespace}/tasks/{task}/claim
action_1 counts outside deposits from Orders, never from the Page. action_2 captures the 34 holds once you approve it, because the stakes are medium. action_3 is each reserver’s receipt, naming the charge as a charge and the ship date of their tranche.
43 net deposits against a pass mark of 25 · before-after,
| Try another: the drop | Choice | Reason |
|---|---|---|
| The close, Oct 9 18:00: 34 outside deposits, pass mark 25 | capture-on-pass | the pass mark met; holds captured |
| Tranche 1 at $39: 20 of 20 sold 19 h after the post | open-next-tranche | sold out inside the window |
| The creator’s TikTok cross-post, T+2 h, with no paid-promotion setting | pause-checkout | a post missing its disclosure |
| A replay at 19 outside deposits by the close | release-on-miss | under the pass mark; every hold released |
- 1.5 h week 1, then 20 min a week
- Your time
- Hour 1: the first deposit held
- First signal
- a creator Agreement, ships within 90 days
- Use it when
Where it sits: Stranger → Lead → Trialing → Activated → At risk → Churned → Won back · Deposits per tranche → New paying Customers → New Customers ↑ → ARR added each week → ARR
Worth’s formula: about 43 net deposits × 0.6 kept after delivery (Other Startups’ results) × $143 Inspect ARR ÷ 2 months between drops ≈ +$1,845. Under First signal: One drop reads at its 72-hour close against the pass mark; ship dates and refunds settle it by Feb 15 plus 30 days.
sample · api.sb/
Start it this week
npx startup-builder add play reserve-drop # 1 · writes plays/reserve-drop.mdx (Not live yet, gaps #5)
# 2 · dry run; below, its 422 on 2026-08-24
curl -X POST "https://api.sb/leaseline.app/campaigns?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"reserve-drop"}'
# 3 · keep it, at You approve the first wave
curl -X POST https://api.sb/leaseline.app/campaigns \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"reserve-drop"}'
# on
curl -X PATCH https://api.sb/leaseline.app/campaigns/reserve-drop \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"endsAt":null}'
# off: checkout pauses; the close time stands and refunds keep running
curl -X PATCH https://api.sb/leaseline.app/campaigns/reserve-drop \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"endsAt":"now"}' | Check | Fix | Then |
|---|---|---|
use-when pass · Not live yet, gaps #8 | Sign one creator whose audience buys from you, or run creator-probe. | POST /{namespace}/metrics/query |
billing-connected pass · Not live yet, gaps #8 | Connect Stripe so holds, captures and refunds are live. | POST /{namespace}/integrations/connect |
ship-date fail | Set tranche 1 to ship within 90 days of the post. | POST /{namespace}/offers/{offer}/publish |
baseline warn · Not live yet, gaps #8 | n 0: one drop reads against its pass mark, not proof. | POST /{namespace}/metrics/query |
role-unstaffed warn · Not live yet, gaps #8 | Staff Partnerships, or leave it: creator fixes and refunds come to you. | POST /{namespace}/roles/{role}/staff |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "reserve-drop can’t start yet: 1 check fails and 2 warn.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "a signed creator Agreement; Inspect has a build plan",
"doc": "/plays/reserve-drop#check-use-when",
"fix": "Sign one creator whose audience buys from you, or run creator-probe.",
"then": "Metric.query"
},
{
"check": "billing-connected",
"status": "pass",
"observed": "Stripe, card holds on",
"doc": "/plays/reserve-drop#check-billing-connected",
"fix": "Connect Stripe so holds, captures and refunds are live.",
"then": "Integration.connect"
},
{
"check": "ship-date",
"status": "fail",
"observed": "tranche 1 ships Mar 2, 120 days after the post",
"doc": "/plays/reserve-drop#check-ship-date",
"fix": "Set tranche 1 to ship within 90 days of the post.",
"then": "Offer.publish"
},
{
"check": "baseline",
"status": "warn",
"observed": "no drop before",
"doc": "/plays/reserve-drop#check-baseline",
"fix": "n 0: one drop reads against its pass mark, not proof.",
"then": "Metric.query"
},
{
"check": "role-unstaffed",
"status": "warn",
"roles": [
"partner-manager",
"billing-specialist"
],
"owned": 0,
"doc": "/plays/reserve-drop#check-role-unstaffed",
"fix": "Staff Partnerships, or leave it: creator fixes and refunds come to you.",
"then": "Role.staff"
}
]
}It says no, says why, and names the fix.
| Check | Fix (one call) | Your time | Wait |
|---|---|---|---|
use-when · baseline · pass: a signed Agreement; warn: no drop before (gaps #8) | POST /{namespace}/metrics/query on deposits-per-tranche; the pass mark stands in for Before | 1 min | none |
billing-connected · pass: Stripe | POST /{namespace}/integrations/connect with system recurring-billing (Stripe) | 0 min | none |
ship-date · fail: tranche 1 at 120 days | POST /{namespace}/offers/{offer}/publish with tranche 1 shipping Dec 15 | 10 min | none |
role-unstaffed · warn (gaps #8): no Partnerships or Billing seat | POST /{namespace}/roles/{role}/staff, or leave it: creator fixes and refunds come to you | 0 min | none |
Your number · Before 25 (the pass mark) · Now 43 net deposits · Target 43 delivered by Feb 15 · before-after,
Holds, captures and refunds cost what Stripe charges per card. The creator’s fee is $400 a drop under the Agreement, and the Page, counts and receipts cost about $3 a drop (Worker cost). That comes to about $400 a drop, one drop per creator audience every 60 days.
When it starts
| When | Trigger id | Starts on | Window | How it gets in |
|---|---|---|---|---|
| A reserver’s card hold succeeds inside the window | drop-hold-placed | event on Order.placed where a card hold on a drop Offer, inside the 72-hour window | counts update within 1 min | Stripe Checkout on the drop Page (POST /{namespace}/integrations/connect) |
| A tranche has no seats left | tranche-sold-out | threshold on Offer.exhausted where seats left = 0 on a tranche | the next tranche opens within 1 h | the Offer’s seat count, from Orders |
| The 72 hours after the creator post end | drop-window-closed | at on Schedule.fired where 72 hours after the creator post's publish time, never moved | decide within 1 h | the close time, written once at the post’s publish time |
+ 11 more for the plan, the creator post, payments, refunds, checkout returns, claims, disclosure, the price step, ship risk, disputes and a kill (?lanes=) |
{
"$id": "https://api.sb/leaseline.app/events/event_7088" ,
"$type": "Event",
"name": "Schedule.fired",
"at": "2026-10-09T23:00:00Z" ,
"seq": 7088,
"data": {
"offer": "offer_14",
"trigger": "drop-window-closed",
"opened": "2026-10-06T23:00:00Z" ,
"outside": 34,
"insider": 3,
"passMark": 25
}
}npx startup-builder trigger Schedule.fired --like event_7088 # replays the close
npx startup-builder clock advance --by 12d # runs the tranche run to day 21 and the step notice on day 15
npx startup-builder listen Order.placed --forward-to http://localhost:3000/hook Who runs it
Marketing Lead · your agent (role:, worker_4) holds the Key Result. Creator fixes go to the Partnerships Role and refunds to the Billing Role, both unstaffed, so you (Dana Okafor, person, worker_1); a capture, a date change and a kill are yours to approve. Your number links to Did it work.
| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
|---|---|---|---|---|---|
| Capture on a pass · Release on a miss | You approve each one | 1 of 1 · 0 | never: money moves | — | POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse |
| Open the next tranche · Pause checkout | It does it | 2 of 2 · 1 of 1 | — | — | POST /{namespace}/actions/{action}/redirect |
| Offer the refund first · Kill the drop | You approve each one | 0 · 0 | never | — | POST /{namespace}/approvals/{approval}/approve |
| Change the pass mark, tranches or dates | Refused after the first Visit | 0 asked | never: plan-lock | — | only a kill changes them |
| Never: a countdown that restarts, a struck-through price, a count typed by hand | Refused, every time | 1 draft refused | never | — | nothing; the Checks hold it |
What it reads · What it may call. It reads Orders, holds and refunds from Stripe, the creator’s live post and the forecast ship dates. Every count on the Page reads from Orders at render time; nothing the drop watches appears in a Message. Its tools are POST /{namespace}/orders/{order}/pay, POST /{namespace}/orders/{order}/cancel, POST /{namespace}/offers/{offer}/publish, POST /{namespace}/actions/{action}/pause, POST /{namespace}/tasks/{task}/assign, POST /{namespace}/orders/{order}/refund, POST /{namespace}/credit-grants/issue, and any other call becomes an Approval under the Role’s Mandate.
You hold the Marketing Lead Key Result: 43 deposits delivered by 2026-02-15. ← worker, metric
On each Trigger, choose one option and say why. ← triggers, chooses
The pass mark is 25 outside deposits in 72 hours; it never moves. ← your file, line 4; plan-lock
The facts block says Not built and the ship date of the tranche on sale. ← copyRules 1
Name a hold a hold and a charge a charge in every receipt. ← copyRules 13
Refunds go first, in cash, and never wait on an Approval. ← tactic reserve-refunds The slow loop. The plan locked at the first Visit, so no Change could touch the pass mark, the tranches or the dates in the window; the drop’s Readout writes its result to Other Startups’ pool for the next one.
Bring your own agent (folded) starts at You approve each one whatever it scores, because captures and refunds move money; POST /{namespace}/roles/{role}/staff seats it.
npx startup-builder eval --scenario reserve-drop-46 --agent "claude -p" --seat marketing-lead # seated: every count from Orders, 0 Checks failed shown, refunds same day · yours: 1 count typed, refused What it can do next
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
|---|---|---|---|---|---|
Capture on a pass capture-on-pass | outside deposits at the close meet the pass mark | Your rule (line 4) | POST /{namespace}/orders/{order}/pay on every hold → drop-reserver | you approve the capture · Take this one | you |
Release on a miss release-on-miss | outside deposits at the close fall short | Your rule (line 4) | POST /{namespace}/orders/{order}/cancel on every hold → drop-reserver says so | you approve the release | you |
Open the next tranche open-next-tranche | a tranche sells out | Your rule (the tranche table) | POST /{namespace}/offers/{offer}/publish on the next tranche → drop-step-notice | nobody | the same |
Pause checkout pause-checkout | a post lacks its disclosure, or a line says it is available | Your rule (the holds) | POST /{namespace}/actions/{action}/pause on checkout → POST /{namespace}/tasks/{task}/assign | Partnerships, so you, due 60 min · Take this one | you, within 60 min |
Offer the refund first refund-first | a tranche forecast to miss its ship date | Agent’s call, with its reason | POST /{namespace}/orders/{order}/refund offered first → drop-reserver with the new date | you approve the new date · Take this one | you |
Kill the drop kill-the-drop | the build cannot ship, with paid reservers | Agent’s call, with its reason | drop-kill-choice: cash first, then one credit (POST /{namespace}/credit-grants/issue) | you approve the kill · Take this one | you |
| When they write back | Fixture reply | What happens | Who answers | By when | Call |
|---|---|---|---|---|---|
| Interested | “Can I reserve 3 seats for my team?” | one seat per Order, at the open tranche’s price; three Orders if they want three | Marketing Lead · your agent | 1 h | POST /{namespace}/conversations/{conversation}/answer |
| Send me pricing | “What does it cost after it ships?” | $12 a month, as the Page states, and the deposit counts toward it | Marketing Lead · your agent | 1 h | POST /{namespace}/conversations/{conversation}/answer |
| Not now | “I’ll wait until it ships.” | nothing more from the drop; one note on the ship date, if they ask for it | nobody | at once | POST /{namespace}/contacts/{contact}/subscribe |
| Wrong person | “Our office manager buys software.” | asks them to forward the Page; it never writes to an address from their text | Marketing Lead · your agent | 1 business day | POST /{namespace}/conversations/{conversation}/answer |
| Out of office | an auto-reply to the receipt | the next notice waits for the return date; the close time does not | nobody | the return date | POST /{namespace}/messages/{message}/schedule |
| Question it can’t answer | “Does it read our current move-in checklists?” | To a person; the answer is a promise only you can make | you | 1 business day | POST /{namespace}/conversations/{conversation}/escalate |
| Stop | “Refund me and stop emailing.” | the refund at once, in cash, then nothing else sends | Billing, so you, from the draft | at once | POST /{namespace}/orders/{order}/refund |
When it hands to you
Captures, date changes and kills come to you to approve; creator fixes go to Partnerships, which is unstaffed, so they come to you too. One Brief per Role, as captured (brief is Not live yet, gaps #7).
[
{
"$id": "https://api.sb/leaseline.app/approvals/approval_108" ,
"$type": "Approval",
"verdict": "approved",
"deadline": "2026-10-09T23:59:00Z" ,
"draft": "Capture 34 outside holds: $1,466; 3 insider Orders take no seat" ,
"route": "capture-on-pass",
"checks": [
{
"check": "insider",
"status": "pass"
},
{
"check": "plan-lock",
"status": "pass"
}
]
},
{
"$id": "https://api.sb/leaseline.app/tasks/task_702" ,
"$type": "Task",
"assignee": "worker_1",
"due": "2026-10-07T02:05:00Z" ,
"on": "post_52",
"brief": {
"who": "the creator’s TikTok cross-post",
"said": "posted at 18:00 with the paid-promotion setting off" ,
"chose": "pause-checkout",
"why": "a post missing its disclosure at T+2 h",
"paused": "checkout, for 41 min" ,
"never": [
"moving the close time"
]
}
}
]You answer with POST /{namespace}/approvals/{approval}/approve or POST /{namespace}/approvals/{approval}/refuse, POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, or POST /{namespace}/actions/{action}/redirect, each a one-call window. A refund request never waits on you: it pays first. A Task nobody claims by its due time goes up a Role through POST /{namespace}/tasks/{task}/escalate, and person-promise fires.
On time: you, 2 of 2 within their due time (the capture in 22 min, the creator fix in 41 min), n 2, ■□□□ Too early to tell beside Other Startups’ 97 % on time. Your queue: in the drop week, 3 approvals and 1 creator fix; then about 1 refund draft a week and the ship-date check from Dec 1.
The fixed line: POST /{namespace}/deals/{deal}/assign sets owner to the receiving person, the agent is never a Deal’s owner, and Meetings land on the owner’s calendar under the owner’s name.
When it won’t send
| Check (refuses one send) | Refuses | Fix | Then |
|---|---|---|---|
owned-by-a-person (rule j; gaps #8) | a drop note to a Contact whose Lead or open Deal a person owns | Leave it to the person who owns it: the draft waits in their queue. | POST /{namespace}/tasks/{task}/assign |
claims-resolve (hub; the record’s Availability hold) | a line that presents the unbuilt product as available, shipping or built | Say Not built and the tranche’s ship date. | POST /{namespace}/content/draft |
price (gaps #1) | a Page price that differs from the price charged, a struck-through price, or a tranche called a discount | Print the tranche price as charged, with its date. | POST /{namespace}/approvals/{approval}/approve |
plan-lock (the record’s Plan lock) | any edit to the pass mark, tranches, prices, dates or refund terms after the first Visit | Leave it, or kill the drop and plan a new one. | GET /{namespace}/decisions |
no-reset (the record’s No reset) | a close time moved, or a countdown that restarts | Keep the close time written at the post’s publish time. | POST /{namespace}/offers/{offer}/publish |
insider (the record’s Insider exclusion) | a seat or a count for an Order from you, the creator, their team or your other Startups | It is recorded and takes no seat; nothing to do. | POST /{namespace}/collections/query |
fraud (the record’s Fraud screen) | a fourth attempt from a card or device declined 3 times in 10 min | Try another card; the block lifts after 24 h. | POST /{namespace}/payment-sources/add |
ship-date (the record’s Ship-date guard) | a plan whose tranche 1 ships over 90 days out, or before the forecast plus 14 days | Set tranche 1 to ship within 90 days of the post. | POST /{namespace}/offers/{offer}/publish |
audience-rest (the record’s Audience rest) | a second drop to one creator audience inside 60 days, from any of your Startups | Wait out the 60 days, or use another creator. | GET /{namespace}/decisions |
The captured refusal, then the Stop that fired as a Campaign.paused reason (Not live yet, gaps #2); the rewrite that posted is the comment reply in Example.
| Check | Fix | Then |
|---|---|---|
claims-resolve fail | Say Not built and the tranche’s ship date. | POST /{namespace}/content/draft |
price pass · Not live yet, gaps #1 | — | POST /{namespace}/approvals/{approval}/approve |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "The reply to a comment on the creator’s post did not post: it says Inspect is ready to use.",
"checks": [
{
"check": "claims-resolve",
"status": "fail",
"doc": "/plays/reserve-drop#check-claims-resolve",
"fix": "Say Not built and the tranche’s ship date.",
"then": "Content.draft"
},
{
"check": "price",
"status": "pass"
}
]
}It says no, says why, and names the fix.
[
{
"reason": {
"limit": "disclosure",
"observed": "paid-promotion setting off at T+2h",
"bound": "on",
"window": "the TikTok cross-post"
},
"doc": "/plays/reserve-drop#stop-disclosure" ,
"task": "task_702"
}
]Did it work
One drop holds no half back, so the basis is before-after (rule o): the Now column reads the drop, the Before column the pass mark you fixed first, and nothing prints as Added. Each figure’s call is POST /{namespace}/metrics/query by node; the leaf and every node above it are Not live yet (gaps #4).
43 net deposits against a pass mark of 25 · before-after,
- Chose
- capture-on-pass
- Why
- 34 outside deposits at the 18:00 Central close on Oct 9, against the pass mark of 25; 3 insider Orders excluded
- From
- capture-on-pass · release-on-miss · open-next-tranche · pause-checkout · refund-first · kill-the-drop
- Expects
- tranche 1 delivered by Dec 15, refunds under 10 % by Jan 14
- Reopens when
- a tranche forecast past its ship date, or refund requests over 10 % in 24h
- By
- worker_4
JSON
{
"$id": "decisions/decision_655",
"$type": "Decision",
"choice": "capture-on-pass",
"reason": "34 outside deposits at the 18:00 Central close on Oct 9, against the pass mark of 25; 3 insider Orders excluded",
"stakes": "medium",
"options": [
"capture-on-pass",
"release-on-miss",
"open-next-tranche",
"pause-checkout",
"refund-first",
"kill-the-drop"
],
"by": "worker_4",
"on": "offer_14",
"expected": "tranche 1 delivered by Dec 15, refunds under 10 % by Jan 14",
"reopensWhen": "a tranche forecast past its ship date, or refund requests over 10 % in 24h"
}| Node | Now (the drop) | Before (the pass mark, fixed first) | Added | Confidence | Basis |
|---|---|---|---|---|---|
deposits-per-tranche | tranche 1: 20 of 20 in 19 h · tranche 2: 20 of 20 by day 9 · tranche 3: 6 of 30, open to Oct 27 · 43 net of 3 refunds | 25 outside deposits in 72 h; 34 came | — · Worth about +$1,800 a month once it ships | — | before-after, not proof · Other Startups’ results 1.6× their pass mark, ■■■□ Likely, n 140 drops |
new-paying-customers | 37 new paying Customers, plus 6 who already were | 0 from a drop before | — | — | before-after; 1 tranche still open |
new-arr ↑ | $0 earned: $1,977 in deposits held until each tranche ships · Booked $0: credited, not all caused by this Play | $0 | — | — | a deposit is earned on delivery, from Dec 15 |
net-new-arr · arr | carried from new-arr | carried | — | — | carried |
The leaf counts outside deposits sold in each tranche, net of refunds by the tranche’s ship date plus 30 days; it settles on Mar 17 for tranche 3, and Other Startups’ results print beside it.
How it moves it: one creator post opened a fixed 72-hour window with live counts and dated tranche prices; tranche 1 sold out in 19 h.
Guardrails: before against after: refunds, 3 of 46 (6.5 %) against the 10 % refund spike line, and Disputes, 0 against the 2 that would pause checkout.
{
"$id": "https://api.sb/leaseline.app/campaigns/reserve-drop" ,
"$type": "Campaign",
"play": "play:reserve-drop@1" ,
"path": [
"deposits-per-tranche",
"new-paying-customers",
"new-arr",
"net-new-arr",
"arr"
],
"experiment": {
"metric": "deposits-per-tranche",
"unit": "count",
"heldBack": 0,
"decision": null
},
"readout": {
"value": null,
"n": 1,
"maturing": 1,
"interval": null,
"readability": "inadmissible",
"basis": "before-after",
"pooled": true
},
"ledger": {
"spend": 400,
"workerCost": 3,
"hours": 2.6,
"pipelineArr": 0,
"wonArr": 0,
"projectedArr": 1845,
"paybackDays": null
}
}Outside benchmark: this Play’s catalog record carries no sourced range yet, so Other Startups’ results stand in: 1.6× the pass mark at the close, ■■■□ Likely, n 140 drops.
Before it · After it. Before it: creator-probe finds the creator whose audience buys, and signup-interviews shapes what Inspect does. After it: run-beside holds each reserver’s first 30 days on delivery, and review-requests asks the ones who keep it.
Example
Leaseline ran it from 2026-08-24 to 2026-10-19: the plan on day 0, the creator post on Oct 6 at 18:00 Central, the close on Oct 9 at 18:00, and the tranche run open to Oct 27. Read every captured thread at ?threads=; three follow the tables.
| What happened, by option | Decisions | Deposits | Held (credited, not all caused by this Play) |
|---|---|---|---|
| Capture on a pass | 1 | 34 captured | $1,466 |
| Open the next tranche | 2 | +12 after the close | $648 |
| Pause checkout · Offer the refund first · Kill the drop | 1 · 0 · 0 | 41 min paused · — · — | — |
| Refunds, on request | 3 | −3 | −$137 |
| The drop · the pass mark | 1 | 43 net · 25 | $1,977 held until it ships |
| Day | Event | What happened | Your time |
|---|---|---|---|
| 0 | event_7003 Campaign.created | the three steps; the dry run fails ship-date | 25 min |
| 0 | event_7006 Offer.published | tranche 1 moved to ship Dec 15 | 10 min |
| 41 | event_7040 Agreement.signed | the creator Agreement and the drop plan approved; the plan locks at the first Visit | 20 min |
| 43 | event_7051 Post.published | the creator post, 18:00 Central; the first hold 4 min later | — |
| 43 | event_7055 Campaign.paused | disclosure: the TikTok cross-post at T+2 h; checkout paused 41 min | 12 min |
| 44 | event_7064 Offer.exhausted | tranche 1 sold out at 13:10, 19 h after the post | — |
| 46 | event_7088 Schedule.fired | the close: 34 outside deposits against 25; you approved the capture | 5 min |
| 1–56 | event_7012 Approval.created, first of 3 | the plan, the capture and 1 receipt template; claims-resolve refused 1 comment reply, rewritten once and posted | 1 h 4 min · total 2.6 h measured, 2.5 h asked |
The drop Page, Oct 6 18:04 · Leaseline Inspect. Not built. Tranche 1 ships Dec 15.¹ $39 deposit, refundable any time until it ships, in one click.² 20 seats: 3 taken. Closes Oct 9, 18:00 Central.³
A reserver, 18:04 · held $39. Receipt, 18:05 · We placed a $39 hold on your card; it becomes a charge only if 25 people reserve by Oct 9, 18:00 Central.⁴
Oct 9, 18:41 · the hold captured; the receipt said charge.
- Yes! It’s ready to use as soon as you reserve.
+ Not built: tranche 1 ships Dec 15, and your deposit is refundable until then. The creator’s TikTok cross-post, 2026-10-06 20:00 · the paid-promotion setting off at T+2 h · The agent, 20:00 · paused checkout and assigned the fix (
task_702) · Dana, 20:22 · reached the creator, who turned it on at 20:41; checkout resumed, and the close time stood.
¹ The facts block says Not built and the ship date of the tranche on sale. ² The refund terms beside the button, the same for every tranche. ³ The close time as a date, hour and time zone; no countdown restarts. ⁴ A hold named as a hold; the charge named as a charge when it happens.
Your settings
---
holdout: 0 # one drop holds no half back; it reads against the pass mark
window: 72h
---
Pass mark: 25 outside deposits by the close. Tranches: 20 at $39 (Dec 15), 20 at $49 (Jan 15), 30 at $59 (Feb 15).
Refund on request, in cash first. $ npx startup-builder show plays/reserve-drop
holdout 0 · window 72h · pass mark 25 · 3 tranches · cash refunds first your file plays/reserve-drop.mdx:2,3,5,6 (Ask 2026-08-24; locked at the first Visit, 2026-10-06)
worker role:marketing-lead, owns never · chooses 6 (4 rule, 2 read) · sequences drop-reserver, drop-close-reminder, drop-step-notice, drop-checkout-return, drop-kill-choice · approval first-send, every-send · checks owned-by-a-person, claims-resolve, price, plan-lock, no-reset, insider, fraud, ship-date, audience-rest · stops 7 · placements instagram, tiktok, youtube, linkedin, gmail, outlook, yahoo-mail catalog play:reserve-drop@1 (Not live yet, gaps #5) Every key from the catalog
Compiled, not written: edit the Play record reserve-drop and its Leaseline run, 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.