Overview of consent and subscriptions

Customer.io gives you several ways to respect what people want to hear from you: global unsubscribes, topic and channel preferences, sender opt-outs, open-tracking consent, and consent records. Learn what each one controls and how they fit together.

Customer.io’s consent and subscription tools fall into three groups:

  • Tools that decide who receives your messages: global unsubscribes, topic and channel preferences, sender opt-outs, and push permission.
  • A tool that decides what you track: open-tracking consent.
  • A tool that proves what people agreed to: consent records.

When you need to know why someone did or didn’t get a message, start with the first group.

Decide who receives your messages

A person receives a message only when every check in this flowchart allows it.

flowchart LR u{Is <code>unsubscribed</code> true?} u-...->|yes|app[Person is only eligible for<br>in-app or Slack messages] u-->|no|g{Is the subscription<br>center enabled?} g-->|yes|t{Has the person opted out<br>of the message's topic<br>or channel?} g-...->|no|s t-->|yes|block[Person does not<br>receive message] t-->|no|s{For SMS and WhatsApp, has<br>the person opted out<br>of this sender?} s-->|yes|block s-->|no|send[Person receives message]

Global unsubscribe

The unsubscribed attribute works like a master switch. When it’s true, the person doesn’t receive email, SMS, WhatsApp, or push messages, whatever their other preferences say. They can still receive in-app and Slack messages. A person sets it when they click an unsubscribe link and you don’t use the subscription center, or when they click Unsubscribe from all in the subscription center. You can also set it yourself. Go to Global unsubscribes to learn more.

Topics and channels

If you set up the subscription center, people can opt out of topics, which are the kinds of messages you send, and channels, which are the ways you send them. A person needs to be subscribed to both the topic and the channel to receive a message. Customer.io stores these preferences in the cio_subscription_preferences attribute, and only checks them while your subscription center is enabled.

Opt-ins and opt-outs by channel

Global unsubscribes apply to email, SMS, WhatsApp, and push. So do topic and channel preferences while your subscription center is enabled. On top of those, each channel adds its own ways for people to opt in or out:

  • Email: When a person clicks the one-click unsubscribe button in their email client, Customer.io unsubscribes them the same way your unsubscribe link does: from the email’s topic if it has one and your subscription center is enabled, or from all of your messages otherwise. Some email clients unsubscribe people by sending an email to the address in your message’s List-Unsubscribe header instead. That always unsubscribes the person from all of your messages.
  • SMS and WhatsApp: When a person replies STOP to one of your numbers, Customer.io opts them out of messages from that number only. Go to Opt-out keyword handling to learn more.
  • Push: The person also needs to allow notifications on their device when your app asks for permission. Go to Device tokens to learn more.
  • In-app and Slack: These channels ignore global unsubscribes and topic preferences. They respect channel preferences if you add them as channels in your subscription center. See How topics and channels work together.

Decide what you track

Open-tracking consent controls whether you track when a person opens your emails. It doesn’t affect whether they receive email.

Prove what people agreed to

Consent records are a history of when people opted in to or out of your messages, and how. Use them to answer audit and compliance questions. They don’t affect who receives your messages.

Native unsubscribe links for emails, SMS, WhatsApp, and push

In Customer.io, you can use our default global unsubscribe functionality or set up a subscription center to manage which messages your customers receive. We recommend you create a subscription center to give your customers the option to receive messages they’re interested in without opting-out of all of your messages.

Unsubscribe globally

Out-of-the-box, Customer.io provides global unsubscribe functionality where your customers can subscribe or unsubscribe from email, SMS, WhatsApp, and push notifications. This is great for getting started, but as you grow, you may want to give your customers more control over the messages they receive with subscription preferences.

When someone clicks an unsubscribe link in an email, they’ll see this page and they’ll be unsubscribed from email, SMS, WhatsApp, and push notifications.

In the middle of the page is the question, 'Do you want to unsubscribe from our messages? You'll stop receiving messages from us.' Underneath that is the Unsubscribe button.

Subscription preferences

We recommend you set up a subscription center so your customers can control the messages they receive. The subscription center gives people two dimensions of control: topics and channels. Both work the same way—you set them up in Workspace Settings > Subscription Center, configure each as opt-in or opt-out, and provide a name and description.

The landing page for the subscription center in Fly. The title is Subscription Center. The tab Subscriptions is selected. There is a table with a title Topics and three subscription center topics. The table shows as Live. Underneath the Topics table is Global unsubscribe which also reads Live because customers can still unsubscribe from all messaging from the subscription center.

Click Preview at the top right of the landing page to see what our subscription center looks like to anyone who receives your messages.

A person can still globally unsubscribe if the subscription center is enabled. They just click Unsubscribe from all or uncheck every preference and click Save.

Read on to learn how to:

Topics

Topics control what kind of content people receive—for example, “Product Updates” or “Marketing Offers.” Unsubscribing from a topic means your customers no longer receive emails, push, or SMS for that topic.

Channels

Channels control how people receive messages—for example, email, SMS, push, or WhatsApp. Channel preferences let people opt in or out of specific messaging channels, independent of their topic subscriptions. For example, a person might want to receive your “Product Updates” topic by email but not SMS.

You must explicitly add each channel you want people to manage—enabling a messaging channel in your workspace doesn’t automatically add it to the subscription center.

Channel preferences apply per channel type, not per sender

Channel preferences control whether a person receives messages on a channel type as a whole. For example, setting email to false stops all email—you can’t set preferences for individual email addresses or phone numbers. If you need per-sender control, you might align your sender addresses with topics and use topics to control preferences instead.

How topics and channels work together

Topics and channels are independent layers of subscription control, but they combine as an AND—a person must be subscribed to both the topic and the channel to receive a message. If either one is opted out, the message is blocked.

For example, say a person is subscribed to your “Product Updates” topic but has opted out of the push channel. If you send a push notification for Product Updates, that person won’t receive it—even though they’re subscribed to the topic. They’d still get Product Updates by email or SMS, assuming those channels are subscribed.

TopicChannelResult
SubscribedSubscribedMessage sends ✅
SubscribedUnsubscribedMessage blocked ❌
UnsubscribedSubscribedMessage blocked ❌
UnsubscribedUnsubscribedMessage blocked ❌

There’s no per-topic-per-channel preference—topics and channels are independent. A person can subscribe to all topics but opt out of push, or subscribe to push but opt out of a specific topic.

The flowchart in Decide who receives your messages shows this logic visually.

Different messaging channels handle subscription checks differently:

ChannelSubscription behavior
Email, SMS, push, WhatsAppRespects global unsubscribe, topic preferences, and channel preferences
In-appIgnores global unsubscribe and topic preferences by default; respects channel preferences if you configure in_app as a channel
SlackIgnores global unsubscribe and topic preferences; respects channel preferences if you configure slack as a channel
WebhooksBypasses all subscription checks

You can use the following liquid to generate links that unsubscribe people from email, SMS, and push:

  • {% unsubscribe %}
  • {% unsubscribe_url %}
  • {% manage_subscription_preferences_url %}

{% unsubscribe %} and {% unsubscribe_url %} both work if you’re using our global unsubscribe functionality or subscription topics:

  • {% unsubscribe %} generates “Unsubscribe” which a person can click to unsubscribe from your messages. If you’re using the subscription center, people can unsubscribe from the specific topic in your message or manage other topics. If not, this page lets your audience unsubscribe from all messages.
  • {% unsubscribe_url %} generates an unsubscribe link but lets you customize the text your audience sees.
    • To hyperlink within the code and rich text editors, place {% unsubscribe_url %} in the href attribute of an anchor <a> tag in the HTML:
      Untracked unsubscribe link in the Rich Text editor
    • When using the drag and drop editor, place {% unsubscribe_url %} in the settings for the link you create:
      Untracked unsubscribe link in the Drag and Drop editor

{% manage_subscription_preferences_url %} only works if your subscription center is enabled:

  • {% manage_subscription_preferences_url %} generates a link to the subscription preferences page. This is where a person can manage their subscription preferences for all topics and channels. With our standard links - the two tags above - we would first prompt a person to unsubscribe from the topic of the message; this link allows your recipients to go straight to the subscription preferences page. You might do this when you announce a change to preferences, for instance.

Subscription attributes

Our unsubscribed attribute tracks a person’s global subscription status when the subscription center is enabled and disabled. We also track topic and channel preferences through profile attributes.

unsubscribed

We track global subscription statuses through a profile attribute named unsubscribed. It’s a field that takes boolean values - true or false. Setting this field to true means the person is unsubscribed from email, SMS, and push. Setting this field to false means the person is subscribed to them.

A person can globally unsubscribe when the subscription center is enabled or disabled. If the subscription center is enabled, a person must go to the subscription preferences page and click Unsubscribe from all or they must uncheck all of their preferences and click Save. If the subscription center is disabled, a person clicks Unsubscribe.

Go to Set unsubscribed attributes to learn more.

Topic and channel preferences

We track subscription preferences in their own table within the Overview tab of a person.

Note

If you’ve turned on consent records, the Consent state panel replaces this table. Click Manage > Manage subscription preferences… in the panel to see and change a person’s preferences.
The page for a person named Glinda Witch is shown. On the Overview tab, the table in the top left reads Subscription Preferences. The top row shows that Glinda is subscribed to one topic called Feedback, and the row beneath shows that she is unsubscribed from two topics called News and programs and Offers.

Behind the scenes, both topic and channel preferences exist within a JSON object called cio_subscription_preferences. Topics are identified by numeric ID (so renaming a topic doesn’t affect preferences) and channels use the channel type name.

JSON
{
   "cio_subscription_preferences": {
      "topics": {
         "topic_1": true,
         "topic_2": false
      },
      "channels": {
         "email": true,
         "sms": true,
         "push": false
      }
   }
}

Both topics and channels use the same opt-in/opt-out pattern. If a topic or channel is configured as opt-in, people must explicitly subscribe before receiving messages. If it’s configured as opt-out, people are subscribed by default.

Go to Manage subscription preferences to learn more about setting these attributes.

Note

Channel preferences don’t replace topics—they add a second layer of control. If you only use topics today, everything continues to work the same until you configure channel preferences.
Updated October 8, 2026