Skip to content

Transactional and marketing streams

Every email we send is on one of two streams. Transactional email is what a person expects because of something they did: a booking confirmation, a receipt. Marketing email is everything sent to a list: newsletters, offers. The two follow different rules, and the difference is the reason a guest who never wants a newsletter still gets their booking confirmation.

Every email an emit sends is transactional. Templates belong to event types, and an event is something that happened for one person, so there is no stream setting to choose.

Marketing email is sent to a workspace’s subscribed contacts as campaigns. Your customers send campaigns from inside your platform; the API you integrate today is the transactional side and the contacts it sends to.

Keep transactional email transactional. An emit that sends a promotion to people who didn’t do anything is marketing wearing the wrong label, and mailbox providers judge it that way.

Transactional Marketing
Sent by your emits campaigns
Marketing consent not needed needed: only subscribed contacts get it
Unsubscribe link none in every email, and as a one-click header
Recipient a contact, or any address contacts only

A contact you never sent consent for is pending and gets no marketing. See Contacts, attributes and consent.

What happened Transactional Marketing
The address hard-bounced stopped stopped
The person marked an email as spam still sent stopped
Repeated soft bounces still sent stopped
The person left marketing still sent stopped
You suspended the workspace stopped stopped
The workspace’s health is paused still sent stopped
The sending service stopped the workspace’s mail stopped stopped
Your sending domain can’t send stopped stopped

A hard bounce means the address doesn’t exist, so nothing more is sent to it. A spam complaint or repeated soft bounces stop marketing, but a booking confirmation still reaches the person, because they need it. When an address becomes suppressed and a contact in the workspace holds it, your endpoint gets a contact.suppressed webhook with the reason (hard_bounce, complaint or soft_bounce) and blocks: all or marketing. When no contact holds the address, as after an emit to a bare address, the message.bounced or message.complained webhook is the only signal.

A suppression is ours, written from what the recipient’s mail server told us, and your consent can’t lift it. A subscribed you send for a suppressed address changes the contact’s consent but doesn’t make us market to it.

An emit to an address that is suppressed for all email answers with message.state suppressed, sends nothing, and sends your endpoint message.suppressed.

Each workspace’s health tracks how recipients treat its email. A new workspace is ramping while it builds a history, then established. If its bounce or complaint rates run high it is throttled, which slows its marketing, then paused, which stops its marketing until we’ve looked at it. A health pause always stops marketing, and our own throttle and pause leave transactional email flowing. This is what keeps one customer’s bad list from hurting your other customers. Your endpoint hears about every move through workspace.health_changed, with the reason.

Separately, the sending service can stop a workspace’s mail, and that stops transactional email too. Health may not show it, so don’t read health to decide whether transactional email is going out. The signal to rely on is the emit itself: it still answers 202 with queued, and the message then ends in message.failed with the reason sending_paused.

Health is separate from your suspend switch. A suspend is yours, stops both streams, and only you lift it. A health pause is ours, stops marketing, and only we lift it. A workspace can be both at once.