The systems/ folder: one file and what it compiles to
What one systems/ file holds, what each key compiles to, and the checks that read it.
One systems/ file is an override of one System the Startup inherits. SalesBuilder compiles it, and show traces every key.
---
warmup: { days: 14, start: 5, cap: 40 }
sendDays: [mon, tue, wed, thu]
---
New Mailboxes warm for 14 days, from 5 to 40 a day. $ npx startup-builder show systems/sequences.mdx
warmup { days: 14, start: 5, cap: 40 } systems/sequences.mdx:2
sendDays [mon, tue, wed, thu] systems/sequences.mdx:3
owner SalesBuilderleaseline.app/
├── plays/
│ ├── cold-email.mdx
│ ├── warm-intros.mdx
│ ├── signup-interviews.mdx
│ ├── lead-reactivation.mdx
│ └── events-and-webinars.mdx
├── audiences/
│ ├── small-property-managers.mdx
│ ├── lapsed-leads.mdx
│ └── renewal-season.mdx
├── sequences/
│ └── cold-email-thread-founder.mdx
├── funnels/
│ └── signup.mdx
├── workflows/
│ └── outbound.mdx
├── agents/
│ ├── sales/prospector.mdx
│ └── marketing/content-lead.mdx
├── systems/ ← this folder
│ └── sequences.mdx
├── domains/
│ └── leaseline.app.mdx
├── offers/
│ ├── pro.mdx
│ └── team.mdx
├── content/
│ └── webinars/60-day-notices.mdx
├── metrics/
│ ├── q4.mdx
│ └── positive-reply-rate.mdx
└── startups.lockThe file
| Key | On the page | Compiles to | Checked by |
|---|---|---|---|
warmup | Warm up your inbox | POST /{namespace}/mailboxes/{mailbox}/warm on every new Mailbox: days, starting cap and daily cap; the first cold email waits on it | — |
sendDays | Send days | the days every Sequence step may send | — |
Checks
| Check | It holds | What dev prints |
|---|---|---|
| S2 | Every send passes a code-tier Check before it goes. | sequences/ |
Refusals
| Code | Fix, then the call that clears it |
|---|---|
address-cap | Bundle the extra Tenants into the next message; the cap resets after 24 hours. Then POST /{namespace}/messages/{message}/schedule. |
billing-connected | Connect Stripe so every charge and Meter reading is live. Then POST /{namespace}/integrations/connect. |
change-feed | Connect your code host so the feed reads each merged Change. Then POST /{namespace}/integrations/connect. |
claim | Cut the line, or cite the Offer term that grants it. Then POST /{namespace}/conversations/{conversation}/answer. |
consent-stop | Ask once for a yes to the other Startup. Then POST /{namespace}/messages/{message}/schedule. |
conversion-send | Connect the ad account and send one test qualified Lead; the Venue stays off until it lands. Then POST /{namespace}/integrations/connect. |
correction-cap | Hold the correction for next week, or 30 days for the same Contact. Then POST /{namespace}/messages/{message}/schedule. |
count-floor | Say “2 people on your team”, never a name. Then POST /{namespace}/messages/{message}/schedule. |
customer-collision | Send it to their CSM instead: the Contact leaves the List. Then POST /{namespace}/leads/{lead}/assign. |
display-consent | Ask the reviewer once; the Review shows when they agree. Then POST /{namespace}/messages/{message}/schedule. |
domain-authenticated | Add the 3 DNS records shown; it passes once they resolve, often within an hour. Then POST /{namespace}/domains/{domain}/authenticate. |
double-opt-in | Wait for their yes on the introducer’s thread. Then GET /{namespace}/decisions. |
embargo | Hold the number until the release lifts at T-0. Then POST /{namespace}/posts/{post}/schedule. |
evidence | Ask the publisher for subscriber and open numbers first. Then POST /{namespace}/messages/{message}/schedule. |
gift-cap | Pick a gift under the class cap, or send none to that Organization. Then POST /{namespace}/messages/{message}/schedule. |
gift-connection | Connect gift delivery in draft-only mode; only your Approval releases the Card. Then POST /{namespace}/integrations/connect. |
handle-connected | Connect the founder’s Handles to read; every reply is still pressed by hand. Then POST /{namespace}/handles/{handle}/connect. |
import-refusal | Send each Person to the Form to register themselves. Then POST /{namespace}/messages/{message}/broadcast. |
inbound-source | Forward sales@ to your inbound address, or connect your form or ad source. Then POST /{namespace}/integrations/connect. |
invite-bounce | Ask the referrer to share the link instead of typing addresses. Then POST /{namespace}/messages/{message}/schedule. |
mailbox-warm | Wait for the warm-up to finish, 14 days from day 0; warm intros keep running. Then POST /{namespace}/mailboxes/{mailbox}/warm. |
movement-limit | Wait 30 days, or 180 days after 3 unanswered notes; send upward moves only. Then POST /{namespace}/messages/{message}/schedule. |
named-score | Get recorded Consent and the founder's approval, or leave the name out. Then POST /{namespace}/messages/{message}/schedule. |
obligation-void | Send the help Messages; the guarantee stands until then. Then POST /{namespace}/messages/{message}/schedule. |
opt-in | Send the introducer their opt-in page first. Then POST /{namespace}/messages/{message}/schedule. |
original-audience | Post the derivative in another format or another feed. Then POST /{namespace}/posts/{post}/schedule. |
owned-by-a-person | Leave it to the person who owns it: the draft waits in their queue. Then POST /{namespace}/tasks/{task}/assign. |
paying-user | Wait for the first paying connection; send the private link to one. Then POST /{namespace}/messages/{message}/schedule. |
price | Get the discount approved, or quote at the floor. Then POST /{namespace}/approvals/{approval}/approve. |
provenance-hold | Cut the line, or cite its timestamp in the transcript. Then POST /{namespace}/content/draft. |
quiet-hours | Wait for their window; the narrower of two time zones wins. Then POST /{namespace}/messages/{message}/schedule. |
read-only | Connect the old tool with its read-only export scope instead. Then POST /{namespace}/integrations/connect. |
renewal-notice | Send the renewal notice with its amount; the renewal waits 30 days after it. Then POST /{namespace}/messages/{message}/schedule. |
rights-hold | Ask the host for the grant; the Page waits for it. Then POST /{namespace}/messages/{message}/schedule. |
room-cadence | Skip that Room this time; it returns next month. Then POST /{namespace}/posts/{post}/schedule. |
sandbox-connected | Connect each partner’s sandbox account; no suite touches a production account. Then POST /{namespace}/integrations/connect. |
sandbox-only | Run it in the partner’s sandbox. Then POST /{namespace}/integrations/connect. |
spam-brake | Send to a smaller List, or wait an hour for the rate to fall. Then POST /{namespace}/messages/{message}/broadcast. |
summons-only | Reply only to a post that mentions or quotes the Handle. Then POST /{namespace}/posts/{post}/schedule. |
supplied-address | Ask where to send it in the thread; ship only to their answer. Then POST /{namespace}/messages/{message}/schedule. |
visit-in-copy | Open on a public fact about the company instead. Then POST /{namespace}/messages/{message}/schedule. |
Calls
You, to your agent
Connect the sending System and warm Dana’s inbox, as a dry run.
curl -X POST "https://api.sb/leaseline.app/integrations/connect?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"system":"system_1","scope":"studio","grants":["Example grants"]}'
curl -X POST "https://api.sb/leaseline.app/mailboxes/mailbox_1/warm?mode=try" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"cap":40}'import { $ } from 'startup-builder'
await $.Integration.connect({ system: 'system_1', scope: 'studio', grants: ['Example grants'] }, { mode: 'try' }) // systems/ sequences.mdx
return await $.Mailbox.warm({ mailbox: 'mailbox_1', cap: 40 }, { mode: 'try' }) // 14 days to 40 a day
npx startup-builder do Integration.connect --json '{"system":"system_1","scope":"studio","grants":["Example grants"]}' --try
npx startup-builder do Mailbox.warm --json '{"mailbox":"mailbox_1","cap":40}' --try{
"name": "do",
"arguments": {
"code": "await $.Integration.connect({ system: 'system_1', scope: 'studio', grants: ['Example grants'] }, { mode: 'try' }) // systems/sequences.mdx\nreturn await $.Mailbox.warm({ mailbox: 'mailbox_1', cap: 40 }, { mode: 'try' }) // 14 days to 40 a day",
"mode": "try"
}
}Response200
application/json{
"mailbox": {
"$id": "https: //api.sb/ leaseline.app/ mailboxes/ mailbox_1",
"$type": "Mailbox",
"medium": "email",
"address": "dana@leaseline.app",
"stream": "transactional"
},
"action": {
"$id": "https: //api.sb/ leaseline.app/ actions/ action_1",
"operation": "Mailbox.warm",
"status": "done"
}
}
sample| Call | What it does |
|---|---|
POST /{namespace}/mailboxes/{mailbox}/warm | Warm ramps a new Mailbox from a few sends a day to its cap over two to four weeks. Emits Mailbox.warmed. |
POST /{namespace}/mailboxes/{mailbox}/rest | Rest pauses a Mailbox’s sending when a brake fires and resumes it when the reading clears. Emits Mailbox.rested. |
POST /{namespace}/handles/{handle}/connect | Connect binds a Handle to the Integration credential it publishes through, once the platform confirms the account. Emits Handle.connected. |
POST /{namespace}/integrations/connect | Connect asks an account holder to approve an outside account for one System and records the grants they approve. Emits Integration.connected. |
POST /{namespace}/messages/{message}/schedule | Schedule holds a Message until a set time and sends it then, unless it is canceled first. Emits Message.scheduled. |
POST /{namespace}/messages/{message}/broadcast | Broadcast sends one Message to an Audience, now or at a set time, split by Variant when an Experiment runs. Emits Message.broadcasted. |
POST /{namespace}/posts/{post}/schedule | Schedule puts a drafted Post on its Handle’s calendar for a set time. Emits Post.scheduled. |
Compiled, not written: edit the records it reads (compile table; cap), 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.