Skip to content

Buying committee

Writes to 3 or more roles at each named company, one a week, and hands each engaged company to your AE within a day.

Channel
Contacts and companies
Run oneMode try
You, to your agent

Hand our latest engaged member 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(%22Company.funded%22%2C%20%22Visit.recorded%22%2C%20%22Visitor.identified%22%2C%20%22Prospect.engaged%22%2C%20%22Ad.clicked%22%2C%20%22Contact.enriched%22%2C%20%22Experiment.matured%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_1426"}'

# Not live yet (gaps #7)
curl "https://api.sb/leaseline.app/decisions?where=on%20%3D%20%22organization_102%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%22organization_102%22" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'

const { events: [last] } = await $.Event.list({ where: 'name in ("Company.funded", "Visit.recorded", "Visitor.identified", "Prospect.engaged", "Ad.clicked", "Contact.enriched", "Experiment.matured")', 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 (\"Company.funded\", \"Visit.recorded\", \"Visitor.identified\", \"Prospect.engaged\", \"Ad.clicked\", \"Contact.enriched\", \"Experiment.matured\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_1426"}' --try   # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"organization_102\""}'   # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"organization_102\""}'   # Not live yet (gaps #7)
{
  "name": "do",
  "arguments": {
    "code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Company.funded\", \"Visit.recorded\", \"Visitor.identified\", \"Prospect.engaged\", \"Ad.clicked\", \"Contact.enriched\", \"Experiment.matured\")', 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": "to-the-ae",
    "reason": "at Calloway Residential the operations lead replied to the renewals note and the controller viewed the committee page: 2 members engaged",
    "stakes": "low",
    "options": [
      "map-the-committee",
      "write-the-next-member",
      "note-to-the-buyer",
      "ads-only",
      "to-the-ae",
      "not-now"
  …
sample · 4 Not live yetPreview

On POST /{namespace}/processes/{process}/enableOff POST /{namespace}/processes/{process}/pauseTake this one POST /{namespace}/tasks/{task}/claim

action_3 is the Brief in AE · Priya Shah’s queue, due in 1 business day; once she claims, every member note at Calloway stops and replies go to her.

16.7 against 3.3 Deals per 100, interim · ■□□□ Too early to tell · n 60 · 0 matured · path → arr

Try another: the named companyChoiceReason
Calloway Residential: the operations lead replied, the controller viewed the pageto-the-ae2 members engaged
Ridgeway Homes: 3 new owners announced; leasing manager not written to yetwrite-the-next-membera live reason, and a member due this week
Ashford Group: owner and principal, Priority 1note-to-the-buyerthe economic buyer at a Priority 1 company goes as Dana
Bayview Rentals: layoffs announced Oct 6not-nowa crisis holds every touch for 14 days

Where it sits: Stranger → Lead → Trialing → Activated → At risk → Churned → Won back · Committee deal lift → Deals and trials opened → New Customers ↑ → ARR added each week → ARR

Worth’s formula: about +2.0 Deals per 100 named companies a quarter (Other Startups’ results; none of your own has matured) × 60 named ÷ 3 months × 0.30 Deals to paid × $2,400 first order ARR ≈ +$288. Under First signal: The leaf reads at day 90 and day 180; at 30 pairs, day 180 can tell only +14 Deals per 100 or more, so it pools with Other Startups’ draws in your category.

sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Prospect.engaged · first member note 2 days after mapping · 4 keys Not live yet

Start it this week

Terminal
npx startup-builder add play buying-committee   # 1 · writes plays/buying-committee.mdx (Not live yet, gaps #5)

# 2 · dry run; below, its 422 on the day-0 Startup (clock at 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":"buying-committee"}'

# 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":"buying-committee"}'

# on
curl -X POST https://api.sb/leaseline.app/processes/outbound/enable \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"

# off: no member note sends; the Ads layer pauses with it
curl -X POST https://api.sb/leaseline.app/processes/outbound/pause \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
422Refusedbuying-committee can’t start yet: 1 check fails and 2 warn.
CheckFixThen
owned-by-a-person warn · Not live yet, gaps #8Leave it to the person who owns it: the draft waits in their queue.POST /{namespace}/tasks/{task}/assign
use-when pass · Not live yet, gaps #860 named companies at 200+ units; 3.5 roles found a companyPOST /{namespace}/metrics/query
baseline pass · Not live yet, gaps #83.3 Deals opened per 100 of these companies in 90 days, n 60POST /{namespace}/metrics/query
domain-authenticated passleaseline.app: 3 of 3 records resolvePOST /{namespace}/domains/{domain}/authenticate
mailbox-warm fail · Not live yet, gaps #1Wait for the warm-up to finish, 14 days from day 0; mapping and the Ads layer run meanwhile.POST /{namespace}/mailboxes/{mailbox}/warm
role-unstaffed warn · Not live yet, gaps #8Staff the AE, or leave it: engaged companies come to you within a day.POST /{namespace}/roles/{role}/staff
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "buying-committee can’t start yet: 1 check fails and 2 warn.",
  "checks": [
    {
      "check": "owned-by-a-person",
      "status": "warn",
      "observed": "2 of the 60 named have an open Deal a person owns: they stay with that person",
      "doc": "/plays/buying-committee#check-owned-by-a-person",
      "then": "Task.assign"
    },
    {
      "check": "use-when",
      "status": "pass",
      "observed": "60 named companies at 200+ units; 3.5 roles found a company",
      "doc": "/plays/buying-committee#check-use-when",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "pass",
      "observed": "3.3 Deals opened per 100 of these companies in 90 days, n 60",
      "doc": "/plays/buying-committee#check-baseline",
      "then": "Metric.query"
    },
    {
      "check": "domain-authenticated",
      "status": "pass",
      "observed": "leaseline.app: 3 of 3 records resolve",
      "doc": "/plays/buying-committee#check-domain-authenticated",
      "then": "Domain.authenticate"
    },
    {
      "check": "mailbox-warm",
      "status": "fail",
      "doc": "/plays/buying-committee#check-mailbox-warm",
      "fix": "Wait for the warm-up to finish, 14 days from day 0; mapping and the Ads layer run meanwhile.",
      "then": "Mailbox.warm"
    },
    {
      "check": "role-unstaffed",
      "status": "warn",
      "roles": [
        "sales-lead"
      ],
      "owned": 2,
      "doc": "/plays/buying-committee#check-role-unstaffed",
      "fix": "Staff the AE, or leave it: engaged companies come to you within a day.",
      "then": "Role.staff"
    }
  ]
}

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

CheckFix (one call)Your timeWait
owned-by-a-person · warn (gaps #8): 2 of 60 have a person-owned Deal; they leave the drawPOST /{namespace}/tasks/{task}/assign drafts into that owner’s queue0 minnone
use-when · baseline · pass: 60 named, 3.5 roles each · 3.3 per 100, n 60POST /{namespace}/metrics/query on committee-deal-lift1 minnone
domain-authenticated · mailbox-warm · pass · fail: sdr@ warmed 0 of 14 daysPOST /{namespace}/mailboxes/{mailbox}/warm2 min14 days
role-unstaffed · warn (gaps #8): no AE, so engaged companies come to youPOST /{namespace}/roles/{role}/staff, or leave it0 minnone

Your number · Before 3.3 Deals per 100 named · Now 16.7 per 100 treated, interim · Target 20 by Dec 31 · ■□□□ Too early to tell · n 60 · 0 matured · held back at random

Contact data costs $0.06 per member found (POST /{namespace}/contacts/{contact}/enrich), each note $0.04 from your Domain (Worker cost), and a printed note to a Priority 1 owner $4.80 with postage. That comes to about $20 a month at 30 treated companies; the Ads layer bills through account-ads.

When it starts

WhenTrigger idStarts onWindowHow it gets in
A member asks for a meeting, a price or a pilotmember-hand-raiseevent on Prospect.engaged where asks for a Meeting, a Price, a pilot or the security reportto the AE within 1 business daythe member’s reply, through POST /{namespace}/prospects/{prospect}/engage
A member replies, accepts a meeting or views the committee pagemember-engagedevent on Prospect.engaged where replies, accepts a Meeting, or views the committee Page14 dthe same
Funding, hiring or a rival complaint at a treated companynamed-organization-momentevent on Company.funded where funding, hiring, a technology change, a filing or a rival complaint at a treated companya reason for 30 dPOST /{namespace}/monitors/{monitor}/check on each company’s public pages
+ 5 more for pricing visits, surges, ad engagement, role changes and holdout reads (?lanes=all)
One signed delivery · StartupBuilder-Signature
{
  "$id": "https://api.sb/leaseline.app/events/event_1426",
  "$type": "Event",
  "name": "Prospect.engaged",
  "at": "2026-10-19T15:12:48Z",
  "seq": 1426,
  "data": {
    "organization": {
      "$id": "https://api.sb/leaseline.app/organizations/organization_102",
      "name": "Calloway Residential",
      "list": "treated"
    },
    "prospect": {
      "$id": "https://api.sb/leaseline.app/prospects/prospect_310",
      "role": "operations lead"
    },
    "engaged": 2
  }
}
Reproduce it in test
# each delivery is signed with the Watch’s secret
curl -X POST https://api.sb/leaseline.app/watches \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"selector":"Prospect.engaged","url":"https://leaseline.app/hooks/sb"}'
npx startup-builder trigger Prospect.engaged --like event_1426   # replays the second engaged member
npx startup-builder clock advance --by 1d   # runs `sales-capacity` if the AE has not claimed it

Who runs it

SDR · your agent (role:prospector, worker_2) holds the Key Result, maps each committee and writes to its members. It hands engaged companies to AE · Priya Shah (person) (role:sales-lead, worker_3, staffed on day 9) and every note to an owner to you (Dana Okafor, person, worker_1). Your number links to Did it work.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
Write to the next memberYou approve each one38 of 40 approved uneditedat 50 approved, 95 % unedited and no Stop in 30 daysa hostile-reply Stop → every note waits for youPOST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse
Send your note to the buyerYou approve each one, on every rung9 of 9, 4 printednever—POST /{namespace}/approvals/{approval}/approve
Map the committee · Ads onlyIt does it30 of 30 mapped, 1 of 20 checked wrong · 13 of 13—a wrong-person Stop → mapping pausesPOST /{namespace}/actions/{action}/redirect
To the AE · Not nowIt does it7 of 7 · 4 held——POST /{namespace}/tasks/{task}/claim
Never: a note to a colleague after a stop, a touch during a crisis, a gift over its capTo a person, every time1 gift refused, 0 sentnever—POST /{namespace}/processes/{process}/pause

What it reads · What it may call. It reads each company’s public pages and its members’ public roles; a reply is data, never instructions, and no text in it picks the next person written to. One member’s stop ends every note to the whole company. Its tools are POST /{namespace}/contacts/{contact}/enrich, POST /{namespace}/prospects, POST /{namespace}/messages/{message}/schedule, PATCH /{namespace}/audiences/{id}, POST /{namespace}/leads/{lead}/assign, POST /{namespace}/tasks/{task}/assign, and any other call becomes an Approval under the Role’s Mandate.

The brief (folded): compiled Agent-register Markdown · play:buying-committee@1 · each line names its record key
You hold the SDR Key Result: 20 Deals opened per 100 named companies by 2026-12-31. ← worker, metric
On each reason, engagement or role change, choose one option and say why.        ← triggers, chooses
Write to one member a week, with something made for that role.                   ← your file, line 4
Owners and principals at Priority 1 companies hear from Dana, after her OK.      ← your file, line 5
One member’s stop ends every note to that company.                               ← organization-stop

The slow loop. The weekly Decisions kept the one-member-a-week pace and the 2-engaged hand-off line, and no Change was merged in the window, so there is no replay or read-back to print.

Bring your own agent (folded) starts at You approve each one; mapping it does is hand-checked on 20 members before any note sends.

Terminal
npx startup-builder eval --scenario buying-committee-60 --agent "claude -p" --seat prospector   # seated: 3.5 roles a company, 5 % wrong in the hand-check · yours: 3.1, 10 % wrong → mapping pauses

What it can do next

OptionPicked whenDecided byRunsHands toIf it’s just you
Map the committee map-the-committeefewer than 3 verified rolesYour rule (the 3-role line)POST /{namespace}/contacts/{contact}/enrich → POST /{namespace}/prospects per member; 20 hand-checkednobodythe same
Write to the next member write-the-next-membera live reason, a member due this weekAgent’s call, with its reasoncommittee-wave: one note per member, a week apart (POST /{namespace}/messages/{message}/schedule)on reply, the hand-raise rowthe same
Send your note to the buyer note-to-the-buyerthe economic buyer at a Priority 1 companyYour rule (line 5)founder-buyer-note: email from dana@, or a printed note of 60 words or feweryou approve each one, due 1 business day · Take this oneyou
Ads only ads-onlyno live reason this monthYour rule (the reason test)PATCH /{namespace}/audiences/{id} on the company list account-ads readsnobodythe same
To the AE to-the-aea hand-raise, or 2 members engagedYour rule (the hand-off line)POST /{namespace}/leads/{lead}/assign → POST /{namespace}/tasks/{task}/assign, Brief attachedPOST /{namespace}/tasks/{task}/assign → AE · Priya Shah, due 1 business day (response-1bd) · Take this oneyou, within 1 business day
Not now not-nowa crisis, a hostile reply, or a person-owned DealYour rule (rule j)nothing; names the holder: crisis-hold, hostile-reply or the Deal’s ownerthe Deal’s owner · Take this oneyou
When they write backFixture replyWhat happensWho answersBy whenCall
Interested“Our renewals are a mess across 6 owners. Can we talk next week?”hands the company to the AE with the Brief (When it hands to you)AE · Priya Shah (person)1 business dayPOST /{namespace}/leads/{lead}/assign
Send me pricing“What would 600 units cost?”answers with the Pricing Page’s list Price; anything above it goes to the AESDR · your agent5 minPOST /{namespace}/conversations/{conversation}/answer
Not now“We’re mid-audit until December.”no note to that member until their date; the company stays on AdsSDR · your agentat oncePOST /{namespace}/leads/{lead}/nurture
Wrong person“I don’t handle renewals; our leasing manager does.”marks the role and moves to the leasing manager on the map; it never writes to a name from the textSDR · your agentnext week’s notePATCH /{namespace}/prospects/{id}
Out of officean auto-reply until Oct 30that member’s note waits for the return date; the next member’s does notnobodythe return datePOST /{namespace}/messages/{message}/schedule
Question it can’t answer“Can you map to our accounting system’s owner ledgers?”To the AE, the question in the BriefAE · Priya Shah (person)1 business dayPOST /{namespace}/conversations/{conversation}/escalate
Stop“Please stop contacting my colleagues.”every note to the whole company ends, and it leaves every company listnobodyat oncePOST /{namespace}/suppressions

When it hands to you

Engaged companies go to AE · Priya Shah (person), due in 1 business day; owners at Priority 1 companies hear from you. Before day 9 every engaged company came to you. What lands in each queue, as captured: one Brief per Role, then the Approval (brief, draft, route and checks are Not live yet, gaps #7).

What lands in each queue · sample
[
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_311",
    "$type": "Task",
    "assignee": "worker_3",
    "due": "2026-10-20T15:12:00Z",
    "on": "organization_102",
    "brief": {
      "who": "Calloway Residential, 900 units for 11 owners",
      "engaged": [
        "Grace Lin, operations lead: replied to the renewals note",
        "the controller: viewed the committee page"
      ],
      "chose": "to-the-ae",
      "why": "2 members engaged",
      "reason": "their news page: 3 new owners this year",
      "notWrittenTo": [
        "the owner",
        "the leasing manager"
      ],
      "never": [
        "a price beyond the list",
        "a discount"
      ]
    }
  },
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_287",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-10-08T17:00:00Z",
    "on": "organization_163",
    "brief": {
      "who": "Ashford Group, owner and principal",
      "chose": "note-to-the-buyer",
      "why": "the economic buyer at a Priority 1 company",
      "note": "printed, 52 words, to the verified work address"
    }
  },
  {
    "$id": "https://api.sb/leaseline.app/approvals/approval_83",
    "$type": "Approval",
    "verdict": null,
    "deadline": "2026-10-08T17:00:00Z",
    "draft": "Tom, Ashford renews 1,400 leases a year across 9 owners. I built Leaseline to send every notice 60 days out, per owner…",
    "route": "note-to-the-buyer",
    "checks": [
      {
        "check": "gift-cap",
        "status": "pass"
      },
      {
        "check": "crisis-hold",
        "status": "pass"
      }
    ]
  }
]

Each receiver answers with POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, POST /{namespace}/actions/{action}/redirect, POST /{namespace}/approvals/{approval}/approve or POST /{namespace}/approvals/{approval}/refuse, each a one-call window, and an Approval unanswered by its deadline expires and the note never sends. Once the AE claims a company, every member note there stops and replies go to her. A company nobody claims within 1 business day pauses every new first touch (sales-capacity) and goes up through POST /{namespace}/tasks/{task}/escalate.

On time: AE · Priya Shah, 6 of 7 claimed within 1 business day, median 3 h, ■□□□ Too early to tell, n 7 (the 7th waited 27 h and paused new first touches for a day). Your queue: counted by kind: in weeks 1 to 3, 40 note approvals and the 20-member hand-check; since, about 1 hand-off and 1 owner note a week.

The fixed line: POST /{namespace}/deals/{deal}/assign sets owner to the receiving person, the agent is never a Deal’s owner, and Meetings land on the owner’s calendar under the owner’s name.

When it won’t send

Check (refuses one send)RefusesFixThen
owned-by-a-person (rule j; Not live yet, gaps #8)a note to a member of a company 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
organization-stopany note to a company where one member asked to stop, or asked you to stop writing colleaguesLeave them off; the stop holds at Company scope.GET /{namespace}/suppressions
crisis-holdany touch for 14 days after a layoff, breach or leadership crisis at the companyWait the 14 days; the Ads layer pauses too.GET /{namespace}/events
gift-cap (printed notes)a gift over its buyer-class cap, or any gift to a public-sector or healthcare companySend the note without the gift, or under the cap.POST /{namespace}/messages/{message}/schedule
mailbox-warma first note from a Mailbox still warmingWait for the warm-up to finish, 14 days from day 0; mapping runs meanwhile.POST /{namespace}/mailboxes/{mailbox}/warm
Stop (pauses the Play)Pauses whenThen
bouncebounces over 2 % of a day’s notesthat Mailbox pauses; POST /{namespace}/mailboxes/{mailbox}/rest
complaintcomplaints near 0.1 %notes pause on every Mailbox
reply-floorinterested replies under 1 % after 300 member notesoutreach stops; Ads continue under their own Stops
hostile-replyone hostile replythat company gets nothing for 90 days and the reply goes to you; 3 in 30 days drop a rung
wrong-personover 10 % wrong person or role in a hand-checkmapping and unchecked first notes pause
thin-mapunder half the treated companies hold 3 verified rolesoutreach pauses and reports the List as hard to map
sales-capacityan engaged company waits over 1 business dayevery new first touch pauses
holdout-integrityheld-back companies touched by more than 5 % of the holdoutthe draw’s Readout is void and promotion freezes
spend-limitAds, notes, data or model spend at its monthly Limitthat part pauses until the month turns
kill-switchyou press itevery Tactic and the Ads layer pause; POST /{namespace}/processes/{process}/enable after review

The captured refusal, then the Stop that fired as a Campaign.paused reason (Not live yet, gaps #2); the company it held is the third thread in Example.

422RefusedThe note to Bayview’s controller did not send: Bayview announced layoffs on Oct 6.
CheckFixThen
crisis-hold failWait the 14 days; the Ads layer pauses too.GET /{namespace}/events
owned-by-a-person pass · Not live yet, gaps #8—POST /{namespace}/tasks/{task}/assign
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "The note to Bayview’s controller did not send: Bayview announced layoffs on Oct 6.",
  "checks": [
    {
      "check": "crisis-hold",
      "status": "fail",
      "observed": "layoffs announced 2026-10-06",
      "doc": "/plays/buying-committee#check-crisis-hold",
      "fix": "Wait the 14 days; the Ads layer pauses too.",
      "then": "Event.list"
    },
    {
      "check": "owned-by-a-person",
      "status": "pass"
    }
  ]
}

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

The Stops that fired, as Campaign.paused reasons · sample
[
  {
    "reason": {
      "limit": "sales-capacity",
      "observed": "Ridgeway Homes waited 27 h for a claim",
      "bound": "1 business day",
      "window": "1 company"
    },
    "doc": "/plays/buying-committee#stop-sales-capacity",
    "task": "task_296"
  }
]

Did it work

The 60 companies were paired by size and split at random, 30 treated and 30 held back (rules m–o). The leaf reads at day 90, on 2026-11-22, so no company has matured: every row is an interim count, and nothing prints as Added. Each figure’s call is POST /{namespace}/metrics/query by node and by arm; every node above the leaf is Not live yet (gaps #4).

16.7 against 3.3 Deals per 100, interim · ■□□□ Too early to tell · n 60 · 0 matured · path → arr

Chose
to-the-ae
Why
at Calloway Residential the operations lead replied to the renewals note and the controller viewed the committee page: 2 members engaged
From
map-the-committee · write-the-next-member · note-to-the-buyer · ads-only · to-the-ae · not-now
Expects
a Meeting held with Calloway within 14d
Reopens when
no Meeting.booked at organization_102 within 14d
By
worker_2
JSON
{
  "$id": "decisions/decision_503",
  "$type": "Decision",
  "choice": "to-the-ae",
  "reason": "at Calloway Residential the operations lead replied to the renewals note and the controller viewed the committee page: 2 members engaged",
  "stakes": "low",
  "options": [
    "map-the-committee",
    "write-the-next-member",
    "note-to-the-buyer",
    "ads-only",
    "to-the-ae",
    "not-now"
  ],
  "by": "worker_2",
  "on": "organization_102",
  "expected": "a Meeting held with Calloway within 14d",
  "reopensWhen": "no Meeting.booked at organization_102 within 14d"
}
NodeAgent halfYour halfAddedConfidenceBasis
committee-deal-lift16.7 Deals per 100 treated (5 of 30), interim3.3 per 100 held back (1 of 30)— (0 matured; the day-90 read lands 2026-11-22)■□□□ Too early to tellheld back at random, in pairs · n 60 · 0 matured · Other Startups’ results +2.0 per 100, ■■□□ Early sign, n 1,240
opened-deals-and-trials5 Deals1—■□□□ Too early to tellthe same assignment, interim
new-arr ↑$2,393, 1 Customer on the $2,400 plan · Booked: credited, not all caused by this Play$0— · Worth about +$290 a month■□□□ Too early to tell (1 vs 0 Customers)the same · 4 Deals still deciding
net-new-arr · arr+$2,393$0—■□□□ Too early to tellcarried from new-arr

The leaf counts Deals opened after a held Meeting or a written request, per 100 named companies, treated minus held back, at day 90 and day 180; held-back companies get Ads and outreach from no Play but inbound answers.

How it moves it: each treated company heard from a median of 3 roles, a week apart, each opening on a reason of its own, where before one person per company heard a general pitch.

Guardrails: treated against held back, interim: Meetings held per Deal opened, 1.0 against 1.0, and stop requests, 1 of 30 companies against 0.

The Campaign card · sample
{
  "$id": "https://api.sb/leaseline.app/campaigns/buying-committee",
  "$type": "Campaign",
  "play": "play:buying-committee@1",
  "path": [
    "committee-deal-lift",
    "opened-deals-and-trials",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "committee-deal-lift",
    "unit": "per-100",
    "heldBack": 30,
    "decision": null
  },
  "readout": {
    "value": null,
    "n": 60,
    "maturing": 60,
    "interval": null,
    "readability": "inadmissible",
    "basis": "held-back",
    "pooled": false
  },
  "ledger": {
    "spend": 37,
    "workerCost": 4,
    "hours": 4.6,
    "wonArr": 2393,
    "projectedArr": 288,
    "paybackDays": 1
  }
}

Outside benchmark: deals with 3 or more engaged buyer contacts closed at about twice the rate of single-threaded deals (a revenue-intelligence firm’s 2025 study of 1.8M opportunities).

Before it · After it. Before it: account-ads runs its Ads layer, and account-visits and cold-email bring the visits and first replies. After it: the AE’s Meetings start Deals, and champion-follow hears a mapped member who changes jobs.

Example

Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days). 60 named property managers, paired by size: 30 treated and 30 held back. Mapping found 104 members across 4 roles; the hand-check of 20 found 1 wrong role. 17 treated companies held a live reason by day 56; the other 13 got Ads only. Read every captured thread at ?threads=all; three follow the tables.

What happened, treated companies, by optionDecisionsDoneEngaged (what happened)
Map the committee · Write to the next member30 · 61104 members · 61 notes9 members at 7 companies
Send your note to the buyer99 sent, 4 printed2 owners replied
Ads only · To the AE · Not now13 · 7 · 4— · 7 handed over · held5 Deals opened, 1 won
Treated · held back30 · 3061 notes · none5 Deals, interim · 1 · $2,393 won (credited, not all caused by this Play)
At 50 named (the Use it when volume)about 25 pairsheld back at random; pools at day 180Other Startups’ results: +2.0 per 100, ■■□□ Early sign, n 1,240
DayEventWhat happenedYour time
0event_1125 Campaign.createdthe 60 named, paired and drawn; the dry run fails mailbox-warm30 min
2event_1132 Prospect.created, first of 104mapping; you hand-checked 20, 1 wrong25 min
9event_1164 Role.staffedAE · Priya Shah (person) takes role:sales-lead—
14event_1192 Mailbox.warmedthe first member notes—
16event_1204 Message.createdthe first owner note, printed, to Ashford Group5 min
26event_1270 Prospect.engagedthe first hand-raise: Ridgeway’s operations lead asked to meet—
27event_1278 Campaign.pausedsales-capacity: Ridgeway waited 27 h; Priya claimed it, and first touches resumed—
1–56event_1141 Approval.created, first of 4940 member notes and 9 owner notes you approved, from the POST /{namespace}/tasks/next log3.1 h · total 4.6 h measured, 5 h asked

Leaseline → Grace Lin, operations lead, Calloway Residential, Oct 13 · Your news page says Calloway took on 3 new owners this year.¹ For an operations lead, that usually means 3 more renewal calendars to keep in step. Leaseline sends every notice 60 days out, per owner, from your own lease dates.² Worth 20 minutes? *Signed with the Role’s disclosure line.*³

Grace, Oct 17 · “Yes, our renewals are a mess across owners.” Oct 19 · the controller viewed the committee page; To the AE sent the Brief to Priya (task_311), due Oct 20, 15:12.

Bayview Rentals, 2026-10-08 · crisis-hold refused the note, then the one that sent on Oct 21
- With your team getting leaner, Leaseline can take renewals off your plate.
+ Bayview renews about 400 leases a year; Leaseline sends each notice 60 days out, per owner.

Ridgeway Homes, 2026-09-19 10:20 · the operations lead: “Can we see it with our 6 owners’ leases?” To the AE went to Priya (task_296, due Sep 22, 10:20). She claimed it 27 h later, past the line, which paused new first touches for a day;⁴ she held the call on Sep 24, and the Deal is still deciding.

¹ It opens on the company’s own public page. ² Every claim maps to an approved Page. ³ The fixed signature line, compiled from the Role’s disclosure Setting. ⁴ An engaged company that waits over a business day pauses every new first touch.

Your settings

plays/buying-committee.mdx
---
holdout: 0.5      # in pairs by size: half the named companies hear only inbound answers
---
Write to one member a week at each named company, with something for their role.
Owners and principals at Priority 1 companies hear from Dana, after her OK.
Text
$ npx startup-builder show plays/buying-committee
holdout 0.5 in pairs · one member a week · owners as Dana    your file  plays/buying-committee.mdx:2,4,5 (Ask 2026-08-24)
family demand · process outbound · worker role:prospector, owns never · chooses 6 (5 rule, 1 read) · sequences committee-wave, founder-buyer-note · Ads layer account-ads · approval every-send · checks owned-by-a-person, organization-stop, crisis-hold, mailbox-warm · stops 10    catalog  play:buying-committee@1

Every key from the catalog

Key Id What it is
Tactic committee-list-build Committee list build names, ranks and prioritizes the Organizations a draw targets, and fills the company list to the Venue’s floor. Starts at You approve the first wave.
Tactic committee-holdout-draw Committee holdout draw pairs named Organizations and sends one of each pair to a holdout every promotional Play excludes for 180 days. Starts at Sends nothing.
Tactic committee-map Committee map finds and verifies one Person for each committee role at a treated Organization, from public sources and sources with a recorded basis. Starts at Sends nothing.
Tactic committee-page-build Committee page build makes one noindex Page per Organization with a section for each committee role, from public sources and the claims source only. Starts at You approve each one.
Tactic committee-threading Committee threading reaches one member of a treated Organization each week, in role order, and only while the Organization has a live reason. Starts at You approve each one.
Tactic committee-person-layer Committee person layer adds person-grain Visits under the account-visits rules, the founder’s own video, and confirmed digital or physical gifts. Starts at You approve each one.
Tactic engaged-organization-routing Engaged organization routing hands an Organization to the Sales Lead on a hand-raise or two engaged members, and opens a Deal after a held Meeting. Starts at Sends nothing.
Tactic committee-coverage-readout Committee coverage readout counts roles reached weekly and reads Deals opened per 100 treated against the holdout at day 90 and day 180. Starts at You approve the first wave.
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.
Trigger named-organization-moment Named organization moment: event on Company.funded, window 30d.
Trigger pricing-visit Pricing visit: event on Visit.recorded, window 72h.
Trigger organization-surge Organization surge: threshold on Visitor.identified, window 7d.
Trigger member-hand-raise Member hand raise: event on Prospect.engaged, window 24h.
Trigger member-engaged Member engaged: event on Prospect.engaged, window 14d.
Trigger organization-ad-engagement Organization ad engagement: threshold on Ad.clicked, window 14d.
Trigger member-role-change Member role change: event on Contact.enriched, window 30d.
Trigger holdout-closed Holdout closed: event on Experiment.matured, window 7d.
Sequence committee-wave Committee wave: 6 steps; it ends on A hand-raise by any member; An engaged mark on the Organization; An Organization-scope stop; A hostile reply; A crisis Event; A Deal opened; 90 days with no new Reason.
Sequence founder-buyer-note Founder buyer note: 3 steps; it ends on A hand-raise by any member; An engaged mark on the Organization; An Organization-scope stop; A hostile reply; A crisis Event; A Deal opened.
Benchmark committee-ads-deal-open Deals opened per company targeted with LinkedIn company-list Ads.: 0.2–0.58 % (An ad-analytics vendor’s 2026 LinkedIn company-list benchmark report., 2026-10-24).
Benchmark committee-reply-one-two-contacts Reply rate when 1 or 2 contacts per company are emailed.: 5.1 % (An email-finder vendor’s 2025 cold email dataset., 2026-10-24).
Benchmark committee-reply-three-plus-contacts Reply rate when 3 or more contacts per company are emailed.: 3.5 % (An email-finder vendor’s 2025 cold email dataset., 2026-10-24).
Benchmark committee-day-one-shortlist Share of purchases won by a vendor on the buyer’s day-one shortlist.: 95 % (An intent-data vendor’s 2025 buyer survey., 2026-10-24).
Benchmark committee-buyer-first-contact Share of first contacts the buyer initiated.: 79 % (An intent-data vendor’s 2025 buyer survey., 2026-10-24).
Benchmark committee-first-contact-winner Share of purchases won by the vendor the buyer contacted first.: 77 % (An intent-data vendor’s 2025 buyer survey., 2026-10-24).

Compiled, not written: edit the Play record buying-committee 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.