Skip to content

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.

StepChecks
RulesRecipient, Suppression, Consent for the Purpose, send-rate Limits.
Fast reviewA small model screens tone, claims and personal data.
Strong reviewA larger model reviews anything the fast pass flags.
Human reviewOnly 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.

Conversation.answerMode do
You, to your agent

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.

TermKindDefinition
OutboundProcessOutbound reaches Prospects who match the ICP, with a legal basis for contact and within the touch Limit.
SupportProcessSupport answers every Conversation from the record in one Thread and fixes causes, not symptoms.
Renewal noticeWorkflowRenewal notice tells each Customer on a term of a year or longer the date, Price and cancel link before it renews.
Lead nurturePlayLead nurture enrolls each Lead who has not bought in a Sequence keyed to what they do, ending at purchase, reply or 90 silent days.
ChannelNounA Channel is a place Messages flow, such as a chat channel, a Mailbox, or an SMS number.
ConsentNounA Consent is a person’s grant for one Purpose, with its basis, region, notice, evidence, and expiry.
ContactNounA Contact is a person or Agent a Startup knows by at least one address, where Consent to message them is recorded.
ConversationNounA Conversation is a Thread with one or more Contacts that a Worker must answer, such as a support request.
EnrollmentNounAn Enrollment is one person’s run through one Sequence: the current step, when the next fires, the branches taken, and why it ended.
GuardNounA Guard is a check every outbound Message and publish passes, from code rules to model review to a Human for high stakes.
MailboxNounA Mailbox is an email Channel at a Domain, held by a Startup, a Role, or a Worker, so every Agent has its own.
MeetingNounA Meeting is a scheduled time when Workers and Contacts meet about one or more Things, producing notes, Decisions, and Tasks.
MessageNounA Message is one communication from any party over one medium, such as email, SMS, or chat, inbound or outbound.
QuestionNounA Question is what a pending Action asks a Party, a Role, or a Worker before it resumes, kept on the Action with its answer.
SequenceNounA Sequence is a timed series of steps run for one Contact at a time: send a Message, wait, branch, or stop.
SuppressionNounA Suppression is an address a Company never sends commercial Messages to, read before every send from any of its Startups.
ThreadNounA Thread is a set of Messages replying to one another inside a Channel.
Action.answerVerbAnswer gives the reply to an Action’s open Question, through any Interface, and the Action resumes.
Action.askVerbAsk puts a Question to a Party, a Role, or a Worker and holds the Action pending with reason awaitingInput.
Contact.enrollVerbEnroll adds a Contact to a Sequence, which sends its steps until the Contact replies or exits.
Contact.suppressVerbSuppress records a Suppression for a Contact’s address, which every Startup honors forever.
Conversation.answerVerbAnswer replies in a Conversation through the Channel it arrived on and closes the reply Task it opened.
Conversation.closeVerbClose marks a Conversation resolved, confirmed by the Customer or assumed after 72 hours with no reply.
Conversation.reopenVerbReopen reverses a Conversation’s resolution when a reversal signal arrives within 7 days, and grades the resolution a failure.
Human.inviteVerbInvite asks a person to join a Startup in a named Role, sharing that Role’s work with its Agent.
Human.recruitVerbRecruit invites a person to supply credentialed work to a Startup through its supply App.
Issue.resolveVerbResolve closes an Issue with its fix recorded and tells every Customer who reported it.
Meeting.bookVerbBook schedules a Meeting with a Contact at a time both calendars hold free.
Tenant.inviteVerbInvite asks a Person to join a Customer’s Tenant, and resizes the Subscription when the Offer prices per member.
Waitlist.admitVerbAdmit 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.