# Messaging

URL: /systems/communications/messaging · Id: `page:systems/communications/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](/business/nouns/message) a [Startup](/business/nouns/startup) sends or receives, by email, SMS, voice or chat, through one model. Each Message links to its purpose, its recipient's [Consent](/business/nouns/consent), its delivery result and the work it answers.

## Channels, Threads and Conversations
A [Channel](/business/nouns/channel) is a place Messages flow: a chat channel, a [Mailbox](/business/nouns/mailbox), or an SMS number. Replies group into a [Thread](/business/nouns/thread). A Thread that a [Worker](/business/nouns/worker) must answer, such as a support request, is a [Conversation](/business/nouns/conversation).

Every Message has one canonical id in [db.sb](/code/platform/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](/business/nouns/agent) sends as itself, from its own address at the Startup's [Domain](/business/nouns/domain). A [Role](/business/nouns/role) holds shared addresses, so `support@` reaches whoever fills the support seat today.

A [Customer](/business/nouns/customer) who writes to an Agent gets a reply from the same address, in the same Thread. When a [Human](/business/nouns/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](/business/nouns/guard). The chain runs cheapest first and stops at the first refusal.

| Step | Checks |
| --- | --- |
| Rules | Recipient, [Suppression](/business/nouns/suppression), Consent for the [Purpose](/business/nouns/purpose), send-rate [Limits](/business/nouns/limit). |
| 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](/business/nouns/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](/business/nouns/task) for the Role that owns the Channel. A mention of a Worker is a reply Task for that Worker. Every [Approval](/business/nouns/approval) gets a Thread of its own, so the decision and its discussion stay together.

**Ask**

```text
Answer the latest conversation.
```

**API**

```bash
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"}'
```

```json
{
  "api": "https://api.sb/ledgerlark.com",
  "conversation": {
    "$id": "https://api.sb/ledgerlark.com/conversations/conversation_1",
    "$type": "Conversation",
    "subject": "Example subject",
    "answeredAt": "2026-10-22T12:00:00Z"
  },
  "action": {
    "$id": "https://api.sb/ledgerlark.com/actions/action_1",
    "operation": "Conversation.answer",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/ledgerlark.com/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const conversation = await $.Conversation.answer({ conversation: 'conversation_1', body: 'Example body' })
```

**CLI**

```bash
npx startup-builder do Conversation.answer --json '{"conversation":"conversation_1","body":"Example body"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Conversation.answer({ conversation: 'conversation_1', body: 'Example body' })"
  }
}
```

[Answer](/business/nouns/conversation/answer) replies through the Channel the Conversation arrived on and closes the reply Task.

## Delivery and failure
Delivery is an [Event](/business/nouns/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](/business/nouns/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](/workflows/processes/outbound) | Process | Outbound reaches Prospects who match the ICP, with a legal basis for contact and within the touch Limit. |
| [Support](/workflows/processes/support) | Process | Support answers every Conversation from the record in one Thread and fixes causes, not symptoms. |
| [Renewal notice](/workflows/processes/billing/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](/workflows/plays/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](/business/nouns/channel) | Noun | A Channel is a place Messages flow, such as a chat channel, a Mailbox, or an SMS number. |
| [Consent](/business/nouns/consent) | Noun | A Consent is a person’s grant for one Purpose, with its basis, region, notice, evidence, and expiry. |
| [Contact](/business/nouns/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](/business/nouns/conversation) | Noun | A Conversation is a Thread with one or more Contacts that a Worker must answer, such as a support request. |
| [Enrollment](/business/nouns/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](/business/nouns/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](/business/nouns/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](/business/nouns/meeting) | Noun | A Meeting is a scheduled time when Workers and Contacts meet about one or more Things, producing notes, Decisions, and Tasks. |
| [Message](/business/nouns/message) | Noun | A Message is one communication from any party over one medium, such as email, SMS, or chat, inbound or outbound. |
| [Question](/business/nouns/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](/business/nouns/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](/business/nouns/suppression) | Noun | A Suppression is an address a Company never sends commercial Messages to, read before every send from any of its Startups. |
| [Thread](/business/nouns/thread) | Noun | A Thread is a set of Messages replying to one another inside a Channel. |
| [Action.answer](/business/nouns/action/answer) | Verb | Answer gives the reply to an Action’s open Question, through any Interface, and the Action resumes. |
| [Action.ask](/business/nouns/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](/business/nouns/contact/enroll) | Verb | Enroll adds a Contact to a Sequence, which sends its steps until the Contact replies or exits. |
| [Contact.suppress](/business/nouns/contact/suppress) | Verb | Suppress records a Suppression for a Contact’s address, which every Startup honors forever. |
| [Conversation.answer](/business/nouns/conversation/answer) | Verb | Answer replies in a Conversation through the Channel it arrived on and closes the reply Task it opened. |
| [Conversation.close](/business/nouns/conversation/close) | Verb | Close marks a Conversation resolved, confirmed by the Customer or assumed after 72 hours with no reply. |
| [Conversation.reopen](/business/nouns/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](/business/nouns/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](/business/nouns/human/recruit) | Verb | Recruit invites a person to supply credentialed work to a Startup through its supply App. |
| [Issue.resolve](/business/nouns/issue/resolve) | Verb | Resolve closes an Issue with its fix recorded and tells every Customer who reported it. |
| [Meeting.book](/business/nouns/meeting/book) | Verb | Book schedules a Meeting with a Contact at a time both calendars hold free. |
| [Tenant.invite](/business/nouns/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](/business/nouns/waitlist/admit) | Verb | Admit releases Leads from a Waitlist to the Offer they waited for, in the order the Waitlist ranks them. |

## Next
- [Agents](/code/platform/capabilities/agents): the Workers behind every Mailbox.
- [Domains](/products/platform/domains): the addresses Messages send from.
- [Integrations](/code/platform/integrations): connecting outside chat tools.