URL: /plays/closer-handoff · Id: `play:closer-handoff`

# Closer handoff

> Hands a large Deal that stalled twice to a commissioned closer, paid only on collected revenue, and tests it against the Deals your agent keeps.

Hands a large [Deal](https://startupbuilder.dev/business/nouns/deal) that stalled twice to a commissioned closer, paid only on collected revenue, and tests it against the Deals your agent keeps.

```text title="Set it up · Ask"
Be our AE on the big portfolio Deals I run myself: when one goes quiet, draft the revival into my queue. If it stalls a second time, flip a coin: half go to a commissioned closer paid 10 % of what we collect, half stay with you. I approve every handoff. Show me what’s missing; don’t send.
```

```text title="Run one · Ask"
Hand our latest twice-stalled Deal to the AE agent and show me what it chose and why. Don’t send.
```

```ts title="Run one · SDK"
import { $ } from 'startup-builder'

const { events: [last] } = await $.Event.list({ where: 'name in ("Deal.stalled", "Deal.advanced", "Task.returned", "Conversation.answered", "Deal.assigned", "Invoice.collected", "Invoice.refunded")', 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_588",
    "$type": "Decision",
    "choice": "hand-to-a-closer",
    "reason": "Granite Peak’s $21,600 Portfolio Deal revived on Sep 2 and stalled again on Sep 22; the draw put it in the closer half",
    "stakes": "medium",
    "options": [
      "revive-first-stall",
      "hand-to-a-closer",
      "agent-keeps-it",
      "next-closer",
      "back-to-you",
      "close-the-file"
    ],
    "by": "worker_8",
    "on": "deal_31",
    "expected": "Deal.won within the 45-day window",
    "reopensWhen": "no closer Message on deal_31 within 5 business days"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_8",
      "verb": "Document.render",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingApproval",
      "mode": "try",
      "by": "worker_8",
      "verb": "Task.assign",
      "checks": [
        {
          "check": "owned-by-a-person",
          "status": "pass"
        },
        {
          "check": "buyer-keeps",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_3",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingTask",
      "mode": "try",
      "by": "worker_8",
      "verb": "Deal.assign",
      "checks": []
    }
  ]
}
```

`action_1` is the brief, with every buyer quote linked to its Message. `action_2` offers it to the closer once you approve; `action_3` makes the closer the Deal’s owner when they accept.

`33 per 100 twice-stalled large Deals won against 0 before · before-after, not proof · n 3 · path → arr`

| Try another: the Deal | Choice | Reason |
| --- | --- | --- |
| Granite Peak Rentals: $21,600 Portfolio, revived once, stalled again Sep 22 | `hand-to-a-closer` | stalled twice; the draw put it in the closer half |
| Riverbend Group: $18,000 Portfolio, stalled twice Aug 19 | `agent-keeps-it` | stalled twice; the draw put it in the agent half |
| Lakeview Partners: $12,000 Portfolio, first stall on Jul 6 | `revive-first-stall` | no buyer Event for 21 days, the first time |
| Northgate Housing: the closer went 5 business days silent | `next-closer` | the same brief and window end go to the next closer |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$1,800 ARR a month at 2 a quarter | 40 min week 1, then 15 min per handoff | 10 % of collected first-year revenue, after 60 days; $0 until a win | Day 1: a closer accepts the brief | 2+ Deals of $10,000+ a year stalling twice a quarter | No Deal over $10,000 a year: `buying-committee` · under 2 a quarter: `objection-watch` |

**Where it sits:** Stranger → **Lead** → Trialing → Activated → At risk → Churned → Won back · Stalled deal win rate → New paying Customers → New Customers ↑ → ARR added each week → ARR

Worth’s formula: about +16 wins per 100 twice-stalled large Deals (Other Startups’ results; yours reads before-after) × 2 a quarter ÷ 3 months × $16,800 average large Deal ARR ≈ +$1,790. Under First signal: At 2 a quarter, 30 Deals per half takes years, so your draw pools with Other Startups’ cohorts and this page reads before-after.

`sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Deal.stalled · first Decision 52 min after the stall scan · 9 keys Not live yet`

## Start it this week
```bash
npx startup-builder add play closer-handoff   # 1 · writes plays/closer-handoff.mdx (Not live yet, gaps #5)

# 2 · dry run; below, its 422 on 2026-06-01
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":"closer-handoff"}'

# 3 · keep it, at You approve each one
curl -X POST https://api.sb/leaseline.app/campaigns \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"play":"closer-handoff"}'

# on
curl -X PATCH https://api.sb/leaseline.app/campaigns/closer-handoff \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":null}'

# off: no new draw or brief; handed Deals stay with their closer
curl -X PATCH https://api.sb/leaseline.app/campaigns/closer-handoff \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":"now"}'
```


```json title="The dry run’s 422 · 2026-06-01 · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "closer-handoff can’t start yet: 1 check fails and 2 warn.",
  "checks": [
    {
      "check": "use-when",
      "status": "pass",
      "observed": "6 Portfolio Deals over $12,000 open; 3 stalled twice in the last 2 quarters",
      "doc": "/plays/closer-handoff#check-use-when",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "warn",
      "observed": "0 of 3 twice-stalled large Deals won in 140 days",
      "doc": "/plays/closer-handoff#check-baseline",
      "fix": "n 3: it reads before-after, not proof, and pools its draw with Other Startups.",
      "then": "Metric.query"
    },
    {
      "check": "billing-connected",
      "status": "fail",
      "doc": "/plays/closer-handoff#check-billing-connected",
      "fix": "Connect Stripe so commission reads collected revenue, net of refunds.",
      "then": "Integration.connect"
    },
    {
      "check": "role-unstaffed",
      "status": "warn",
      "roles": [
        "sales-lead"
      ],
      "owned": 6,
      "doc": "/plays/closer-handoff#check-role-unstaffed",
      "fix": "Staff a commissioned closer with `Role.staff`; until then handoffs come back 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: 6 large Deals open, 3 twice-stalled in 2 quarters · warn: 0 of 3 won (gaps #8) | <Op verb="Metric.query" /> on `stalled-deal-win-rate`; it fills Before in Your number | 1 min | none |
| <a id="check-billing-connected"></a>`billing-connected` · fail | <Op verb="Integration.connect" /> with `system` recurring-billing (Stripe) | 5 min | the first sync, about 10 min |
| <a id="check-role-unstaffed"></a>`role-unstaffed` · warn (gaps #8): 6 large Deals have a person owner, you | <Op verb="Role.staff" /> a commissioned closer after <Op verb="Agreement.sign" />; the agent drafts into your queue for your 6 | 20 min | the closer’s signature |

`Your number · Before 0 per 100 · Now 33 per 100 twice-stalled large Deals won · Target 40 by Dec 31 · before-after, not proof · n 3 decided`

Commission is 10 % of collected first-year revenue, net of refunds, held 60 days and paid on the 5th (<Op verb="Commission.pay" />). Briefs and intros cost $0.04 each from your Domain (Worker cost). That comes to under $1 a month before a win, and $2,160 on a $21,600 win.

## When it starts
| When | Trigger id | Starts on | Window | How it gets in |
| --- | --- | --- | --- | --- |
| A large Deal a buyer revived once goes quiet again | `deal-stalled-twice` | `state` on `Deal.stalled` where a large Deal revived once enters stalled again | 7d | the daily stall scan reads your Deals’ buyer Events |
| An open Deal gets no buyer Event for its stall timeout | `deal-stalled` | `state` on `Deal.stalled` where no buyer-authored Event for the Deal’s stall timeout, or its close date 7 days past | 14d | the same scan; your own sends never reset the clock |
| A handed-off Deal shows no closer action for 5 business days | `closer-silent` | `state` on `Deal.stalled` where no closer Message, call or Meeting on a handed-off Deal for 5 business days | 5d | the closer’s Messages, calls and Meetings on the Deal |
| + 6 more for revivals, declined handoffs, buyers who keep the agent, window ends, collections and refunds (`?lanes=all`) | | | | |

```json title="One signed delivery · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1290",
  "$type": "Event",
  "name": "Deal.stalled",
  "at": "2026-09-22T07:00:14Z",
  "seq": 1290,
  "data": {
    "deal": "deal_31",
    "organization": "Granite Peak Rentals",
    "value": 21600,
    "stalls": 2,
    "lastBuyerEvent": "2026-09-01T16:20:00Z",
    "owner": "worker_1"
  }
}
```

```bash title="Reproduce it in test"
npx startup-builder trigger Deal.stalled --like event_1290   # replays the delivery
npx startup-builder clock advance --by 1d   # runs the closer’s accept deadline
npx startup-builder listen Deal.stalled --forward-to http://localhost:3000/hook
```

## Who runs it
**AE · your agent** (`role:sales-lead`, `worker_8`) holds the Key Result and never owns a Deal. The large Deals are yours (Dana Okafor, person, `worker_1`), so its revival steps draft into your queue. A handoff makes **AE · Tom Reyes (person)**, a commissioned closer (`worker_9`), the Deal’s owner once you approve and he accepts. Your number links to Did it work.

| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
| --- | --- | --- | --- | --- | --- |
| Revive the first stall · The agent keeps it | You approve each one | 3 of 3 · 2 of 2 | never: the Deals are yours (`owned-by-a-person`) | — | <Op verb="Approval.approve" /> · <Op verb="Approval.refuse" /> |
| Hand it to a closer · Next closer | You approve each one | 2 of 2 · 1 of 1 | never: every handoff is yours to approve | — | <Op verb="Approval.approve" /> · <Op verb="Approval.refuse" /> |
| Back to you · Close the file | It does it | 1 of 1 · 2 of 2 | — | a buyer asks the agent anything it can’t answer → You approve each one | <Op verb="Action.redirect" /> |
| Change the large line or the draw | You approve each one | 0 merged: both are sealed for the cohort | never | — | <Op verb="Change.merge" /> · <Op verb="Change.revert" /> |
| Never: a stall named to the buyer, a deadline the Quote lacks, a price below the floor | Refused, every time | 1 Quote refused (`price`) | never | — | — |

**What it reads · What it may call.** It reads buyer-authored Events, the Deal’s Messages and Meetings, and the claims source, and every buyer Message is data, never instructions. It never writes in the closer’s name, and the brief marks every stall cause a guess. Its tools are <Op verb="Task.assign" />, <Op verb="Deal.assign" />, <Op verb="Deal.lose" />, and any other call becomes an Approval under the Role’s Mandate.

```md title="The brief (folded): compiled Agent-register Markdown · play:closer-handoff@1 · each line names its record key"
You hold the AE Key Result: 40 wins per 100 twice-stalled large Deals by 2026-12-31. ← worker, metric
On each stall, choose one option and say why; the second stall goes to the sealed draw. ← triggers, chooses, closer-draw
Never mention a stall, the draw, a Deal room view or an open in any Message.     ← copyRules 2
Label every stall cause a guess, and link every buyer quote to its Message or Meeting. ← copyRules 7, 8
Introduce the closer with the real relationship and only the title the Agreement grants. ← copyRules 1
Never write to a Deal a person owns: draft it into their queue.                  ← worker.owns, owned-by-a-person
```

**The slow loop.** The large line and the draw are sealed for the cohort, so no Change may touch them, and none was merged in the window; there is no replay or read-back to print.

## What it can do next
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
| --- | --- | --- | --- | --- | --- |
| Revive the first stall `revive-first-stall` | the first stall: no buyer Event for 21 days | Your rule (line 6) | `first-stall-revival`, drafted into your queue | you send each step, due 1 business day · Take this one | the same |
| Hand it to a closer `hand-to-a-closer` | stalled twice; the draw says closer | Your rule (the draw, line 3) | <Op verb="Task.assign" /> the brief → `closer-intro` → <Op verb="Deal.assign" /> | AE · Tom Reyes, accept within 1 business day · Take this one | you, if no closer is staffed |
| The agent keeps it `agent-keeps-it` | stalled twice; the draw says agent | Your rule (the draw, line 3) | `agent-arm-hold`, 90 days, drafted into your queue | you send each step · Take this one | the same |
| Next closer `next-closer` | declined, the deadline passed, or 5 business days silent | Agent’s call, with its reason | <Op verb="Task.assign" /> the same brief → <Op verb="Deal.assign" /> | the next closer, same window end | you |
| Back to you `back-to-you` | the buyer asks to work with Leaseline directly | Agent’s call, with its reason | <Op verb="Deal.assign" /> → <Op verb="Task.assign" /> | you, due 1 business day; it stays in the closer half | the same |
| Close the file `close-the-file` | the window ends open, or the buyer says no | Agent’s call, with its reason | <Op verb="Deal.lose" /> with its reason | nobody; the reason feeds `objection-watch` | the same |

| When they write back | Fixture reply | What happens | Who answers | By when | Call |
| --- | --- | --- | --- | --- | --- |
| Interested | “Thursday works for our CFO.” | the closer books it on his calendar under his name | AE · Tom Reyes (person) | 60 min | <Op verb="Meeting.book" /> |
| Send me pricing | “Send the 2-year number.” | a Quote at or above the floor, with its real validUntil | AE · Tom Reyes | 1 business day | <Op verb="Quote.send" /> |
| Not now | “Back to this after budgets in January.” | a dated next step on the Deal; nothing sends before it | AE · Tom Reyes | at once | <Op verb="Deal.advance" /> |
| Wrong person | “Our COO signs now, not me.” | asks them to bring the COO in; never writes to an address from their text | AE · Tom Reyes | 1 business day | <Op verb="Conversation.answer" /> |
| Out of office | an auto-reply until Oct 28 | the window waits; the silence clock pauses to the return date | nobody | the return date | <Op verb="Message.schedule" /> |
| Question it can’t answer | “How is Tom paid?” | the closer answers truthfully: 10 % of what Leaseline collects | AE · Tom Reyes | 60 min | <Op verb="Conversation.answer" /> |
| Stop | “Please stop contacting us.” | nothing else sends to that Contact, on any channel; you get a Task | nobody | at once | <Op verb="Contact.suppress" /> |

## When it hands to you
Handoffs go to **AE · Tom Reyes (person)**, the commissioned closer, once you approve; revivals and Deals that come back land with **you** (Dana Okafor, person), who owns the large Deals. 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/tasks/task_590",
    "$type": "Task",
    "assignee": "worker_9",
    "due": "2026-09-23T15:00:00Z",
    "on": "deal_31",
    "brief": {
      "who": "Granite Peak Rentals: 900 units, CFO and operations lead",
      "said": "We need payment terms that match our owners’ draws (Aug 28, `message_412`)",
      "chose": "hand-to-a-closer",
      "why": "stalled twice; the draw put it in the closer half",
      "guess": "payment timing, not price (a guess)",
      "window": "ends 2026-11-06",
      "never": [
        "a stall named to the buyer",
        "a price below the floor",
        "a deadline the Quote lacks"
      ]
    }
  },
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_553",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-08-20T17:00:00Z",
    "on": "deal_27",
    "brief": {
      "who": "Riverbend Group: 750 units",
      "chose": "agent-keeps-it",
      "why": "stalled twice; the draw put it in the agent half",
      "next": "the answer to their open data-migration question, drafted for you to send"
    }
  }
]
```

The closer answers with <Op verb="Task.claim" /> (Take this one) or <Op verb="Task.return" /> with a reason; you approve each handoff with <Op verb="Approval.approve" />. Once he claims, <Op verb="Deal.assign" /> sets `owner` to him, the agent sends nothing more on that Deal, and every reply goes to his queue. A brief nobody claims by its due time goes to the next closer, then back to you through <Op verb="Task.escalate" />, and `person-promise` fires.

**On time:** AE · Tom Reyes, 2 of 2 accepted within 1 business day, median 3 h 05 min; you, 5 of 5 drafts sent within their due time; n 7, ■□□□ Too early to tell beside Other Startups’ 89 % on time. **Your queue:** counted by kind: in month 1, 3 revival drafts and 1 approval; since then, about 1 handoff a month.

**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; Not live yet, gaps #8) | an agent send on a Deal a person owns, or a Conversation a person claimed | Leave it to the person who owns it: the draft waits in their queue. | <Op verb="Task.assign" /> |
| <a id="check-price"></a>`price` (hub, on <Op verb="Quote.send" />; gaps #1) | a Quote below the Offer’s price floor | Get the discount approved, or quote at the floor. | <Op verb="Approval.approve" /> |
| <a id="check-buyer-stop"></a>`buyer-stop` (the record’s Buyer stop) | any send to a buyer Contact who asked to stop | Nothing else sends to them; you get a Task. | <Op verb="Contact.suppress" /> |
| <a id="check-buyer-keeps"></a>`buyer-keeps` (the record’s Buyer keeps the agent) | a closer send after the buyer asked to work with Leaseline directly | The Deal comes back to you; it stays in the closer half. | <Op verb="Deal.assign" /> |
| <a id="check-recording"></a>`recording` (the record’s Recording gate) | a Meeting recording before every attendee consents on the record | Ask each attendee on the call, then record. | <Op verb="Meeting.book" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-claims"></a>`claims` | a closer Message states a price, term, date or claim outside the claims source | it flags to you within 1 hour |
| <a id="stop-second-claims"></a>`second-claims` | a second claims flag in 30 days | the closer is suspended; each open Deal goes to the next closer |
| <a id="stop-closer-silent"></a>`closer-silent` | 10 business days with no closer action | the Deal goes to the next closer, same brief and window end |
| <a id="stop-off-record"></a>`off-record` | a buyer Message cites a channel outside your Mailboxes, numbers and Meetings | it flags to you |
| <a id="stop-discount"></a>`discount` | closer-half wins average 10+ discount points deeper than agent-half wins, over 10 wins | new handoffs pause |
| <a id="stop-refund"></a>`refund` | over 20 % of a closer’s won first-year revenue refunded within 90 days | that closer pauses |
| <a id="stop-payback"></a>`payback` | commission over 50 % of added first-year revenue for 2 quarters | new handoffs pause |
| <a id="stop-readout-kill"></a>`readout-kill` | at 30+ Deals per half, the interval sits wholly below the sealed minimum | the run ends |
| <a id="stop-kill-switch"></a>`kill-switch` | you press it | no new draw, brief or agent send; handed Deals stay with their closer |

The captured refusal, then the Stop that fired as a `Campaign.paused` reason (Not live yet, gaps #2); the Quote that sent is the Granite Peak thread in Example.

```json title="The captured refusal · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "The Quote to Granite Peak did not send: it sits 25 % below the Portfolio floor.",
  "checks": [
    {
      "check": "price",
      "status": "fail",
      "doc": "/plays/closer-handoff#check-price",
      "fix": "Get the discount approved, or quote at the floor.",
      "then": "Approval.approve"
    }
  ]
}
```


```json title="The Stops that fired, as Campaign.paused reasons · sample"
[
  {
    "reason": {
      "limit": "closer-silent",
      "observed": "10 business days",
      "bound": "10 business days",
      "window": "1 Deal"
    },
    "doc": "/plays/closer-handoff#stop-closer-silent",
    "task": "task_571"
  }
]
```

## Did it work
At 2 twice-stalled large Deals a quarter, neither half reaches 30 Deals within a year, so the basis is before-after (rule o): nothing prints as Added, and your 4 drawn Deals pool with Other Startups’ cohorts. Each figure’s call is <Op verb="Metric.query" /> by node, and every node above the leaf is Not live yet (gaps #4).

`33 per 100 twice-stalled large Deals won against 0 before · before-after, not proof · n 3 · path → arr`

| Node | Now (140 days, both halves) | Before (the 140 days before) | Added | Confidence | Basis |
| --- | --- | --- | --- | --- | --- |
| `stalled-deal-win-rate` | 33 per 100: 1 of 3 decided won (closer half 1 of 2, agent half 0 of 1) · 1 still deciding | 0 per 100 (0 of 3) | — · Worth about +$1,800 a month | — | before-after, not proof · Other Startups’ results: closer half +16 per 100 over the agent half, ■■□□ Early sign, n 212 Deals pooled |
| `new-paying-customers` ↑ | +1 (Granite Peak) | 0 | — | — | before-after |
| `new-arr` | $21,600, 1 Customer · Booked $21,600: credited, not all caused by this Play | $0 | — | — | before-after · Riverbend’s $18,000 still deciding |
| `net-new-arr` · `arr` | carried from `new-arr` | carried | — | — | carried |

The leaf counts twice-stalled large Deals won per 100 drawn, by the half each was drawn into (intention to treat), read quarterly. A verdict needs 30 Deals per half, so a cohort pools across Startups.

**How it moves it:** the closer had the buyer’s own words in a brief within 1 business day of the second stall, and booked the CFO 9 days later.

**Guardrails:** before against after: discount points on won large Deals, 6 against a trailing 8, and refunds on closer-won revenue, $0 in 90 days; commission is 10 % of added first-year revenue, under the 50 % payback Stop.

```json title="The Campaign card · sample"
{
  "$id": "https://api.sb/leaseline.app/campaigns/closer-handoff",
  "$type": "Campaign",
  "play": "play:closer-handoff@1",
  "path": [
    "stalled-deal-win-rate",
    "new-paying-customers",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "stalled-deal-win-rate",
    "unit": "per-100",
    "heldBack": 2,
    "decision": null
  },
  "readout": {
    "value": null,
    "n": 3,
    "maturing": 1,
    "interval": null,
    "readability": "inadmissible",
    "basis": "before-after",
    "pooled": true
  },
  "ledger": {
    "spend": 2160,
    "workerCost": 3,
    "hours": 1.4,
    "pipelineArr": 18000,
    "wonArr": 21600,
    "projectedArr": 1790,
    "paybackDays": 37
  }
}
```

Outside benchmark: none recorded for this Play yet; Other Startups’ pooled results print beside every row.

**Before it · After it.** Before it: `buying-committee` and `instant-response` open the large Deals, and `revenue` marks a stall from buyer Events. After it: won Deals go to onboarding, and lost Deals go to `objection-watch` by their reason.

## Example
Leaseline ran it from 2026-06-01 to 2026-10-19 (140 days): 6 large Deals open, 5 first stalls revived by drafts in your queue, and 4 second stalls drawn at random, 2 to each half. Read every captured thread at `?threads=all`; three follow the tables.

| What happened, by option | Decisions | Done | Won (credited, not all caused by this Play) |
| --- | --- | --- | --- |
| Hand it to a closer · Next closer | 2 · 1 | 2 accepted, 1 reassigned after 10 silent days | 1 · Granite Peak, $21,600; Northgate lost |
| The agent keeps it | 2 | 2 held 90 days, drafted into your queue | 0 · Riverbend still deciding; Lakeview lost |
| Revive the first stall · Back to you · Close the file | 5 · 1 · 2 | 5 drafts sent by you · 1 · 2 lost with reasons | — |
| At 2 a quarter (the Use it when volume) | about 8 drawn a year | before-after, not proof | Other Startups’ results: +16 per 100, ■■□□ Early sign, n 212 |

| Day | Event | What happened | Your time |
| --- | --- | --- | --- |
| 0 | `event_610` Campaign.created | the three steps; the dry run fails `billing-connected` | 15 min |
| 0 | `event_611` Integration.connected | Stripe connected for collected revenue | 5 min |
| 9 | `event_655` Agreement.signed | Tom Reyes signs the closer Agreement; <Op verb="Role.staff" /> seats him | 20 min |
| 79 | `event_1011` Deal.stalled | Riverbend stalls twice; the draw keeps it with the agent | — |
| 113 | `event_1290` Deal.stalled | Granite Peak stalls twice; you approve the handoff; Tom accepts at 13:05 | 5 min |
| 119 | `event_1312` Action.refused | `price` refused Tom’s 25 %-off Quote; the 2-year Quote at the floor sent | — |
| 128 | `event_1371` Deal.won | Granite Peak signs: +$21,600 ARR; commission held to Dec 6 | — |
| 1–140 | `event_640` Approval.created, first of 8 | you sent 5 revival drafts, approved 2 handoffs and 1 reassignment | 1 h · **total 1.4 h measured, 2 h asked** |

> **AE · your agent → Granite Peak’s CFO and operations lead, in their own thread, Sep 23, 10:05** · Tom Reyes is joining this thread: he closes multi-owner portfolio setups for Leaseline as a commissioned partner.¹ He has the 900-unit plan and your question about payment timing.² *Signed with the Role’s disclosure line.*³
>
> **Tom, 10:41** · booked the CFO for Thursday, then traded a 2-year term for net-45 payment inside the discount Limit. Signed Oct 7: `Deal.won`, +$21,600 ARR.

```diff title="Granite Peak, 2026-09-28 · the Quote price refused, then the Quote that sent"
- $16,200 a year (25 % off) if you sign this week.
+ $21,600 a year on a 2-year term, with net-45 payment; this Quote is valid until Oct 31.
```

> **Riverbend Group, 2026-10-14 09:20** · “Before anything else: can someone walk us through moving 750 units off our old system?” · **AE · your agent, 09:21** · drafted into your queue with the Brief, due 2026-10-15 17:00 (`task_602`). · **Dana, Oct 15 11:10** · sent her own answer and two times for a migration call.

¹ The real relationship and only the title the Agreement grants. ² The buyer’s own question; no stall, open or view is named. ³ The fixed signature line, compiled from the Role’s disclosure Setting.

## Your settings
```mdx title="plays/closer-handoff.mdx"
---
large: 12000      # Portfolio Deals at $12,000 a year and up; never under $10,000
draw: 0.5
commission: 0.10  # of collected first-year revenue, held 60 days
---
Draft every revival into my queue. On a second stall, half go to a commissioned closer and half stay with the agent; I approve every handoff.
```

```text
$ npx startup-builder show plays/closer-handoff
large 12000 · draw 0.5 · commission 0.10     your file  plays/closer-handoff.mdx:2-4,6 (Ask 2026-06-01)
family sale · worker role:sales-lead, owns never · chooses 6 (3 rule, 3 read) · sequences first-stall-revival, closer-intro, agent-arm-hold · checks owned-by-a-person, price, buyer-stop, buyer-keeps, recording · stops 9 · placements gmail, outlook, linkedin (the closer’s own)    catalog  play:closer-handoff@1 (Not live yet, gaps #5)
```

### Every key from the catalog
| Key | Id | What it is |
| --- | --- | --- |
| Tactic | <a id="tactic-stall-watch"></a>`stall-watch` | Stall watch computes each open Deal’s stalls from its buyer-authored Events and passes a large Deal’s second stall to the draw. Starts at Sends nothing. |
| Tactic | <a id="tactic-agent-revival"></a>`agent-revival` | Agent revival is the agent’s own attempt on a stalled Deal, run on a first stall and for 90 days in the agent arm. Starts at Sends nothing. |
| Tactic | <a id="tactic-closer-bench"></a>`closer-bench` | Closer bench seats commissioned closers through a paid work trial, a signed Agreement and verified payout details before any Deal needs one. Starts at Sends nothing. |
| Tactic | <a id="tactic-closer-draw"></a>`closer-draw` | Closer draw checks a twice-stalled large Deal’s eligibility and a closer’s capacity, then randomizes it to the handoff arm or the agent arm. Starts at Sends nothing. |
| Tactic | <a id="tactic-handoff-brief"></a>`handoff-brief` | Handoff brief compiles a Deal’s full record for the closer, so no buyer repeats themselves, and offers it with a deadline. Starts at You approve each one. |
| Tactic | <a id="tactic-closer-handoff-run"></a>`closer-handoff-run` | Closer handoff run gives one closer ownership of the Deal for one window, has the agent introduce them in thread, and closes by record only. Starts at You approve each one. |
| Tactic | <a id="tactic-closer-assist"></a>`closer-assist` | Closer assist drafts for the closer and sends scheduling and document deliveries in the closer’s name, under a Mandate that ends with the window. Starts at You approve the first wave. |
| Tactic | <a id="tactic-closer-commission"></a>`closer-commission` | Closer commission earns a rate on a won Deal’s collected first-year revenue, net of refunds, and remits it monthly after a clawback hold. Starts at Sends nothing. |
| Tactic | <a id="tactic-closer-readout"></a>`closer-readout` | Closer readout compares the handoff arm with the agent arm each quarter, beside its guardrails and payback, and records the verdict. 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. |
| Tactic | <a id="tactic-reply-matrix"></a>`reply-matrix` | Reply matrix: Labels every outreach reply with one of 11 labels, maps it to one of seven reply kinds, and runs that kind’s move by its deadline. Starts at You approve each one. |
| Trigger | <a id="trigger-deal-stalled"></a>`deal-stalled` | Deal stalled: `state` on `Deal.stalled`, window 14d. |
| Trigger | <a id="trigger-deal-revived"></a>`deal-revived` | Deal revived: `event` on `Deal.advanced`, window 7d. |
| Trigger | <a id="trigger-deal-stalled-twice"></a>`deal-stalled-twice` | Deal stalled twice: `state` on `Deal.stalled`, window 7d. |
| Trigger | <a id="trigger-handoff-declined"></a>`handoff-declined` | Handoff declined: `event` on `Task.returned`, window 1d. |
| Trigger | <a id="trigger-closer-silent"></a>`closer-silent` | Closer silent: `state` on `Deal.stalled`, window 5d. |
| Trigger | <a id="trigger-buyer-declines-closer"></a>`buyer-declines-closer` | Closer declined by the buyer: `event` on `Conversation.answered`, window 1d. |
| Trigger | <a id="trigger-handoff-window-end"></a>`handoff-window-end` | Handoff window end: `at` on `Deal.assigned`, window 1d. |
| Trigger | <a id="trigger-handoff-collected"></a>`handoff-collected` | Handoff collected: `event` on `Invoice.collected`, window 30d. |
| Trigger | <a id="trigger-handoff-refunded"></a>`handoff-refunded` | Handoff refunded: `event` on `Invoice.refunded`, window 1d. |
| Sequence | <a id="sequence-closer-intro"></a>`closer-intro` | Closer intro: 4 steps; it ends on The closer sends a first Message; A buyer Contact asks to stop; A buyer asks to keep the agent. |
| Sequence | <a id="sequence-agent-arm-hold"></a>`agent-arm-hold` | Agent arm hold: 6 steps; it ends on Any buyer reply, routed to reply-matrix; The Deal is won or lost; A Contact opts out. |
| Sequence | <a id="sequence-first-stall-revival"></a>`first-stall-revival` | First stall revival: 4 steps; it ends on A buyer-authored Event revives the Deal; A Contact opts out. |