Skip to content

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.

systems/sequences.mdx
---
warmup: { days: 14, start: 5, cap: 40 }
sendDays: [mon, tue, wed, thu]
---
New Mailboxes warm for 14 days, from 5 to 40 a day.
show
$ 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     SalesBuilder
leaseline.app
leaseline.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.lock

The file

KeyOn the pageCompiles toChecked by
warmupWarm up your inboxPOST /{namespace}/mailboxes/{mailbox}/warm on every new Mailbox: days, starting cap and daily cap; the first cold email waits on it—
sendDaysSend daysthe days every Sequence step may send—

Checks

CheckIt holdsWhat dev prints
S2Every send passes a code-tier Check before it goes.sequences/cold-email-thread-founder.mdx:5 S2 steps.second sends with no code-tier Check. Add guards: [customer-collision].

Refusals

CodeFix, then the call that clears it
address-capBundle the extra Tenants into the next message; the cap resets after 24 hours. Then POST /{namespace}/messages/{message}/schedule.
billing-connectedConnect Stripe so every charge and Meter reading is live. Then POST /{namespace}/integrations/connect.
change-feedConnect your code host so the feed reads each merged Change. Then POST /{namespace}/integrations/connect.
claimCut the line, or cite the Offer term that grants it. Then POST /{namespace}/conversations/{conversation}/answer.
consent-stopAsk once for a yes to the other Startup. Then POST /{namespace}/messages/{message}/schedule.
conversion-sendConnect the ad account and send one test qualified Lead; the Venue stays off until it lands. Then POST /{namespace}/integrations/connect.
correction-capHold the correction for next week, or 30 days for the same Contact. Then POST /{namespace}/messages/{message}/schedule.
count-floorSay “2 people on your team”, never a name. Then POST /{namespace}/messages/{message}/schedule.
customer-collisionSend it to their CSM instead: the Contact leaves the List. Then POST /{namespace}/leads/{lead}/assign.
display-consentAsk the reviewer once; the Review shows when they agree. Then POST /{namespace}/messages/{message}/schedule.
domain-authenticatedAdd the 3 DNS records shown; it passes once they resolve, often within an hour. Then POST /{namespace}/domains/{domain}/authenticate.
double-opt-inWait for their yes on the introducer’s thread. Then GET /{namespace}/decisions.
embargoHold the number until the release lifts at T-0. Then POST /{namespace}/posts/{post}/schedule.
evidenceAsk the publisher for subscriber and open numbers first. Then POST /{namespace}/messages/{message}/schedule.
gift-capPick a gift under the class cap, or send none to that Organization. Then POST /{namespace}/messages/{message}/schedule.
gift-connectionConnect gift delivery in draft-only mode; only your Approval releases the Card. Then POST /{namespace}/integrations/connect.
handle-connectedConnect the founder’s Handles to read; every reply is still pressed by hand. Then POST /{namespace}/handles/{handle}/connect.
import-refusalSend each Person to the Form to register themselves. Then POST /{namespace}/messages/{message}/broadcast.
inbound-sourceForward sales@ to your inbound address, or connect your form or ad source. Then POST /{namespace}/integrations/connect.
invite-bounceAsk the referrer to share the link instead of typing addresses. Then POST /{namespace}/messages/{message}/schedule.
mailbox-warmWait for the warm-up to finish, 14 days from day 0; warm intros keep running. Then POST /{namespace}/mailboxes/{mailbox}/warm.
movement-limitWait 30 days, or 180 days after 3 unanswered notes; send upward moves only. Then POST /{namespace}/messages/{message}/schedule.
named-scoreGet recorded Consent and the founder's approval, or leave the name out. Then POST /{namespace}/messages/{message}/schedule.
obligation-voidSend the help Messages; the guarantee stands until then. Then POST /{namespace}/messages/{message}/schedule.
opt-inSend the introducer their opt-in page first. Then POST /{namespace}/messages/{message}/schedule.
original-audiencePost the derivative in another format or another feed. Then POST /{namespace}/posts/{post}/schedule.
owned-by-a-personLeave it to the person who owns it: the draft waits in their queue. Then POST /{namespace}/tasks/{task}/assign.
paying-userWait for the first paying connection; send the private link to one. Then POST /{namespace}/messages/{message}/schedule.
priceGet the discount approved, or quote at the floor. Then POST /{namespace}/approvals/{approval}/approve.
provenance-holdCut the line, or cite its timestamp in the transcript. Then POST /{namespace}/content/draft.
quiet-hoursWait for their window; the narrower of two time zones wins. Then POST /{namespace}/messages/{message}/schedule.
read-onlyConnect the old tool with its read-only export scope instead. Then POST /{namespace}/integrations/connect.
renewal-noticeSend the renewal notice with its amount; the renewal waits 30 days after it. Then POST /{namespace}/messages/{message}/schedule.
rights-holdAsk the host for the grant; the Page waits for it. Then POST /{namespace}/messages/{message}/schedule.
room-cadenceSkip that Room this time; it returns next month. Then POST /{namespace}/posts/{post}/schedule.
sandbox-connectedConnect each partner’s sandbox account; no suite touches a production account. Then POST /{namespace}/integrations/connect.
sandbox-onlyRun it in the partner’s sandbox. Then POST /{namespace}/integrations/connect.
spam-brakeSend to a smaller List, or wait an hour for the rate to fall. Then POST /{namespace}/messages/{message}/broadcast.
summons-onlyReply only to a post that mentions or quotes the Handle. Then POST /{namespace}/posts/{post}/schedule.
supplied-addressAsk where to send it in the thread; ship only to their answer. Then POST /{namespace}/messages/{message}/schedule.
visit-in-copyOpen on a public fact about the company instead. Then POST /{namespace}/messages/{message}/schedule.

Calls

systems/ compiledMode try
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"
  }
}
Response200application/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
CallWhat it does
POST /{namespace}/mailboxes/{mailbox}/warmWarm 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}/restRest pauses a Mailbox’s sending when a brake fires and resumes it when the reading clears. Emits Mailbox.rested.
POST /{namespace}/handles/{handle}/connectConnect binds a Handle to the Integration credential it publishes through, once the platform confirms the account. Emits Handle.connected.
POST /{namespace}/integrations/connectConnect 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}/scheduleSchedule holds a Message until a set time and sends it then, unless it is canceled first. Emits Message.scheduled.
POST /{namespace}/messages/{message}/broadcastBroadcast 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}/scheduleSchedule 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.

Contents