Mailboxes
The addresses your agents send from, warmed, rested and authenticated, with every Suppression and Consent read before each send.
- System
- Mailboxes
- Nouns
- 4
- Verbs
- 9
- Events
- 9
You, to your agent
Email the launch-day note to my waitlist at 8 a.m. Pacific on November 4.
curl -X POST "https: //api.sb/ leaseline.app/ messages/ broadcast? mode= try" \
-H "Authorization: Bearer $SB_TOKEN" \
-H "Content-Type: application/ json" \
-d '{"message": "msg_Wl5tQ8nB2r", "audience": "audience_Wt3kP9sL4e", "at": "2026-11-04T16: 00: 00Z"}'
npx startup-builder do Message.broadcast --try --data '{"message": "msg_Wl5tQ8nB2r", "audience": "audience_Wt3kP9sL4e", "at": "2026-11-04T16: 00: 00Z"}'
{
"name": "do",
"arguments": {
"mode": "try",
"code": "return await $.Message.broadcast({ message: 'msg_Wl5tQ8nB2r', audience: 'audience_Wt3kP9sL4e', at: '2026-11-04T16: 00: 00Z' })"
}
}
import { $ } from 'startup-builder'
const result = await $.try.Message.broadcast({ message: 'msg_Wl5tQ8nB2r', audience: 'audience_Wt3kP9sL4e', at: '2026-11-04T16: 00: 00Z' })
Response
{
"api": "https: //api.sb/ leaseline.app",
"message": {
"$id": "https: //api.sb/ leaseline.app/ messages/ msg_Wl5tQ8nB2r",
"$type": "Message",
"medium": "email",
"direction": "outbound",
"from": "dana@leaseline.app",
"subject": "Leaseline is live on Product Hunt today",
"purpose": "launch"
},
"messages": [
{
"$type": "Message",
"to": "leo@birchline-homes.example",
"subject": "Leaseline is live on Product Hunt today",
"body": "Leo, you joined the waitlist in September. Leaseline is live today: rent and every lease renewal tracked in one place, each notice sent 60 days out."
}
],
"counts": {
"audience": 640,
"sending": 611,
"skippedNoConsent": 21,
"skippedSuppressed": 8
},
"action": {
"operation": "Message.broadcast",
"mode": "try",
"status": "done"
}
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns
Nouns
| Noun | What it is |
|---|---|
| Mailbox | A Mailbox is an email Channel at a Domain, held by a startup, a Role, or a Worker, so every Agent has its own. |
| Message | A Message is one communication from any party over one medium, such as email, SMS, or chat, inbound or outbound. |
| Suppression | A Suppression is an address a Company never sends commercial Messages to, read before every send from any of its startups. |
| Consent | A Consent is a person’s grant for one Purpose, with its basis, region, notice, evidence, and expiry. |
Properties
The hub defines each Noun’s core Properties; Mailboxes adds the ones a sale needs.
Mailbox
| Property | Type | What it holds | Defined by |
|---|---|---|---|
address | email | The email address. | The hub |
stream | string | What it sends: receipts and resets, broadcasts, or cold outbound; one stream per Mailbox. | The hub |
dailyCap | integer | Sends allowed today, raised by the warmup ramp and cut by the brakes. | The hub |
status | string | Where the Mailbox stands in its warmup and rest cycle. | The hub |
tenant | tenant | The Tenant it sends for, at a Domain that Tenant’s customer holds; replies land in the Tenant’s Threads. | The hub |
domain | Domain | Its domain; cold outbound lives only on a second domain, never your primary. | Mailboxes |
bounceRate | number | Hard bounces over the last 7 days; over 2% rests the Mailbox. | Mailboxes |
spamRate | number | Complaints reported by the inbox providers; over 0.3% rests it. | Mailboxes |
Message
| Property | Type | What it holds | Defined by |
|---|---|---|---|
medium | string | One of email, sms, voice, or chat. | The hub |
direction | string | One of inbound or outbound. | The hub |
body | text | What it says. | The hub |
from | string | The sender: an address, a number, or a Channel id. | The hub |
to | string | The recipient: an address, a number, or a Person id. | The hub |
subject | string | The subject line, for email. | The hub |
purpose | string | Why it goes out, such as onboarding; consent and suppression rules read it. | The hub |
mailbox | Mailbox | The Mailbox it sends from, which sets its daily cap. | Mailboxes |
thread | string | The thread it belongs to, so a follow-up lands under the first email. | Mailboxes |
Suppression
| Property | Type | What it holds | Defined by |
|---|---|---|---|
address | string | The email address or phone number. | The hub |
reason | string | Why it is suppressed, such as an opt-out or a bounce. | The hub |
Consent
| Property | Type | What it holds | Defined by |
|---|---|---|---|
region | string | The jurisdiction whose rules apply. | The hub |
withdrawnAt | datetime | When the person withdrew it. | The hub |
Lifecycle
Every move names the Verb that makes it, or the Event it waits on.
Mailbox
| State | What it means | Moves to |
|---|---|---|
warming (first) | Its daily sends ramp toward its cap over two to four weeks. | active by Mailbox.warm; retired by Mailbox.retire |
active | It sends up to its cap while its readings stay inside their brakes. | resting by Mailbox.rest; retired by Mailbox.retire |
resting | A brake fired, so it sends nothing until the reading clears. | active by Mailbox.warm; retired by Mailbox.retire |
retired | It sends nothing again; its address, Messages and sending history stay. | None: it ends here. |
Verbs
| Verb | What it does | Approval |
|---|---|---|
Message.schedule | Holds one email until the minute you set, such as 9:10 in the buyer’s morning, then sends it from your Mailbox. | Runs on its own On each site Gmail, LinkedIn, Outlook, X Limits Cold first touches send only from a warmed second domain: 2 Mailboxes at 25 a day each after a 14-day ramp, 50 a day in all. Warm intros and replies send from your primary domain. |
Message.broadcast | Sends one email to a whole Audience, such as your waitlist, now or at a set time. | Goes out on its own On each site Gmail, Outlook Limits Only to people who opted in; a broadcast never goes to a cold list. |
Mailbox.warm | Ramps a new Mailbox from 5 sends a day to 25 over 14 days, before any cold email leaves it. | Runs on its own On each site None. Limits Fourteen days from 5 sends a day to 25; no cold email leaves a Mailbox still warming. |
Mailbox.rest | Pauses a Mailbox’s sending when a brake fires, such as bounces over 2%, and resumes it when the reading clears. | Runs on its own |
Domain.authenticate | Writes your domain’s SPF, DKIM and DMARC records and checks them before its first send. | Runs on its own |
Mailbox.retire | Stops a Mailbox for good and keeps its address, Messages and sending history. | Runs on its own |
Contact.suppress | Adds an address to the one list every send reads first, honored by every startup, forever. | Runs on its own |
Contact.unsubscribe | Stops commercial email to a person in one click, for one topic or all, at once. | Runs on its own On each site Gmail, Outlook |
Consent.withdraw | Ends a Consent at once: sending for its purpose stops, and the record stays. | Runs on its own |
Events
| Event | Emitted by |
|---|---|
Message.scheduled | Message.schedule |
Message.broadcasted | Message.broadcast |
Mailbox.warmed | Mailbox.warm |
Mailbox.rested | Mailbox.rest |
Mailbox.retired | Mailbox.retire |
Domain.authenticated | Domain.authenticate |
Contact.suppressed | Contact.suppress |
Contact.unsubscribed | Contact.unsubscribe |
Consent.withdrawn | Consent.withdraw |
A Trigger can start a Workflow on any of them, and a Watch delivers each to your endpoint, signed (Events and webhooks).
Who operates it
| Part | Mailboxes |
|---|---|
| Accountable | Prospector |
| Also calls its Verbs | Customer lead, Marketing lead, Onboarding Specialist, Billing Specialist, Success Manager, Partner Manager |
| Seat | An agent holds each seat until you seat a person in it. |
| Asks you first | None of its Verbs: each runs within its seat’s Limits |
Integrations
Import and export
| Direction | What | How |
|---|---|---|
| Import | Your existing inbox and its threads | Integration.connect for Gmail or Outlook; replies land in the thread they answer |
| Import | Your Suppressions from another tool | Contact.suppress for each address; suppressions are never removed |
| Export | Every Message, with its reply and outcome | Collection.export |
Example
A second domain, warmed before the first cold email.
Domain.authenticatewrites SPF, DKIM and DMARC for tryleaseline.app and checks each one.Mailbox.warmramps dana@tryleaseline.app and ops@tryleaseline.app from 5 a day to 25 over 14 days.- On day 15,
Message.scheduleholds each first touch for 9:10 in the buyer’s time zone: 50 a day across the two. - A bounce spike past 2% on one Mailbox fires its brake;
Mailbox.restpauses it until the reading clears.