Skip to content

Owned community

Runs your own community room, where people moderate and a labeled agent answers only when asked, from your approved Pages.

Channel
Webinars and events
Run oneMode try
You, to your agent

Hand the latest question someone asked our community agent to the Marketing Lead agent and show me what it chose and why. Don’t post.

curl "https://api.sb/leaseline.app/events?where=name%20in%20(%22Channel.joined%22%2C%20%22Handle.mentioned%22%2C%20%22Conversation.escalated%22%2C%20%22Thread.created%22%2C%20%22Thread.resolved%22%2C%20%22Message.created%22%2C%20%22Message.flagged%22%2C%20%22Prospect.engaged%22%2C%20%22Customer.created%22%2C%20%22Consent.withdrawn%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_1371"}'

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

const { events: [last] } = await $.Event.list({ where: 'name in ("Channel.joined", "Handle.mentioned", "Conversation.escalated", "Thread.created", "Thread.resolved", "Message.created", "Message.flagged", "Prospect.engaged", "Customer.created", "Consent.withdrawn")', 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 (\"Channel.joined\", \"Handle.mentioned\", \"Conversation.escalated\", \"Thread.created\", \"Thread.resolved\", \"Message.created\", \"Message.flagged\", \"Prospect.engaged\", \"Customer.created\", \"Consent.withdrawn\")","limit":1}'
npx startup-builder do Trigger.fire --json '{"like":"event_1371"}' --try   # Not live yet (gaps #7)
npx startup-builder do Decision.list --json '{"where":"on = \"thread_58\""}'   # Not live yet (gaps #7)
npx startup-builder do Action.list --json '{"where":"on = \"thread_58\""}'   # Not live yet (gaps #7)
{
  "name": "do",
  "arguments": {
    "code": "const { events: [last] } = await $.Event.list({ where: 'name in (\"Channel.joined\", \"Handle.mentioned\", \"Conversation.escalated\", \"Thread.created\", \"Thread.resolved\", \"Message.created\", \"Message.flagged\", \"Prospect.engaged\", \"Customer.created\", \"Consent.withdrawn\")', 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_553",
    "$type": "Decision",
    "choice": "answer-from-pages",
    "reason": "contact_14 asked the agent directly whether renewal notices send in Spanish; the Notices Page says English and Spanish since Sep 1",
    "stakes": "low",
    "options": [
      "welcome",
      "answer-from-pages",
      "bring-in-a-person",
      "buying-question",
      "ask-a-member",
      "publish-the-answer"
  …
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 is the agent’s answer in the thread, waiting for your approval: answers stay at You approve each one until 300 carry at most 3 marked wrong (64 so far).

+2.1 per 100 invited · ■□□□ Too early to tell · n 420 · path → arr

Try another: the threadChoiceReason
#renewals: “@leaseline-agent, can renewal notices go out in Spanish?”answer-from-pagesthe Notices Page answers it
Rosa Lin joined from the newsletter invitewelcomea new member: the welcome Sequence and her community yes
#general: “Is there a discount for 300 units if we switch this quarter?”buying-questiona buying question: a person answers within 4 business hours
#ops: “How do you handle owners who never open the portal?”, 26 h with no replyask-a-memberunanswered at 24 h; 2 members listed owner portals as their interest
@leaseline-agent: “My card was charged twice”bring-in-a-personbilling is never the agent’s to answer

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

Worth’s formula: about +1.5 Leads per 100 invited (Other Startups’ results; your own read is too early) × 300 invited a month × 0.25 Leads to paid × $347 Pro ARR ≈ +$390. Under First signal: Holding back 1 in 5 invites at 300 a month, about 20 weeks to tell a +1.5 lift; 90 days can tell only +3.4 or more.

sample · api.sb/leaseline.app · 41 Customers at 2026-10-19 · on Handle.mentioned · first draft answer 38s after the ask · 9 keys Not live yet

Start it this week

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

# 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":"owned-community"}'

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

# off: the agent goes silent and invitations hold; the room stays open
curl -X PATCH https://api.sb/leaseline.app/campaigns/owned-community \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endsAt":"now"}'
422Refusedowned-community can’t start yet: 2 checks fail and 1 warns.
CheckFixThen
use-when fail · Not live yet, gaps #8Send your 20 personal invites; the join Page opens at the 20th yes.POST /{namespace}/messages/{message}/schedule
baseline pass · Not live yet, gaps #8Nothing to do: Before reads the same invite sources’ last 90 days.POST /{namespace}/metrics/query
approved-pages fail · Not live yet, gaps #8Approve the Pages the agent may answer from: pricing, notices, owners.POST /{namespace}/sites/{site}/publish
owned-by-a-person pass · Not live yet, gaps #8Nothing to do: their questions route to your queue.POST /{namespace}/tasks/{task}/assign
role-unstaffed warn · Not live yet, gaps #8Staff the AE, or leave it: buying questions come to you.POST /{namespace}/roles/{role}/staff
JSON
{
  "type": "https://startupbuilder.dev/errors/refused",
  "title": "Refused",
  "status": 422,
  "detail": "owned-community can’t start yet: 2 checks fail and 1 warns.",
  "checks": [
    {
      "check": "use-when",
      "status": "fail",
      "observed": "340 people a month to invite; 0 of 20 founding members yet",
      "doc": "/plays/owned-community#check-use-when",
      "fix": "Send your 20 personal invites; the join Page opens at the 20th yes.",
      "then": "Message.schedule"
    },
    {
      "check": "baseline",
      "status": "pass",
      "observed": "4.8 Leads per 100 newsletter subscribers in 90 days, n 610",
      "doc": "/plays/owned-community#check-baseline",
      "fix": "Nothing to do: Before reads the same invite sources’ last 90 days.",
      "then": "Metric.query"
    },
    {
      "check": "approved-pages",
      "status": "fail",
      "observed": "no Pages approved for the agent’s answers",
      "doc": "/plays/owned-community#check-approved-pages",
      "fix": "Approve the Pages the agent may answer from: pricing, notices, owners.",
      "then": "Site.publish"
    },
    {
      "check": "owned-by-a-person",
      "status": "pass",
      "observed": "31 open Leads have a person owner, you",
      "doc": "/plays/owned-community#check-owned-by-a-person",
      "fix": "Nothing to do: their questions route to your queue.",
      "then": "Task.assign"
    },
    {
      "check": "role-unstaffed",
      "status": "warn",
      "roles": [
        "marketing-lead",
        "sales-lead"
      ],
      "owned": 31,
      "doc": "/plays/owned-community#check-role-unstaffed",
      "fix": "Staff the AE, or leave it: buying questions come to you.",
      "then": "Role.staff"
    }
  ]
}

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

CheckFix (one call)Your timeWait
use-when · fail: 0 of 20 founding members (gaps #8)POST /{namespace}/messages/{message}/schedule your 20 personal invites, from your own Mailbox30 min20 yeses; Leaseline’s took 6 days
baseline · pass: 4.8 per 100, n 610POST /{namespace}/metrics/query on community-member-leads, which fills Before in Your number1 minnone
approved-pages · fail (Not live yet)POST /{namespace}/sites/{site}/publish the 3 Pages the agent may answer from15 minnone
owned-by-a-person · pass: 31 owned by younothing; it runs again on every answer0 minnone
role-unstaffed · warn (gaps #8): 31 of your open Leads have a person owner, youPOST /{namespace}/roles/{role}/staff, or leave it: buying questions and person asks come to you0 minnone

Your number · Before 1.2 per 100 · Now 3.3 per 100 invited · Target 3 by Dec 31 · ■□□□ Too early to tell · n 420 matured · Other Startups +1.5, ■■■□ Likely

Each agent answer costs about $0.01 and each welcome about $0.01 (Worker cost). The Discord server, the join Page and the Q&A Pages cost nothing; your time and Priya’s moderating are the real cost. That comes to about $2 a month at 120 answers.

When it starts

WhenTrigger idStarts onWindowHow it gets in
A member asks the agent directlyconcierge-summonedevent on Handle.mentioned where handle.agent = trueanswered within 60 s; a tag waits 15 min for a person firstPOST /{namespace}/handles/{handle}/connect with venue discord
Someone joins the room from the join Pagemember-joinedevent on Channel.joined where room = 'leaseline-operators'7d of welcomethe join Page posts to POST /{namespace}/consents
A member asks about buying, pricing or a callbuying-questionevent on Message.created where intent = 'buying'a person within 4 business hoursthe same Discord connection
+ 7 more: a person asked for, an unanswered question at 24 h, a resolved thread, a moderator flag, a cluster of members, a member who became a Customer, and a withdrawn yes (?lanes=all)
One signed delivery · StartupBuilder-Signature
{
  "$id": "https://api.sb/leaseline.app/events/event_1371",
  "$type": "Event",
  "name": "Handle.mentioned",
  "at": "2026-10-19T15:31:40Z",
  "seq": 1371,
  "data": {
    "handle": "leaseline-agent",
    "room": "leaseline-operators",
    "thread": {
      "$id": "https://api.sb/leaseline.app/threads/thread_58",
      "channel": "#renewals"
    },
    "member": "contact_14",
    "text": "Can renewal notices go out in Spanish?"
  }
}
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":"Handle.mentioned","url":"https://leaseline.app/hooks/sb"}'
npx startup-builder trigger Handle.mentioned --like event_1371   # replays the delivery in test
npx startup-builder clock advance --by 72h   # asks a member who knows if the thread is still unresolved

Who runs it

Marketing Lead · your agent (role:marketing-lead, worker_6) holds the Key Result and answers from the labeled leaseline-agent profile, the only agent in the room. People moderate: you (Dana Okafor, person, worker_1) and AE · Priya Shah (person) (worker_3, staffed on day 9). Buying questions go to Priya; asks for a person, billing, refunds, security and outages come to you. Your number links to Did it work.

OptionRung todayEvidence (passed of n)Moves up atDrops back whenYou can
Answer from your PagesYou approve each one64 posted, 2 marked wrongat 300 answers with at most 3 marked wrong (64 so far)2 marked wrong in 7 days (wrong-answer) → You see each one firstPOST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse
Welcome the member · Ask a member who knowsIt does it, you can stop it96 of 96 · 11 of 11met on day 14 (the first 20 approved unedited)3 complaints about the agent in 14 days (bot-complaint) → You approve each onePOST /{namespace}/actions/{action}/cancel inside the 15-minute hold
Publish the answer as a PageYou approve each one5 of 5never: a member’s words need their yes and yours—POST /{namespace}/approvals/{approval}/approve · POST /{namespace}/approvals/{approval}/refuse
Bring in a person · A person answers the buying questionA person, every time9 of 9 · 7 of 7never—POST /{namespace}/tasks/{task}/claim · POST /{namespace}/tasks/{task}/return
Change a room ruleYou approve each one1 merged of 1never—POST /{namespace}/changes/{change}/merge · POST /{namespace}/changes/{change}/revert
Never: a seeded thread, a second staff profile, an Offer that needs a post or a reviewRefused, every time0 draftednever—none: the Check holds it

What it reads · What it may call. It reads the thread it was asked in, the approved Pages and the member’s stated interests. It never refers to what a member did outside the room, and only a person removes, mutes or bans, under a published room rule. Its tools are POST /{namespace}/consents, POST /{namespace}/conversations/{conversation}/answer, POST /{namespace}/conversations/{conversation}/escalate, POST /{namespace}/tasks/{task}/assign, POST /{namespace}/leads, POST /{namespace}/messages/{message}/schedule, POST /{namespace}/pages, and any other call becomes an Approval under the Role’s Mandate.

The brief (folded): compiled Agent-register Markdown · play:owned-community@1 · each line names its record key
You hold the Marketing Lead Key Result: 3 Leads per 100 invited by 2026-12-31.   ← worker, metric
On each room Event, choose one option and say why.                               ← triggers, chooses
Answer only when asked, from approved Pages, and link the Page.                  ← copyRules 1, 3
Your name and bio say you are an agent; never claim to be a person.              ← copyRules 2
Billing, refunds, security and outages go to a person.                           ← chooses.bring-in-a-person.when
Every buying question gets a person within 4 business hours.                     ← chooses.buying-question, your file line 7

The slow loop, as a Change. decision_389 (2026-09-28, weekly) read 7 questions answered by the agent first with 1 member reply after, and 6 answered by a member first with 5. change_31 made a tag wait 15 minutes for a person or member before the agent answers (your file, line 6), and Dana merged it with POST /{namespace}/changes/{change}/merge. Replayed on past threads, POST /{namespace}/changes/{change}/review put member replies at 71 per 100 threads; read back at +14d it is 64, n 14, ■□□□ Too early to tell (Example, day 49).

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; POST /{namespace}/roles/{role}/staff seats it.

Terminal
npx startup-builder eval --scenario owned-community-64 --agent "claude -p" --seat marketing-lead   # seated: 62 of 64 marked right, 0 Checks failed sent, $0.01 an answer · yours: 59 → You approve each one

What it can do next

OptionPicked whenDecided byRunsHands toIf it’s just you
Welcome the member welcomesomeone joins from the join PageYour rule (line 5)member-welcome: the join email, one message with two matching threads, one digest ask → POST /{namespace}/consentsnobodythe same
Answer from your Pages answer-from-pagesa member asks the agent a question the approved Pages answerAgent’s call, with its reasonPOST /{namespace}/conversations/{conversation}/answer, labeled, linking the Pageyou approve it · Take this oneyou
Bring in a person bring-in-a-persona person asked for, or billing, refunds, security or an outageYour rule (line 8)POST /{namespace}/conversations/{conversation}/escalate → POST /{namespace}/tasks/{task}/assign, with the true wait postedyou, within 4 business hours · Take this oneyou
A person answers the buying question buying-questiona member asks about buying, pricing or a callYour rule (line 7)POST /{namespace}/leads → POST /{namespace}/tasks/{task}/assign; one members-only Offer may showAE · Priya Shah, within 4 business hours · Take this oneyou
Ask a member who knows ask-a-memberunanswered at 24 h, and a member’s stated interest fitsAgent’s call, with its reasonPOST /{namespace}/messages/{message}/schedule, at most once a month for each membernobodythe same
Publish the answer as a Page publish-the-answera thread resolved, and its asker and quoted members said yesAgent’s call, with its reasonqa-page-consent → POST /{namespace}/pages with only the granted wordsyou approve it · Take this oneyou
When they write backFixture replyWhat happensWho answersBy whenCall
Interested“This is great. How do I try it on our portfolio?”the trial link, and a person’s offer of a setup callAE · Priya Shah (person)4 business hoursPOST /{namespace}/leads
Send me pricing“What’s the price for 300 units?”the Pricing Page’s list Price; over 120 units, a person follows upMarketing Lead · your agent, then AE · Priya Shah4 business hoursPOST /{namespace}/conversations/{conversation}/escalate
Not now“Just here to learn for now.”nothing follows; the digest keeps arriving if they asked for itnobody—GET /{namespace}/decisions
Wrong person“My colleague Sam would want this thread.”it suggests they share the join Page; it never invites a name from their textMarketing Lead · your agent1 business dayPOST /{namespace}/conversations/{conversation}/answer
Out of officean auto-reply to the welcome emailthe welcome waits; nothing else sendsnobodythe return datePOST /{namespace}/messages/{message}/schedule
Question it can’t answer“Is my tenants’ data stored in the US?”security is a person’s: the question goes in the Brief, and the wait is postedyou (Dana Okafor, person)4 business hoursPOST /{namespace}/conversations/{conversation}/escalate
Stop“Stop messaging me.”no more messages or digests; their words come off every Q&A Page within 24 hnobodyat oncePOST /{namespace}/consents/{consent}/withdraw

When it hands to you

Buying questions go to AE · Priya Shah (person); asks for a person, billing, refunds, security and outages come to you, and before day 9 every hand-off did. One Brief per Role, as captured (brief is Not live yet, gaps #7).

What lands in each queue · sample
[
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_463",
    "$type": "Task",
    "assignee": "worker_3",
    "due": "2026-10-14T19:10:00Z",
    "on": "lead_47",
    "brief": {
      "who": "Owen Hale, Larkfield Communities (640 units), member since Sep 23",
      "said": "Is there a discount for 300 units if we switch this quarter?",
      "chose": "buying-question",
      "why": "a buying question is a person’s",
      "never": [
        "a discount the agent offers",
        "what he did outside the room"
      ]
    }
  },
  {
    "$id": "https://api.sb/leaseline.app/tasks/task_447",
    "$type": "Task",
    "assignee": "worker_1",
    "due": "2026-10-07T18:00:00Z",
    "on": "thread_49",
    "brief": {
      "who": "a member in #general",
      "said": "My card was charged twice",
      "chose": "bring-in-a-person",
      "why": "billing is never the agent’s",
      "posted": "Dana replies here by 14:00 Central"
    }
  }
]

Each receiver answers with POST /{namespace}/tasks/{task}/claim (Take this one), POST /{namespace}/tasks/{task}/return with a reason, or POST /{namespace}/actions/{action}/redirect, each a one-call window. Once a person claims a thread, the agent posts nothing more in it (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 three late hand-offs in 7 days pause new invitations (handoff-breach).

On time: AE · Priya Shah, 7 of 7 buying questions answered within 4 business hours, median 1 h 20 min, n 7; you, 9 of 9, median 55 min, n 9, ■□□□ Too early to tell beside Other Startups’ 92 % on time. Your queue: counted by kind: in week 1, 20 personal invites and 12 answer approvals; now about 10 answer approvals, 2 hand-offs and 1 flag 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)an agent message to a member whose Lead or open Deal a person owns, or whose thread a person claimedLeave it to the person who owns it: the draft waits in their queue.POST /{namespace}/tasks/{task}/assign
approved-pages (Not live yet)an agent answer with a sentence no approved Page backsCut the sentence, or publish the Page that says it.POST /{namespace}/sites/{site}/publish
join-raid (the record’s Join-raid hold)new invitations after 20 joins in 10 minutes from new profilesHave a moderator review the joins, then release the hold.POST /{namespace}/tasks/{task}/claim
consent-withdrawn (the record’s Consent withdrawal)a Q&A Page that quotes a member who withdrew their yesTake their words off the Page within 24 hours; no approval is needed.PATCH /{namespace}/pages/{id}
Stop (pauses the Play)Pauses whenThen
wrong-answer2 agent answers marked wrong by staff within 7 daysthe agent drops to You see each one first; each cited Page gets a fix Task
concierge-health3 failed health checks in 5 minutesthe agent stops; asks go to the staff responder with a posted notice
bot-complaint3 member complaints about the agent within 14 daysit drops to You approve each one for your review
handoff-breach3 hand-offs past 4 business hours within 7 daysnew invitations pause until the roster covers the gap
moderator-absencea flag waits 48 hoursinvitations, member asks and the digest pause; a Task for the Marketing Lead
unansweredover 20 % of questions unanswered at 24 h, 2 weeks runninginvitations pause; a Task for you
staff-sharestaff and agent posts pass 50 % of all posts over 30 daysmember asks and the Offer line pause for your review
empty-roomafter day 60, under 10 member posts a week for 4 weeksinvitations pause; a keep, narrow or archive Decision opens
member-customer-floorno lift over the held-back invites at the first read with 300 joinersthe Play stops for review
kill-switchyou press itthe agent goes silent and invitations hold; the room stays open

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

422RefusedThe agent’s answer in #integrations did not post: one sentence no approved Page backs.
CheckFixThen
approved-pages fail · Not live yet, gaps #8Cut the sentence, or publish the Page that says it.POST /{namespace}/sites/{site}/publish
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 agent’s answer in #integrations did not post: one sentence no approved Page backs.",
  "checks": [
    {
      "check": "approved-pages",
      "status": "fail",
      "doc": "/plays/owned-community#check-approved-pages",
      "fix": "Cut the sentence, or publish the Page that says it.",
      "then": "Site.publish"
    },
    {
      "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": "moderator-absence",
      "observed": "a flag waiting 49 h",
      "bound": "48 h",
      "window": "1 flag, Oct 3 to Oct 5"
    },
    "doc": "/plays/owned-community#stop-moderator-absence",
    "task": "task_452"
  }
]

Did it work

1 in 5 of each invite source is held back at random and gets no invitation; both halves are read from that assignment, per 100 invited, joined or not (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).

+2.1 per 100 invited · ■□□□ Too early to tell · n 420 · path → arr

Chose
answer-from-pages
Why
contact_14 asked the agent directly whether renewal notices send in Spanish; the Notices Page says English and Spanish since Sep 1
From
welcome · answer-from-pages · bring-in-a-person · buying-question · ask-a-member · publish-the-answer
Expects
the asker marks the answer accepted within 72h
Reopens when
no Thread.resolved on thread_58 within 72h: it asks a member who knows
By
worker_6
JSON
{
  "$id": "decisions/decision_553",
  "$type": "Decision",
  "choice": "answer-from-pages",
  "reason": "contact_14 asked the agent directly whether renewal notices send in Spanish; the Notices Page says English and Spanish since Sep 1",
  "stakes": "low",
  "options": [
    "welcome",
    "answer-from-pages",
    "bring-in-a-person",
    "buying-question",
    "ask-a-member",
    "publish-the-answer"
  ],
  "by": "worker_6",
  "on": "thread_58",
  "expected": "the asker marks the answer accepted within 72h",
  "reopensWhen": "no Thread.resolved on thread_58 within 72h: it asks a member who knows"
}
NodeInvited (agent half)Held backAddedConfidenceBasis
community-member-leads3.3 per 100 invited (11 of 336) · 16.4 per 100 joiners (11 of 67)1.2 (1 of 84)+2.1 [−1.1, +5.3]■□□□ Too early to tellheld back at random, 1 in 5 · n 420 · 180 still maturing · Other Startups +1.5, ■■■□ Likely, n 22 Startups
new-leads6.0 per 100 invited (20 of 336), from any source4.8 (4 of 84)+1.2 [−3.9, +6.3]■□□□ Too early to tellthe same assignment
new-arr ↑$1,388, 4 Customers: $413 per 100 invited · Booked: credited, not all caused by this Play$347, 1 Customer: $413 per 100+$0 per 100 invited [−$720, +$720] · Not carrying up yet■□□□ Too early to tell (4 vs 1 Customers)the same · 6 trials still deciding
net-new-arr · arr+$1,388+$347carried: +$0 per 100 invited■□□□ Too early to tellcarried from new-arr

The leaf counts invited People who were not Customers and who start a trial or reach the activation Event within 30 days of the invitation, per 100 invited (rule m, intent to treat), to 300 matured in each half; at 336 and 84 the held-back half runs on.

How it moves it: a joiner’s question got a person or member reply in a median 3 h 40 min, and every buying question a person within 4 business hours (community-member-leads by first-reply time).

Guardrails: treated against held back: trials to paid, 4 of 11 against 1 of 1, and the newsletter’s unsubscribes after an invite, 0.4 % against 0.3 %.

The Campaign card · sample
{
  "$id": "https://api.sb/leaseline.app/campaigns/owned-community",
  "$type": "Campaign",
  "play": "play:owned-community@1",
  "path": [
    "community-member-leads",
    "new-leads",
    "new-arr",
    "net-new-arr",
    "arr"
  ],
  "experiment": {
    "metric": "community-member-leads",
    "unit": "per-100",
    "heldBack": 84,
    "decision": null
  },
  "readout": {
    "value": 2.1,
    "n": 420,
    "maturing": 180,
    "interval": [
      -1.1,
      5.3
    ],
    "readability": "inadmissible",
    "basis": "held-back",
    "pooled": false
  },
  "ledger": {
    "spend": 0,
    "workerCost": 2,
    "hours": 14.5,
    "pipelineArr": 2400,
    "wonArr": 1388,
    "projectedArr": 390,
    "paybackDays": 30
  }
}

Outside benchmark: the catalog holds none for this Play yet, so Other Startups’ results stand in: +1.5 Leads per 100 invited, ■■■□ Likely, n 22 Startups.

Before it · After it. Before it: owned-newsletter, community-answers, product-led and events-and-webinars send it the people it invites. After it: a cluster of 8 members in one city goes to gatherings, buying questions reach instant-response’s AE hand-off, and Q&A Pages feed aeo and editorial-seo.

Example

Leaseline ran it from 2026-08-24 to 2026-10-19 (56 days); the room opened on day 6 at the 20th founding yes. 600 people were assigned at random, 480 invited and 120 held back; 420 have matured. 96 joined, and the agent answered 64 asks. Read every captured thread at ?threads=all; three follow the tables.

What happened, by optionDecisionsDoneWon (credited, not all caused by this Play)
Welcome the member9696 welcomed, 71 asked for the digest—
Answer from your Pages6458 accepted, 2 marked wrong1 asker on Pro (+$347 ARR)
A person answers the buying question77 within 4 business hours, 3 trials2 on Pro (+$694 ARR), 1 Deal open on the $2,400 plan
Bring in a person · Ask a member who knows · Publish the answer as a Page9 · 11 · 59 · 8 answered by members · 5 Pages1 on Pro (+$347 ARR) · 0 · 0
At 300 invited a month (the Use it when volume)about 560 in 56 daysheld back 1 in 5: Too early to tell at 90 daysOther Startups’ results: +1.5 per 100, ■■■□ Likely, n 22 Startups
DayEventWhat happenedYour time
0event_118 Campaign.createdthe three steps; the dry run fails use-when (0 of 20 founding members) and approved-pages45 min
0–6event_120 Message.scheduled, first of 20your 20 personal invites; the 20th yes came on day 6 and the join Page opened1 h 10 min
9event_301 Role.staffedAE · Priya Shah (person) takes role:sales-lead and moderates—
9event_305 Offer.trialedthe first member starts a trial, after a person answered her buying question—
14event_388 Role.updatedwelcomes and member asks promoted; answers stay with you—
35 · 49event_655 Change.merged · event_802 Readout.createda tag waits 15 min for a person or member: replayed at 71 member replies per 100 threads, read back at 645 min
41event_702 Campaign.pausedmoderator-absence: a flag waited 49 h; invitations resumed once you reviewed it10 min
6–56event_140 Approval.created, first of 69you approved 64 answers and 5 Pages, and moderated with Priya; weekly reviews, from the POST /{namespace}/tasks/next log12 h 30 min · total 14.5 h measured, 14 h asked

contact_14 in #renewals, Oct 19, 15:31 · “@leaseline-agent, can renewal notices go out in Spanish?”

leaseline-agent (agent), 15:32 · Yes: renewal notices send in English and Spanish, chosen per tenant (Notices Page, updated Sep 1).¹ You set it on each lease’s language field. Want a person to show you? Ask and Dana or Priya replies.² *From the Notices Page · I’m Leaseline’s agent.*³

contact_14, 15:58 · marked the answer accepted. She started a trial on Oct 20.

#integrations, 2026-09-24 · the answer approved-pages refused, then the rewrite that posted
- Yes, Leaseline integrates with every accounting system.
+ The Integrations Page lists one accounting export today, a monthly CSV of owner statements. For anything else, ask and a person replies.

Owen Hale in #general, 2026-10-14 15:10 · “Is there a discount for 300 units if we switch this quarter?” · leaseline-agent (agent), 15:11 · *Priya, our account lead, answers pricing here by 19:10 today.*⁴ The Brief went to Priya (task_463); she claimed it at 15:40 and replied in the thread at 16:25, then booked a call.

¹ Every sentence maps to an approved Page, and the answer links it. ² A person is always offered. ³ The fixed label line, compiled from the Role’s Settings. ⁴ The routed line, compiled from the Role’s Settings.

Your settings

plays/owned-community.mdx
---
holdout: 0.2      # 1 in 5 of each invite source gets no invitation
room: leaseline-operators
---
Welcome every member with two threads that match their interest.
A tag waits 15 minutes for a person or member before the agent answers.
Every buying question gets Priya within 4 business hours.
Billing, refunds, security and outages come to me.
Text
$ npx startup-builder show plays/owned-community
holdout 0.2 · room leaseline-operators · 15-minute wait on a tag · buying questions to the AE · billing to you     your file  plays/owned-community.mdx:2,3,5,6,7,8 (Ask 2026-08-24; line 6 by change_31, 2026-09-28)
family owned-audience · worker role:marketing-lead, owns never · chooses 6 (3 rule, 3 read) · sequences member-welcome, qa-page-consent · approval every-send · checks owned-by-a-person, approved-pages, join-raid, consent-withdrawn · stops 10 · placements discord server and thread replies    catalog  play:owned-community@1 (Not live yet, gaps #5)

Every key from the catalog

Key Id What it is
Tactic community-open Community open: Checks the preconditions, sets up the room with its owner and moderators, tests the concierge, and opens the join Page after 20 founding members. Starts at You approve each one.
Tactic member-join Member join runs the one join Page, records the community Consent, links the Person to a Contact, and welcomes the member under their intro. Starts at You approve each one.
Tactic concierge-answer Concierge answer replies to a member’s summons from approved Pages only, labeled as an agent, and routes what it must not answer to a human. Starts at You approve each one.
Tactic human-handoff Human handoff: Opens a Conversation for the staff responder whenever a member asks for a person, states the true wait, and holds a 4-hour reply target. Starts at Sends nothing.
Tactic moderator-queue Moderator queue files every flagged post with the room rule it matches for a human moderator, who alone removes, mutes or bans. Starts at Sends nothing.
Tactic qa-page-publish Q&A Page publish turns a resolved open thread into a public Q&A Page with only the words its members granted, and withdraws them on request. Starts at You approve each one.
Tactic member-activation Member activation routes unanswered questions to members whose stated interest fits, at most once a month each, and sends the weekly digest. Starts at You approve each one.
Tactic member-buying-path Member buying path gets a human reply to every buying question within 4 hours, turns talk-to-the-team asks into Leads, and shows one members-only Offer. Starts at You approve each one.
Tactic cluster-handoff Cluster handoff: Finds 8 or more engaged members in one stated city or segment, asks who wants to meet, and hands the opted-in list to hosted gatherings. Starts at Sends nothing.
Tactic member-customers-readout Member customers readout counts member-customers by join cohort and source, reads the invitation holdout at 90 days, and records a Decision. Starts at Sends nothing.
Trigger member-joined Member joined: event on Channel.joined, window 7d.
Trigger concierge-summoned Concierge summoned: event on Handle.mentioned, window 1h.
Trigger human-requested Human requested: event on Conversation.escalated, window 4h.
Trigger question-unanswered Question unanswered: state on Thread.created, window 72h.
Trigger thread-resolved Thread resolved: event on Thread.resolved, window 30d.
Trigger buying-question Buying question: event on Message.created, window 72h.
Trigger moderation-flag Moderation flag: event on Message.flagged, window 12h.
Trigger engagement-cluster Engagement cluster: threshold on Prospect.engaged, window 30d.
Trigger member-converted Member converted: event on Customer.created, window 90d.
Trigger community-consent-withdrawn Community consent withdrawn: event on Consent.withdrawn, window 24h.
Sequence member-welcome Member welcome: 3 steps; it ends on A first post in the room; Leaving the room; DMs turned off; An opt-out.
Sequence qa-page-consent Q&A Page consent: 3 steps; it ends on Any answer; Leaving the room; The thread’s removal.

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