Field presence
Field presence books Meetings at other hosts’ events before day one, hosts a dinner instead of a booth, and follows up only who you met.
- Channel
- Webinars and events
Be our SDR for the Denver apartment conference: book Priya’s Meetings before it starts, invite strong fits to my dinner on night two, and draft her notes from what she writes down. Ask me to keep or cancel the trip if bookings lag. 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":"field-presence"}'import { $ } from 'startup-builder'
return await $.Campaign.create({ play: 'field-presence' }, { 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":"field-presence"}' --try # Not live yet (gaps #2){
"name": "do",
"arguments": {
"code": "return await $.Campaign.create({ play: 'field-presence' }, { 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": "field-presence can’t start yet: 1 check fails and 1 warns.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "140 ICP Organizations forecast for the Denver conference; Deals at $2, 400 a year",
"doc": "/plays/ field-presence#check-use-when",
"fix": "None needed: 40 Organizations and $2, 000 Deals are enough.",
"then": "Metric.query"
},
…
Hand our latest Meeting from the event 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(%22Monitor.matched%22%2C%20%22Audience.predicted%22%2C%20%22Meeting.requested%22%2C%20%22Audience.imported%22%2C%20%22Lead.captured%22%2C%20%22Meeting.held%22%2C%20%22Meeting.missed%22%2C%20%22Deal.opened%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_1741"}'
# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/decisions?where=on%20%3D%20%22contact_93%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_93%22" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"import { $ } from 'startup-builder'
const { events: [last] } = await $.Event.list({ where: 'name in ("Monitor.matched", "Audience.predicted", "Meeting.requested", "Audience.imported", "Lead.captured", "Meeting.held", "Meeting.missed", "Deal.opened")', 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 (\"Monitor.matched\", \"Audience.predicted\", \"Meeting.requested\", \"Audience.imported\", \"Lead.captured\", \"Meeting.held\", \"Meeting.missed\", \"Deal.opened\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_1741"}' --try # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"contact_93\""}' # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"contact_93\""}' # Not live yet (gaps #7){
"name": "do",
"arguments": {
"code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Monitor.matched\", \"Audience.predicted\", \"Meeting.requested\", \"Audience.imported\", \"Lead.captured\", \"Meeting.held\", \"Meeting.missed\", \"Deal.opened\")', 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_503",
"$type": "Decision",
"choice": "follow-up-who-you-met",
"reason": "Priya marked the Meeting held at 15: 40 with a memo: 420 units across 6 owners, renewals tracked in a spreadsheet",
"stakes": "low",
"options": [
"shortlist-the-event",
"ask-for-a-meeting",
"ask-a-likely-attendee",
"invite-to-the-dinner",
"follow-up-who-you-met",
"keep-or-cancel"
…
sample · 4 Not live yetPreviewOn PATCH /{namespace}/campaigns/{id}Off PATCH /{namespace}/campaigns/{id}Take this one POST /{namespace}/tasks/{task}/claim
action_2 puts Priya’s Day-1 note in her send tray, quoting only her memo; action_3 is the day-2 resource, which waits for her press because she owns the Lead.
11 prebooked Meetings against 2 last year · before-after,
| Try another: the Meeting held | Choice | Reason |
|---|---|---|
| Rachel Kim, Summit Residential, 420 units: Meeting held Oct 7 with a memo | follow-up-who-you-met | held, with Priya’s memo |
| A speaker listed on the agenda: ops lead at a 300-unit manager | ask-for-a-meeting | announced attendance: two slot times from 28 days out |
| A forecast attendee at 70 %, 150 units | ask-a-likely-attendee | states only Leaseline’s presence, never theirs |
| A strong-fit owner at 600 units | invite-to-the-dinner | inside the guest’s class cap: a seat at your table |
| Day 22 out: 2 Meetings booked, 3 dinner seats | keep-or-cancel | under the 21-day line: you decide the trip |
- Day 17: first Meeting prebooked
- First signal
Where it sits: Stranger → Lead → Trialing → Activated → At risk → Churned → Won back · Prebooked meetings → Deals and trials opened → New Customers ↑ → ARR added each week → ARR
Worth’s formula: about +6 prebooked Meetings per event (Other Startups’ results; no lift of your own yet) ÷ 3 months × 0.45 Deals per Meeting × 0.3 won × $2,393 first order ARR ≈ +$646. Under First signal: One event a quarter is too few for any half to read in 90 days; the held-back Organizations read at day 60 (Dec 5) and day 180, as what happened.
sample · api.sb/
Also runs as: Hosted gatherings.
Start it this week
npx startup-builder add play field-presence # 1 · writes plays/field-presence.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":"field-presence"}'
# 3 · keep it, at You approve each one
curl -X POST https://api.sb/leaseline.app/campaigns \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"play":"field-presence"}'
# on
curl -X PATCH https://api.sb/leaseline.app/campaigns/field-presence \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"endsAt":null}'
# off: every Sequence, invite and booking pauses; booked Meetings stay
curl -X PATCH https://api.sb/leaseline.app/campaigns/field-presence \
-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 | None needed: 40 Organizations and $2,000 Deals are enough. | POST /{namespace}/metrics/query |
baseline pass · Not live yet, gaps #8 | None needed: 2 is your Before. | POST /{namespace}/metrics/query |
domain-authenticated pass | None needed. | POST /{namespace}/domains/{domain}/authenticate |
mailbox-warm fail · Not live yet, gaps #1 | Warm priya@ for 8 more days; the first ask goes 28 days out. | POST /{namespace}/mailboxes/{mailbox}/warm |
role-unstaffed warn · Not live yet, gaps #8 | Staff the AE before the event, or you attend and press every send. | POST /{namespace}/roles/{role}/staff |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "field-presence can’t start yet: 1 check fails and 1 warns.",
"checks": [
{
"check": "use-when",
"status": "pass",
"observed": "140 ICP Organizations forecast for the Denver conference; Deals at $2,400 a year",
"doc": "/plays/field-presence#check-use-when",
"fix": "None needed: 40 Organizations and $2,000 Deals are enough.",
"then": "Metric.query"
},
{
"check": "baseline",
"status": "pass",
"observed": "2 Meetings prebooked at last year’s edition, with a booth",
"doc": "/plays/field-presence#check-baseline",
"fix": "None needed: 2 is your Before.",
"then": "Metric.query"
},
{
"check": "domain-authenticated",
"status": "pass",
"observed": "leaseline.app authenticated on 2026-08-02",
"doc": "/plays/field-presence#check-domain-authenticated",
"fix": "None needed.",
"then": "Domain.authenticate"
},
{
"check": "mailbox-warm",
"status": "fail",
"observed": "priya@leaseline.app has warmed 6 of 14 days",
"doc": "/plays/field-presence#check-mailbox-warm",
"fix": "Warm priya@ for 8 more days; the first ask goes 28 days out.",
"then": "Mailbox.warm"
},
{
"check": "role-unstaffed",
"status": "warn",
"roles": [
"sales-lead"
],
"owned": 31,
"doc": "/plays/field-presence#check-role-unstaffed",
"fix": "Staff the AE before the event, or you attend and press every send.",
"then": "Role.staff"
}
]
}It says no, says why, and names the fix.
| Check | Fix (one call) | Your time | Wait |
|---|---|---|---|
use-when · baseline · pass: 140 ICP Organizations forecast; 2 prebooked last year (gaps #8) | POST /{namespace}/metrics/query on prebooked-meetings, which fills Before in Your number | 1 min | none |
domain-authenticated · pass | POST /{namespace}/domains/{domain}/authenticate (done Aug 2) | 0 min | none |
mailbox-warm · fail (Not live yet, gaps #1) | POST /{namespace}/mailboxes/{mailbox}/warm priya@leaseline.app | 2 min | 8 days; the first ask goes Sep 8 |
role-unstaffed · warn (gaps #8): the AE seat is staffed on day 9 | POST /{namespace}/roles/{role}/staff Priya, or you attend | 0 min | none |
Your number · Before 2 at last year’s edition · Now 11 prebooked Meetings · Target 10 per event · before-after,
The event cost $2,630: $900 for the ticket, $950 for travel and $780 for the 12-seat dinner, under a $3,000 Limit; each draft costs about $0.02 (Worker cost). That comes to $240 per Meeting held, or about $880 a month at 1 event a quarter.
When it starts
| When | Trigger id | Starts on | Window | How it gets in |
|---|---|---|---|---|
| Someone is listed as a speaker, or posts that they attend | attendance-announced | event on Monitor.matched where listed as speaker or sponsor staff, or posts that they attend | from 28 days out; 30d | POST /{namespace}/monitors on the agenda and the event’s public posts |
| The person who attended marks a Meeting held, or logs a memo | field-meeting-held | event on Meeting.held where marked held, or a memo logged | the Day-1 note within 24 h; 7d | PATCH /{namespace}/meetings/{id} from the calendar |
| A booked Meeting passes its start by 15 minutes with no memo | field-meeting-missed | state on Meeting.missed where 15m past the start with no memo and no check-in | 1 rebook note; 1d | the same calendar |
+ 8 more for found events, calls for talks, forecasts, app requests, organizer lists, captures, changes and Deals (?lanes=) |
{
"$id": "https://api.sb/leaseline.app/events/event_1741" ,
"$type": "Event",
"name": "Meeting.held",
"at": "2026-10-07T15:40:22Z" ,
"seq": 1741,
"data": {
"meeting": "meeting_57",
"contact": "contact_93",
"organization": "Summit Residential",
"by": "worker_3",
"memo": "420 units, 6 owners; renewals tracked in a spreadsheet; wants owner-level reports"
}
}npx startup-builder trigger Meeting.held --like event_1741 # replays the delivery
npx startup-builder clock advance --by 1d # then drafts the day-2 resource step
npx startup-builder listen Meeting.held --forward-to http://localhost:3000/hook Who runs it
SDR · your agent (role:, worker_2) holds the Key Result. It reads the agenda and the forecast, builds the slot grid and drafts every ask and note; AE · Priya Shah (person) (role:, worker_3) attends and presses every send, and you (Dana Okafor, person, worker_1) host the dinner and decide the trip. Your number links to Did it work.
| Option | Rung today | Evidence (passed of n) | Moves up at | Drops back when | You can |
|---|---|---|---|---|---|
| Ask for a Meeting · Ask a likely attendee · Follow up who you met | You approve each one | 96 of 101 drafts sent by Priya | never: sends go from a person’s own Mailbox | — | POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/actions/{action}/cancel |
| Meeting confirmations and reminders | It does it, you can stop it | 33 of 33 | met on day 25 (the first 10 bookings) | a double booking → every open offer pauses | POST /{namespace}/actions/{action}/cancel inside the delay |
| Shortlist the event · Invite to the dinner · Keep or cancel travel | To a person, every time | 1 · 14 invites · 0 asked | never: spend and your table are yours | — | POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/tasks/{task}/claim |
| Change the booking rule | You approve each one | 0 merged | never | — | POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert |
| Never: an attendee list loaded as Contacts, a predicted Person told they attend, a past meeting claimed with no memo | To a person, every time | 0 asked | never | — | POST /{namespace}/tasks/{task}/claim |
What it reads · What it may call. It reads the agenda, public posts, the attendee forecast and Priya’s memos. A predicted attendance, a Visit or a profile view picks who to ask and never appears in a Message; no attendee list ever loads as Contacts. Its tools are POST /{namespace}/gatherings, POST /{namespace}/approvals, POST /{namespace}/tasks/{task}/assign, POST /{namespace}/decisions, and any other call becomes an Approval under the Role’s Mandate.
You hold the SDR Key Result: 10 Meetings booked before the event’s first day. ← worker, metric
On each forecast, post, booking or memo, choose one option and say why. ← triggers, chooses
Tell a predicted Person that Leaseline attends, never that they do. ← copyRules 2
Offer a slot only while Priya’s calendar shows it free. ← copyRules 8; sendGates Availability truth
Quote a conversation only from Priya’s own memo. ← copyRules 5
At 21 and 7 days out, ask Dana to keep or cancel when bookings lag. ← your file, line 4 The slow loop. One event ran in the window, so the weekly Decisions kept the booking rule as written and no Change was merged; there is no replay or read-back to print.
Bring your own agent (folded) drafts at You approve each one, like the seated agent, because every send goes from a person’s own Mailbox; POST /{namespace}/roles/{role}/staff seats it.
npx startup-builder eval --scenario field-presence-140 --agent "claude -p" --seat prospector # seated: 11 prebooked, 0 Checks failed sent, memo to note in 3.7 h · yours: 9, 1 failed `availability` What it can do next
| Option | Picked when | Decided by | Runs | Hands to | If it’s just you |
|---|---|---|---|---|---|
Shortlist the event shortlist-the-event | an event 60 to 180 days out whose agenda names your buyers | Agent’s call, with its reason | POST /{namespace}/gatherings → POST /{namespace}/approvals for the trip | you decide it, due 1 business day · Take this one | you |
Ask for a Meeting ask-for-a-meeting | said in public they attend, or is your own Contact | Your rule (line 4) | field-prebook-announced, from 28 days out | POST /{namespace}/tasks/{task}/assign → Priya presses send · Take this one | you |
Ask a likely attendee ask-a-likely-attendee | forecast at 60 %+, fits your List | Agent’s call, with its reason | field-prebook-predicted: Leaseline’s presence only | Priya presses send · Take this one | you |
Invite to the dinner invite-to-the-dinner | strong fit, inside the class cap | Agent’s call, with its reason | side-dinner-invite from your Mailbox | you press send · Take this one | you |
Follow up who you met follow-up-who-you-met | a held Meeting with a memo, or a consented capture | Your rule (line 4) | field-follow-up-warm or field-follow-up-cold | Priya presses send, due 1 business day · Take this one | you |
Keep or cancel travel keep-or-cancel | bookings under the 21-day or 7-day line | Your rule (Go or no-go, Lock floor) | POST /{namespace}/decisions → POST /{namespace}/tasks/{task}/assign | you, due 1 business day · Take this one | you |
| When they write back | Fixture reply | What happens | Who answers | By when | Call |
|---|---|---|---|---|---|
| Interested | “Tuesday 14:00 works. See you at the booth row.” | booked on Priya’s calendar; the confirm Sequence runs | AE · Priya Shah (person) | 1 business day | POST /{namespace}/meetings/book |
| Send me pricing | “What does it cost for 420 units?” | over 150 units: Priya quotes the $2,400-a-year plan | AE · Priya Shah (person) | 1 business day | POST /{namespace}/quotes/{quote}/send |
| Not now | “Our schedule is full this year.” | the asks stop; the Day-1 note goes only if they meet | nobody | at once | POST /{namespace}/enrollments/{enrollment}/cancel |
| Wrong person | “Our regional manager is the one attending.” | Priya asks them to bring their manager in; it never writes to an address from their text | AE · Priya Shah, from the draft | 1 business day | POST /{namespace}/conversations/{conversation}/answer |
| Out of office | an auto-reply until the event | the next ask waits; slots stay held only while free | nobody | the return date | POST /{namespace}/messages/{message}/schedule |
| Question it can’t answer | “Can you sponsor our association’s breakfast?” | To a person: sponsorship is your call | you | 1 business day | POST /{namespace}/conversations/{conversation}/escalate |
| Stop | “Please stop emailing about the conference.” | every ask and note stops, for all your Startups | nobody | at once | POST /{namespace}/contacts/{contact}/suppress |
When it hands to you
Every ask and note waits in AE · Priya Shah (person)’s send tray, because she attends; the trip, the dinner and the guest list come to you. One Brief per Role, as captured (brief is Not live yet, gaps #7).
[
{
"$id": "https://api.sb/leaseline.app/tasks/task_633" ,
"$type": "Task",
"assignee": "worker_3",
"due": "2026-10-08T15:40:00Z" ,
"on": "contact_93",
"brief": {
"who": "Rachel Kim, Summit Residential, 420 units, 6 owners" ,
"memo": "renewals tracked in a spreadsheet; wants owner-level reports" ,
"chose": "follow-up-who-you-met",
"draft": "Rachel, good to meet at the conference. You mentioned owner-level reports: here is how Leaseline shows renewals by owner." ,
"next": "day 3: one 30-minute slot inside 2 weeks" ,
"never": [
"her watch of our booth",
"a discount"
]
}
},
{
"$id": "https://api.sb/leaseline.app/tasks/task_626" ,
"$type": "Task",
"assignee": "worker_1",
"due": "2026-09-15T17:00:00Z" ,
"on": "gathering_5",
"brief": {
"what": "the night-two dinner, 12 seats" ,
"guests": "14 invited: 6 owners and 8 operators, all inside their class caps" ,
"topic": "What does a missed renewal really cost?" ,
"never": [
"a demo at the table",
"names shown without their OK"
]
}
}
]Priya and you answer with POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, or POST /{namespace}/actions/{action}/redirect, each a one-call window. Once a person claims, the agent’s pending steps to that Person cancel with claimedByPerson (Not live yet, gaps #7), and every reply goes to the claimer. A Task nobody claims by its due time goes up through POST /{namespace}/tasks/{task}/escalate, and person-promise fires.
On time: AE · Priya Shah, 21 of 22 Day-1 notes sent within 24 h, median 3 h 40 min, n 22, ■■□□ Early sign; you, 2 of 2 within their due time. Your queue: counted by kind: about 12 drafts a week for Priya from 28 days out, 22 Day-1 notes after the event, and 2 decisions for you.
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 send to a Person whose Lead or open Deal a person owns | Leave it to the person who owns it: the draft waits in their queue. | POST /{namespace}/tasks/{task}/assign |
consent-stop (gaps #3; the record’s Consent stop) | a Sequence step to a Person whose Market needs a recorded yes; the Day-1 note from the person they met still goes | Ask once for a yes in the Day-1 note. | POST /{namespace}/messages/{message}/schedule |
claims-resolve (shared) | a sentence in an ask, invite or note that resolves to no record | Cut the claim, or name the record that backs it. | POST /{namespace}/content/draft |
import-refusal (the record’s Import refusal) | an attendee list loaded as Contacts; the forecast stays Prospects | Ask the people on it; nothing loads. | POST /{namespace}/prospects/{prospect}/engage |
organizer-list | an organizer list with any Person whose yes to Leaseline the organizer did not record | The whole list is refused; ask the organizer for ticked-box rows only. | POST /{namespace}/tasks/{task}/assign |
capture-path | a Person met at the event who came in by any path but the Form, the event’s capture, an accepted request or a card | Capture them through your Form at the table. | POST /{namespace}/forms |
availability | a slot the calendar does not show free | Offer the next free slot; the grid rebuilds itself. | POST /{namespace}/meetings/book |
class-cap | a dinner seat above a guest’s class cap | Offer a coffee Meeting each pays for instead. | POST /{namespace}/meetings/book |
| Stop (pauses the Play) | Pauses when | Then |
|---|---|---|
go-no-go | at 21 days out, under 3 Meetings and 4 dinner seats | POST /{namespace}/decisions: you keep or cancel the trip |
lock-floor | at 7 days out, under 5 Meetings | POST /{namespace}/decisions: keep, shrink to coffee Meetings, or cancel |
event-change | the event is cancelled or moved, or the person attending withdraws | every Sequence naming it pauses within 1 h; booked Persons get one plain note |
bounce | hard bounces over 2 % of a day’s sends | that Mailbox pauses |
complaint | complaints near 0.1 % of a send | every pre-show Sequence pauses on every Mailbox |
opt-out | opt-outs over 1 % of one list label’s sends | that label pauses until the Marketing Lead reviews it |
dinner-show-floor | under 8 seated at 2 dinners running | the next event runs coffee Meetings instead |
holdout-loser | the 180-day readout marks the event a loser | its next edition waits on a Decision |
spend-limit | event spend reaches its Limit | new bookings and deposits pause; a raise is an Approval |
kill-switch | you press it | every Sequence, invite, request and booking pauses |
The captured refusal, then the Stop that fired as a Campaign.paused reason (Not live yet, gaps #2); the rewrite that sent is the second thread in Example.
| Check | Fix | Then |
|---|---|---|
claims-resolve fail | Cut the claim, or name the record that backs it. | POST /{namespace}/content/draft |
availability pass | — | POST /{namespace}/meetings/book |
JSON
{
"type": "https://startupbuilder.dev/errors/refused",
"title": "Refused",
"status": 422,
"detail": "The ask to a forecast attendee did not go to Priya’s tray: “see you in Denver” states their attendance, which no record of theirs shows.",
"checks": [
{
"check": "claims-resolve",
"status": "fail",
"doc": "/plays/field-presence#check-claims-resolve",
"fix": "Cut the claim, or name the record that backs it.",
"then": "Content.draft"
},
{
"check": "availability",
"status": "pass"
}
]
}It says no, says why, and names the fix.
[
{
"reason": {
"limit": "go-no-go",
"observed": "2 Meetings, 3 dinner seats" ,
"bound": "3 Meetings and 4 seats",
"window": "21 days out"
},
"doc": "/plays/field-presence#stop-go-no-go" ,
"task": "task_624"
}
]Did it work
One event is one unit, so no half reads within 90 days and the basis is before-after (rule o): the columns read this edition and last year’s, and nothing prints as Added. The 28 held-back Organizations read at day 60 (Dec 5) in Example, as what happened. Every node above the leaf is Not live yet (gaps #4).
11 prebooked Meetings against 2 last year · before-after,
- Chose
- follow-up-who-you-met
- Why
- Priya marked the Meeting held at 15:40 with a memo: 420 units across 6 owners, renewals tracked in a spreadsheet
- From
- shortlist-the-event · ask-for-a-meeting · ask-a-likely-attendee · invite-to-the-dinner · follow-up-who-you-met · keep-or-cancel
- Expects
- a Deal opened at Summit Residential within 60d
- Reopens when
- no Deal.opened at Summit Residential within 60d
- By
- worker_2
JSON
{
"$id": "decisions/decision_503",
"$type": "Decision",
"choice": "follow-up-who-you-met",
"reason": "Priya marked the Meeting held at 15:40 with a memo: 420 units across 6 owners, renewals tracked in a spreadsheet",
"stakes": "low",
"options": [
"shortlist-the-event",
"ask-for-a-meeting",
"ask-a-likely-attendee",
"invite-to-the-dinner",
"follow-up-who-you-met",
"keep-or-cancel"
],
"by": "worker_2",
"on": "contact_93",
"expected": "a Deal opened at Summit Residential within 60d",
"reopensWhen": "no Deal.opened at Summit Residential within 60d"
}| Node | This edition (Oct 6–8) | Last year (a booth) | Added | Confidence | Basis |
|---|---|---|---|---|---|
prebooked-meetings | 11 booked before day 1 · 9 held, 1 rebooked and held | 2 booked, 2 held | — | — | before-after, not proof · Other Startups’ results +6 per event, ■■□□ Early sign, n 310 events |
opened-deals-and-trials | 4 Deals and 2 trials opened by Oct 19 | 1 Deal | — | — | before-after · read at day 60 and 180 |
new-arr ↑ | $2,393, 1 Customer on the $2,400 plan · Booked: credited, not all caused by this Play | $0 | — · Worth about +$650 a month | — | before-after · 3 Deals and 2 trials still deciding |
net-new-arr · arr | carried from new-arr | carried | — | — | carried |
Before against after reads this edition against last year’s, when Leaseline staffed a booth; it is not proof, and Other Startups’ results print beside it. The leaf counts Meetings booked before the first day, with the Meetings held and Deals opened they keep at 60 and 180 days.
How it moves it: each booked buyer had a named slot with Priya on their calendar before day one, and 10 of 14 dinner guests sat at your table on night two.
Guardrails: before against after: Deals per Meeting held, 0.40 against 0.50, and cost per Meeting held, $240 against $610 for last year’s booth; 3 Deals and 2 trials are still deciding.
{
"$id": "https://api.sb/leaseline.app/campaigns/field-presence" ,
"$type": "Campaign",
"play": "play:field-presence@1" ,
"path": [
"prebooked-meetings",
"opened-deals-and-trials",
"new-arr",
"net-new-arr",
"arr"
],
"experiment": {
"metric": "prebooked-meetings",
"unit": "count",
"heldBack": 28,
"decision": null
},
"readout": {
"value": null,
"n": 1,
"maturing": 1,
"interval": null,
"readability": "inadmissible",
"basis": "before-after",
"pooled": true
},
"ledger": {
"spend": 2630,
"workerCost": 4,
"hours": 14.5,
"openArr": 7200,
"wonArr": 2393,
"projectedArr": 646,
"paybackDays": 340
}
}Outside benchmark: no measured range for prebooked event Meetings survived the research’s check, so Other Startups’ results (n 310 events) stand in.
Before it · After it. Before it: founder-voice and organic-social make the posts attendees answer. After it: gatherings runs the dinner as its own table, gifting takes a Person only after 2 relevant touches, and instant-response answers the captures who write in.
Example
Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days) for one conference, Oct 6 to 8: 140 ICP Organizations forecast, 28 held back, 168 people at the other 112 asked; 11 Meetings booked before day one and a 12-seat dinner. Read every captured thread at ?threads=; three follow the tables.
| What happened, by option | Decisions | Sent by a person | Booked · held |
|---|---|---|---|
| Ask for a Meeting · Ask a likely attendee | 41 · 127 | 41 · 112 (15 dropped at T-1) | 7 · 4 booked; 9 held, 1 rebooked |
| Invite to the dinner | 14 | 14 from your Mailbox | 12 accepted · 10 seated |
| Follow up who you met | 22 | 21 Day-1 notes within 24 h | 12 replies in 7 days |
| Shortlist the event · Keep or cancel travel | 1 · 1 | 1 approved · kept, then 9 more booked | — |
| Asked Organizations · held back (read Dec 5) | 112 | 4 Deals and 2 trials so far | $2,393 won · 28 Organizations, 0 Deals so far |
| Day | Event | What happened | Your time |
|---|---|---|---|
| 0 | event_1702 Campaign.created | the three steps; the dry run fails mailbox-warm | 25 min |
| 2 | event_1706 Approval.approved | you approved the trip and the $3,000 Limit | 10 min |
| 15 | event_1712 Message.created | 28 days out: the first asks, sent by Priya | 45 min |
| 17 | event_1715 Meeting.booked | the first prebooked Meeting | — |
| 22 | event_1719 Campaign.paused | go-no-go: 2 Meetings, 3 seats; you kept the trip | 5 min |
| 43–45 | event_1735 Gathering.held | the conference: 10 Meetings held, the dinner on night two | 2 days at the event |
| 1–56 | event_1709 Task.assigned, first of 101 | Priya sent 96 drafts, from the POST /{namespace}/tasks/next log | 6 h 30 min · total 14.5 h measured, plus the event |
Priya → a listed speaker, Sep 8, 09:30 · Hi Marta, Leaseline is at the Denver conference Oct 6 to 8.¹ Your talk on renewals at 300 units is the reason I’m writing: we see 71 % renewal when notice goes out 60+ days early (n 1,940).² Would Tue 10:30 or 14:00 work, near the expo hall?³
Marta, Sep 9 · “Tue 14:00.” Booked; held Oct 7, and a Deal opened Oct 12.
- See you in Denver next month!
+ Leaseline is at the Denver conference Oct 6 to 8; if you are there, Tue 11:00 is open. Rachel Kim, Oct 7, 15:10 · held Meeting with Priya; her memo: “420 units, 6 owners, renewals in a spreadsheet.” · The Day-1 note went to Priya’s tray (
task_633), due 15:40 on Oct 8; Priya, Oct 7, 19:20 · *sent it with one edit, quoting her own memo.*⁴
¹ It states Leaseline’s presence, never theirs. ² The number comes from your records, with its n. ³ Slots the calendar shows free. ⁴ A note quotes the conversation only from the person’s own memo.
Your settings
---
holdout: 0.2 # a hashed 1 forecast Organization in 5 gets no pre-show touch
---
Book Priya’s Meetings from 28 days out and invite strong fits to Dana’s night-two dinner. Under 3 Meetings at 21 days out, ask Dana to keep or cancel. $ npx startup-builder show plays/field-presence
holdout 0.2 · 28 days out · dinner night two · keep-or-cancel at T-21 your file plays/field-presence.mdx:2,4 (Ask 2026-08-24)
worker role:prospector, owns never · chooses 6 (3 rule, 3 read) · sequences field-prebook-announced, field-prebook-predicted, field-prebook-late, field-meeting-confirm, side-dinner-invite, field-follow-up-warm, field-follow-up-cold · approval every-send · checks owned-by-a-person, consent-stop, claims-resolve + 5 · stops 10 · placements industry-events, gmail, outlook, yahoo-mail, linkedin · also runs as gatherings catalog play:field-presence@1 (Not live yet, gaps #5) Every key from the catalog
Compiled, not written: edit the Play record field-presence 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.