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
- Kind
- Outreach
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.
# Not live yet (gaps #2)
curl -X POST "https://api.sb/leaseline.app/campaigns?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"gifting"}'import { $ } from 'startup-builder'
return await $.Campaign.create({ play: 'gifting' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2
npx startup-builder do Campaign.create --json '{"play":"gifting"}' --try # Not live yet (gaps #2){
"name": "do",
"arguments": {
"code": "return await $.Campaign.create({ play: 'gifting' }, { mode: 'try' }) // dry run on the day-0 Startup, 2026-08-24 · Not live yet, gaps #2",
"mode": "try"
}
}application/json{
"type": "https: //startupbuilder.dev/ errors/ refused",
"title": "Refused",
"status": 422,
"detail": "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"
},
{
…
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"
}
}application/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 yetPreviewOn 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,
| 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 |
- 30 min week 1, then 15 a week
- Your time
- Day 17: first Meeting booked after a gift
- First signal
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: and reads before-after.
sample · api.sb/
Start it this week
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"}' | Check | Fix | Then |
|---|---|---|
use-when pass · Not live yet, gaps #8 | 7 Meetings held from outreach in 90 days; 11 a month with 2 relevant touches at a live moment | POST /{namespace}/metrics/query |
baseline pass · Not live yet, gaps #8 | 11 held Meetings per 100 People with 2 relevant touches, n 64 in 90 days | POST /{namespace}/metrics/query |
domain-authenticated fail | Add 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 #1 | Finish warming Dana’s Mailbox; gift Messages send from it, about 5 more days. | POST /{namespace}/mailboxes/{mailbox}/warm |
gift-connection fail | Connect gift delivery in draft-only mode; only your Approval releases the Card. | POST /{namespace}/integrations/connect |
role-unstaffed warn · Not live yet, gaps #8 | Staff 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.
| Check | Fix (one call) | Your time | Wait |
|---|---|---|---|
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 number | 1 min | none |
domain-authenticated · fail | POST /{namespace}/domains/{domain}/authenticate | 10 min | until DNS resolves, often under 1 h |
mailbox-warm · fail: day 9 of 14 | POST /{namespace}/mailboxes/{mailbox}/warm on Dana’s Mailbox | 0 min | about 5 days |
gift-connection · fail (gaps #8) | POST /{namespace}/integrations/connect with gift delivery, draft-only | 5 min | none |
role-unstaffed · warn (gaps #8): 6 of your open Deals have a person owner, you | POST /{namespace}/roles/{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,
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
| 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 POST /{namespace}/events/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 POST /{namespace}/events/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 POST /{namespace}/messages/{message}/schedule |
+ 10 more for quiet Deals, an address given, pricing visits, an outage, an initiative and the five holds (?lanes=) |
{
"$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"
}
}# 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:, 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:, 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 | — | POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{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 | POST /{namespace}/actions/{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 | POST /{namespace}/actions/{action}/redirect |
| Change the gift rule | You approve each one | 1 merged of 1 | never | — | 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 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. 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.
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.
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 → POST /{namespace}/orders/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 | POST /{namespace}/tasks/{task}/assign, with no gift | POST /{namespace}/tasks/{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 | POST /{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 gift | SDR · your agent | 5 min | POST /{namespace}/conversations/{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 | POST /{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 text | SDR · your agent | 1 business day | POST /{namespace}/conversations/{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 | POST /{namespace}/messages/{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 | POST /{namespace}/conversations/{conversation}/escalate |
| Stop | “No gifts, please, and stop emailing.” | a gift-scope and email Suppression; nothing sends again, on any lane | nobody | at once | POST /{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).
[
{
"$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) | Refuses | Fix | Then |
|---|---|---|---|
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. | POST /{namespace}/tasks/{task}/assign |
gift-approval (the Approval gate) | a gift Order with no POST /{namespace}/approvals/{approval}/approve from a person | Approve it in your queue; a gift never sends on a timeout. | POST /{namespace}/approvals/{approval}/approve |
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. | GET /{namespace}/decisions |
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. | POST /{namespace}/orders/{order}/revise |
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. | POST /{namespace}/messages/{message}/schedule |
draft-match | an Order that differs from its Approval in recipient, class, amount or address | Approve the changed Order again; the old Card voids. | POST /{namespace}/approvals/{approval}/approve |
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. | GET /{namespace}/decisions |
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. | POST /{namespace}/tasks/next |
| Stop (pauses the Play) | Pauses when | Then |
|---|---|---|
spend-limit (the gift Limit) | month-to-date gift Cost reaches the $500 Limit; at 80 % the Treasurer, so you, hears first | POST /{namespace}/limits/{limit}/raise, or gifting resumes when the month turns |
connection | a gift delivery or print connection can send on its own | that connection pauses; POST /{namespace}/integrations/{integration}/reconnect in draft-only mode |
wrong-detail | one delivered gift has a wrong name, Organization, role or city | the Play pauses until the evals run again and pass |
condition | a delivered note or follow-up ties the gift to a Meeting, a reply or a decision | the Play pauses; POST /{namespace}/incidents/open |
decline | 2 declines, returns or no-gifts replies in a cell within 30 days | the cell pauses for your review |
no-lift | after 200 eligible per arm, a gift class adds no Meetings | that class stops |
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 |
approver-queue | your queue sits unread 2 business days, or over 5 Approvals expire in a week | new candidates pause; you hear first |
kill-switch | you press it | POST /{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.
| Check | Fix | Then |
|---|---|---|
class-cap fail | Send 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.
[
{
"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,
- 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"
}| 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.
{
"$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=; 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: | — |
| 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 POST /{namespace}/tasks/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.”
POST /{namespace}/meetings/bookbooked Priya for Sep 10, and the Brief reached her at 11:41.
- 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}/claimand 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
---
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. $ 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
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.