# 08 · Communications & support

https://exo.now/docs/stack/communications

> One Exo communications layer sends email, text, and voice through Bird; customer records live in Twenty, an open-source CRM.



<StackFacts dimension="08 · Communications & support" platforms="[&#x22;bird&#x22;, &#x22;twenty&#x22;]" status="Communications: Planned (roadmap horizon: now). Resend is still the required default until the migration lands. CRM: TBD — named standard in the catalog; no integration is documented in the repository yet." />

## What it is [#what-it-is]

One Exo communications layer sends email, SMS, WhatsApp, Apple Messages, and voice. It is
consent-aware, runs server-side, uses per-app sending domains, and stays separate from product
data. Apps never hold provider keys. They call Exo's send function with their tenant ID
([roadmap: bird-communications](../../../roadmap/items/bird-communications.md)).

### CRM [#crm]

Customer context stays in the CRM, while forms and signals synchronize through replaceable,
consent-aware adapters (the stack description on exo.now).

## Platform [#platform]

**Bird** will be the single communications provider, replacing Resend and any one-off messaging
integrations.

### CRM [#crm-1]

**Twenty**, an open-source CRM. Its catalog posture is **optional adapter**, and the **App** is the
authority: customer relationships belong to the App, not to Exo.

## Boundary and replaceability [#boundary-and-replaceability]

* **Exo owns the infrastructure:** the Bird account, keys, DNS verification, templates, analytics,
  and suppression lists.
* **Vendor-neutral subdomains.** Each App sends from its own custom domain (for example
  `mail.2daysearly.com` or `inbox.2daysearly.com`) for recipient trust and per-domain reputation.
  Names are never `bird.`, so a provider swap never touches DNS.
* **Exo speaks as Exo** from an Exo-owned subdomain (`ops.exo.now` or `notify.exo.now`) for
  billing, operations, and agent notifications.
* **Adapter shape.** A Convex `communications` layer (an `outboundMessages` table plus per-channel
  `send` actions), with the same adapter shape as the billing providers.

### CRM [#crm-2]

* The catalog describes the boundary as "open-source customer context synchronized through
  replaceable intake adapters". The adapter contract itself is **TBD**.
* Related intake that exists today: Exo's own contact inquiries are stored in the Convex `contactInquiries` table, and the portfolio
  dashboard counts inbound volume over 30 days
  ([revenue monitoring](../../../docs/revenue-monitoring.md)).
* Direct customer contact data is excluded from Exo's revenue ledger
  ([commerce contract](../../../docs/commerce-contract.md)).

## Cost notes [#cost-notes]

Bird per-channel pricing: **TBD**. The roadmap notes that SMS, WhatsApp, and voice "land free on
the same layer — no new vendor later", which means no added vendor, not no usage cost.

### CRM [#crm-3]

Twenty hosting (self-hosted or cloud) and cost: **TBD**.

## Status [#status]

* **Planned**, priority high, horizon now, trail `IV-170`.
* **Scope:** migrate Resend call sites (Construct waitlist, contact, and email library; the
  Interspace inbound route; the Observatory changelog email; Exo templates), add inbound email via
  Bird mailboxes, and add domain onboarding with warm-up sequencing to tenant provisioning.
* **Until then:** Resend remains the required default email provider for active managed projects,
  and outbound email fails closed unless explicitly enabled
  ([repository contract](../../../docs/repository-contract.md),
  [environment lifecycle](../../../docs/environment-lifecycle.md)).

### CRM [#crm-4]

**TBD.** The repository names Twenty as the standard, but no adapter, ADR, or roadmap item exists
yet. Adding one is a next step.
