URL: /plays/reserve-drop · Id: `play:reserve-drop`

# 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.

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.

```text title="Set it up · Ask"
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.
```

```text title="Run one · Ask"
Hand the drop at its close to the Marketing Lead agent and show me what it chose and why. Don’t capture.
```

```ts title="Run one · SDK"
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 }
```

```json title="Run one · Response · sample"
{
  "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"
    ],
    "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"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_4",
      "verb": "Collection.query",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingApproval",
      "mode": "try",
      "by": "worker_4",
      "verb": "Order.pay",
      "checks": [
        {
          "check": "insider",
          "status": "pass"
        },
        {
          "check": "plan-lock",
          "status": "pass"
        },
        {
          "check": "price",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_3",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingTime",
      "mode": "try",
      "by": "worker_4",
      "verb": "Message.schedule",
      "checks": [
        {
          "check": "owned-by-a-person",
          "status": "pass"
        },
        {
          "check": "claims-resolve",
          "status": "pass"
        }
      ]
    }
  ]
}
```

`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, not proof · n 1 drop · path → arr`

| 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 |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$1,800 ARR a month, once it ships | 1.5 h week 1, then 20 min a week | $0 per deposit; the creator’s fee, $400 a drop | Hour 1: the first deposit held | a creator Agreement, ships within 90 days | No creator: `creator-probe` · ships past 90 days: `signup-interviews` |

**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/leaseline.app · 41 Customers at 2026-10-19 · on Schedule.fired · first hold 4 min after the post · 8 keys Not live yet`

## Start it this week
```bash
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"}'
```


```json title="The dry run’s 422 · 2026-08-24 · sample"
{
  "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"
    }
  ]
}
```

| Check | Fix (one call) | Your time | Wait |
| --- | --- | --- | --- |
| <a id="check-use-when"></a>`use-when` · <a id="check-baseline"></a>`baseline` · pass: a signed Agreement; warn: no drop before (gaps #8) | <Op verb="Metric.query" /> on `deposits-per-tranche`; the pass mark stands in for Before | 1 min | none |
| <a id="check-billing-connected"></a>`billing-connected` · pass: Stripe | <Op verb="Integration.connect" /> with `system` recurring-billing (Stripe) | 0 min | none |
| <a id="check-ship-date"></a>`ship-date` · fail: tranche 1 at 120 days | <Op verb="Offer.publish" /> with tranche 1 shipping Dec 15 | 10 min | none |
| <a id="check-role-unstaffed"></a>`role-unstaffed` · warn (gaps #8): no Partnerships or Billing seat | <Op verb="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, not proof · n 1 drop`

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 (<Op verb="Integration.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=all`) | | | | |

```json title="One signed delivery · StartupBuilder-Signature"
{
  "$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
  }
}
```

```bash title="Reproduce it in test"
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:marketing-lead`, `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 | — | <Op verb="Approval.approve" /> · <Op verb="Approval.refuse" /> |
| Open the next tranche · Pause checkout | It does it | 2 of 2 · 1 of 1 | — | — | <Op verb="Action.redirect" /> |
| Offer the refund first · Kill the drop | You approve each one | 0 · 0 | never | — | <Op verb="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 <Op verb="Order.pay" />, <Op verb="Order.cancel" />, <Op verb="Offer.publish" />, <Op verb="Action.pause" />, <Op verb="Task.assign" />, <Op verb="Order.refund" />, <Op verb="CreditGrant.issue" />, and any other call becomes an Approval under the Role’s Mandate.

```md title="The brief (folded): compiled Agent-register Markdown · play:reserve-drop@1 · each line names its record key"
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; <Op verb="Role.staff" /> seats it.

```bash
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) | <Op verb="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) | <Op verb="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) | <Op verb="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) | <Op verb="Action.pause" /> on checkout → <Op verb="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 | <Op verb="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 (<Op verb="CreditGrant.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 | <Op verb="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 | <Op verb="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 | <Op verb="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 | <Op verb="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 | <Op verb="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 | <Op verb="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 | <Op verb="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).

```json title="What lands in each queue · sample"
[
  {
    "$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 <Op verb="Approval.approve" /> or <Op verb="Approval.refuse" />, <Op verb="Task.claim" /> (Take this one), <Op verb="Task.return" /> with a reason, or <Op verb="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 <Op verb="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:** <Op verb="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 |
| --- | --- | --- | --- |
| <a id="check-owned-by-a-person"></a>`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. | <Op verb="Task.assign" /> |
| <a id="check-claims-resolve"></a>`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. | <Op verb="Content.draft" /> |
| <a id="check-price"></a>`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. | <Op verb="Approval.approve" /> |
| <a id="check-plan-lock"></a>`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. | <Op verb="Decision.list" /> |
| <a id="check-no-reset"></a>`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. | <Op verb="Offer.publish" /> |
| <a id="check-insider"></a>`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. | <Op verb="Collection.query" /> |
| <a id="check-fraud"></a>`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. | <Op verb="PaymentSource.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. | <Op verb="Offer.publish" /> |
| <a id="check-audience-rest"></a>`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. | <Op verb="Decision.list" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-disclosure"></a>`disclosure` (the creator’s post lanes) | a creator post lacks its in-content disclosure or the Venue’s partnership label at T+2 h | checkout pauses until both show |
| <a id="stop-availability"></a>`availability` | any post, comment, Page line or Message says the product is available or shipping | checkout pauses until it is fixed |
| <a id="stop-refund"></a>`refund` | refund requests over 10 % of captured deposits in 24 h | new checkouts pause; a Task goes to you |
| <a id="stop-dispute"></a>`dispute` | 2 Disputes on one drop, or over 0.5 % of captured Orders | checkout pauses; an Approval goes to you |
| <a id="stop-capture"></a>`capture` | a pass with holds still uncaptured at the close plus 2 h | it pages Billing, so you |
| <a id="stop-creator-exit"></a>`creator-exit` | the creator deletes the post or ends the Agreement | checkout pauses; the close time stands; nothing ships under their name |
| <a id="stop-kill-switch"></a>`kill-switch` | you press it | every Tactic and checkout pause; refunds keep running |

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.

```json title="The captured refusal · sample"
{
  "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"
    }
  ]
}
```


```json title="The Stops that fired, as Campaign.paused reasons · sample"
[
  {
    "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 <Op verb="Metric.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, not proof · n 1 drop · path → arr`

| 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.

```json title="The Campaign card · sample"
{
  "$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=all`; 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.

```diff title="A comment on the creator’s post, 2026-10-06 · the reply claims-resolve refused, then the rewrite that posted"
- 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
```mdx title="plays/reserve-drop.mdx"
---
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.
```

```text
$ 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
| Key | Id | What it is |
| --- | --- | --- |
| Tactic | <a id="tactic-drop-plan"></a>`drop-plan` | Drop plan sets the pass mark, tranche sizes, prices and dates from the Startup’s records, and locks them at the first Visit. Starts at You approve the first wave. |
| Tactic | <a id="tactic-creator-brief"></a>`creator-brief` | Creator brief sends each creator the Problem, approved claims, code, link and disclosure line for one post, and leaves concept and publishing to the creator. Starts at You approve the first wave. |
| Tactic | <a id="tactic-drop-page"></a>`drop-page` | Drop page compiles the reserve page: the facts block, the tranche table, the dated price step, the fixed close time and live counts. Starts at You approve each one. |
| Tactic | <a id="tactic-creator-disclosure-scan"></a>`creator-disclosure-scan` | Creator disclosure scan reads each live creator post for an in-content disclosure and the Venue’s partnership label, and pauses checkout when one is missing. Starts at Sends nothing. |
| Tactic | <a id="tactic-drop-window"></a>`drop-window` | Drop window places card holds for 72 hours, keeps every count live, advances tranches at sell-out, and answers the creator’s comments through the creator. Starts at Sends nothing. |
| Tactic | <a id="tactic-drop-close"></a>`drop-close` | Drop close compares outside deposits with the pass mark at the close time, capturing every hold on a pass and releasing all on a miss. Starts at Sends nothing. |
| Tactic | <a id="tactic-tranche-run"></a>`tranche-run` | Tranche run sells the open tranches to day 21 after a pass, steps the price for new Visitors at day 15, and reads novelty. Starts at Sends nothing. |
| Tactic | <a id="tactic-reserve-refunds"></a>`reserve-refunds` | Reserve refunds pay back any reserver on request, on a missed date and on a kill, always offering cash first and one credit at another of your Startups second. Starts at Sends nothing. |
| Tactic | <a id="tactic-ship-date-watch"></a>`ship-date-watch` | Ship date watch forecasts each tranche’s ship date from 14 days out, offers a refund first on a delay, and delivers each Order on time. Starts at Sends nothing. |
| Tactic | <a id="tactic-drop-readout"></a>`drop-readout` | Drop readout reads tranche sell-out times and the share refunded, pools the drop into the Portfolio’s prior, and records Evidence and a Decision. Starts at Sends nothing. |
| Tactic | <a id="tactic-claims-check"></a>`claims-check` | Claims check maps every draft sentence to an approved source or the Person’s own words, and holds anything else before it reaches anyone. Starts at Sends nothing. |
| Tactic | <a id="tactic-send-gate-check"></a>`send-gate-check` | Send gate check: Checks Suppression, a live reason, the Market, the basis stamp, the Person-month grant, the facts and the labels before any cold Message exists. Starts at Sends nothing. |
| Trigger | <a id="trigger-drop-plan-approved"></a>`drop-plan-approved` | Drop plan approved: `state` on `Agreement.signed`, window 14d. |
| Trigger | <a id="trigger-creator-post-live"></a>`creator-post-live` | Creator post live: `event` on `Post.published`, window 30d. |
| Trigger | <a id="trigger-drop-hold-placed"></a>`drop-hold-placed` | Drop hold placed: `event` on `Order.placed`, window 1h. |
| Trigger | <a id="trigger-drop-charge-paid"></a>`drop-charge-paid` | Drop charge paid: `event` on `Order.paid`, window 1h. |
| Trigger | <a id="trigger-tranche-sold-out"></a>`tranche-sold-out` | Tranche sold out: `threshold` on `Offer.exhausted`, window 1h. |
| Trigger | <a id="trigger-checkout-abandoned"></a>`checkout-abandoned` | Checkout abandoned: `state` on `Order.started`, window 48h. |
| Trigger | <a id="trigger-refund-requested"></a>`refund-requested` | Refund requested: `event` on `Refund.requested`, window 1h. |
| Trigger | <a id="trigger-disclosure-missing"></a>`disclosure-missing` | Disclosure missing: `event` on `Monitor.checked`, window 2d. |
| Trigger | <a id="trigger-availability-claim"></a>`availability-claim` | Availability claim: `event` on `Claim.flagged`, window 2h. |
| Trigger | <a id="trigger-drop-window-closed"></a>`drop-window-closed` | Drop window closed: `at` on `Schedule.fired`, window 1h. |
| Trigger | <a id="trigger-price-step-due"></a>`price-step-due` | Price step due: `at` on `Schedule.fired`, window 1h. |
| Trigger | <a id="trigger-ship-risk"></a>`ship-risk` | Ship risk: `threshold` on `Forecast.slipped`, window 7d. |
| Trigger | <a id="trigger-drop-dispute-opened"></a>`drop-dispute-opened` | Drop dispute opened: `event` on `Dispute.opened`, window 1d. |
| Trigger | <a id="trigger-drop-killed"></a>`drop-killed` | Drop killed: `event` on `Decision.recorded`, window 72h. |
| Sequence | <a id="sequence-drop-reserver"></a>`drop-reserver` | Drop reserver: 6 steps; it ends on A refund; A kill; Delivery plus 7 days; A miss at close. |
| Sequence | <a id="sequence-drop-close-reminder"></a>`drop-close-reminder` | Drop close reminder: 1 steps; it ends on A deposit; An opt-out; The close. |
| Sequence | <a id="sequence-drop-step-notice"></a>`drop-step-notice` | Drop step notice: 1 steps; it ends on A deposit; An opt-out; The step. |
| Sequence | <a id="sequence-drop-checkout-return"></a>`drop-checkout-return` | Drop checkout return: 1 steps; it ends on A deposit; An opt-out; The window close. |
| Sequence | <a id="sequence-drop-kill-choice"></a>`drop-kill-choice` | Drop kill choice: 3 steps; it ends on A choice of cash or credit. |