Skip to content

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.

Channel
Mail and gifts
Run oneMode try
You, to your agent

Hand our latest gift moment to the SDR agent and show me what it chose and why. Don’t send.

curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Organization.appointed%22%2C%20%22Post.published%22%2C%20%22Organization.announced%22%2C%20%22Organization.degraded%22%2C%20%22Conversation.answered%22%2C%20%22Message.received%22%2C%20%22Deal.stalled%22%2C%20%22Visit.recorded%22%2C%20%22Organization.downsized%22%2C%20%22Organization.disrupted%22%2C%20%22Organization.acquired%22%2C%20%22Organization.tendered%22%2C%20%22Deal.proposed%22)&limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

# Not live yet (gaps #7)
curl -X POST "https://api.sb/leaseline.app/triggers/fire?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"like":"event_1187"}'

# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/decisions?where=on%20%3D%20%22contact_14%22" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/actions?where=on%20%3D%20%22contact_14%22" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
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 }
npx startup-builder do Event.list --json '{"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}'
npx startup-builder do Trigger.fire --json '{"like":"event_1187"}' --try   # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"contact_14\""}'   # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"contact_14\""}'   # Not live yet (gaps #7)
{
  "name": "do",
  "arguments": {
    "code": "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\nconst { subject } = await $.Trigger.fire({ like: last.$id }, { mode: 'try' })   // the same Event again, in try mode · Not live yet, gaps #7\nconst { decisions: [decision] } = await $.Decision.list({ where: `on = \"${subject}\"` })   // what it chose, and why · Not live yet, gaps #7\nconst { actions } = await $.Action.list({ where: `on = \"${subject}\"` })   // what it did, with its checks · Not live yet, gaps #7\nreturn { decision, actions }",
    "mode": "try"
  }
}
Response200application/json
{
  "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"
    ],
  …
sample · 4 Not live yetPreview

On PATCH /{namespace}/campaigns/{id}Off PATCH /{namespace}/campaigns/{id}Take this one POST /{namespace}/tasks/{task}/claim

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 PersonChoiceReason
Ridgeview Residential: Marcus Bell, new Director of Operations, 2 touches, no replygift-they-pickprivate business, a live new-leader window, under the $50 cap
Cedar County Housing Authority: Ana Ruiz speaks at the state housing conference on Nov 4printed-piecepublic sector: its cap allows only a printed note
Copperline Rentals: Meeting held Sep 29, quiet 12 business daysto-the-aea gift during an open Deal is never the agent’s call
Oakmont Living: Deal at proposal since Oct 14not-nowthe decision hold runs until the Deal closes

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

Terminal
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"}'
422Refusedgifting can’t start: 3 checks fail and 1 warns.
CheckFixThen
use-when pass · Not live yet, gaps #87 Meetings held from outreach in 90 days; 11 a month with 2 relevant touches at a live momentPOST /{namespace}/metrics/query
baseline pass · Not live yet, gaps #811 held Meetings per 100 People with 2 relevant touches, n 64 in 90 daysPOST /{namespace}/metrics/query
domain-authenticated failAdd the 3 DNS records shown; it passes once they resolve, often within an hour.POST /{namespace}/domains/{domain}/authenticate
mailbox-warm fail · Not live yet, gaps #1Finish warming Dana’s Mailbox; gift Messages send from it, about 5 more days.POST /{namespace}/mailboxes/{mailbox}/warm
gift-connection failConnect gift delivery in draft-only mode; only your Approval releases the Card.POST /{namespace}/integrations/connect
role-unstaffed warn · Not live yet, gaps #8Staff the AE, or leave it: quiet Deals come to you.POST /{namespace}/roles/{role}/staff
JSON
{
  "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"
    }
  ]
}

It says no, says why, and names the fix.

CheckFix (one call)Your timeWait
use-when · baseline · pass: 7 Meetings held from outreach, 11 a month at a live moment; 11 per 100, n 64 (gaps #8)POST /{namespace}/metrics/query on positive-reply-rate, then on gift-meetings-per-100, which fills Before in Your number1 minnone
domain-authenticated · failPOST /{namespace}/domains/{domain}/authenticate10 minuntil DNS resolves, often under 1 h
mailbox-warm · fail: day 9 of 14POST /{namespace}/mailboxes/{mailbox}/warm on Dana’s Mailbox0 minabout 5 days
gift-connection · fail (gaps #8)POST /{namespace}/integrations/connect with gift delivery, draft-only5 minnone
role-unstaffed · warn (gaps #8): 6 of your open Deals have a person owner, youPOST /{namespace}/roles/{role}/staff, or leave it: quiet Deals come to you, and the agent drafts into your queue for your 60 minnone

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 (POST /{namespace}/contacts/{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

WhenTrigger idStarts onWindowHow it gets in
A new head of operations announces their startnew-leaderevent on Organization.appointed where function = 'operations'60d; one gift per Person in 180 daysread from public posts, or POST /{namespace}/events/capture for one you saw
They announce they attend or speak at a named work eventevent-tripevent on Post.published where kind = 'event-attendance'21dread from public posts, or POST /{namespace}/events/capture
The date they named to write again arrivesnot-now-dateat on Conversation.answered where the date the Person’s own reply named14dset from their reply by POST /{namespace}/messages/{message}/schedule
+ 10 more for quiet Deals, an address given, pricing visits, an outage, an initiative and the five holds (?lanes=all)
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"
  }
}
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.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
A gift they pick · A printed pieceYou approve each one15 approved of 18 (2 refused, 1 expired)never: the $0 per-gift Limit opens an Approval for every gift—POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse
The note and the follow-upIt does it, you can stop it13 follow-ups, 0 Checks failed sentmet on day 31 (20 briefs reviewed, the note prompt locked)any Stop → You approve each onePOST /{namespace}/actions/{action}/cancel inside the hold
No angle · To the AE · Not nowIt does it3 of 3 · 2 of 2 · 4 of 4—a held Organization drafted anyway → You approve each onePOST /{namespace}/actions/{action}/redirect
Change the gift ruleYou approve each one1 merged of 1never—POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert
Never: a gift tied to a Meeting, a reply or a decision; an address they did not giveRefused, every time1 drafted, 1 refusednever—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. POST /{namespace}/orders/place pays only with the single-use Card your Approval issues, and POST /{namespace}/cards/issue is never its call. Its tools are POST /{namespace}/orders/place, POST /{namespace}/tasks/{task}/assign, and any other call becomes an Approval under the Role’s Mandate.

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 POST /{namespace}/changes/{change}/merge. Replayed on past candidates, POST /{namespace}/changes/{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 POST /{namespace}/roles/{role}/staff seats it.

Terminal
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

OptionPicked whenDecided byRunsHands toIf it’s just you
A gift they pick gift-they-picka private business, 2 relevant touches, a live moment, under the class capYour rule (line 5)approve-spend → your Approval → POST /{namespace}/orders/place with the single-use Card → gift-touchyou approve it, due 1 business day · Take this oneyou
A printed piece printed-piecea class whose cap allows only print, or a moment a printed deliverable fitsAgent’s call, with its reasonapprove-spend → gift-touch-printed: it asks where to send it, then ships to the address they gaveyou approve it, due 1 business day · Take this oneyou
No angle no-anglethe note could go to anyone else this weekAgent’s call, with its reasonoutbound-sequence carries on unchangednobody; they stay in their Sequencethe same
To the AE to-the-aean open Deal with a held Meeting, quiet for 10 business daysAgent’s call, with its reasonPOST /{namespace}/tasks/{task}/assign, with no giftPOST /{namespace}/tasks/{task}/assign → AE · Priya Shah, due 1 business day, Brief attached · Take this oneyou, within 1 business day
Not now not-nowa hold, a Deal at proposal, or a gift in the last 180 daysYour rule (the holds)nothing; names the hold and its end datenobody; the hold ends on its datethe same
When they write backFixture replyWhat happensWho answersBy whenCall
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 dayPOST /{namespace}/meetings/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 giftSDR · your agent5 minPOST /{namespace}/conversations/{conversation}/answer
Not now“Busy until the new year.”the follow-up stops; not-now-date waits for Jan 5SDR · your agentat oncePOST /{namespace}/messages/{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 textSDR · your agent1 business dayPOST /{namespace}/conversations/{conversation}/answer
Out of officean auto-reply until Oct 28the follow-up waits for the return date; the gift link stays open to day 30nobodythe return datePOST /{namespace}/messages/{message}/schedule
Question it can’t answer“Does it sync with our accounting system?”To a person, the question in the BriefAE · Priya Shah, or you1 business dayPOST /{namespace}/conversations/{conversation}/escalate
Stop“No gifts, please, and stop emailing.”a gift-scope and email Suppression; nothing sends again, on any lanenobodyat oncePOST /{namespace}/contacts/{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).

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 POST /{namespace}/approvals/{approval}/approve, an edit, or POST /{namespace}/approvals/{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 POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, or POST /{namespace}/actions/{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 POST /{namespace}/tasks/{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: POST /{namespace}/deals/{deal}/assign sets owner to the receiving person, the agent is never a Deal’s owner, and Meetings land on the owner’s calendar under the owner’s name.

When it won’t send

Check (refuses one send)RefusesFixThen
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 claimedLeave it to the person who owns it: the draft waits in their queue.POST /{namespace}/tasks/{task}/assign
gift-approval (the Approval gate)a gift Order with no POST /{namespace}/approvals/{approval}/approve from a personApprove it in your queue; a gift never sends on a timeout.POST /{namespace}/approvals/{approval}/approve
holda gift or follow-up to an Organization under a live hold, or with a Deal at proposalWait for the hold’s end date; the agent reads it again then.GET /{namespace}/decisions
class-capa gift above its recipient-class cap, its 12-month cap, or the Organization’s own published capSend a printed note, or drop the value to the class cap.POST /{namespace}/orders/{order}/revise
supplied-address (mail lane)a printed piece or physical gift to an address the Person did not giveAsk where to send it in the thread; ship only to their answer.POST /{namespace}/messages/{message}/schedule
draft-matchan Order that differs from its Approval in recipient, class, amount or addressApprove the changed Order again; the old Card voids.POST /{namespace}/approvals/{approval}/approve
window-expirya gift past its moment’s window, or 3 business days after its Approval openedLet it go; the next live moment opens a new brief.GET /{namespace}/decisions
market-holda gift to an unresolved Market or an unverified gift rowResolve the Organization’s Market; the gift waits and never retries another way.POST /{namespace}/tasks/next
Stop (pauses the Play)Pauses whenThen
spend-limit (the gift Limit)month-to-date gift Cost reaches the $500 Limit; at 80 % the Treasurer, so you, hears firstPOST /{namespace}/limits/{limit}/raise, or gifting resumes when the month turns
connectiona gift delivery or print connection can send on its ownthat connection pauses; POST /{namespace}/integrations/{integration}/reconnect in draft-only mode
wrong-detailone delivered gift has a wrong name, Organization, role or citythe Play pauses until the evals run again and pass
conditiona delivered note or follow-up ties the gift to a Meeting, a reply or a decisionthe Play pauses; POST /{namespace}/incidents/open
decline2 declines, returns or no-gifts replies in a cell within 30 daysthe cell pauses for your review
no-liftafter 200 eligible per arm, a gift class adds no Meetingsthat class stops
break-evenafter 200 eligible per arm, a gift class costs more per added Meeting than the break-even lineit stops, or drops one value step
approver-queueyour queue sits unread 2 business days, or over 5 Approvals expire in a weeknew candidates pause; you hear first
kill-switchyou press itPOST /{namespace}/mandates/{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.

422RefusedThe gift to Cedar County Housing Authority did not send: a $25 voucher is over the public sector cap.
CheckFixThen
class-cap failSend a printed note, or drop the value to the class cap.POST /{namespace}/orders/{order}/revise
hold pass—GET /{namespace}/decisions
JSON
{
  "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"
    }
  ]
}

It says no, says why, and names the fix.

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 POST /{namespace}/metrics/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

Chose
gift-they-pick
Why
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
From
gift-they-pick · printed-piece · no-angle · to-the-ae · not-now
Expects
a Meeting held by day 45
Reopens when
no Meeting.booked for contact_14 within 45d
By
worker_2
JSON
{
  "$id": "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"
}
NodeNow (56 days)Before (the 90 days, per 56)AddedConfidenceBasis
gift-meetings-per-10036 per 100: 4 held Meetings from 11 matured gifts ($224) · 4 still maturing11 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-trials3 Deals opened from the 4 Meetings5 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 · arrcarried from new-arrcarried——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.

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 optionDecisionsGifts sentHeld MeetingsWon (credited, not all caused by this Play)
A gift they pick1411 ($275)4 (3 of the 8 matured)1 on the $2,400 plan (+$2,393 ARR)
A printed piece44 ($31)1 (1 of the 3 matured)1 Deal open
No angle · To the AE · Not now3 · 2 · 40— · 1 Deal claimed · —1 Deal open
All · Before (90 days, per 56)2715 ($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 daysabout $305before-after, not proofOther Startups’ results: +0.9 per $100, ■■■□ Likely, n 1,180 per arm
DayEventWhat happenedYour time
0event_121 Campaign.createdthe three steps; dry run fails domain-authenticated, mailbox-warm and gift-connection25 min
0event_124 Integration.connectedgift delivery connected, draft-only5 min
6event_233 Approval.approvedthe first gift: a $25 voucher to Ashford Lane’s new head of operations2 min
9event_301 Role.staffedAE · Priya Shah (person) takes role:sales-lead—
17event_402 Meeting.bookedthe first Meeting after a gift: Ashford Lane, with Priya—
31event_588 Role.updatedthe note prompt locked after 20 briefs; notes and follow-ups send after a 2-minute hold, and gifts still wait on you—
35 · 56event_611 Change.merged · event_902 Readout.createdvouchers only for private businesses: replayed at 0 of 13 declines, read back at +21d at 0 of 75 min
44event_745 Campaign.pausedapprover-queue: your queue sat 2 days; resumed in 20 min20 min
1–56event_230 Approval.created, first of 18you answered 18 gift Approvals and the weekly reviews, from the POST /{namespace}/tasks/next log58 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.” POST /{namespace}/meetings/book booked Priya for Sep 10, and the Brief reached her at 11:41.

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 POST /{namespace}/tasks/{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

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 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 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 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 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 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 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 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 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 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 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 new-leader New leader: event on Organization.appointed, window 60d.
Trigger event-trip Event trip: event on Post.published, window 21d.
Trigger stated-initiative Stated initiative: event on Organization.announced, window 30d.
Trigger alternative-outage Alternative outage: event on Organization.degraded, window 90d.
Trigger not-now-date Not now date: at on Conversation.answered, window 14d.
Trigger address-given Address given: event on Message.received, window 30d.
Trigger quiet-deal Quiet deal: state on Deal.stalled, window 30d.
Trigger pricing-visit Pricing visit: event on Visit.recorded, window 72h.
Trigger layoff-hold Layoff hold: state on Organization.downsized, window 14d.
Trigger crisis-hold Crisis hold: state on Organization.disrupted, window 30d.
Trigger acquisition-hold Acquisition hold: state on Organization.acquired, window 90d.
Trigger tender-hold Tender hold: event on Organization.tendered, window 90d.
Trigger decision-hold Decision hold: state on Deal.proposed, window 90d.
Sequence 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 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 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 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).

Compiled, not written: edit the Play record gifting and its Leaseline run, then regenerate. Every step runs from a sentence or a line of code. In your words: the CRM words you know, and where each lives here.