Messaging
How every email, SMS, call and chat flows through Channels and Threads, passes Guards before it sends, and turns replies into work.
Messaging carries every Message a Startup sends or receives, by email, SMS, voice or chat, through one model. Each Message links to its purpose, its recipient's Consent, its delivery result and the work it answers.
Channels, Threads and Conversations
A Channel is a place Messages flow: a chat channel, a Mailbox, or an SMS number. Replies group into a Thread. A Thread that a Worker must answer, such as a support request, is a Conversation.
Every Message has one canonical id in db.sb. Copies on connected chat tools are aliases of it. An edit is a new revision and a delete is a marker, so the record of what was said survives both.
Every Agent has a Mailbox
An Agent sends as itself, from its own address at the Startup's Domain. A Role holds shared addresses, so support@ reaches whoever fills the support seat today.
A Customer who writes to an Agent gets a reply from the same address, in the same Thread. When a Human takes over, the Thread and its history stay where they are.
Guards on every send
No Message leaves a Startup without passing its Guards. The chain runs cheapest first and stops at the first refusal.
| Step | Checks |
|---|---|
| Rules | Recipient, Suppression, Consent for the Purpose, send-rate Limits. |
| Fast review | A small model screens tone, claims and personal data. |
| Strong review | A larger model reviews anything the fast pass flags. |
| Human review | Only Messages above the Startup's stakes threshold. |
A Suppression is read before every send from every Startup of the same Company. One opt-out at one Startup silences them all, permanently.
Replies become work
An inbound Message lands in its Thread and, when it needs a reply, opens a Task for the Role that owns the Channel. A mention of a Worker is a reply Task for that Worker. Every Approval gets a Thread of its own, so the decision and its discussion stay together.
Answer the latest conversation.
curl -X POST https: //api.sb/ ledgerlark.com/ conversations/ conversation_1/ answer \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/ json" \
-d '{"body": "Example body"}'
import { $ } from 'startup-builder'
const conversation = await $.Conversation.answer({ conversation: 'conversation_1', body: 'Example body' })
npx startup-builder do Conversation.answer --json '{"conversation": "conversation_1", "body": "Example body"}'
{
"name": "do",
"arguments": {
"code": "return await $.Conversation.answer({ conversation: 'conversation_1', body: 'Example body' })"
}
}
Answer replies through the Channel the Conversation arrived on and closes the reply Task.
Delivery and failure
Delivery is an Event, not an assumption. A bounce, a rejected number, an expired credential and a rate limit are different Events, and each routes to a different next step.
Retries reuse the Message's id, so a timeout never sends the same Message twice. A Message that cannot be delivered becomes a Task for its owning Role.
Connected chat
Channels mirror into the chat tools a team already uses, such as Slack, through an Integration. The Channel in db.sb stays the record; the mirror is a view of it, and a reply in either place lands in both.
| Term | Kind | Definition |
|---|---|---|
| Outbound | Process | Outbound reaches Prospects who match the ICP, with a legal basis for contact and within the touch Limit. |
| Support | Process | Support answers every Conversation from the record in one Thread and fixes causes, not symptoms. |
| Renewal notice | Workflow | Renewal notice tells each Customer on a term of a year or longer the date, Price and cancel link before it renews. |
| Lead nurture | Play | Lead nurture enrolls each Lead who has not bought in a Sequence keyed to what they do, ending at purchase, reply or 90 silent days. |
| Channel | Noun | A Channel is a place Messages flow, such as a chat channel, a Mailbox, or an SMS number. |
| Consent | Noun | A Consent is a person’s grant for one Purpose, with its basis, region, notice, evidence, and expiry. |
| Contact | Noun | A Contact is a person or Agent a Startup knows by at least one address, where Consent to message them is recorded. |
| Conversation | Noun | A Conversation is a Thread with one or more Contacts that a Worker must answer, such as a support request. |
| Enrollment | Noun | An Enrollment is one person’s run through one Sequence: the current step, when the next fires, the branches taken, and why it ended. |
| Guard | Noun | A Guard is a check every outbound Message and publish passes, from code rules to model review to a Human for high stakes. |
| Mailbox | Noun | A Mailbox is an email Channel at a Domain, held by a Startup, a Role, or a Worker, so every Agent has its own. |
| Meeting | Noun | A Meeting is a scheduled time when Workers and Contacts meet about one or more Things, producing notes, Decisions, and Tasks. |
| Message | Noun | A Message is one communication from any party over one medium, such as email, SMS, or chat, inbound or outbound. |
| Question | Noun | A Question is what a pending Action asks a Party, a Role, or a Worker before it resumes, kept on the Action with its answer. |
| Sequence | Noun | A Sequence is a timed series of steps run for one Contact at a time: send a Message, wait, branch, or stop. |
| Suppression | Noun | A Suppression is an address a Company never sends commercial Messages to, read before every send from any of its Startups. |
| Thread | Noun | A Thread is a set of Messages replying to one another inside a Channel. |
| Action.answer | Verb | Answer gives the reply to an Action’s open Question, through any Interface, and the Action resumes. |
| Action.ask | Verb | Ask puts a Question to a Party, a Role, or a Worker and holds the Action pending with reason awaitingInput. |
| Contact.enroll | Verb | Enroll adds a Contact to a Sequence, which sends its steps until the Contact replies or exits. |
| Contact.suppress | Verb | Suppress records a Suppression for a Contact’s address, which every Startup honors forever. |
| Conversation.answer | Verb | Answer replies in a Conversation through the Channel it arrived on and closes the reply Task it opened. |
| Conversation.close | Verb | Close marks a Conversation resolved, confirmed by the Customer or assumed after 72 hours with no reply. |
| Conversation.reopen | Verb | Reopen reverses a Conversation’s resolution when a reversal signal arrives within 7 days, and grades the resolution a failure. |
| Human.invite | Verb | Invite asks a person to join a Startup in a named Role, sharing that Role’s work with its Agent. |
| Human.recruit | Verb | Recruit invites a person to supply credentialed work to a Startup through its supply App. |
| Issue.resolve | Verb | Resolve closes an Issue with its fix recorded and tells every Customer who reported it. |
| Meeting.book | Verb | Book schedules a Meeting with a Contact at a time both calendars hold free. |
| Tenant.invite | Verb | Invite asks a Person to join a Customer’s Tenant, and resizes the Subscription when the Offer prices per member. |
| Waitlist.admit | Verb | Admit releases Leads from a Waitlist to the Offer they waited for, in the order the Waitlist ranks them. |
Next
- Agents: the Workers behind every Mailbox.
- Domains: the addresses Messages send from.
- Integrations: connecting outside chat tools.