Skip to content

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
Run oneMode try
You, to your agent

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"
  }
}
Response200application/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 yetPreview

On 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, not proof · n 1 event · path → arr

Try another: the Meeting heldChoiceReason
Rachel Kim, Summit Residential, 420 units: Meeting held Oct 7 with a memofollow-up-who-you-metheld, with Priya’s memo
A speaker listed on the agenda: ops lead at a 300-unit managerask-for-a-meetingannounced attendance: two slot times from 28 days out
A forecast attendee at 70 %, 150 unitsask-a-likely-attendeestates only Leaseline’s presence, never theirs
A strong-fit owner at 600 unitsinvite-to-the-dinnerinside the guest’s class cap: a seat at your table
Day 22 out: 2 Meetings booked, 3 dinner seatskeep-or-cancelunder the 21-day line: you decide the trip

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/leaseline.app · 41 Customers at 2026-10-19 · on Meeting.held · first memo to note 3h 40m · 9 keys Not live yet

Also runs as: Hosted gatherings.

Start it this week

Terminal
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"}'
422Refusedfield-presence can’t start yet: 1 check fails and 1 warns.
CheckFixThen
use-when pass · Not live yet, gaps #8None needed: 40 Organizations and $2,000 Deals are enough.POST /{namespace}/metrics/query
baseline pass · Not live yet, gaps #8None needed: 2 is your Before.POST /{namespace}/metrics/query
domain-authenticated passNone needed.POST /{namespace}/domains/{domain}/authenticate
mailbox-warm fail · Not live yet, gaps #1Warm priya@ for 8 more days; the first ask goes 28 days out.POST /{namespace}/mailboxes/{mailbox}/warm
role-unstaffed warn · Not live yet, gaps #8Staff 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.

CheckFix (one call)Your timeWait
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 number1 minnone
domain-authenticated · passPOST /{namespace}/domains/{domain}/authenticate (done Aug 2)0 minnone
mailbox-warm · fail (Not live yet, gaps #1)POST /{namespace}/mailboxes/{mailbox}/warm priya@leaseline.app2 min8 days; the first ask goes Sep 8
role-unstaffed · warn (gaps #8): the AE seat is staffed on day 9POST /{namespace}/roles/{role}/staff Priya, or you attend0 minnone

Your number · Before 2 at last year’s edition · Now 11 prebooked Meetings · Target 10 per event · before-after, not proof · n 1 event

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

WhenTrigger idStarts onWindowHow it gets in
Someone is listed as a speaker, or posts that they attendattendance-announcedevent on Monitor.matched where listed as speaker or sponsor staff, or posts that they attendfrom 28 days out; 30dPOST /{namespace}/monitors on the agenda and the event’s public posts
The person who attended marks a Meeting held, or logs a memofield-meeting-heldevent on Meeting.held where marked held, or a memo loggedthe Day-1 note within 24 h; 7dPATCH /{namespace}/meetings/{id} from the calendar
A booked Meeting passes its start by 15 minutes with no memofield-meeting-missedstate on Meeting.missed where 15m past the start with no memo and no check-in1 rebook note; 1dthe same calendar
+ 8 more for found events, calls for talks, forecasts, app requests, organizer lists, captures, changes and Deals (?lanes=all)
One signed delivery · StartupBuilder-Signature
{
  "$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"
  }
}
Reproduce it in test
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:prospector, 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:sales-lead, 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.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
Ask for a Meeting · Ask a likely attendee · Follow up who you metYou approve each one96 of 101 drafts sent by Priyanever: sends go from a person’s own Mailbox—POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/actions/{action}/cancel
Meeting confirmations and remindersIt does it, you can stop it33 of 33met on day 25 (the first 10 bookings)a double booking → every open offer pausesPOST /{namespace}/actions/{action}/cancel inside the delay
Shortlist the event · Invite to the dinner · Keep or cancel travelTo a person, every time1 · 14 invites · 0 askednever: spend and your table are yours—POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/tasks/{task}/claim
Change the booking ruleYou approve each one0 mergednever—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 memoTo a person, every time0 askednever—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.

The brief (folded): compiled Agent-register Markdown · play:field-presence@1 · each line names its record key
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.

Terminal
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

OptionPicked whenDecided byRunsHands toIf it’s just you
Shortlist the event shortlist-the-eventan event 60 to 180 days out whose agenda names your buyersAgent’s call, with its reasonPOST /{namespace}/gatherings → POST /{namespace}/approvals for the tripyou decide it, due 1 business day · Take this oneyou
Ask for a Meeting ask-for-a-meetingsaid in public they attend, or is your own ContactYour rule (line 4)field-prebook-announced, from 28 days outPOST /{namespace}/tasks/{task}/assign → Priya presses send · Take this oneyou
Ask a likely attendee ask-a-likely-attendeeforecast at 60 %+, fits your ListAgent’s call, with its reasonfield-prebook-predicted: Leaseline’s presence onlyPriya presses send · Take this oneyou
Invite to the dinner invite-to-the-dinnerstrong fit, inside the class capAgent’s call, with its reasonside-dinner-invite from your Mailboxyou press send · Take this oneyou
Follow up who you met follow-up-who-you-meta held Meeting with a memo, or a consented captureYour rule (line 4)field-follow-up-warm or field-follow-up-coldPriya presses send, due 1 business day · Take this oneyou
Keep or cancel travel keep-or-cancelbookings under the 21-day or 7-day lineYour rule (Go or no-go, Lock floor)POST /{namespace}/decisions → POST /{namespace}/tasks/{task}/assignyou, due 1 business day · Take this oneyou
When they write backFixture replyWhat happensWho answersBy whenCall
Interested“Tuesday 14:00 works. See you at the booth row.”booked on Priya’s calendar; the confirm Sequence runsAE · Priya Shah (person)1 business dayPOST /{namespace}/meetings/book
Send me pricing“What does it cost for 420 units?”over 150 units: Priya quotes the $2,400-a-year planAE · Priya Shah (person)1 business dayPOST /{namespace}/quotes/{quote}/send
Not now“Our schedule is full this year.”the asks stop; the Day-1 note goes only if they meetnobodyat oncePOST /{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 textAE · Priya Shah, from the draft1 business dayPOST /{namespace}/conversations/{conversation}/answer
Out of officean auto-reply until the eventthe next ask waits; slots stay held only while freenobodythe return datePOST /{namespace}/messages/{message}/schedule
Question it can’t answer“Can you sponsor our association’s breakfast?”To a person: sponsorship is your callyou1 business dayPOST /{namespace}/conversations/{conversation}/escalate
Stop“Please stop emailing about the conference.”every ask and note stops, for all your Startupsnobodyat oncePOST /{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).

What lands in each queue · sample
[
  {
    "$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)RefusesFixThen
owned-by-a-person (rule j; Not live yet, gaps #8)a send to a Person whose Lead or open Deal a person ownsLeave 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 goesAsk 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 recordCut 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 ProspectsAsk the people on it; nothing loads.POST /{namespace}/prospects/{prospect}/engage
organizer-listan organizer list with any Person whose yes to Leaseline the organizer did not recordThe whole list is refused; ask the organizer for ticked-box rows only.POST /{namespace}/tasks/{task}/assign
capture-patha Person met at the event who came in by any path but the Form, the event’s capture, an accepted request or a cardCapture them through your Form at the table.POST /{namespace}/forms
availabilitya slot the calendar does not show freeOffer the next free slot; the grid rebuilds itself.POST /{namespace}/meetings/book
class-capa dinner seat above a guest’s class capOffer a coffee Meeting each pays for instead.POST /{namespace}/meetings/book
Stop (pauses the Play)Pauses whenThen
go-no-goat 21 days out, under 3 Meetings and 4 dinner seatsPOST /{namespace}/decisions: you keep or cancel the trip
lock-floorat 7 days out, under 5 MeetingsPOST /{namespace}/decisions: keep, shrink to coffee Meetings, or cancel
event-changethe event is cancelled or moved, or the person attending withdrawsevery Sequence naming it pauses within 1 h; booked Persons get one plain note
bouncehard bounces over 2 % of a day’s sendsthat Mailbox pauses
complaintcomplaints near 0.1 % of a sendevery pre-show Sequence pauses on every Mailbox
opt-outopt-outs over 1 % of one list label’s sendsthat label pauses until the Marketing Lead reviews it
dinner-show-floorunder 8 seated at 2 dinners runningthe next event runs coffee Meetings instead
holdout-loserthe 180-day readout marks the event a loserits next edition waits on a Decision
spend-limitevent spend reaches its Limitnew bookings and deposits pause; a raise is an Approval
kill-switchyou press itevery 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.

422RefusedThe 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.
CheckFixThen
claims-resolve failCut 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.

The Stops that fired, as Campaign.paused reasons · sample
[
  {
    "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, not proof · n 1 event · path → arr

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"
}
NodeThis edition (Oct 6–8)Last year (a booth)AddedConfidenceBasis
prebooked-meetings11 booked before day 1 · 9 held, 1 rebooked and held2 booked, 2 held——before-after, not proof · Other Startups’ results +6 per event, ■■□□ Early sign, n 310 events
opened-deals-and-trials4 Deals and 2 trials opened by Oct 191 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 · arrcarried from new-arrcarried——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.

The Campaign card · sample
{
  "$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=all; three follow the tables.

What happened, by optionDecisionsSent by a personBooked · held
Ask for a Meeting · Ask a likely attendee41 · 12741 · 112 (15 dropped at T-1)7 · 4 booked; 9 held, 1 rebooked
Invite to the dinner1414 from your Mailbox12 accepted · 10 seated
Follow up who you met2221 Day-1 notes within 24 h12 replies in 7 days
Shortlist the event · Keep or cancel travel1 · 11 approved · kept, then 9 more booked—
Asked Organizations · held back (read Dec 5)1124 Deals and 2 trials so far$2,393 won · 28 Organizations, 0 Deals so far
DayEventWhat happenedYour time
0event_1702 Campaign.createdthe three steps; the dry run fails mailbox-warm25 min
2event_1706 Approval.approvedyou approved the trip and the $3,000 Limit10 min
15event_1712 Message.created28 days out: the first asks, sent by Priya45 min
17event_1715 Meeting.bookedthe first prebooked Meeting—
22event_1719 Campaign.pausedgo-no-go: 2 Meetings, 3 seats; you kept the trip5 min
43–45event_1735 Gathering.heldthe conference: 10 Meetings held, the dinner on night two2 days at the event
1–56event_1709 Task.assigned, first of 101Priya sent 96 drafts, from the POST /{namespace}/tasks/next log6 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.

A forecast attendee, 2026-09-08 · the draft claims-resolve refused, then the rewrite that went to the tray
- 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

plays/field-presence.mdx
---
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.
Text
$ 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

Key Id What it is
Tactic event-shortlist Event shortlist ranks third-party events 60 to 180 days out by ICP Organizations per $1,000, drops any above its cost ceiling, and queues one. Starts at You approve each one.
Tactic talk-pitch Talk pitch drafts 3 abstracts per call from the Startup’s own data; the speaker rewrites, submits and gives the talk in their own words. Starts at You approve each one.
Tactic attendee-read Attendee read grades an event’s predicted and announced attendees against the ICP, labels each Person, and holds out 20 percent of Organizations by hash. Starts at Sends nothing.
Tactic prebook-run Prebook run offers a 16-slot grid from the human’s live calendar 28 days out, and widens or stops enrollment at 14 and 7 days. Starts at You approve each one.
Tactic side-dinner Side dinner books a 12-seat room for night two and invites 26 guests inside each class cap; the human hosts with no demo. Starts at You approve each one.
Tactic event-desk Event desk runs the attending human’s event days: a morning sheet, reminders, rebooks, notes within 15 minutes, and every capture through a consented path. Starts at Sends nothing.
Tactic field-follow-up Field follow-up tiers each conversation that night; the person who had it writes the first note, and the agent runs the next 30 days. Starts at You approve each one.
Tactic field-readout Field readout counts what each event’s pre-booked Meetings kept at 60, 180 and 365 days, against a hash holdout, and drafts the keep-or-cut Decision. 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.
Tactic founder-send-tray Founder send tray shows each approved draft with its source trail; the founder presses post by hand or through the Venue’s own posting path. Starts at You approve each one.
Tactic placement-code Placement code gives each placement a vanity Page, a Stripe promotion code and, for events, an API Key prefix, each tested before it runs. Starts at Sends nothing.
Trigger icp-event-found ICP event found: event on Monitor.matched, window 30d.
Trigger cfp-open CFP open: event on Monitor.matched, window 14d.
Trigger attendee-forecast Attendee forecast: threshold on Audience.predicted, window 60d.
Trigger attendance-announced Attendance announced: event on Monitor.matched, window 30d.
Trigger event-app-request Event app request: event on Meeting.requested, window 3d.
Trigger organizer-list-delivered Organizer list delivered: event on Audience.imported, window 30d.
Trigger field-capture Field capture: event on Lead.captured, window 7d.
Trigger field-meeting-held Field meeting held: event on Meeting.held, window 7d.
Trigger field-meeting-missed Field meeting missed: state on Meeting.missed, window 1d.
Trigger event-changed Event changed: event on Monitor.matched, window 1d.
Trigger field-deal-opened Field deal opened: event on Deal.opened, window 365d.
Sequence field-prebook-announced Field prebook announced: 6 steps; it ends on A reply; A booked Meeting; A dinner acceptance; An opt-out or Suppression; The event is cancelled or moved.
Sequence field-prebook-predicted Field prebook predicted: 3 steps; it ends on A reply; A booked Meeting; An opt-out or Suppression; The event is cancelled or moved.
Sequence field-prebook-late Field prebook late: 3 steps; it ends on A reply; A booked Meeting; An opt-out or Suppression; The event starts; The event is cancelled or moved.
Sequence field-meeting-confirm Field meeting confirm: 4 steps; it ends on The Meeting is held; The Person cancels; An opt-out or Suppression; The event is cancelled or moved.
Sequence side-dinner-invite Side dinner invite: 4 steps; it ends on A decline; An opt-out or Suppression; The dinner is cancelled.
Sequence field-follow-up-warm Field follow-up warm: 4 steps; it ends on A reply; A booked Meeting; A Deal opens at the Organization; An opt-out or Suppression.
Sequence field-follow-up-cold Field follow-up cold: 2 steps; it ends on A reply; A booked Meeting; An opt-out or Suppression.

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.