Part 1 — Broadcasts
A broadcast is one email sent to many people, persisted end to end: you draft it, schedule it, send it, then read back who received it, who opened it, and which links they clicked.The lifecycle
draft → scheduled → sending → sent, with canceled and failed as exits.
Omit scheduled_at and you get a draft. Pass a future timestamp and it becomes scheduled — a cron picks it up when it comes due, so a deploy or restart can’t strand it. Pass send_now: true and it goes out immediately. A draft or scheduled broadcast stays editable; once it starts sending, the rendered body and recipient list are frozen so what you report can’t drift from what recipients actually received.
Choosing an audience
audience is how you say who receives a broadcast. Filters combine as a union and are deduplicated by address:
Addresses on your suppression list — hard bounces, spam complaints, and unsubscribes — are dropped before the send is counted, so
stats.recipients reflects what the provider will actually attempt. A broadcast with no reachable recipients is rejected rather than silently sending to nobody.
Content
Every broadcast carries a per-recipient unsubscribe link and the RFC 8058
List-Unsubscribe headers that let mailbox providers show a native “Unsubscribe” button. An opt-out adds that address to your suppression list, so it is honoured by every send path afterwards. This is not optional and cannot be turned off — bulk marketing mail requires it, and it is what protects your sending reputation.Worked example: broadcast to all paid customers
Reading the results
stats is embedded on every broadcast and also available on its own endpoint. Rates are fractions of sent, not of recipients — a recipient never handed to the provider can’t have opened anything.
opened and clicked count distinct recipients. For per-person detail use GET /broadcasts/{id}/recipients, and for per-link detail use GET /broadcasts/{id}/link-clicks, which reports both total clicks and unique_clicks.
Subscribe to broadcast.sent, broadcast.canceled, and broadcast.failed to react without polling. See Webhooks.
Open and click tracking
Tracking is off until the account has its own verified email domain, and turns itself on from there — no configuration. Click tracking works by rewriting every link in the body to redirect through a tracking host. Whose host that is decides whether it costs you deliverability:- URL blocklists score the hosts appearing in a message body, so a tracking host shared across many senders carries whatever reputation the worst of them earns.
- Links pointing somewhere other than the domain the mail is authenticated as is structurally what phishing looks like, and inbox providers weigh that alignment.
click.yourdomain.com and publishes the CNAME for it — written straight into your DNS when Crevio hosts the zone, or shown alongside the other records for you to add when it doesn’t. Once that record resolves, click and open tracking switch on, links stay on your domain, and the reputation is yours alone.
Until then stats.clicked and link-clicks stay empty. That’s deliberate: sending on the shared platform domain and tracking through a shared host is the configuration most likely to cost inbox placement, and click data isn’t worth that trade.
If something already lives at
click.yourdomain.com, Crevio leaves it alone rather than overwriting it — the record is surfaced in domain settings instead, and tracking stays off until it’s resolved.Sending limits
Broadcasts draw on a per-account daily send limit set by your plan. Exceeding it returns429 with quota_exceeded; a scheduled broadcast that hits the cap stays scheduled and is retried after the limit resets at UTC midnight, rather than failing outright.
Part 2 — The email client
Crevio also operates as a real mailbox built around inboxes → threads → messages, with drafts, search, labels, and attachments. Every account has a built-in inbox at{slug}@ai.crevio.app that works immediately — listing inboxes creates it if it doesn’t exist yet. Mail sent from it goes out on Crevio’s verified sending domain with replies routed back to that address. Verify a domain of your own to add named inboxes like support@yourbrand.com and send from your own address.
Inboxes, threads, and messages
Worked example: reply to an inbound message
Reading a thread gives you its messages; reply directly to one.reply-all and forward on a message, the same way.
Drafts, search, and labels
Sending domains
To send from your own domain (rather than the platform default), enable theemail_sending capability on the domain. This is what makes broadcasts arrive from hello@yourbrand.com.
The response’s
records[] lists the DNS records to add at your registrar, each with its own status. For domains purchased through Crevio they’re written automatically. See Domains.Email webhooks
Both halves are event-driven. Subscribe instead of polling:- Inbox —
email_message.received,email_message.sent,email_message.delivered,email_message.bounced,email_message.complained,email_message.failed. - Broadcasts —
broadcast.sent(every recipient handed to the provider),broadcast.canceled,broadcast.failed.
email_message.received, run a Task to draft a reply, and send it. See Webhooks.
Next steps
Webhooks
React to inbound mail with
email_message.* events.Tasks
Let an agent triage and reply to your inbox.
Customers
Segment who your broadcasts reach.
Domains
Manage DNS for your sending domain.

