Skip to content

Guest circuit

Books the founder on the niche’s shows with pitches in the founder’s own words, then turns each aired episode into a Page that brings buyers.

Channel
Press and guest spots
Run oneMode try
You, to your agent

Hand the latest show opening to the Communications Lead agent and show me what it chose and why. Don’t send.

curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Schedule.fired%22%2C%20%22Monitor.checked%22%2C%20%22Post.published%22%2C%20%22Monitor.matched%22%2C%20%22Interview.requested%22%2C%20%22Message.received%22%2C%20%22Meeting.booked%22%2C%20%22Recording.captured%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_1195"}'

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

const { events: [last] } = await $.Event.list({ where: 'name in ("Schedule.fired", "Monitor.checked", "Post.published", "Monitor.matched", "Interview.requested", "Message.received", "Meeting.booked", "Recording.captured")', 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 (\"Schedule.fired\", \"Monitor.checked\", \"Post.published\", \"Monitor.matched\", \"Interview.requested\", \"Message.received\", \"Meeting.booked\", \"Recording.captured\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_1195"}' --try   # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"show_42\""}'   # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"show_42\""}'   # Not live yet (gaps #7)
{
  "name": "do",
  "arguments": {
    "code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Schedule.fired\", \"Monitor.checked\", \"Post.published\", \"Monitor.matched\", \"Interview.requested\", \"Message.received\", \"Meeting.booked\", \"Recording.captured\")', 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_423",
    "$type": "Decision",
    "choice": "pitch-the-show",
    "reason": "Rent Roll Radio’s listeners asked about late renewals in 3 episodes and it covered the topic in none of the last 20; your anecdote #4 (the 11-owner batch) is fresh to it",
    "stakes": "low",
    "options": [
      "pitch-the-show",
      "answer-the-request",
      "offer-a-take",
      "book-it",
      "after-it-airs",
      "not-now"
  …
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 the pitch in your tray: you write its opening line, and it sends from your Mailbox only when you press send.

107 per episode against 38 before · before-after, not proof · n 2 · path → arr

Try another: the showChoiceReason
Rent Roll Radio: a call for guests; listeners asked about late renewals 3 timespitch-the-showa skipped topic and a fresh anecdote
A trade reporter: “Looking for property managers on renewal season, by 15:00”answer-the-requestin the beat, due in 4 hours
The Landlord Hour host: “Can Dana join us on Nov 12?”book-itan invite: book it, then prep
Doorbell Dispatch: asks $400 for a guest slotnot-nowa paid slot leaves this Play for sponsorships

Where it sits: Stranger → Lead → Trialing → Activated → At risk → Churned → Won back · ICP Visits per episode → People reached → New Customers ↑ → ARR added each week → ARR

Worth’s formula: about +60 ICP Visitors per episode (Other Startups’ results; no lift of your own to read) × 2 aired a month × 0.006 Visitors to paid × $590 first order ARR ≈ +$425. Under First signal: At 2 aired a month, 90 days give 6 episodes, so your file starts at holdout: 0 and reads before-after.

sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Monitor.checked · first pitch brief 7m 05s · 8 keys Not live yet

Start it this week

Terminal
npx startup-builder add play guest-circuit   # 1 · writes plays/guest-circuit.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":"guest-circuit"}'

# 3 · keep it: you open every pitch and approve every quote
curl -X POST https://api.sb/leaseline.app/campaigns \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"play":"guest-circuit"}'

# on
curl -X PATCH https://api.sb/leaseline.app/campaigns/guest-circuit \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":null}'

# off: the slate stops; booked recordings stay booked
curl -X PATCH https://api.sb/leaseline.app/campaigns/guest-circuit \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":"now"}'
422Refusedguest-circuit can’t start: 2 checks fail and 1 warns.
CheckFixThen
use-when pass · Not live yet, gaps #8Dana, a person, can record 1 a week; 5 anecdotes loggedPOST /{namespace}/metrics/query
baseline warn · Not live yet, gaps #8n 1: it reads before-after, not proof, beside Other Startups’ results.POST /{namespace}/metrics/query
opinion-bank failAnswer 8 more questions; pitches state only views you hold.POST /{namespace}/content
domain-authenticated failAdd the 3 DNS records shown; it passes once they resolve, often within an hour.POST /{namespace}/domains/{domain}/authenticate
mailbox-warm pass · Not live yet, gaps #1Dana’s Mailbox, 2 years of sent mailPOST /{namespace}/mailboxes/{mailbox}/warm
role-unstaffed pass · Not live yet, gaps #8every hand-off goes to the founder, DanaPOST /{namespace}/roles/{role}/staff
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "guest-circuit can’t start: 2 checks fail and 1 warns.",
  "checks": [
    {
      "check": "use-when",
      "status": "pass",
      "observed": "Dana, a person, can record 1 a week; 5 anecdotes logged",
      "doc": "/plays/guest-circuit#check-use-when",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "warn",
      "observed": "1 episode in 90 days, 38 ICP Visitors",
      "doc": "/plays/guest-circuit#check-baseline",
      "fix": "n 1: it reads before-after, not proof, beside Other Startups’ results.",
      "then": "Metric.query"
    },
    {
      "check": "opinion-bank",
      "status": "fail",
      "observed": "22 of 30 views",
      "doc": "/plays/guest-circuit#check-opinion-bank",
      "fix": "Answer 8 more questions; pitches state only views you hold.",
      "then": "Content.create"
    },
    {
      "check": "domain-authenticated",
      "status": "fail",
      "doc": "/plays/guest-circuit#check-domain-authenticated",
      "fix": "Add the 3 DNS records shown; it passes once they resolve, often within an hour.",
      "then": "Domain.authenticate"
    },
    {
      "check": "mailbox-warm",
      "status": "pass",
      "observed": "Dana’s Mailbox, 2 years of sent mail",
      "doc": "/plays/guest-circuit#check-mailbox-warm",
      "then": "Mailbox.warm"
    },
    {
      "check": "role-unstaffed",
      "status": "pass",
      "observed": "every hand-off goes to the founder, Dana",
      "doc": "/plays/guest-circuit#check-role-unstaffed",
      "then": "Role.staff"
    }
  ]
}

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

CheckFix (one call)Your timeWait
use-when · baseline · pass: a founder who records weekly; warn: 1 episode, n 1 (gaps #8)POST /{namespace}/metrics/query on episode-icp-visits, which fills Before in Your number1 minnone
opinion-bank · fail (gaps #8): 22 of 30 viewsPOST /{namespace}/content: answer the grilling20 minnone
domain-authenticated · failPOST /{namespace}/domains/{domain}/authenticate10 minuntil DNS resolves, often under 1 h
mailbox-warm · role-unstaffed · pass: pitches send from Dana’s own Mailbox; every hand-off is yoursPOST /{namespace}/mailboxes/{mailbox}/warm only for a new Mailbox · POST /{namespace}/roles/{role}/staff if a person joins0 minnone

Your number · Before 38 ICP Visitors per episode · Now 107 per episode · Target 120 by Dec 31 · before-after, not proof · n 2 matured

A pitch costs nothing to send from your own Mailbox. Each pitch brief costs $0.03 and each episode Page $0.20 to draft and publish (Worker cost), and shows that ask a fee leave this Play. That comes to about $5 a month at 8 pitches a week, plus your 3 hours.

When it starts

WhenTrigger idStarts onWindowHow it gets in
Monday’s pitch slate is due and you have open recording slotsslate-dueat on Schedule.fired where Monday 07:00, with open recording slots in the next 6 weeks7dset by your file’s capacity line
A journalist asks in public for a view in your beatview-requestevent on Post.published where kind = 'source-request' and dueIn > 45m12h; dropped inside 45 min of its deadlinePOST /{namespace}/handles/{handle}/connect reads it, or forward it
A booked episode, or a feature quoting you, goes liveepisode-airedevent on Monitor.checked where status = 'aired'72hread from the show’s feed; POST /{namespace}/events/capture for one seen elsewhere
+ 8 more for show openings and gaps, invites, confirmed bookings, citations, news moments, interview asks and your memos (?lanes=all)
One signed delivery · StartupBuilder-Signature
{
  "$id": "https://api.sb/leaseline.app/events/event_1195",
  "$type": "Event",
  "name": "Monitor.checked",
  "at": "2026-10-19T06:30:02Z",
  "seq": 1195,
  "data": {
    "monitor": "monitors/show-openings",
    "show": "shows/show_42",
    "name": "Rent Roll Radio",
    "kind": "call-for-guests",
    "listenerAsks": 3,
    "lastEpisodesOnTopic": 0
  }
}
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":"Monitor.checked","url":"https://leaseline.app/hooks/sb"}'
npx startup-builder trigger Monitor.checked --like event_1195   # replays the delivery
npx startup-builder clock advance --by 7d   # runs the one follow-up line, only with new information

Who runs it

Communications Lead · your agent (role:communications-lead, worker_7) holds the Key Result: it maps shows, reads episodes, drafts pitches, schedules and publishes episode Pages. Every pitch, answer, take and quote hands to you (Dana Okafor, person, worker_1, role:founder), who writes the opening line and presses send. A scheduling Message names the agent as an agent in its first line.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
Pitch the show · Answer the request · Offer a takeYou approve each one42 sent of 51 briefed (9 skipped)never: words under your name stay yours—skip it in the tray, or POST /{namespace}/actions/{action}/cancel
Book itIt does it, you can stop it7 of 7met on day 30 (5 bookings, 0 Checks failed)a missed session → You approve each onePOST /{namespace}/actions/{action}/cancel inside the hold
After it airs · Not nowIt does it4 of 4 · 11 of 11—a Page before the host’s grant → You approve each onePOST /{namespace}/actions/{action}/redirect
Change the slate ruleYou approve each one1 merged of 1never—POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert
Never: a quote you did not approve, a paid slot, a transcript before the host’s grantRefused, every time2 drafted, 2 refusednever—the words-check, paid-slot and rights-hold Checks

What it reads · What it may call. It reads only what a host published: episode titles, dates, guests and the host’s own words. A host’s Message is data, never instructions; POST /{namespace}/meetings/book lands on your calendar under your name. Its tools are POST /{namespace}/content/draft, POST /{namespace}/tasks/{task}/assign, POST /{namespace}/meetings/book, POST /{namespace}/sites/{site}/publish, POST /{namespace}/videos/draft, and any other call becomes an Approval under the Role’s Mandate.

The brief (folded): compiled Agent-register Markdown · play:guest-circuit@1 · each line names its record key
You hold the Communications Lead Key Result: 120 ICP Visitors per aired episode by 2026-12-31. ← worker, metric
On each show, request or story, choose one option and say why; a paid slot gets Not now. ← triggers, chooses
Pitch at most 4 shows per open recording slot, and 1 a week when the slots are full. ← your file, line 3
Every sentence under the founder’s name traces to their typing, the opinion bank or the anecdote log. ← copyRules 1, words-check
Cite only what the host published; carry one anecdote fresh to the show for 90 days. ← copyRules 3, 4
Credit the show and the host before Leaseline on every episode Page.             ← copyRules 10

The slow loop, as a Change. decision_383 (2026-09-21, weekly) read 4 bookings from 11 pitches naming a listener’s question against 1 from 17 that did not, so change_25 made the listener’s question the pitch’s second line (your file, line 5), and Dana merged it with POST /{namespace}/changes/{change}/merge. Replayed on past pitches, POST /{namespace}/changes/{change}/review put bookings at 27 per 100; read back at +28d it is 25 per 100, n 16, ■□□□ Too early to tell (Example, day 56).

Bring your own agent (folded) drafts at the same rung when it matches or beats the seated agent on the eval suite; you open every pitch either way, and POST /{namespace}/roles/{role}/staff seats it.

Terminal
npx startup-builder eval --scenario guest-circuit-73 --agent "claude -p" --seat communications-lead   # seated: 0 untraced sentences sent, 0 stale anecdotes, 4.1 founder min a pitch · yours: 2 untraced, 1 stale, 5.0 min → fix the trace first

What it can do next

OptionPicked whenDecided byRunsHands toIf it’s just you
Pitch the show pitch-the-showits audience asks about a topic it skipped in 20 episodes, and you hold a fresh anecdoteAgent’s call, with its reasonPOST /{namespace}/content/draft → POST /{namespace}/tasks/{task}/assign to your tray → guest-pitch-two-touch once you sendyou open and send it, due 1 business day · Take this oneyou
Answer the request answer-the-requesta journalist’s public request in your beat, due in over 45 minAgent’s call, with its reasonPOST /{namespace}/content/draft of fragments → POST /{namespace}/tasks/{task}/assignyou write the answer, due 60 min · Take this oneyou
Offer a take offer-a-takea news story in your beat, inside its class windowAgent’s call, with its reasonPOST /{namespace}/content/draft → newsjack-comment-offer, no follow-upyou write the take, due 60 min · Take this oneyou
Book it book-ita host says yes or invitesYour rule (line 3)booking-confirm → POST /{namespace}/meetings/book on your calendar → your prep brief the day beforeyou, for the recordingyou
After it airs after-it-airsa booked episode or a feature quoting you goes liveYour rule (the episode Page)POST /{namespace}/sites/{site}/publish the episode Page → POST /{namespace}/videos/draft clips → host-thanksnobodythe same
Not now not-nowheld out this quarter, pitched in the last 90 days, or a paid slotYour rule (the leases)nothing; names the lease and its end date, or sponsorships for a paid slotnobodythe same
When they write backFixture replyWhat happensWho answersBy whenCall
Interested“Love this angle. Can you record on Sep 10?”Book it: the scheduling agent offers 3 slots in the host’s time zone and asks once for the grantsCommunications Lead · your agent, then you1 business dayPOST /{namespace}/meetings/book
Send me pricing“Do you charge to come on, or do we?”drafts your one line: no fee either way; a show that asks one leaves this Playyou, from a draft1 business dayPOST /{namespace}/content/draft
Not now“We’re booked through December.”no follow-up; the show’s lease holds 90 days, then it can return to the slatenobodyat onceGET /{namespace}/decisions
Wrong person“Our producer, Sam, books guests.”drafts your thanks asking them to loop Sam in; it never writes to an address from their textyou, from a draft1 business dayPOST /{namespace}/content/draft
Out of officean auto-reply until Oct 28the one follow-up waits for the return date, only with new informationnobodythe return datePOST /{namespace}/messages/{message}/schedule
Question it can’t answer“Can you share Leaseline’s churn numbers on air?”held for you: a number off the claims source never appears; you decide what to shareyou (Dana, person)1 business dayPOST /{namespace}/conversations/{conversation}/escalate
Stop“Please take us off your list.”the show leaves the map for every one of your Startups; nothing sends againnobodyat oncePOST /{namespace}/contacts/{contact}/suppress

When it hands to you

Every pitch, answer, take and recording hands to you (Dana Okafor, person): words under your name are yours to open and send. As captured, the Brief in your tray (brief is Not live yet, gaps #7); a booked recording adds a prep brief the day before.

What lands in each queue · sample
[
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_517",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-10-20T17:00:00Z",
    "on": "show_42",
    "brief": {
      "show": "Rent Roll Radio, host Lena Ortiz, 94 episodes",
      "gap": "late renewals: 3 listener asks, 0 of the last 20 episodes",
      "anecdote": "#4: the 11-owner batch, fresh to this show and the niche for 90 days",
      "episodes": [
        "Ep 91: Turnover math",
        "Ep 88: The owner report",
        "Ep 85: Move-in to move-out"
      ],
      "chose": "pitch-the-show",
      "never": [
        "a number off the claims source",
        "an ask for a review or a share"
      ]
    }
  }
]

You answer each brief by writing the opening line and pressing send, with POST /{namespace}/tasks/{task}/return and a reason, or with POST /{namespace}/actions/{action}/redirect. A brief left 1 business day expires, and 7 days with no tray action stop the slate (founder-silence). Nobody else can speak in your name, so nothing goes up a Role.

On time: You: 42 of 51 briefs sent within their due time, median 3h 40m for pitches and 38 min for requests, n 51, ■■□□ Early sign beside Other Startups’ 79 %. Your queue: counted by kind: about 8 pitch briefs, 1 request and 1 prep brief a week, and 1 weekly slate review.

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 pitch to a host whose Lead or open Deal the AE ownsLeave it to the person who owns it: the draft waits in their queue.POST /{namespace}/tasks/{task}/assign
words-checka sentence under your name that traces to no founder-written source, reference line or accepted fragmentWrite that sentence yourself, or cut it.POST /{namespace}/content/draft
fact-check (the fabrication veto)a number, name, event or credential no fact backsCut the line, or add the source it came from.POST /{namespace}/content/draft
fresh-anecdote (email)a pitch whose anecdote aired on that show, or any mapped show, in 90 daysPick another anecdote from the log, or log a new one.POST /{namespace}/content/draft
unsure-viewa view marked unsure in the opinion bankFirm the view in the bank, or leave it out.POST /{namespace}/content
rights-hold (Pages and clips)a transcript or clip before the host’s grant is on the bookingAsk the host for the grant; the Page waits for it.POST /{namespace}/messages/{message}/schedule
recording-holda local backup recording with no host grant, or before everyone hears it announcedAnnounce it at the start, under the host’s grant.POST /{namespace}/tasks/next
paid-slot (email)a pitch to a show that asks for a fee, a purchase or an ad buySend it to sponsorships instead.POST /{namespace}/tasks/{task}/assign
disclosurea recommendation of a Startup you hold an interest in, with no disclosure firstName your interest before the recommendation.POST /{namespace}/content/draft
agent-labelthe agent as a guest, unless invited as itself with a labeled voiceSend yourself, or accept only an invite to the agent by name.POST /{namespace}/tasks/{task}/assign
prep-holdsround terms, unshipped Changes or a Customer without Consent in a brief, clip or PageCut it from the brief; the hold lists what stays out.POST /{namespace}/content/draft
contact-lease (email)a second pitch to one show in 90 days, or a host one of your other Startups wrote in 30Wait for the lease’s end date.GET /{namespace}/decisions
deadline-drop (email)a source request due inside 45 minutes, or a take outside its class windowLet it go; the next request opens a new brief.GET /{namespace}/decisions
tragedy-skipa take on a story about a death, a disaster or violenceNone: the news Monitor drops it, with no override.GET /{namespace}/decisions
Stop (pauses the Play)Pauses whenThen
capacity (email)pitches reach 4 per open recording slot, or the capacity line fillsthe slate stops until a slot opens
booking-floor (email)under 4 bookings per 100 pitches, after 75 pitchesthe slate pauses; You approve each one, with the brief shown first
complaint (email)one host complaint, or a pitch shown in public as genericevery pitch Tactic pauses; you hear first
bounce (email)over 2 bounces in a weekthe slate pauses until queued addresses verify again
missed-sessiona missed recordingthe slate pauses until you write the host
founder-silence7 days with no tray actionthe slate stops; you get one notice
kill-switchyou press itevery Tactic pauses at once; booked recordings stay on your calendar

The captured refusal, then the Stop that fired as a Campaign.paused reason (Not live yet, gaps #2); the rewrite you sent is the Landlord Hour thread in Example.

422RefusedThe pitch to The Landlord Hour did not reach your tray: it claims a number no fact backs.
CheckFixThen
fact-check fail · Not live yet, gaps #1Cut the line, or add the source it came from.POST /{namespace}/content/draft
words-check pass—POST /{namespace}/content/draft
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "The pitch to The Landlord Hour did not reach your tray: it claims a number no fact backs.",
  "checks": [
    {
      "check": "fact-check",
      "status": "fail",
      "doc": "/plays/guest-circuit#check-fact-check",
      "fix": "Cut the line, or add the source it came from.",
      "then": "Content.draft"
    },
    {
      "check": "words-check",
      "status": "pass"
    }
  ]
}

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

The Stops that fired, as Campaign.paused reasons · sample
[
  {
    "reason": {
      "limit": "bounce",
      "observed": "3 bounces",
      "bound": "2",
      "window": "7d"
    },
    "doc": "/plays/guest-circuit#stop-bounce",
    "task": "task_470"
  }
]

Did it work

At about 2 aired a month, no held-out half of shows reads within 90 days, so the basis is before-after (rule o): the columns read Now and Before, and nothing prints as Added. Each figure’s call is POST /{namespace}/metrics/query by node, and every node above the leaf is Not live yet (gaps #4).

107 per episode against 38 before · before-after, not proof · n 2 · path → arr

Chose
pitch-the-show
Why
Rent Roll Radio’s listeners asked about late renewals in 3 episodes and it covered the topic in none of the last 20; your anecdote #4 (the 11-owner batch) is fresh to it
From
pitch-the-show · answer-the-request · offer-a-take · book-it · after-it-airs · not-now
Expects
a recording booked within 21d
Reopens when
no Meeting.booked for show_42 within 21d
By
worker_7
JSON
{
  "$id": "decisions/decision_423",
  "$type": "Decision",
  "choice": "pitch-the-show",
  "reason": "Rent Roll Radio’s listeners asked about late renewals in 3 episodes and it covered the topic in none of the last 20; your anecdote #4 (the 11-owner batch) is fresh to it",
  "stakes": "low",
  "options": [
    "pitch-the-show",
    "answer-the-request",
    "offer-a-take",
    "book-it",
    "after-it-airs",
    "not-now"
  ],
  "by": "worker_7",
  "on": "show_42",
  "expected": "a recording booked within 21d",
  "reopensWhen": "no Meeting.booked for show_42 within 21d"
}
NodeNow (56 days)Before (the 90 days, per 56)AddedConfidenceBasis
episode-icp-visits107 per episode: 214 ICP Visitors from 2 matured · 2 still maturing (88 so far)38 per episode: 1 invited episode— · Worth about +$420 a month—before-after, not proof · Other Startups’ results +60 per episode, ■■■□ Likely, n 410 episodes, 1 show in 4 held out at random
icp-reached302 ICP Visitors from show links and episode Pages24——before-after
new-arr ↑$694, 2 Customers on Pro · Booked: credited, not all caused by this Play$0— · 3 trials still deciding—before-after, not proof
net-new-arr · arrcarried from new-arrcarried——carried

Before against after reads ICP Visitors per aired episode in the 56 days against the 90 days before, scaled, when one show invited Dana and none were pitched. It is not proof; Other Startups’ results, read with 1 tier-2 show in 4 held out at random for 90 days, print beside it.

How it moves it: 6 bookings from 32 pitches, each opening on a listener’s own question, and every aired episode got its Page within 48 hours.

Guardrails: before against after: earned-mentions, 4 against 1, and play-sourced-customers, 2 against 0; 0 host complaints.

The Campaign card · sample
{
  "$id": "https://api.sb/leaseline.app/campaigns/guest-circuit",
  "$type": "Campaign",
  "play": "play:guest-circuit@1",
  "path": [
    "episode-icp-visits",
    "icp-reached",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "episode-icp-visits",
    "unit": "per-episode",
    "heldBack": 0,
    "decision": null
  },
  "readout": {
    "value": null,
    "n": 2,
    "maturing": 2,
    "interval": null,
    "readability": "inadmissible",
    "basis": "before-after",
    "pooled": true
  },
  "ledger": {
    "spend": 0,
    "workerCost": 9,
    "hours": 24,
    "pipelineArr": 1041,
    "wonArr": 694,
    "projectedArr": 425,
    "paybackDays": 3
  }
}

Outside benchmark: 33 % of human-written answers to journalist source requests were selected, against 10 % of generated ones (a source-request service’s pitch data, 2026-09-23).

Before it · After it. Before it: founder-voice fills the opinion bank and the anecdote log, and data-stories finds the news moments. After it: archive-repurposing hears each transcript, video-ladder the clips, and a paid slot goes to sponsorships.

Example

Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days) on a map of 64 shows, 16 of them tier 1. It briefed 51 pitches, answers and takes, Dana sent 42, and 4 episodes or features aired. Read every captured thread at ?threads=all; three follow the tables.

What happened, by optionDecisionsSent by youBooked or quotedAired
Pitch the show38326 booked3 episodes, 3 to air
Answer the request · Offer a take9 · 47 · 32 quoted · 01 feature
Book it · After it airs7 · 4—7 recordings4 episode Pages
Not now110——
All · Before (90 days, per 56)734284 · 1
At 2 aired a month (the Use it when volume)about 70 in 56 daysabout 40before-after, not proofOther Startups’ results: +60 per episode, ■■■□ Likely, n 410
DayEventWhat happenedYour time
0event_126 Campaign.createdthe three steps; dry run fails opinion-bank and domain-authenticated35 min
9event_290 Meeting.bookedthe first recording: Rent Roll Radio, Sep 10—
17event_388 Monitor.checkedthe episode aired; its Page published within 48 hours with the host’s grant10 min
28 · 56event_530 Change.merged · event_905 Readout.createdthe listener’s question as line 2: replayed at 27 per 100, read back at +28d at 25, n 165 min
30event_560 Role.updatedpromoted: booking sends after a 2-minute hold; pitches still wait on you—
37event_655 Campaign.pausedbounce: 3 bounces in a week; resumed after 2 addresses verified10 min
1–56event_133 Task.assigned, first of 51you sent 42, recorded 7 times and reviewed 8 slates, from the POST /{namespace}/tasks/next log21 h · total 24 h measured, 24 h asked

Dana → Lena Ortiz, Rent Roll Radio, Sep 1, 10:12 · Lena, three of your listeners asked about late renewals this year, and the last 20 episodes skipped it.¹ Last spring an owner group of 11 sent every renewal notice in one batch, and 9 went out late.² I can walk through how per-owner batches fixed it. Ep 91, 88 and 85 set it up well.³

Lena, Sep 2, 08:30 · “Yes. Can you record Sep 10?” POST /{namespace}/meetings/book booked it on Dana’s calendar; the episode aired Sep 15, and its Page brought 131 ICP Visitors in 30 days.

The Landlord Hour, 2026-09-08 · the draft fact-check refused, then the rewrite you sent
- Leaseline has helped over 300 property managers stop late renewals.
+ Leaseline sends renewal notices for 41 property managers, each owner on its own 60-day batch.

A trade reporter, 2026-10-07 11:02 · asked in public for property managers on renewal season, due 15:00. The agent drafted fragments and put a Brief in Dana’s tray, due 12:02. · Dana, 11:48 · answered in her own 70 words; the feature quoted her on Oct 13. The Brief is in When it hands to you.

¹ Only what the host published, and a listener’s own question first. ² A fresh anecdote from the log, with its numbers from the claims source. ³ Episode titles the host published.

Your settings

plays/guest-circuit.mdx
---
holdout: 0        # 2 aired a month is too few to hold 1 show in 4 back; it reads before-after
capacity: 1       # recordings a week
---
Pitch property-management shows whose listeners ask about renewals. Open each pitch on a listener’s own question.
Text
$ npx startup-builder show plays/guest-circuit
holdout 0 · capacity 1 a week · the listener’s question first     your file  plays/guest-circuit.mdx:2,3,5 (Ask 2026-08-24; line 5 by change_25, 2026-09-21)
family demand · worker role:communications-lead, owns never · chooses 6 (3 rule, 3 read) · sequences guest-pitch-two-touch, booking-confirm, host-thanks, newsjack-comment-offer · every pitch opened by the founder · checks owned-by-a-person + 13 · stops 7 · placements gmail, outlook, google-search, answer engines, youtube, x, linkedin    catalog  play:guest-circuit@1 (Not live yet, gaps #5)

Every key from the catalog

Key Id What it is
Tactic show-map Show map scores a niche’s shows on fit, reach and openness, tiers them, checks leases and permission, and holds out 1 in 4. Starts at You approve each one.
Tactic episode-read Episode read turns a show’s last 10 to 20 episodes into a pitch brief: the audience’s unanswered gap, one fresh anecdote, one dated fact. Starts at Sends nothing.
Tactic pitch-critic Pitch critic briefs the human author before a pitch and checks the draft after it, returning fragments and comments and never rewritten text. Starts at Sends nothing.
Tactic guest-pitch Guest pitch builds, checks and sends a show pitch in the founder’s own words from the founder’s Mailbox, after the founder’s approval. Starts at You approve each one.
Tactic pitch-follow-through Pitch follow-through leases the host, sends one follow-up line only when it carries new information, and routes every reply. Starts at You approve each one.
Tactic words-check Words check blocks any sentence sent under a Human’s name that traces to nothing the Human wrote, said or accepted, or to a dated reference. Starts at Sends nothing.
Tactic booking-desk Booking desk schedules a recording session as the founder’s disclosed agent, records the host’s grants, and routes any paid slot to sponsorships. Starts at You approve each one.
Tactic guest-prep Guest prep confirms each place, decides go or no-go 10 days out, briefs the host one page per guest, and sends the founder’s reminder. Starts at You approve the first wave.
Tactic view-answer View answer briefs the founder within 10 minutes on a journalist’s request for a view, from the founder’s own bank; the founder writes and submits. Starts at Sends nothing.
Tactic newsjack-watch Newsjack watch scores beat news every 30 minutes, keeps stories the Dataset answers with a number, and briefs the founder within 2 hours. Starts at You approve each one.
Tactic view-newsjack View newsjack turns a beat story that needs a view into a founder-written take for 3 to 5 journalists and 3 shows, inside its window. Starts at You approve each one.
Tactic episode-capture Episode capture publishes each aired episode as a Page within 24 hours: the show credited first, chapters, and the verbatim transcript when granted. Starts at It does it, you can stop it.
Tactic appearance-log Appearance log writes an aired episode back into the claims source, the anecdote log and the appearances Page, and hands the transcript on. Starts at Sends nothing.
Tactic clip-cut Clip cut trims real source footage into captioned clips of one claim each, which a human edits before any upload, and never generates a frame. Starts at You approve each one.
Tactic host-give-back Host give-back sends the host clips, the episode Page and the founder’s thanks within 48 hours of air, promotes the show, and asks for nothing. Starts at It does it, you can stop it.
Tactic aired-readout Aired readout counts episodes aired, ICP Visits per episode and transcript citations monthly, reads bookings by arm against the holdout, and pools by niche. Starts at Sends nothing.
Tactic fabrication-veto Fabrication veto blocks any draft written in a Human’s name that states a number, name, event, quote or feeling no source supports. 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 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.
Trigger slate-due Slate due: at on Schedule.fired, window 7d.
Trigger show-opening Show opening: event on Monitor.checked, window 14d.
Trigger show-gap Show gap: threshold on Monitor.checked, window 30d.
Trigger view-request View request: event on Post.published, window 12h.
Trigger news-moment News moment: event on Monitor.matched, window 48h.
Trigger interview-ask Interview ask: event on Interview.requested, window 24h.
Trigger host-invite Host invite: event on Message.received, window 48h.
Trigger booking-confirmed Booking confirmed: event on Meeting.booked, window 14d.
Trigger episode-aired Episode aired: event on Monitor.checked, window 72h.
Trigger transcript-cited Transcript cited: event on Monitor.checked, window 28d.
Trigger founder-memo Founder memo: event on Recording.captured, window 7d.
Sequence guest-pitch-two-touch Guest pitch two touch: 2 steps; it ends on A reply; A booking; A later reply, re-queued at its date; A no-pitch reply or an opt-out; A bounce; No new information at 7 days.
Sequence booking-confirm Booking confirm: 3 steps; it ends on A recorded session; A cancel; The host’s opt-out.
Sequence host-thanks Host thanks: 2 steps; it ends on The host’s opt-out; No results opt-in at 30 days; The results note sent.
Sequence newsjack-comment-offer Newsjack comment offer: 1 steps; it ends on A reply; An opt-out or a no-pitch reply; The class window closing.
Benchmark guest-answer-selection-human Share of human-written answers to journalist source requests that the journalist selects: 33 % (A source-request service’s pitch data, analyzed by an AI-detection vendor, 2026-09-23).
Benchmark guest-answer-selection-generated Share of fully generated answers to journalist source requests that the journalist selects: 10 % (A source-request service’s pitch data, analyzed by an AI-detection vendor, 2026-09-23).
Benchmark guest-journalist-filter Share of journalists on a source-request service who turned on its filter against fully generated pitches: 35 % (A source-request service’s pitch data, analyzed by an AI-detection vendor, 2026-09-23).

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