Skip to content

Owned newsletter

Sends one issue a week with one fact, your own words and one Offer, passed by you, and stops writing to silent readers.

Channel
Newsletter
Run oneMode try
You, to your agent

Hand this week’s issue to the Content Lead agent and show me what it chose and why. Don’t send.

curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Message.scheduled%22%2C%20%22Source.added%22%2C%20%22Change.merged%22%2C%20%22Contact.subscribed%22%2C%20%22Contact.engaged%22%2C%20%22Message.broadcasted%22%2C%20%22Conversation.labeled%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_1380"}'

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

const { events: [last] } = await $.Event.list({ where: 'name in ("Message.scheduled", "Source.added", "Change.merged", "Contact.subscribed", "Contact.engaged", "Message.broadcasted", "Conversation.labeled")', 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 (\"Message.scheduled\", \"Source.added\", \"Change.merged\", \"Contact.subscribed\", \"Contact.engaged\", \"Message.broadcasted\", \"Conversation.labeled\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_1380"}' --try   # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"broadcast_9\""}'   # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"broadcast_9\""}'   # Not live yet (gaps #7)
{
  "name": "do",
  "arguments": {
    "code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Message.scheduled\", \"Source.added\", \"Change.merged\", \"Contact.subscribed\", \"Contact.engaged\", \"Message.broadcasted\", \"Conversation.labeled\")', 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_561",
    "$type": "Decision",
    "choice": "send-the-issue",
    "reason": "fact_31 (1,204 notices 60 days out in September) is inside its 30-day refresh window; Dana’s Oct 16 recording has a 2-minute cut on owner statements; Pro’s Price matches the Pricing Page",
    "stakes": "medium",
    "options": [
      "send-the-issue",
      "not-now",
      "welcome",
      "hand-on-the-buyer",
      "ask-to-keep",
      "add-a-sister-slot"
  …
sample · 4 Not live yetPreview

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

action_2 is your editor pass, due Oct 21 at 17:00 Central. action_3 sends Thursday at 08:00 in each reader’s time zone, and only once editorial passes; the Price is read again on the send day.

+3.9 per 1,000 · ■□□□ Too early to tell · n 410 · path → arr

Try another: the issueChoiceReason
Issue 9, due Oct 22: fact_31, Dana’s Oct 16 cut, Pro at $29send-the-issuea fresh fact, a cut and a live Offer; waiting for your pass
Issue 4, due Sep 17: no recording that weeknot-nowno usable cut: the week records checked, nothing to send
A reply to issue 8: “Can we get this for our 3 offices?”hand-on-the-buyera buying question: a Lead for the AE within 5 minutes
Sam Patel: no open, reply or click for 75 daysask-to-keepsilent 75 days: one Keep or Stop, then the sunset at 90

Where it sits: Stranger → Lead → Trialing → Activated → At risk → Churned → Won back · Subscribers who become Leads → New Leads → New Customers ↑ → ARR added each week → ARR

Worth’s formula: about +0.8 trials per 1,000 delivered (Other Startups’ results; your own read is too early) × 7,800 delivered a month × 0.30 trials to paid × $347 Pro ARR ≈ +$650. Under First signal: Holding back 1 in 10 new subscribers at about 220 a month, about 26 weeks to tell a +1 lift; 90 days can tell only +4.2 per 1,000 or more.

sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Message.scheduled · first draft 4 min after the cycle opened · 9 keys Not live yet

Start it this week

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

# 3 · keep it: you pass every issue as editor
curl -X POST https://api.sb/leaseline.app/campaigns \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"play":"owned-newsletter"}'

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

# off: no issue, welcome or re-permission sends
curl -X POST https://api.sb/leaseline.app/processes/content-marketing/pause \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
422Refusedowned-newsletter can’t start yet: 1 check fails and 1 warns.
CheckFixThen
use-when pass · Not live yet, gaps #8Nothing to do: only addresses whose yes names Leaseline count.POST /{namespace}/metrics/query
baseline pass · Not live yet, gaps #8Nothing to do: Before reads your monthly update’s last 90 days.POST /{namespace}/metrics/query
domain-authenticated failAdd the 3 DNS records shown for news.leaseline.app; it passes once they resolve.POST /{namespace}/domains/{domain}/authenticate
fact-check pass · Not live yet, gaps #1Nothing to do: each issue’s fact must sit inside its refresh window.POST /{namespace}/content/draft
provenance-hold pass · Not live yet, gaps #1Record 10 minutes this week; every take quotes your own words.POST /{namespace}/content/draft
spam-brake passNothing to do: the broadcast Mailbox sends the issue in time-zone waves.POST /{namespace}/messages/{message}/broadcast
owned-by-a-person pass · Not live yet, gaps #8Nothing to do: their buying replies go to their owner.POST /{namespace}/tasks/{task}/assign
role-unstaffed warn · Not live yet, gaps #8Staff the AE, or leave it: buying replies come to you.POST /{namespace}/roles/{role}/staff
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "owned-newsletter can’t start yet: 1 check fails and 1 warns.",
  "checks": [
    {
      "check": "use-when",
      "status": "pass",
      "observed": "1,860 subscribers who said yes; 1,790 are not Customers",
      "doc": "/plays/owned-newsletter#check-use-when",
      "fix": "Nothing to do: only addresses whose yes names Leaseline count.",
      "then": "Metric.query"
    },
    {
      "check": "baseline",
      "status": "pass",
      "observed": "1.1 trials per 1,000 delivered from the monthly update, n 9,400 delivered in 90 days",
      "doc": "/plays/owned-newsletter#check-baseline",
      "fix": "Nothing to do: Before reads your monthly update’s last 90 days.",
      "then": "Metric.query"
    },
    {
      "check": "domain-authenticated",
      "status": "fail",
      "observed": "news.leaseline.app has no DNS records",
      "doc": "/plays/owned-newsletter#check-domain-authenticated",
      "fix": "Add the 3 DNS records shown for news.leaseline.app; it passes once they resolve.",
      "then": "Domain.authenticate"
    },
    {
      "check": "fact-check",
      "status": "pass",
      "observed": "12 facts on the facts Page, each with a refresh date",
      "doc": "/plays/owned-newsletter#check-fact-check",
      "fix": "Nothing to do: each issue’s fact must sit inside its refresh window.",
      "then": "Content.draft"
    },
    {
      "check": "provenance-hold",
      "status": "pass",
      "observed": "0 recordings yet; the first issue waits for one",
      "doc": "/plays/owned-newsletter#check-provenance-hold",
      "fix": "Record 10 minutes this week; every take quotes your own words.",
      "then": "Content.draft"
    },
    {
      "check": "spam-brake",
      "status": "pass",
      "observed": "trailing 7-day rate 240 Messages; one issue is 1,860",
      "doc": "/plays/owned-newsletter#check-spam-brake",
      "fix": "Nothing to do: the broadcast Mailbox sends the issue in time-zone waves.",
      "then": "Message.broadcast"
    },
    {
      "check": "owned-by-a-person",
      "status": "pass",
      "observed": "31 subscribers have an open Lead a person owns",
      "doc": "/plays/owned-newsletter#check-owned-by-a-person",
      "fix": "Nothing to do: their buying replies go to their owner.",
      "then": "Task.assign"
    },
    {
      "check": "role-unstaffed",
      "status": "warn",
      "roles": [
        "sales-lead"
      ],
      "owned": 31,
      "doc": "/plays/owned-newsletter#check-role-unstaffed",
      "fix": "Staff the AE, or leave it: buying replies come to you.",
      "then": "Role.staff"
    }
  ]
}

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

CheckFix (one call)Your timeWait
use-when · baseline · pass: 1,860 subscribers; 1.1 per 1,000, n 9,400 (gaps #8)POST /{namespace}/metrics/query on subscriber-leads, which fills Before in Your number1 minnone
domain-authenticated · failPOST /{namespace}/domains/{domain}/authenticate on news.leaseline.app10 minuntil DNS resolves, often under 1 h
fact-check · provenance-hold · spam-brake · pass: 12 facts; first recording due; time-zone waves (gaps #1)record 10 minutes before Thursday; each runs again on every issue10 minnone
owned-by-a-person · pass: 31 owned by younothing; it runs again on every reply0 minnone
role-unstaffed · warn (gaps #8): 31 subscribers have a person owner, youPOST /{namespace}/roles/{role}/staff, or leave it: buying replies come to you within 60 min0 minnone

Your number · Before 1.1 per 1,000 · Now 1.5 per 1,000 delivered · Target 2 by Dec 31 · ■□□□ Too early to tell · n 410 new subscribers · Other Startups +0.8, ■■■□ Likely

Each issue costs about $0.60 to send to 1,860 and $0.05 to draft (Worker cost); transcribing your 10-minute recording costs about $0.06. The archive Pages cost nothing. That comes to about $3 a month at 4 issues.

When it starts

WhenTrigger idStarts onWindowHow it gets in
This week’s issue is 3 days from its sendissue-dueat on Message.scheduled where sendAt - 3ddraft by Monday; your pass by Tuesday 17:00the send day in your file; POST /{namespace}/messages/{message}/schedule writes it
Someone ticks the newsletter box on any Page or at sign-upsubscriber-joinedevent on Contact.subscribed where list = 'newsletter'welcome within 1dyour subscribe Form posts to POST /{namespace}/contacts/{contact}/subscribe
A reply or poll answer asks about buyingbuying-replyevent on Conversation.labeled where label = 'buying'a Lead within 5 min; a person within 60replies to the broadcast Mailbox
+ 2 more: an act that resets the silence clock, and 75 days of silence, a state that starts the re-permission ask (?lanes=all)
One signed delivery · StartupBuilder-Signature
{
  "$id": "https://api.sb/leaseline.app/events/event_1380",
  "$type": "Event",
  "name": "Message.scheduled",
  "at": "2026-10-19T13:00:00Z",
  "seq": 1380,
  "data": {
    "broadcast": {
      "$id": "https://api.sb/leaseline.app/broadcasts/broadcast_9",
      "list": "the-renewal-desk",
      "sendAt": "2026-10-22T08:00:00",
      "timezone": "reader"
    },
    "fact": "fact_31",
    "source": "recordings/recording_14"
  }
}
Reproduce it in test
npx startup-builder trigger Message.scheduled --like event_1380   # replays the delivery in test
npx startup-builder clock advance --to 2026-10-22T08:00   # sends issue 9 in test (action_3) once your pass is in
npx startup-builder listen Lead.created --forward-to http://localhost:3000/hook

Who runs it

Content Lead · your agent (role:content-lead, worker_7) holds the Key Result and drafts every issue from your recording and the facts Page. You (Dana Okafor, person, worker_1) pass every issue as editor, on every rung. Buying replies go to AE · Priya Shah (person) (role:sales-lead, worker_3, staffed on day 9). Your number links to Did it work.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
Send this week’s issueYou approve each one7 passed, 1 heldnever: a person edits every issue—POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse
Welcome the subscriber · Ask whether to keep itIt does it, you can stop it410 of 410 · 38 of 38met on day 16 (200 sends, no Stop in 30 days)any email Stop → You approve each onePOST /{namespace}/actions/{action}/cancel inside the 15-minute hold
Hand the buying reply on · Not nowIt does it6 of 6 · 1 of 1——POST /{namespace}/actions/{action}/redirect
Add your other Startup’s slotYou approve each one0 offeredat 200 slot sends with no slot-opt-out—POST /{namespace}/approvals/{approval}/approve
Change the issue ruleYou approve each one1 merged of 1never—POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert
Never: a line you didn’t say, a reader’s clicks in an issue, a countdown that resetsRefused, every time1 drafted, 1 refusednever—none: the Check holds it

What it reads · What it may call. It reads your recording, the facts Page and the live Pricing Page. Clicks and Visits only choose who counts as engaged; they never appear in an issue, and no text in a reply picks a recipient or a link. Its tools are POST /{namespace}/approvals, POST /{namespace}/messages/{message}/broadcast, POST /{namespace}/leads, POST /{namespace}/tasks/{task}/assign, POST /{namespace}/contacts/{contact}/unsubscribe, POST /{namespace}/content/draft, and any other call becomes an Approval under the Role’s Mandate.

The brief (folded): compiled Agent-register Markdown · play:owned-newsletter@1 · each line names its record key
You hold the Content Lead Key Result: 2 trials per 1,000 delivered by 2026-12-31. ← worker, metric
Each issue: one dated fact, one take in Dana’s own sentences, one Offer at the send day’s Price. ← copyRules 1–4
Trim and order her sentences; never rewrite one into your own phrasing.          ← copyRules 4
No fresh fact, no cut or no editor pass: skip the week.                          ← chooses.not-now.when
A buying reply becomes a Lead for the AE within 5 minutes.                       ← chooses.hand-on-the-buyer, your file line 7

The slow loop, as a Change. decision_371 (2026-09-21, weekly) read 4 issues with the Offer under the take and 3 trials, and 2 with the poll first and the Offer last with 0. change_26 fixed the order as fact, take, Offer, poll (your file, line 5), and Dana merged it with POST /{namespace}/changes/{change}/merge. Replayed on past issues, POST /{namespace}/changes/{change}/review put them at 1.7 per 1,000; read back over the next 3 issues it is 1.6, n 5,420 delivered, ■□□□ Too early to tell (Example, day 52).

Bring your own agent (folded) starts at It does it, you can stop it when it matches or beats the seated agent on the eval suite, and at You approve each one when it does not; issues stay with you either way.

Terminal
npx startup-builder eval --scenario owned-newsletter-8 --agent "claude -p" --seat content-lead   # seated: 0 lines off source, 0 Checks failed sent, $0.65 an issue · yours: 2 lines off source → You approve each one

What it can do next

OptionPicked whenDecided byRunsHands toIf it’s just you
Send this week’s issue send-the-issuea fresh fact, a cut and a live Offer, and your passYour rule (line 5)publish-content → POST /{namespace}/approvals for you → POST /{namespace}/messages/{message}/broadcast in time-zone waves, plus the archive Pageyou pass it as editor · Take this oneyou
Not now not-nowno fresh fact, no usable cut, or no pass by the deadlineYour rule (line 6)nothing; the week records checked, nothing to sendnobodythe same
Welcome the subscriber welcomesomeone says yes to the newsletterYour rule (the subscribe Form)newsletter-welcome: where they subscribed, the best archive issue and one questionnobodythe same
Hand the buying reply on hand-on-the-buyera reply or poll answer asks about buyingAgent’s call, with its reasonPOST /{namespace}/leads → POST /{namespace}/tasks/{task}/assignAE · Priya Shah, due 60 min (response-60m) · Take this oneyou, within 60 min
Ask whether to keep it ask-to-keepsilent 75 days while issues kept sendingYour rule (line 8)re-permission: Keep and Stop at equal size, once → at day 90, POST /{namespace}/contacts/{contact}/unsubscribe from this newsletternobodythe same
Add your other Startup’s slot add-a-sister-slota sister product’s Offer fits this issue’s readersAgent’s call, with its reasonPOST /{namespace}/content/draft of one labeled Sponsored slot, below your own Offeryou approve it · Take this oneyou
When they write backFixture replyWhat happensWho answersBy whenCall
Interested“Can we get this for our 3 offices?”a Lead for the AE within 5 minutes, with the reply in the Brief (When it hands to you)AE · Priya Shah (person)60 minPOST /{namespace}/leads
Send me pricing“What does Pro cost for 80 units?”the Pricing Page’s list Price, read the same dayContent Lead · your agent5 minPOST /{namespace}/conversations/{conversation}/answer
Not now“Not buying this year, but keep the issues coming.”no Lead opens; the issues keep comingnobody—GET /{namespace}/decisions
Wrong person“Our ops lead should get this, not me.”a reply with the subscribe link to forward; it never adds an address from their textContent Lead · your agent1 business dayPOST /{namespace}/conversations/{conversation}/answer
Out of officean auto-reply until Oct 28nothing; an auto-reply never counts as engaged or as a replynobody—GET /{namespace}/decisions
Question it can’t answer“You said 1,204 notices. Is that all your Customers or a sample?”a fact question goes to you as editor; a wrong fact gets a correction in the next issueyou (Dana Okafor, person)1 business dayPOST /{namespace}/tasks/{task}/assign
Stop“Unsubscribe me.”this newsletter stops for them at once; one-click unsubscribe works the samenobodyat oncePOST /{namespace}/contacts/{contact}/unsubscribe

When it hands to you

Every issue comes to you as editor; buying replies go to AE · Priya Shah (person), and before day 9 they came to you. One Brief per Role, as captured, then the Approval (brief, draft and checks are Not live yet, gaps #7).

What lands in each queue · sample
[
  {
    "$id": "https://api.sb/leaseline.app/approvals/approval_88",
    "$type": "Approval",
    "verdict": null,
    "deadline": "2026-10-21T22:00:00Z",
    "draft": "In September, Leaseline Customers sent 1,204 renewal notices 60 days out. Dana, on owner statements: “The owners who call me are the ones who…”",
    "route": "send-the-issue",
    "checks": [
      {
        "check": "fact-check",
        "status": "pass"
      },
      {
        "check": "provenance-hold",
        "status": "pass"
      },
      {
        "check": "price-match",
        "status": "pass"
      }
    ]
  },
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_441",
    "$type": "Task",
    "assignee": "worker_3",
    "due": "2026-10-15T14:05:00Z",
    "on": "lead_47",
    "brief": {
      "who": "Mara Quinn, Northgate Rentals (3 offices, about 260 units)",
      "said": "Can we get this for our 3 offices?",
      "chose": "hand-on-the-buyer",
      "why": "a buying question in a reply to issue 8",
      "subscribed": "2026-06-02, from the pricing Page",
      "never": [
        "what she clicked",
        "a price beyond the list"
      ]
    }
  }
]

You answer the issue with POST /{namespace}/approvals/{approval}/approve or POST /{namespace}/approvals/{approval}/refuse; an issue unpassed by its deadline never sends. The AE answers a buying reply with POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, or POST /{namespace}/actions/{action}/redirect. Once a person claims a reply, the agent writes nothing more to that subscriber outside the issue (claimedByPerson, Not live yet, gaps #7). A Task nobody claims by its due time goes up a Role through POST /{namespace}/tasks/{task}/escalate, and person-promise fires.

On time: you, 7 of 8 issues passed by the deadline, median 26 min of editing, n 8 (issue 4 had no recording); AE · Priya Shah, 6 of 6 buying replies claimed within 60 min, median 14 min, n 6, ■□□□ Too early to tell beside Other Startups’ 93 % on time. Your queue: counted by kind: one issue to pass and one recording each week, plus about 1 buying reply a week for the AE.

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)an agent reply to a subscriber 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
editorial (the record’s Editorial hold)an issue with no editor pass by its deadlinePass it before the deadline, or the week records checked, nothing to send.POST /{namespace}/approvals/{approval}/approve
provenance-hold (the record’s Provenance hold)a paragraph that links to no source cut or fact record, or a line its speaker never saidCut the line, or cite its timestamp in the recording.POST /{namespace}/content/draft
fact-check (the record’s Fact hold)an issue whose fact is past its refresh window or fails the checkRefresh the fact on the facts Page, or pick another.POST /{namespace}/content/draft
price-match (the record’s Price hold)an Offer block whose Price differs from the Pricing Page on the send dayFix the Offer block or the Pricing Page until both match the Price.GET /{namespace}/offers/{id}
source-consent (the record’s Source Consent hold)a cut with a speaker other than you and no yes to reuse their wordsAsk the speaker for a yes to reuse, or use another cut.POST /{namespace}/consents
spam-brake (gaps #1)a broadcast past three times the trailing 7-day rate in an hourSend in time-zone waves, or wait an hour for the rate to fall.POST /{namespace}/messages/{message}/broadcast
Stop (pauses the Play)Pauses whenThen
complaintspam complaints near 0.1 % of an issue’s deliveredthe next issue and the welcome pause on the broadcast Mailbox
shadow-complaintstop, remove-me and hostile replies, each weighted 5 times, over 0.05 % of deliveredthe next issue pauses
bouncehard bounces over 2 % of an issue’s sendsthe list pauses until the rest are verified
unsubscribeunsubscribes over 1 % of delivered on 2 issues in a rowissues return to review; a Decision opens
slot-opt-outslot issues draw 0.5 points more unsubscribes than no-slot issues, over 4the slot drops for 8 weeks
suppression-auditany send to an address under a covering Suppressionevery Tactic pauses at once
yield-floorunder 0.5 subscriber-Customers per 100 at 90 daysa Decision on the Offer and the source mix
kill-switchyou press itPOST /{namespace}/processes/{process}/pause on content-marketing; nothing sends

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

422RefusedIssue 6 did not send: its take has a line Dana never said in the recording.
CheckFixThen
provenance-hold fail · Not live yet, gaps #1Cut the line, or cite its timestamp in the transcript.POST /{namespace}/content/draft
fact-check pass · Not live yet, gaps #1—POST /{namespace}/content/draft
price-match pass—GET /{namespace}/offers/{id}
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "Issue 6 did not send: its take has a line Dana never said in the recording.",
  "checks": [
    {
      "check": "provenance-hold",
      "status": "fail",
      "doc": "/plays/owned-newsletter#check-provenance-hold",
      "fix": "Cut the line, or cite its timestamp in the transcript.",
      "then": "Content.draft"
    },
    {
      "check": "fact-check",
      "status": "pass"
    },
    {
      "check": "price-match",
      "status": "pass"
    }
  ]
}

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

The Stops that fired, as Campaign.paused reasons · sample
[
  {
    "reason": {
      "limit": "shadow-complaint",
      "observed": "0.06 % (2 remove-me replies × 5 on 1,812 delivered)",
      "bound": "0.05 %",
      "window": "issue 5"
    },
    "doc": "/plays/owned-newsletter#stop-shadow-complaint",
    "task": "task_398"
  }
]

Did it work

1 in 10 new subscribers who are not Customers is held back at random and gets every issue without the Offer block; both halves are read from that assignment, per 1,000 delivered to everyone assigned (rules m–o). Each figure’s call is POST /{namespace}/metrics/query by node and by arm; the parent field and every node above the leaf are Not live yet (gaps #4).

+3.9 per 1,000 · ■□□□ Too early to tell · n 410 · path → arr

Chose
send-the-issue
Why
fact_31 (1,204 notices 60 days out in September) is inside its 30-day refresh window; Dana’s Oct 16 recording has a 2-minute cut on owner statements; Pro’s Price matches the Pricing Page
From
send-the-issue · not-now · welcome · hand-on-the-buyer · ask-to-keep · add-a-sister-slot
Expects
your editor pass by Oct 21 17:00 Central, and the issue sent Oct 22 at 08:00
Reopens when
no Approval.approved for broadcast_9 by 2026-10-21T22:00Z: the week records checked, nothing to send
By
worker_7
JSON
{
  "$id": "decisions/decision_561",
  "$type": "Decision",
  "choice": "send-the-issue",
  "reason": "fact_31 (1,204 notices 60 days out in September) is inside its 30-day refresh window; Dana’s Oct 16 recording has a 2-minute cut on owner statements; Pro’s Price matches the Pricing Page",
  "stakes": "medium",
  "options": [
    "send-the-issue",
    "not-now",
    "welcome",
    "hand-on-the-buyer",
    "ask-to-keep",
    "add-a-sister-slot"
  ],
  "by": "worker_7",
  "on": "broadcast_9",
  "expected": "your editor pass by Oct 21 17:00 Central, and the issue sent Oct 22 at 08:00",
  "reopensWhen": "no Approval.approved for broadcast_9 by 2026-10-21T22:00Z: the week records checked, nothing to send"
}
NodeWith the Offer (agent half)Without it (held back)AddedConfidenceBasis
subscriber-leads3.9 per 1,000 delivered (6 of 1,540)0 (0 of 170)+3.9 [−3.8, +11.6]■□□□ Too early to tellheld back at random, 1 in 10 · n 410 subscribers · 160 still maturing · Other Startups +0.8, ■■■□ Likely, n 41 Startups
new-leads3.8 per 100 subscribers (14 of 369)2.4 (1 of 41)+1.4 [−3.6, +6.4]■□□□ Too early to tellthe same assignment
new-arr ↑$1,041, 3 Customers · Booked across the whole list $2,082, 6 Customers: credited, not all caused by this Play$0, 0 Customers+$1,041 [−$600, +$2,700] · Worth about +$650 a month■□□□ Too early to tell (3 vs 0 Customers)the same · 4 trials still deciding
net-new-arr · arr+$1,041+$0+$1,041, carried: it moves no other bridge term■□□□ Too early to tellcarried from new-arr

The leaf counts trials and checkouts started from a coded issue link per 1,000 delivered, from subscribers who were not Customers when they subscribed, each counted 90 days on (rule n). Subscribers from before day 0 read beside it, unassigned: 13 trials on 11,060 delivered, 1.2 per 1,000.

How it moves it: each issue carried one dated fact and one Offer at its send-day Price, where the monthly update before it carried 4 stories and no Offer (subscriber-leads by issue).

Guardrails: treated against held back: unsubscribes per issue, 0.4 % against 0.3 %, and spam complaints, 0.01 % against a Stop near 0.1 %.

The Campaign card · sample
{
  "$id": "https://api.sb/leaseline.app/campaigns/owned-newsletter",
  "$type": "Campaign",
  "play": "play:owned-newsletter@1",
  "path": [
    "subscriber-leads",
    "new-leads",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "subscriber-leads",
    "unit": "per-1000",
    "heldBack": 41,
    "decision": null
  },
  "readout": {
    "value": 3.9,
    "n": 410,
    "maturing": 160,
    "interval": [
      -3.8,
      11.6
    ],
    "readability": "inadmissible",
    "basis": "held-back",
    "pooled": false
  },
  "ledger": {
    "spend": 5,
    "workerCost": 1,
    "hours": 6.1,
    "pipelineArr": 2400,
    "wonArr": 2082,
    "projectedArr": 650,
    "paybackDays": 2
  }
}

Outside benchmark: the catalog holds none for this Play yet, so Other Startups’ results stand in: +0.8 trials per 1,000 delivered, ■■■□ Likely, n 41 Startups.

Before it · After it. Before it: archive-repurposing, founder-voice, organic-social and the search Plays feed it recordings, facts and subscribers. After it: buying replies reach the AE as instant-response hand-offs do, members of the list are invited to owned-community, and 90-day silent subscribers stop getting it.

Example

Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days): 8 weekly cycles, 7 issues sent and 1 week with nothing to send. 410 new subscribers were assigned at random, 369 with the Offer and 41 without; 250 have matured. Read every captured thread at ?threads=all; three follow the tables.

What happened, by optionDecisionsSent or doneWon (credited, not all caused by this Play)
Send this week’s issue87 issues, 12,600 delivered; 19 trials from coded links6 on Pro (+$2,082 ARR), 3 of them new subscribers
Welcome the subscriber · Ask whether to keep it410 · 38410 welcomed · 9 kept, 29 sunset at day 90—
Hand the buying reply on · Not now · Add your other Startup’s slot6 · 1 · 06 Leads, 2 Deals · issue 4 skipped · —1 Deal open on the $2,400 plan
At 500 subscribers (the Use it when volume)about 3,400 delivered in 56 daysheld back 1 in 10: Too early to tell at 90 daysOther Startups’ results: +0.8 per 1,000, ■■■□ Likely, n 41 Startups
DayEventWhat happenedYour time
0event_118 Campaign.createdthe three steps; the dry run fails domain-authenticated on news.leaseline.app20 min
0event_121 Domain.authenticatednews.leaseline.app resolves in 35 min10 min
3event_160 Offer.trialedthe first trial from an issue link, on issue 1—
9event_301 Role.staffedAE · Priya Shah (person) takes role:sales-lead—
24event_470 Decision.createdissue 4: no recording that week; checked, nothing to send—
28 · 52event_560 Change.merged · event_880 Readout.createdfact, take, Offer, poll: replayed at 1.7 per 1,000, read back over 3 issues at 1.65 min
31event_611 Campaign.pausedshadow-complaint on issue 5: 2 remove-me replies; issue 6 sent after your review15 min
1–56event_140 Approval.created, first of 8you recorded 7 times and passed 7 issues; weekly reviews, from the POST /{namespace}/tasks/next log5 h 10 min · total 6.1 h measured, 6 h asked

The Renewal Desk, issue 8, Oct 15, 08:00 · Subject: 1,204 notices went out 60 days early in September.¹ The fact, with its source link. Dana, from Oct 9’s recording: “The owners who call me angry never got the first notice. The ones who got it at 60 days don’t call at all.”² This week’s Offer: Pro, $29 a month, with renewal notices per owner.³

Mara Quinn, Northgate Rentals, 09:05 · “Can we get this for our 3 offices?” A Lead for Priya at 09:06; she claimed it at 09:20 and booked a call for Oct 17 (When it hands to you).

Issue 6, 2026-10-01 · the take provenance-hold refused, then the rewrite that sent
- We built Leaseline because property managers deserve better tools.
+ “I built the first version for my mom’s 12 units, because her renewals lived on sticky notes.” (Dana, recording of Sep 25, 03:12)

A reply to issue 7, 2026-10-08 10:40 · “You said 1,204 notices. Is that all your Customers or a sample?” · Leaseline (agent), 10:41 · *Thanks for asking. Dana, our editor, answers fact questions and replies by tomorrow 10:40.*⁴ The Brief went to Dana (task_436); she replied at 15:10: all Customers, from the facts Page’s September record.

¹ The subject names the fact; no fake reply prefix and no countdown. ² The take: Dana’s own sentences from the cited cut, trimmed and ordered, never rewritten. ³ One Offer, with the Price read from the Pricing Page on the send day. ⁴ The routed line, compiled from the Role’s Settings.

Your settings

plays/owned-newsletter.mdx
---
holdout: 0.1      # 1 in 10 new non-Customer subscribers gets no Offer block for 90 days
send: thursday 08:00 reader time
---
Order: fact, take, Offer, poll.
No recording that week, no issue.
Buying replies go to our AE within 5 minutes.
Silent 75 days: ask once; at 90, stop.
Text
$ npx startup-builder show plays/owned-newsletter
holdout 0.1 · send Thursday 08:00 · fact, take, Offer, poll · skip without a recording · buying replies to the AE · sunset at 90 days     your file  plays/owned-newsletter.mdx:2,3,5,6,7,8 (Ask 2026-08-24; line 5 by change_26, 2026-09-21)
family owned-audience · process content-marketing · worker role:content-lead, owns never · chooses 6 (4 rule, 2 read) · sequences newsletter-welcome, re-permission · approval every-send · checks owned-by-a-person, editorial, provenance-hold, fact-check, price-match, source-consent, spam-brake · stops 8 · placements gmail, outlook + the archive site    catalog  play:owned-newsletter@1 (Not live yet, gaps #5)

Every key from the catalog

KeyIdWhat it is
Tacticarchive-ingestArchive ingest turns a consented first-party recording, call or Thread into indexed source cuts with speaker, timestamps, claims, advice class and audience. Starts at Sends nothing.
Tacticissue-draftIssue draft assembles one weekly issue from one fact record, one human source cut and one live Offer, with every paragraph linked to its source. Starts at Sends nothing.
Tacticeditorial-passEditorial pass: Puts a human editor on every issue to check its fact and its take against their sources, cut generic lines, and approve or hold it. Starts at You approve each one.
Tacticissue-sendIssue send delivers an approved issue to every consented, unsuppressed subscriber from the broadcast Mailbox, and publishes it as an archive Page. Starts at You approve each one.
Tacticsubscribe-growthSubscribe growth: Puts the newsletter on every Page and at sign-up, records one Consent per box ticked, and grows the list through referrals and sibling boxes. Starts at You approve the first wave.
Tacticreply-loopReply loop reads every subscriber reply and poll answer, routes buying questions to sales, fixes reported errors, and turns repliers into recorded calls. Starts at You approve each one.
Tacticsilence-sunsetSilence sunset asks a subscriber silent for 75 days whether to keep the newsletter, and suppresses this Startup’s newsletter to them at day 90. Starts at You approve the first wave.
Tacticsibling-slot-hostSibling slot host: Opens at most one labeled slot per issue for a same-pool sibling’s Offer, below the Startup’s own Offer, with the Startup as sender. Starts at Sends nothing.
Tacticnewsletter-readoutNewsletter readout: Reads each week how many new subscribers who were not Customers at subscribe become Customers within 90 days, against the Offer holdout. Starts at Sends nothing.
Triggerissue-dueIssue due: at on Message.scheduled, window 3d.
Triggersource-addedSource added: event on Source.added, window 30d.
Triggerfact-changedFact changed: event on Change.merged, window 24h.
Triggersubscriber-joinedSubscriber joined: event on Contact.subscribed, window 1d.
Triggersubscriber-engagedSubscriber engaged: event on Contact.engaged, window 90d.
Triggersubscriber-silentSubscriber silent: state on Message.broadcasted, window 15d.
Triggerbuying-replyBuying reply: event on Conversation.labeled, window 1d.
Triggerhost-issue-scheduledHost issue scheduled: event on Message.scheduled, window 2d.
Sequencenewsletter-welcomeNewsletter welcome: 2 steps; it ends on The subscriber becomes a Customer.; The subscriber unsubscribes.; A Suppression covers the address.; The first regular issue sends..
Sequencere-permissionRe-permission: 2 steps; it ends on The subscriber presses Keep.; The subscriber presses Stop.; Any engagement event.; Day 90 of silence, when the inactive Suppression is recorded..

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