MillionSend Docs

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-Unsubscribe pair, which replaces MillionSend's), while the page's Unsubscribe from all opts them out of every topic and broadcast. Transactional sends without a topic_id are 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.

On this page