Code: every call, file and refusal behind the pages
Your first week of data, in test mode.
A call you can run sits behind every page here. Your Startup is a folder of files: show traces each key to its line, and dev names the line that fails.
---
audience: small-property-managers
sequence: cold-email-thread-founder
---
Write as Dana: one fresh reason from a public source, one ask, plain text. $ npx startup-builder show plays/cold-email.mdx
family demand play:cold-email@1
metric positive-reply-rate → new-leads → new-arr → net-new-arr → arr play:cold-email@1
process outbound play:cold-email@1
audience small-property-managers plays/cold-email.mdx:2 (Ask, 2026-10-19)
on Review.published, Monitor.checked, Conversation.answered +4 unregistered play:cold-email@1, 8 Triggers
holdout unit contact, control 0.25 compile default
worker role:prospector (SDR) play:cold-email@1
sequence cold-email-thread-founder plays/cold-email.mdx:3 (Ask, 2026-10-19)
heardFrom signup.heardFrom funnels/signup.mdx:3
approval every-send play:cold-email@1
budget { amount: 0, currency: USD, per: month } the Ask, 2026-10-19 (no budget)
guards 6: use-when, baseline, domain-authenticated +3 play:cold-email@1
stops 12: bounce, shadow-complaint, provider-spam +9 play:cold-email@1
body 1 rule → 1 Evaluator, run as Action.evaluate on each draft plays/cold-email.mdx:5
owner SalesBuilderplay: is the catalog Play this file inherits; versions are Not live yet (gaps #5). Every key and what it compiles to: the plays/ folder.
---
audience: lapsed-leads
approval: first-send
on: Lead.lapsed
budget: { amount: 48, currency: USD, per: month }
---
Every Message cites one fresh reason with its public source.$ npx startup-builder dev
plays/lead-reactivation.mdx:4 S5 on: Lead.lapsed is not a registered Event. Did you mean Offer.trialed? Files
| Folder | One file is | Compiled by | Checked by |
|---|---|---|---|
plays/ | one Play: the Workflows a Worker may choose between and the Key Result it moves, compiled to one Campaign | SalesBuilder | S1, S2, S3, S4, S5, S7, S8 |
audiences/ | one Audience: who is in, who is left out and what fills it | SalesBuilder | S3 |
sequences/ | one Sequence: its steps, waits and the replies that end it | SalesBuilder | S2, S5 |
funnels/ | one funnel, and the question that asks each new Lead where they heard of you | SalesBuilder | — |
workflows/ | one sales Process, holding only what differs from the hub’s | SalesBuilder | — |
agents/ | one seat’s contract: who fills it, its number, its standards, limits and approvals | SalesBuilder | S4, S9 |
systems/ | an override of one System the Startup inherits | SalesBuilder | S2 |
domains/ | one Domain and what it does: the site, or the email it sends from | SiteBuilder | S2 |
offers/ | one Offer: its Price, its trial, its checkout and how it is sold | SalesBuilder | S8 |
content/ | one piece: who wrote it, what it came from, where it goes and what it moves | SalesBuilder | S1, S6, S7 |
metrics/ | the quarter’s Goal and Key Results, and each leaf Metric with its one parent | SalesBuilder | S1, S9 |
Checks
| Check | It holds | What dev prints |
|---|---|---|
| S1 | The Metric’s parent chain reaches arr: the Result card’s path. | metrics/ |
| S2 | Every send passes a code-tier Check before it goes. | sequences/ |
| S3 | Lists leave out suppressed Contacts and read Consent. | audiences/ |
| S4 | The budget fits the Mandate, or opens an Approval. | plays/ |
| S5 | Every on: names a registered Event. | plays/ |
| S6 | Content from and distribute handles resolve. | content/ |
| S7 | Every body rule compiles to an Evaluator that runs as POST /{namespace}/actions/{action}/evaluate on each draft before its window opens. | plays/ |
| S8 | An Experiment that varies an Offer’s Price assigns by market or by time. | experiments/ |
| S9 | Each Key Result names a node or leaf of the ARR tree, and a seat’s Key Result sits in its band. | agents/ |
Refusals
380 codes carry a fix and the call that clears it. Every code.
| Code | Alias | Then |
|---|---|---|
abuse | Free account looks like abuse | POST /{namespace}/payment-sources/add |
accept-guard | Residency check failing | POST /{namespace}/quotes/{quote}/supersede |
activation-event | No activation Event | POST /{namespace}/offers/{offer}/publish |
address-cap | Too many claim messages | POST /{namespace}/messages/{message}/schedule |
admin-lock | Item an admin locked | POST /{namespace}/files/generate |
advice-review | Advice needs the editor | POST /{namespace}/tasks/{task}/claim |
agent-label | Agent label | POST /{namespace}/tasks/{task}/assign |
agreement | No confidentiality terms yet | POST /{namespace}/agreements |
Events
| Events the pages name | Registered | Not live yet |
|---|---|---|
| 370 | 234 | 136 |
Each registered Event with its webhook payload: Events.
Calls
240 calls, each with its signature and the pages that make it: Calls.
MCP
claude mcp add --transport http salesbuilder-docs https://salesbuilder.dev/mcp
claude mcp add --transport http startup-builder https://api.sb/mcp Read these docs keyless on the first line; act on your Startup on the second: MCP.
Compiled, not written: edit its page, 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.