---
title: "Unsubscribe Topics"
slug: unsubscribe-topics
description: "Give your users more control over their subscription preferences."
created_at: "2025-11-06"
updated_at: "2025-11-06"
image: "https://cdn.resend.com/posts/unsubscribe-topics.jpg"
humans: ["alexandre-cisneiros", "carolina-josephik", "cassio-zen", "danilo-woznica"]
category: "product"
featured: true
---

It may sound counterintuitive, but letting people unsubscribe from emails they don’t want from you is great for deliverability.

When you only send to engaged recipients, it’s good for everyone. People are happier to receive your emails, and mailbox providers evaluate you as a high-quality sender.

Today, we’re excited to introduce **Topics**, a new way to allow users to manage their email preferences.

<video
  src="https://cdn.resend.com/posts/unsubscribe-topics.mp4"
  poster="https://cdn.resend.com/posts/topics-cover.png"
  controls
  className="extraWidth"
/>

## How it works

When you send emails to your Contacts, you can now assign a Topic to that email. For example, label your emails as "Monthly newsletter" or "Deals & savings". 

<video
  src="https://cdn.resend.com/posts/topics-add-topic-to-broadcast.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

When users manage their preferences, they’ll see which Topics they’re currently subscribed to and can adjust their settings to their liking.

<video
  src="https://cdn.resend.com/posts/topics-unsubscribe.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

Sometimes people in your audience want to receive monthly newsletters, but don't want to know about every sale you run. Giving people options means they can stay subscribed to what they want and unsubscribe from the rest.

<Callout type="info">
The **Subscribed** status for a Contact is a global setting that enables or disables sending Broadcasts to a Contact.

- If a Contact’s **Subscribed** status is **false**, they will not receive emails from your account, even if they have opted in to a specific Topic.
- If a Contact's **Subscribed** status is **true**, they can receive Broadcast emails from your account.
</Callout>

## Creating a new Topic

You can create a new Topic by navigating to **Audience** > **Topics**:

<video
  src="https://cdn.resend.com/posts/topics-create-topic.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

You can also [create Topics using the API](/docs/api-reference/topics/create-topic):

<CodeTabs>

```nodejs
import { Resend } from 'resend';

const resend = new Resend('re_xxxxxxxxx');

const { data, error } = await resend.topics.create({
  name: 'Store Events',
  defaultSubscription: 'opt_out',
});
```

```php
$resend = Resend::client('re_xxxxxxxxx');

$resend->topics->create([
  'name' => 'Store Events',
  'default_subscription' => 'opt_out',
]);
```

```python
import resend

resend.api_key = "re_xxxxxxxxx"

resend.Topics.create({
    "name": "Store Events",
    "default_subscription": "opt_out",
    "description": "Subscribe to our weekly newsletter for updates",
})
```

```ruby
require "resend"

Resend.api_key = "re_xxxxxxxxx"

Resend::Topics.create(
  name: "Store Events",
  default_subscription: "opt_out"
)
```

```go
import (
	"context"

	"github.com/resend/resend-go/v3"
)

func main() {
	client := resend.NewClient("re_xxxxxxxxx")

	client.Topics.CreateWithContext(context.TODO(), &resend.CreateTopicRequest{
		Name:                "Store Events",
		DefaultSubscription: resend.DefaultSubscriptionOptIn,
	})
}
```

```rust
use resend_rs::{
  types::{CreateTopicOptions, SubscriptionType},
  Resend, Result,
};

#[tokio::main]
async fn main() -> Result<()> {
  let resend = Resend::new("re_xxxxxxxxx");

  let opts = CreateTopicOptions::new("Store Events", SubscriptionType::OptIn);
  let _topic = resend.topics.create(opts).await?;

  Ok(())
}
```

```java
import com.resend.*;

public class Main {
  public static void main(String[] args) {
    Resend resend = new Resend("re_xxxxxxxxx");

    CreateTopicOptions createTopicOptions = CreateTopicOptions.builder()
      .name("Store Events")
      .defaultSubscription("opt_out")
      .build();

    CreateTopicResponseSuccess response = resend.topics().create(createTopicOptions);
  }
}
```

```dotnet
using Resend;

IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI

var resp = await resend.TopicCreateAsync( new TopicData() {
  Name = "Store Events",
  Description = "Weekly newsletter for our subscribers",
  SubscriptionDefault = SubscriptionType.OptIn,
} );
Console.WriteLine( "Topic Id={0}", resp.Content );
```

```curl
curl -X POST 'https://api.resend.com/topics' \
     -H 'Authorization: Bearer re_xxxxxxxxx' \
     -H 'Content-Type: application/json' \
     -d $'{
  "name": "Store Events",
  "default_subscription": "opt_out"
}'
```

</CodeTabs>

When creating a Topic, you can set the default subscription to **Opt-in** or **Opt-out**.
* **Opt-in**: Contacts will be subscribed to this Topic by default.
* **Opt-out**: Contacts will not be subscribed to this Topic by default.

For example, you can create a Topic for security updates and set the default subscription to **Opt-in**, ensuring all of your Contacts will receive these emails. On the other hand, you can create a Topic for marketing emails and set it to **Opt-out**, ensuring no one will receive these emails unless they have explicitly opted-in to that Topic.

## Assigning Topics to Contacts

Each Contact can be assigned to multiple Topics. This can be done on the dashboard:

<video
  src="https://cdn.resend.com/posts/topics-add-topic-to-contact.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

## Customizing your unsubscribe page

While Resend handles the unsubscribe flow for you, the experience should look and feel like your brand.

You can customize your [unsubscribe page](/settings/unsubscribe-page) by uploading a logo, adjusting the background and text colors, changing the wording, and more.

<video
  src="https://cdn.resend.com/custom-unsubscribe-video.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

When someone unsubscribes, they'll see your custom branded page instead of a generic one.

Learn more about [customizing your unsubscribe page](/changelog/custom-unsubscribe).


## The power of user preference

The best way to curate an engaged audience is to empower your users with more control over the ways they hear from you. It's a good way to meaningfully signal to your users that you care about their experience.

Unsubscribe Topics launches today. Add it to your app by [following the guide](/docs/api-reference/topics).
