URL: /plays/gifting · Id: `play:gifting`

# Gifting

> Sends one gift the Person picks after two relevant touches at a live moment, with you approving each, and counts the Meetings it adds.

Sends one gift the [Person](https://startupbuilder.dev/business/nouns/person) picks after two relevant touches at a live moment, with you approving each, and counts the [Meetings](https://startupbuilder.dev/business/nouns/meeting) it adds.

```text title="Set it up · Ask"
Be our SDR for gifts: when someone we have written to twice hits a real moment, draft one small gift they pick, and I approve every one. Keep it under $500 a month. Show me what’s missing; don’t send.
```

```text title="Run one · Ask"
Hand our latest gift moment to the SDR 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 ("Organization.appointed", "Post.published", "Organization.announced", "Organization.degraded", "Conversation.answered", "Message.received", "Deal.stalled", "Visit.recorded", "Organization.downsized", "Organization.disrupted", "Organization.acquired", "Organization.tendered", "Deal.proposed")', 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_418",
    "$type": "Decision",
    "choice": "gift-they-pick",
    "reason": "2 relevant touches (Oct 6, Oct 13), a new-leader window with 41 days left, and Ridgeview is a private business under the $50 cap",
    "stakes": "medium",
    "options": [
      "gift-they-pick",
      "printed-piece",
      "no-angle",
      "to-the-ae",
      "not-now"
    ],
    "by": "worker_2",
    "on": "contact_14",
    "expected": "a Meeting held by day 45",
    "reopensWhen": "no Meeting.booked for contact_14 within 45d"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_2",
      "verb": "Contact.enrich",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingApproval",
      "mode": "try",
      "by": "worker_2",
      "verb": "Order.place",
      "checks": [
        {
          "check": "owned-by-a-person",
          "status": "pass"
        },
        {
          "check": "hold",
          "status": "pass"
        },
        {
          "check": "class-cap",
          "status": "pass"
        },
        {
          "check": "market-hold",
          "status": "pass"
        }
      ]
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_3",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingApproval",
      "mode": "try",
      "by": "worker_2",
      "verb": "Message.schedule",
      "checks": []
    }
  ]
}
```

`action_2` waits on your Approval: every gift does, on every rung. `action_3` is the gift Message, which sends only once the Order matches what you approved.

`36 per 100 gifted against 11 before · before-after, not proof · n 11 · path → arr`

| Try another: the Person | Choice | Reason |
| --- | --- | --- |
| Ridgeview Residential: Marcus Bell, new Director of Operations, 2 touches, no reply | `gift-they-pick` | private business, a live new-leader window, under the $50 cap |
| Cedar County Housing Authority: Ana Ruiz speaks at the state housing conference on Nov 4 | `printed-piece` | public sector: its cap allows only a printed note |
| Copperline Rentals: Meeting held Sep 29, quiet 12 business days | `to-the-ae` | a gift during an open Deal is never the agent’s call |
| Oakmont Living: Deal at proposal since Oct 14 | `not-now` | the decision hold runs until the Deal closes |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$650 ARR a month at 8 | 30 min week 1, then 15 a week | $20 per gift, ~$165 a month at 8 | Day 17: first Meeting booked after a gift | 5+ Meetings from outreach, 8+ a month at a live moment | Under 5 Meetings: `cold-email` · no gift Limit: set one (<Op verb="Limit.raise" />) |

**Where it sits:** **Stranger** → **Lead** → Trialing → Activated → At risk → Churned → Won back · Held Meetings per $100 of gifts → Deals and trials opened → New Customers ↑ → ARR added each week → ARR

Worth’s formula: about +0.9 added Meetings per $100 (Other Startups’ results; no lift of your own to read) × $165 a month of gifts × 0.75 Meetings to opens × 0.25 opens to paid × $2,393 first order ARR ≈ +$666. Under First signal: At 8 a month, 90 days can tell only +2.4 per $100 or more, so your file starts at `holdout: 0` and reads before-after.

`sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Organization.appointed · first gift brief 4m 12s · 7 keys Not live yet`

## Start it this week
```bash
npx startup-builder add play gifting   # 1 · writes plays/gifting.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":"gifting"}'

# 3 · keep it: every gift waits on your Approval
curl -X POST https://api.sb/leaseline.app/campaigns \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"play":"gifting"}'

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

# off: open Cards void and queued follow-ups cancel
curl -X PATCH https://api.sb/leaseline.app/campaigns/gifting \
  -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": "gifting can’t start: 3 checks fail and 1 warns.",
  "checks": [
    {
      "check": "use-when",
      "status": "pass",
      "observed": "7 Meetings held from outreach in 90 days; 11 a month with 2 relevant touches at a live moment",
      "doc": "/plays/gifting#check-use-when",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "pass",
      "observed": "11 held Meetings per 100 People with 2 relevant touches, n 64 in 90 days",
      "doc": "/plays/gifting#check-baseline",
      "then": "Metric.query"
    },
    {
      "check": "domain-authenticated",
      "status": "fail",
      "doc": "/plays/gifting#check-domain-authenticated",
      "fix": "Add the 3 DNS records shown; it passes once they resolve, often within an hour.",
      "then": "Domain.authenticate"
    },
    {
      "check": "mailbox-warm",
      "status": "fail",
      "observed": "day 9 of 14",
      "doc": "/plays/gifting#check-mailbox-warm",
      "fix": "Finish warming Dana’s Mailbox; gift Messages send from it, about 5 more days.",
      "then": "Mailbox.warm"
    },
    {
      "check": "gift-connection",
      "status": "fail",
      "doc": "/plays/gifting#check-gift-connection",
      "fix": "Connect gift delivery in draft-only mode; only your Approval releases the Card.",
      "then": "Integration.connect"
    },
    {
      "check": "role-unstaffed",
      "status": "warn",
      "roles": [
        "sales-lead"
      ],
      "owned": 6,
      "doc": "/plays/gifting#check-role-unstaffed",
      "fix": "Staff the AE, or leave it: quiet Deals 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: 7 Meetings held from outreach, 11 a month at a live moment; 11 per 100, n 64 (gaps #8) | <Op verb="Metric.query" /> on `positive-reply-rate`, then on `gift-meetings-per-100`, which fills Before in Your number | 1 min | none |
| <a id="check-domain-authenticated"></a>`domain-authenticated` · fail | <Op verb="Domain.authenticate" /> | 10 min | until DNS resolves, often under 1 h |
| <a id="check-mailbox-warm"></a>`mailbox-warm` · fail: day 9 of 14 | <Op verb="Mailbox.warm" /> on Dana’s Mailbox | 0 min | about 5 days |
| <a id="check-gift-connection"></a>`gift-connection` · fail (gaps #8) | <Op verb="Integration.connect" /> with gift delivery, draft-only | 5 min | none |
| <a id="check-role-unstaffed"></a>`role-unstaffed` · warn (gaps #8): 6 of your open Deals have a person owner, you | <Op verb="Role.staff" />, or leave it: quiet Deals come to you, and the agent drafts into your queue for your 6 | 0 min | none |

`Your number · Before 11 per 100 with no gift · Now 36 per 100 gifted · Target 1 added Meeting per $100 by Dec 31 · before-after, not proof · n 11 matured`

Each gift costs what you approve: $25 for a voucher they pick, about $10.50 for a printed renewal calendar with postage, and $5.25 for a printed note. Contact and company data costs $0.06 a lookup (<Op verb="Contact.enrich" />) and each note $0.04 (Worker cost). That comes to about $165 a month at 8 gifts, inside the $500 gift Limit.

## When it starts
| When | Trigger id | Starts on | Window | How it gets in |
| --- | --- | --- | --- | --- |
| A new head of operations announces their start | `new-leader` | `event` on `Organization.appointed` where function = 'operations' | 60d; one gift per Person in 180 days | read from public posts, or <Op verb="Event.capture" /> for one you saw |
| They announce they attend or speak at a named work event | `event-trip` | `event` on `Post.published` where kind = 'event-attendance' | 21d | read from public posts, or <Op verb="Event.capture" /> |
| The date they named to write again arrives | `not-now-date` | `at` on `Conversation.answered` where the date the Person’s own reply named | 14d | set from their reply by <Op verb="Message.schedule" /> |
| + 10 more for quiet Deals, an address given, pricing visits, an outage, an initiative and the five holds (`?lanes=all`) | | | | |

```json title="One signed delivery · StartupBuilder-Signature"
{
  "$id": "https://api.sb/leaseline.app/events/event_1187",
  "$type": "Event",
  "name": "Organization.appointed",
  "at": "2026-10-19T07:12:40Z",
  "seq": 1187,
  "data": {
    "organization": "organizations/organization_63",
    "contact": "contacts/contact_14",
    "role": "Director of Operations",
    "announced": "2026-09-30",
    "source": "a public post"
  }
}
```

```bash title="Reproduce it in test"
# each delivery is signed with the Watch’s secret
curl -X POST https://api.sb/leaseline.app/watches \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"selector":"Organization.appointed","url":"https://leaseline.app/hooks/sb"}'
npx startup-builder trigger Organization.appointed --like event_1187   # replays the delivery
npx startup-builder clock advance --by 3d   # runs the follow-up, after a claim or 3 business days
```

## Who runs it
**SDR · your agent** (`role:prospector`, `worker_2`) holds the Key Result and drafts every gift brief. Every gift waits on **you** (Dana Okafor, person, `worker_1`), the gift Mandate’s approver, and quiet Deals go to **AE · Priya Shah (person)** (`role:sales-lead`, `worker_3`, staffed on day 9). The gift itself never climbs past You approve each one: a $0 per-gift Limit opens an Approval for each.

| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
| --- | --- | --- | --- | --- | --- |
| A gift they pick · A printed piece | You approve each one | 15 approved of 18 (2 refused, 1 expired) | never: the $0 per-gift Limit opens an Approval for every gift | — | <Op verb="Approval.approve" /> · <Op verb="Approval.refuse" /> |
| The note and the follow-up | It does it, you can stop it | 13 follow-ups, 0 Checks failed sent | met on day 31 (20 briefs reviewed, the note prompt locked) | any Stop → You approve each one | <Op verb="Action.cancel" /> inside the hold |
| No angle · To the AE · Not now | It does it | 3 of 3 · 2 of 2 · 4 of 4 | — | a held Organization drafted anyway → You approve each one | <Op verb="Action.redirect" /> |
| Change the gift rule | You approve each one | 1 merged of 1 | never | — | <Op verb="Change.merge" /> · <Op verb="Change.revert" /> |
| Never: a gift tied to a Meeting, a reply or a decision; an address they did not give | Refused, every time | 1 drafted, 1 refused | never | — | the `condition` Stop and the `supplied-address` Check |

**What it reads · What it may call.** It reads public posts and your own Sequence history, never a Visit or a Page viewed in what it writes. <Op verb="Order.place" /> pays only with the single-use Card your Approval issues, and <Op verb="Card.issue" /> is never its call. Its tools are <Op verb="Order.place" />, <Op verb="Task.assign" />, and any other call becomes an Approval under the Role’s Mandate.

```md title="The brief (folded): compiled Agent-register Markdown · play:gifting@1 · each line names its record key"
You hold the SDR Key Result: 1 added held Meeting per $100 of gifts by 2026-12-31. ← worker, metric
On each gift moment, choose one option and say why; a hold gets Not now.         ← triggers, chooses
Gift only after 2 relevant touches in 60 days, or 1 reply that was not a stop.   ← tactics.gift-eligibility
Private businesses get a voucher they pick; public sector gets a printed note.   ← your file, line 5
The note names who sent it, the moment with its date, and the gift, and nothing else. ← copyRules 1
Never tie a gift to a Meeting, a reply or a decision.                            ← copyRules 2, condition
Ship print only to an address the Person gave you.                               ← copyRules 8, supplied-address
```

**The slow loop, as a Change.** `decision_377` (2026-09-28, weekly) read 2 declines of printed notes to private businesses against 0 of 9 vouchers, so `change_22` sent private businesses vouchers only (your file, line 5), and Dana merged it with <Op verb="Change.merge" />. **Replayed on past candidates**, <Op verb="Change.review" /> put declines at 0 of 13; read back at +21d it is 0 of 7, n 7, ■□□□ Too early to tell (Example, day 56).

**Bring your own agent** (folded) drafts at It does it, you can stop it when it matches or beats the seated agent on the eval suite, and at You approve each one when it does not; gifts wait on you either way, and <Op verb="Role.staff" /> seats it.

```bash
npx startup-builder eval --scenario gifting-21 --agent "claude -p" --seat prospector   # seated: 0 wrong details sent, 0 conditions, $0.04 a brief · yours: 1 wrong role, 0 conditions, $0.07 → You approve each one
```

## What it can do next
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
| --- | --- | --- | --- | --- | --- |
| A gift they pick `gift-they-pick` | a private business, 2 relevant touches, a live moment, under the class cap | Your rule (line 5) | `approve-spend` → your Approval → <Op verb="Order.place" /> with the single-use Card → `gift-touch` | you approve it, due 1 business day · Take this one | you |
| A printed piece `printed-piece` | a class whose cap allows only print, or a moment a printed deliverable fits | Agent’s call, with its reason | `approve-spend` → `gift-touch-printed`: it asks where to send it, then ships to the address they gave | you approve it, due 1 business day · Take this one | you |
| No angle `no-angle` | the note could go to anyone else this week | Agent’s call, with its reason | `outbound-sequence` carries on unchanged | nobody; they stay in their Sequence | the same |
| To the AE `to-the-ae` | an open Deal with a held Meeting, quiet for 10 business days | Agent’s call, with its reason | <Op verb="Task.assign" />, with no gift | <Op verb="Task.assign" /> → AE · Priya Shah, due 1 business day, Brief attached · Take this one | you, within 1 business day |
| Not now `not-now` | a hold, a Deal at proposal, or a gift in the last 180 days | Your rule (the holds) | nothing; names the hold and its end date | nobody; the hold ends on its date | the same |

| When they write back | Fixture reply | What happens | Who answers | By when | Call |
| --- | --- | --- | --- | --- | --- |
| Interested | “Thanks for the coffee. Happy to look at renewals next week.” | offers 3 times from Priya’s calendar; the Brief goes to the AE (When it hands to you) | AE · Priya Shah (person) | 1 business day | <Op verb="Meeting.book" /> |
| Send me pricing | “What does it cost for 210 units?” | answers with the Pricing Page’s list Price and one next step; never a price because of the gift | SDR · your agent | 5 min | <Op verb="Conversation.answer" /> |
| Not now | “Busy until the new year.” | the follow-up stops; `not-now-date` waits for Jan 5 | SDR · your agent | at once | <Op verb="Message.schedule" /> |
| Wrong person | “Leasing is Tara’s side.” | thanks them and asks them to bring Tara in; it never gifts or writes to an address from their text | SDR · your agent | 1 business day | <Op verb="Conversation.answer" /> |
| Out of office | an auto-reply until Oct 28 | the follow-up waits for the return date; the gift link stays open to day 30 | nobody | the return date | <Op verb="Message.schedule" /> |
| Question it can’t answer | “Does it sync with our accounting system?” | To a person, the question in the Brief | AE · Priya Shah, or you | 1 business day | <Op verb="Conversation.escalate" /> |
| Stop | “No gifts, please, and stop emailing.” | a gift-scope and email Suppression; nothing sends again, on any lane | nobody | at once | <Op verb="Contact.suppress" /> |

## When it hands to you
Every gift waits on **you** (Dana Okafor, person), the gift Mandate’s approver; quiet Deals go to **AE · Priya Shah (person)**. As captured: the gift Approval and your Brief, then the AE’s (`brief`, `draft`, `route` and `checks` are Not live yet, gaps #7).

```json title="What lands in each queue · sample"
[
  {
    "$id": "https://api.sb/leaseline.app/approvals/approval_88",
    "$type": "Approval",
    "verdict": null,
    "deadline": "2026-10-22T17:00:00Z",
    "draft": "Marcus, your post on Sep 30 said you started as Ridgeview’s Director of Operations. Here is a coffee, a meal or an ebook on renewal timing; pick one, or decline. Nothing needed back.",
    "route": "gift-they-pick",
    "checks": [
      {
        "check": "class-cap",
        "status": "pass"
      },
      {
        "check": "hold",
        "status": "pass"
      },
      {
        "check": "owned-by-a-person",
        "status": "pass"
      }
    ]
  },
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_509",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-10-20T17:00:00Z",
    "on": "contact_14",
    "brief": {
      "who": "Marcus Bell, Director of Operations, Ridgeview Residential (210 units)",
      "moment": "new-leader: his post, 2026-09-30; the window closes 2026-11-29",
      "touches": [
        "Oct 6 value",
        "Oct 13 renewal calendar"
      ],
      "gift": "a voucher he picks, $25",
      "card": "single-use, $25.00 plus the delivery fee, valid 72 h after approval",
      "never": [
        "a gift tied to a Meeting",
        "an address he did not give"
      ]
    }
  },
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_472",
    "$type": "Task",
    "assignee": "worker_3",
    "due": "2026-10-09T16:00:00Z",
    "on": "lead_47",
    "brief": {
      "who": "Jo Park, Copperline Rentals",
      "said": "Meeting held Sep 29: 160 units, renewals in two systems",
      "chose": "to-the-ae",
      "why": "open Deal, quiet 12 business days; a gift during a Deal is never the agent’s call",
      "never": [
        "a gift",
        "a discount"
      ]
    }
  }
]
```

You answer each gift with <Op verb="Approval.approve" />, an edit, or <Op verb="Approval.refuse" /> with a reason; one unanswered for 3 business days, or past its window, expires and the gift never sends. The AE answers a quiet Deal with <Op verb="Task.claim" /> (Take this one), <Op verb="Task.return" /> with a reason, or <Op verb="Action.redirect" />. Once a person claims, the agent’s pending gifts and follow-ups at that Organization cancel with `claimedByPerson` (Not live yet, gaps #7); a Task nobody claims by its due time goes up a Role through <Op verb="Task.escalate" />, and `approver-queue` fires.

**On time:** You: 17 of 18 gift Approvals answered within 1 business day, median 3h 10m, 1 expired with its window, n 18, ■□□□ Too early to tell beside Other Startups’ 91 % on time. AE · Priya Shah: 2 of 2 claimed within 1 business day, n 2. **Your queue:** counted by kind: in week 1, 5 gift Approvals and 1 weekly review; after the note prompt locked, about 2 gift Approvals and 1 review a week.

**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) | a gift to a Contact whose Lead or open Deal a person owns, or whose 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-gift-approval"></a>`gift-approval` (the Approval gate) | a gift Order with no <Op verb="Approval.approve" /> from a person | Approve it in your queue; a gift never sends on a timeout. | <Op verb="Approval.approve" /> |
| <a id="check-hold"></a>`hold` | a gift or follow-up to an Organization under a live hold, or with a Deal at proposal | Wait for the hold’s end date; the agent reads it again then. | <Op verb="Decision.list" /> |
| <a id="check-class-cap"></a>`class-cap` | a gift above its recipient-class cap, its 12-month cap, or the Organization’s own published cap | Send a printed note, or drop the value to the class cap. | <Op verb="Order.revise" /> |
| <a id="check-supplied-address"></a>`supplied-address` (mail lane) | a printed piece or physical gift to an address the Person did not give | Ask where to send it in the thread; ship only to their answer. | <Op verb="Message.schedule" /> |
| <a id="check-draft-match"></a>`draft-match` | an Order that differs from its Approval in recipient, class, amount or address | Approve the changed Order again; the old Card voids. | <Op verb="Approval.approve" /> |
| <a id="check-window-expiry"></a>`window-expiry` | a gift past its moment’s window, or 3 business days after its Approval opened | Let it go; the next live moment opens a new brief. | <Op verb="Decision.list" /> |
| <a id="check-market-hold"></a>`market-hold` | a gift to an unresolved Market or an unverified gift row | Resolve the Organization’s Market; the gift waits and never retries another way. | <Op verb="Task.next" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-spend-limit"></a>`spend-limit` (the gift Limit) | month-to-date gift Cost reaches the $500 Limit; at 80 % the Treasurer, so you, hears first | <Op verb="Limit.raise" />, or gifting resumes when the month turns |
| <a id="stop-connection"></a>`connection` | a gift delivery or print connection can send on its own | that connection pauses; <Op verb="Integration.reconnect" /> in draft-only mode |
| <a id="stop-wrong-detail"></a>`wrong-detail` | one delivered gift has a wrong name, Organization, role or city | the Play pauses until the evals run again and pass |
| <a id="stop-condition"></a>`condition` | a delivered note or follow-up ties the gift to a Meeting, a reply or a decision | the Play pauses; <Op verb="Incident.open" /> |
| <a id="stop-decline"></a>`decline` | 2 declines, returns or no-gifts replies in a cell within 30 days | the cell pauses for your review |
| <a id="stop-no-lift"></a>`no-lift` | after 200 eligible per arm, a gift class adds no Meetings | that class stops |
| <a id="stop-break-even"></a>`break-even` | after 200 eligible per arm, a gift class costs more per added Meeting than the break-even line | it stops, or drops one value step |
| <a id="stop-approver-queue"></a>`approver-queue` | your queue sits unread 2 business days, or over 5 Approvals expire in a week | new candidates pause; you hear first |
| <a id="stop-kill-switch"></a>`kill-switch` | you press it | <Op verb="Mandate.pause" /> on the gift Mandate: every open Card voids, queued follow-ups cancel |

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

```json title="The captured refusal · sample"
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "The gift to Cedar County Housing Authority did not send: a $25 voucher is over the public sector cap.",
  "checks": [
    {
      "check": "class-cap",
      "status": "fail",
      "doc": "/plays/gifting#check-class-cap",
      "fix": "Send a printed note, or drop the value to the class cap.",
      "then": "Order.revise"
    },
    {
      "check": "hold",
      "status": "pass"
    }
  ]
}
```


```json title="The Stops that fired, as Campaign.paused reasons · sample"
[
  {
    "reason": {
      "limit": "approver-queue",
      "observed": "2d 3h unread",
      "bound": "2 business days",
      "window": "the queue"
    },
    "doc": "/plays/gifting#stop-approver-queue",
    "task": "task_455"
  }
]
```

## Did it work
At about 2 eligible a week, no held-back half reads within 90 days, so the basis is before-after (rule o): the columns read Now and Before, and nothing prints as Added. Each figure’s call is <Op verb="Metric.query" /> by node, and every node above the leaf is Not live yet (gaps #4).

`36 per 100 gifted against 11 before · before-after, not proof · n 11 · path → arr`

| Node | Now (56 days) | Before (the 90 days, per 56) | Added | Confidence | Basis |
| --- | --- | --- | --- | --- | --- |
| `gift-meetings-per-100` | 36 per 100: 4 held Meetings from 11 matured gifts ($224) · 4 still maturing | 11 per 100 with no gift (7 of 64) | — · Worth about +$650 a month | — | before-after, not proof · Other Startups’ results +0.9 per $100, ■■■□ Likely, n 1,180 per arm, held back at random |
| `opened-deals-and-trials` | 3 Deals opened from the 4 Meetings | 5 from the 7 | — | — | before-after |
| `new-arr` ↑ | $2,393, 1 Customer on the $2,400 plan · Booked: credited, not all caused by this Play | $1,196 | — · 2 Deals still deciding | — | before-after, not proof |
| `net-new-arr` · `arr` | carried from `new-arr` | carried | — | — | carried |

Before against after reads the gifted against the 90 days before, when People with 2 relevant touches got no gift, scaled to 56 days. It is not proof; Other Startups’ results, read against a 30 % no-gift half held back at random, print beside it.

**How it moves it:** a gift the Person picks lands in a thread that already carries 2 relevant touches, a median 19 days into its moment’s window, and the follow-up holds one ask.

**Guardrails:** before against after: `positive-reply-rate` on the gifted threads, 4 of 15 against 9 of 64 before, and `play-payback`, $306 of gifts against $2,393 won ARR; opt-outs, 1 of 15 against 2 of 64.

```json title="The Campaign card · sample"
{
  "$id": "https://api.sb/leaseline.app/campaigns/gifting",
  "$type": "Campaign",
  "play": "play:gifting@1",
  "path": [
    "gift-meetings-per-100",
    "opened-deals-and-trials",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "gift-meetings-per-100",
    "unit": "per-100-dollars",
    "heldBack": 0,
    "decision": null
  },
  "readout": {
    "value": null,
    "n": 11,
    "maturing": 4,
    "interval": null,
    "readability": "inadmissible",
    "basis": "before-after",
    "pooled": true
  },
  "ledger": {
    "spend": 306,
    "workerCost": 2,
    "hours": 1.8,
    "pipelineArr": 4800,
    "wonArr": 2393,
    "projectedArr": 666,
    "paybackDays": 5
  }
}
```

Outside benchmark: 77 to 81 % of business purchases go to the first vendor the buyer contacted (3,744 respondents, a buyer survey by an intent-data firm, 2026-10-24).

**Before it · After it.** Before it: `cold-email` and `moment-outreach` carry the 2 relevant touches every gift needs. After it: held Meetings go to the AE, and `lead-nurture` hears the Not now replies (`Lead.nurtured`). If outreach holds under 5 Meetings by day 28, run `cold-email` first.

## Example
Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days). 236 People sat in open outreach Sequences; 58 passed the relevance gate, 24 had a live moment, and 21 were eligible after holds and Suppression. Read every captured thread at `?threads=all`; three follow the tables.

| What happened, by option | Decisions | Gifts sent | Held Meetings | Won (credited, not all caused by this Play) |
| --- | --- | --- | --- | --- |
| A gift they pick | 14 | 11 ($275) | 4 (3 of the 8 matured) | 1 on the $2,400 plan (+$2,393 ARR) |
| A printed piece | 4 | 4 ($31) | 1 (1 of the 3 matured) | 1 Deal open |
| No angle · To the AE · Not now | 3 · 2 · 4 | 0 | — · 1 Deal claimed · — | 1 Deal open |
| **All** · Before (90 days, per 56) | **27** | **15 ($306)** | **5** (4 of the 11 matured) · 7 of 64 | **$2,393** · $1,196 |
| At 8 a month (the Use it when volume) | about 15 in 56 days | about $305 | before-after, not proof | Other Startups’ results: +0.9 per $100, ■■■□ Likely, n 1,180 per arm |

| Day | Event | What happened | Your time |
| --- | --- | --- | --- |
| 0 | `event_121` Campaign.created | the three steps; dry run fails `domain-authenticated`, `mailbox-warm` and `gift-connection` | 25 min |
| 0 | `event_124` Integration.connected | gift delivery connected, draft-only | 5 min |
| 6 | `event_233` Approval.approved | the first gift: a $25 voucher to Ashford Lane’s new head of operations | 2 min |
| 9 | `event_301` Role.staffed | AE · Priya Shah (person) takes `role:sales-lead` | — |
| 17 | `event_402` Meeting.booked | the first Meeting after a gift: Ashford Lane, with Priya | — |
| 31 | `event_588` Role.updated | the note prompt locked after 20 briefs; notes and follow-ups send after a 2-minute hold, and gifts still wait on you | — |
| 35 · 56 | `event_611` Change.merged · `event_902` Readout.created | vouchers only for private businesses: replayed at 0 of 13 declines, read back at +21d at 0 of 7 | 5 min |
| 44 | `event_745` Campaign.paused | `approver-queue`: your queue sat 2 days; resumed in 20 min | 20 min |
| 1–56 | `event_230` Approval.created, first of 18 | you answered 18 gift Approvals and the weekly reviews, from the <Op verb="Task.next" /> log | 58 min · **total 1.8 h measured, 2 h asked** |

> **Leaseline → Hollis Kim, Ashford Lane, Aug 31, 09:10** · Hollis, your post on Aug 18 said you started as Ashford Lane’s head of operations.¹ Here is a coffee, a meal or an ebook on renewal timing; pick one, or decline. Nothing needed back.² *Signed with Dana’s name, then the decline, Source and stop lines from the Role’s Settings.*³
>
> **Sep 3, 09:05, the follow-up in the same thread** · The 60-day renewal calendar is the part most new operations leads set up first. Want it built for Ashford Lane’s 180 units?⁴
>
> **Hollis, Sep 3, 11:40** · “Yes, send times.” <Op verb="Meeting.book" /> booked Priya for Sep 10, and the Brief reached her at 11:41.

```diff title="Cedar County Housing Authority, 2026-10-02 · the draft class-cap refused, then the rewrite that sent"
- Ana, ahead of your talk on Nov 4, here is a $25 voucher: coffee, a meal or an ebook.
+ Ana, ahead of your talk on Nov 4, here is a printed one-page renewal calendar for county housing. Nothing needed back.
```

> **Copperline Rentals, 2026-10-08 09:30** · the Deal sat quiet 12 business days after a held Meeting, so the agent sent no gift and chose To the AE. · **Priya, 10:20** · claimed it with <Op verb="Task.claim" /> and wrote to Jo Park at 14:45, inside the 1-business-day due time. The Brief went to Priya (`task_472`).

¹ The moment, with its date, from a public post. ² The whole gift at once, picked by them, with the decline choice and no ask. ³ The fixed lines, compiled from the Role’s Settings. ⁴ One line on the moment and one ask; it never names the gift.

## Your settings
```mdx title="plays/gifting.mdx"
---
holdout: 0          # about 2 eligible a week is too few to hold 30 % back; it reads before-after
giftLimit: 500       # dollars a month, on the gift Mandate
---
Gift on a new head of operations, an event trip or a not-now date. Private businesses get a $25 voucher they pick; public sector gets a printed note.
```

```text
$ npx startup-builder show plays/gifting
holdout 0 · giftLimit 500 · vouchers for private businesses     your file  plays/gifting.mdx:2,3,5 (Ask 2026-08-24; line 5 by change_22, 2026-09-28)
family demand · worker role:prospector, owns never · chooses 5 (2 rule, 3 read) · sequences gift-touch, gift-touch-printed · approval every-send, every gift · checks owned-by-a-person, gift-approval, hold, class-cap, supplied-address, draft-match, window-expiry, market-hold · stops 9 · placements gmail, outlook, yahoo-mail, postal-mail, linkedin    catalog  play:gifting@1 (Not live yet, gaps #5)
```

### Every key from the catalog
| Key | Id | What it is |
| --- | --- | --- |
| Tactic | <a id="tactic-gift-eligibility"></a>`gift-eligibility` | Gift eligibility finds People in open Sequences who passed the relevance gate at a live gift moment, then applies holds, classes, caps and the holdout. Starts at Sends nothing. |
| Tactic | <a id="tactic-gift-compose"></a>`gift-compose` | Gift compose turns a candidate into a checked gift brief: class, value, a note of 40 words at most, any printed render and the follow-up. Starts at Sends nothing. |
| Tactic | <a id="tactic-address-ask"></a>`address-ask` | Address ask offers a printed piece in the parent thread and asks where to send it, so every printed address is one the Person supplied. Starts at You approve each one. |
| Tactic | <a id="tactic-gift-approval"></a>`gift-approval` | Gift approval holds every gift under a $0 per-gift Limit, so each opens an Approval, and releases a single-use Card only on human approval. Starts at You approve each one. |
| Tactic | <a id="tactic-gift-send"></a>`gift-send` | Gift send places an approved gift Order through a draft-only connection, checks it against its Approval, pays by single-use Card and sends the gift Message. Starts at You approve each one. |
| Tactic | <a id="tactic-gift-follow-up"></a>`gift-follow-up` | Gift follow-up sends one in-thread follow-up with one ask after a claim, a delivery or 3 business days, and never a second. Starts at You approve each one. |
| Tactic | <a id="tactic-gift-readout"></a>`gift-readout` | Gift readout counts incremental held Meetings per $100 of gift Cost against a no-gift holdout, pooled across siblings, and stops classes past break-even. 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. |
| Tactic | <a id="tactic-sending-stop-loss"></a>`sending-stop-loss` | Sending stop loss: Reads the Play’s own bounces, replies and seed tests on every send, and rests, pauses or retires a Mailbox, Domain, cell or the Play. Starts at Sends nothing. |
| Trigger | <a id="trigger-new-leader"></a>`new-leader` | New leader: `event` on `Organization.appointed`, window 60d. |
| Trigger | <a id="trigger-event-trip"></a>`event-trip` | Event trip: `event` on `Post.published`, window 21d. |
| Trigger | <a id="trigger-stated-initiative"></a>`stated-initiative` | Stated initiative: `event` on `Organization.announced`, window 30d. |
| Trigger | <a id="trigger-alternative-outage"></a>`alternative-outage` | Alternative outage: `event` on `Organization.degraded`, window 90d. |
| Trigger | <a id="trigger-not-now-date"></a>`not-now-date` | Not now date: `at` on `Conversation.answered`, window 14d. |
| Trigger | <a id="trigger-address-given"></a>`address-given` | Address given: `event` on `Message.received`, window 30d. |
| Trigger | <a id="trigger-quiet-deal"></a>`quiet-deal` | Quiet deal: `state` on `Deal.stalled`, window 30d. |
| Trigger | <a id="trigger-pricing-visit"></a>`pricing-visit` | Pricing visit: `event` on `Visit.recorded`, window 72h. |
| Trigger | <a id="trigger-layoff-hold"></a>`layoff-hold` | Layoff hold: `state` on `Organization.downsized`, window 14d. |
| Trigger | <a id="trigger-crisis-hold"></a>`crisis-hold` | Crisis hold: `state` on `Organization.disrupted`, window 30d. |
| Trigger | <a id="trigger-acquisition-hold"></a>`acquisition-hold` | Acquisition hold: `state` on `Organization.acquired`, window 90d. |
| Trigger | <a id="trigger-tender-hold"></a>`tender-hold` | Tender hold: `event` on `Organization.tendered`, window 90d. |
| Trigger | <a id="trigger-decision-hold"></a>`decision-hold` | Decision hold: `state` on `Deal.proposed`, window 90d. |
| Sequence | <a id="sequence-gift-touch"></a>`gift-touch` | Gift touch: 4 steps; it ends on Any reply on any channel; A decline on the redemption page; Suppression at any scope; A hold Trigger firing on the Organization; A booked Meeting; The link expires unclaimed. |
| Sequence | <a id="sequence-gift-touch-printed"></a>`gift-touch-printed` | Gift touch printed: 6 steps; it ends on Any reply that is not an address; Suppression at any scope; A hold Trigger firing on the Organization; A booked Meeting; A returned piece; No address after 14 days. |
| Benchmark | <a id="benchmark-gifting-first-contact-wins"></a>`gifting-first-contact-wins` | Share of B2B purchases won by the first vendor the buyer contacted: 77–81 % (A 2025 B2B buyer experience survey by an intent-data vendor; main sample and companion survey, 2026-10-24). |
| Benchmark | <a id="benchmark-gifting-day-one-shortlist"></a>`gifting-day-one-shortlist` | Share of B2B purchases won by a vendor on the buyer’s day-one shortlist: 95 % (A 2025 B2B buyer experience survey by an intent-data vendor, 2026-10-24). |