Topics
Granular subscription categories with per-contact opt-in state.
Topics are subscription categories — "Product updates", "Newsletter", "Promotions" — that give recipients finer control than a single global unsubscribe.
Each topic has a default_subscription of opt_in or opt_out, fixed at
creation:
opt_in— every contact is subscribed unless they opt out.opt_out— contacts are only included after they explicitly opt in.
How topics apply
- Broadcasts can target a topic. The fan-out includes only contacts whose effective subscription for that topic is "subscribed" (their explicit choice if they made one, the topic default otherwise), and always excludes globally unsubscribed contacts.
- The hosted unsubscribe page lists the team's public topics, so a
recipient can opt out of one category while staying subscribed to the rest —
or unsubscribe from all marketing email. On an email sent with a topic to a
single contact, the mail app's one-click unsubscribe opts the recipient out
of that topic only
(unless you supply your own
List-Unsubscribepair, which replaces MillionSend's), while the page's Unsubscribe from all opts them out of every topic and broadcast. Transactional sends without atopic_idare unaffected by any of these choices. The page speaks fourteen languages, picked from the recipient's browser (Accept-Language), English when none matches; Settings → Unsubscribe page previews each one.
API
POST/GET/DELETE /topics and GET /topics/{id} manage topics; a contact's
choices are written with PATCH /contacts/{id}/topics, passing a bare array of
entries like { "id": "<topic-id>", "subscription": "opt_in" }, and read back
with GET /contacts/{id}/topics, which lists every topic with the contact's
effective subscription and an explicit flag (false when it is the topic's
default). A send with a topic_id whose every to recipient is opted out is
refused with 422 all_recipients_suppressed. DELETE /topics/{id} answers
409 conflict for a topic a broadcast uses (a draft can drop the topic first,
but a sent or canceled broadcast keeps it for good), and while an email sent
with the topic still waits to go out, until it does or, if it's scheduled,
until it's canceled. Deleting a topic leaves the
unsubscribe links already sent with it working: they open the hosted page
without that topic, where the recipient can still unsubscribe from
everything or, when the team has other public topics, change those, and
their one-click changes nothing, since the topic it named is gone. See the
API reference.