URL: /plays/field-presence · Id: `play:field-presence`

# 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.

Field presence books [Meetings](https://startupbuilder.dev/business/nouns/meeting) at other hosts’ events before day one, hosts a dinner instead of a booth, and follows up only who you met.

```text title="Set it up · Ask"
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.
```

```text title="Run one · Ask"
Hand our latest Meeting from the event to the SDR agent and show me what it chose and why. Don’t send.
```

```ts title="Run one · SDK"
import { $ } from 'startup-builder'

const { events: [last] } = await $.Event.list({ where: 'name in ("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 }
```

```json title="Run one · Response · sample"
{
  "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"
    ],
    "by": "worker_2",
    "on": "contact_93",
    "expected": "a Deal opened at Summit Residential within 60d",
    "reopensWhen": "no Deal.opened at Summit Residential within 60d"
  },
  "actions": [
    {
      "$id": "https://api.sb/leaseline.app/actions/action_1",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_2",
      "verb": "Meeting.get",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_2",
      "$type": "Action",
      "status": "done",
      "mode": "try",
      "by": "worker_2",
      "verb": "Task.assign",
      "checks": []
    },
    {
      "$id": "https://api.sb/leaseline.app/actions/action_3",
      "$type": "Action",
      "status": "pending",
      "reason": "awaitingPerson",
      "mode": "try",
      "by": "worker_2",
      "verb": "Message.schedule",
      "checks": [
        {
          "check": "owned-by-a-person",
          "status": "held",
          "then": "Task.assign"
        },
        {
          "check": "consent-stop",
          "status": "pass"
        },
        {
          "check": "claims-resolve",
          "status": "pass"
        }
      ]
    }
  ]
}
```

`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 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 |

| Worth | Your time | Spend | First signal | Use it when | Instead |
| --- | --- | --- | --- | --- | --- |
| ≈ +$650 ARR a month at 1 event a quarter | 2 h a week from 28 days out, then the event | $240 per Meeting held, ~$880 a month at 1 event a quarter | Day 17: first Meeting prebooked | 40+ of your buyers’ Organizations at one event a quarter | Deals under $2,000 a year: `events-and-webinars` · no such event: `gatherings` |

**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](/plays/gatherings).

## Start it this week
```bash
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"}'
```


```json title="The dry run’s 422 · 2026-08-24 · sample"
{
  "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"
    }
  ]
}
```

| Check | Fix (one call) | Your time | Wait |
| --- | --- | --- | --- |
| <a id="check-use-when"></a>`use-when` · <a id="check-baseline"></a>`baseline` · pass: 140 ICP Organizations forecast; 2 prebooked last year (gaps #8) | <Op verb="Metric.query" /> on `prebooked-meetings`, which fills Before in Your number | 1 min | none |
| <a id="check-domain-authenticated"></a>`domain-authenticated` · pass | <Op verb="Domain.authenticate" /> (done Aug 2) | 0 min | none |
| <a id="check-mailbox-warm"></a>`mailbox-warm` · fail (Not live yet, gaps #1) | <Op verb="Mailbox.warm" /> priya@leaseline.app | 2 min | 8 days; the first ask goes Sep 8 |
| <a id="check-role-unstaffed"></a>`role-unstaffed` · warn (gaps #8): the AE seat is staffed on day 9 | <Op verb="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, 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
| 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 | <Op verb="Monitor.create" /> 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 | <Op verb="Meeting.update" /> 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=all`) | | | | |

```json title="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"
  }
}
```

```bash title="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.

| 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 | — | <Op verb="Approval.approve" /> · <Op verb="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 | <Op verb="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 | — | <Op verb="Approval.approve" /> · <Op verb="Task.claim" /> |
| Change the booking rule | You approve each one | 0 merged | never | — | <Op verb="Change.merge" /> · <Op verb="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 | — | <Op verb="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 <Op verb="Gathering.create" />, <Op verb="Approval.create" />, <Op verb="Task.assign" />, <Op verb="Decision.create" />, and any other call becomes an Approval under the Role’s Mandate.

```md title="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; <Op verb="Role.staff" /> seats it.

```bash
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 | <Op verb="Gathering.create" /> → <Op verb="Approval.create" /> 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 | <Op verb="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) | <Op verb="Decision.create" /> → <Op verb="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 | <Op verb="Meeting.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 | <Op verb="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 | <Op verb="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 | <Op verb="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 | <Op verb="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 | <Op verb="Conversation.escalate" /> |
| Stop | “Please stop emailing about the conference.” | every ask and note stops, for all your Startups | nobody | at once | <Op verb="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).

```json title="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 <Op verb="Task.claim" /> (Take this one), <Op verb="Task.return" /> with a reason, or <Op verb="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 <Op verb="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:** <Op verb="Deal.assign" /> sets `owner` to the receiving person, the agent is never a Deal’s owner, and Meetings land on the owner’s calendar under the owner’s name.

## When it won’t send
| Check (refuses one send) | Refuses | Fix | Then |
| --- | --- | --- | --- |
| <a id="check-owned-by-a-person"></a>`owned-by-a-person` (rule j; Not live yet, gaps #8) | a 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. | <Op verb="Task.assign" /> |
| <a id="check-consent-stop"></a>`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. | <Op verb="Message.schedule" /> |
| <a id="check-claims-resolve"></a>`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. | <Op verb="Content.draft" /> |
| <a id="check-import-refusal"></a>`import-refusal` (the record’s Import refusal) | an attendee list loaded as Contacts; the forecast stays Prospects | Ask the people on it; nothing loads. | <Op verb="Prospect.engage" /> |
| <a id="check-organizer-list"></a>`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. | <Op verb="Task.assign" /> |
| <a id="check-capture-path"></a>`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. | <Op verb="Form.create" /> |
| <a id="check-availability"></a>`availability` | a slot the calendar does not show free | Offer the next free slot; the grid rebuilds itself. | <Op verb="Meeting.book" /> |
| <a id="check-class-cap"></a>`class-cap` | a dinner seat above a guest’s class cap | Offer a coffee Meeting each pays for instead. | <Op verb="Meeting.book" /> |

| Stop (pauses the Play) | Pauses when | Then |
| --- | --- | --- |
| <a id="stop-go-no-go"></a>`go-no-go` | at 21 days out, under 3 Meetings and 4 dinner seats | <Op verb="Decision.create" />: you keep or cancel the trip |
| <a id="stop-lock-floor"></a>`lock-floor` | at 7 days out, under 5 Meetings | <Op verb="Decision.create" />: keep, shrink to coffee Meetings, or cancel |
| <a id="stop-event-change"></a>`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 |
| <a id="stop-bounce"></a>`bounce` | hard bounces over 2 % of a day’s sends | that Mailbox pauses |
| <a id="stop-complaint"></a>`complaint` | complaints near 0.1 % of a send | every pre-show Sequence pauses on every Mailbox |
| <a id="stop-opt-out"></a>`opt-out` | opt-outs over 1 % of one list label’s sends | that label pauses until the Marketing Lead reviews it |
| <a id="stop-dinner-show-floor"></a>`dinner-show-floor` | under 8 seated at 2 dinners running | the next event runs coffee Meetings instead |
| <a id="stop-holdout-loser"></a>`holdout-loser` | the 180-day readout marks the event a loser | its next edition waits on a Decision |
| <a id="stop-spend-limit"></a>`spend-limit` | event spend reaches its Limit | new bookings and deposits pause; a raise is an Approval |
| <a id="stop-kill-switch"></a>`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.

```json title="The captured refusal · sample"
{
  "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"
    }
  ]
}
```


```json title="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`

| 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.

```json title="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 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 <Op verb="Task.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.

```diff title="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
```mdx title="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 | <a id="tactic-event-shortlist"></a>`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 | <a id="tactic-talk-pitch"></a>`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 | <a id="tactic-attendee-read"></a>`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 | <a id="tactic-prebook-run"></a>`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 | <a id="tactic-side-dinner"></a>`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 | <a id="tactic-event-desk"></a>`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 | <a id="tactic-field-follow-up"></a>`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 | <a id="tactic-field-readout"></a>`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 | <a id="tactic-send-gate-check"></a>`send-gate-check` | Send gate check: Checks Suppression, a live reason, the Market, the basis stamp, the Person-month grant, the facts and the labels before any cold Message exists. Starts at Sends nothing. |
| Tactic | <a id="tactic-reply-matrix"></a>`reply-matrix` | Reply matrix: Labels every outreach reply with one of 11 labels, maps it to one of seven reply kinds, and runs that kind’s move by its deadline. Starts at You approve each one. |
| Tactic | <a id="tactic-sending-stop-loss"></a>`sending-stop-loss` | Sending stop loss: Reads the Play’s own bounces, replies and seed tests on every send, and rests, pauses or retires a Mailbox, Domain, cell or the Play. Starts at Sends nothing. |
| Tactic | <a id="tactic-founder-send-tray"></a>`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 | <a id="tactic-placement-code"></a>`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 | <a id="trigger-icp-event-found"></a>`icp-event-found` | ICP event found: `event` on `Monitor.matched`, window 30d. |
| Trigger | <a id="trigger-cfp-open"></a>`cfp-open` | CFP open: `event` on `Monitor.matched`, window 14d. |
| Trigger | <a id="trigger-attendee-forecast"></a>`attendee-forecast` | Attendee forecast: `threshold` on `Audience.predicted`, window 60d. |
| Trigger | <a id="trigger-attendance-announced"></a>`attendance-announced` | Attendance announced: `event` on `Monitor.matched`, window 30d. |
| Trigger | <a id="trigger-event-app-request"></a>`event-app-request` | Event app request: `event` on `Meeting.requested`, window 3d. |
| Trigger | <a id="trigger-organizer-list-delivered"></a>`organizer-list-delivered` | Organizer list delivered: `event` on `Audience.imported`, window 30d. |
| Trigger | <a id="trigger-field-capture"></a>`field-capture` | Field capture: `event` on `Lead.captured`, window 7d. |
| Trigger | <a id="trigger-field-meeting-held"></a>`field-meeting-held` | Field meeting held: `event` on `Meeting.held`, window 7d. |
| Trigger | <a id="trigger-field-meeting-missed"></a>`field-meeting-missed` | Field meeting missed: `state` on `Meeting.missed`, window 1d. |
| Trigger | <a id="trigger-event-changed"></a>`event-changed` | Event changed: `event` on `Monitor.matched`, window 1d. |
| Trigger | <a id="trigger-field-deal-opened"></a>`field-deal-opened` | Field deal opened: `event` on `Deal.opened`, window 365d. |
| Sequence | <a id="sequence-field-prebook-announced"></a>`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 | <a id="sequence-field-prebook-predicted"></a>`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 | <a id="sequence-field-prebook-late"></a>`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 | <a id="sequence-field-meeting-confirm"></a>`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 | <a id="sequence-side-dinner-invite"></a>`side-dinner-invite` | Side dinner invite: 4 steps; it ends on A decline; An opt-out or Suppression; The dinner is cancelled. |
| Sequence | <a id="sequence-field-follow-up-warm"></a>`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 | <a id="sequence-field-follow-up-cold"></a>`field-follow-up-cold` | Field follow-up cold: 2 steps; it ends on A reply; A booked Meeting; An opt-out or Suppression. |