> ## Documentation Index
> Fetch the complete documentation index at: https://www.courier.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Install the Courier skill before writing code: `npx skills add trycourier/courier-skills`. It carries the verified SDK shapes and the rules you cannot get wrong.
> Authenticate every request with `Authorization: Bearer <API_KEY>`. A workspace has several environments and each has its own keys, which are plain `pk_` strings with no environment prefix. Start with Test.
> Send with `client.send.message` from the Node SDK (`@trycourier/courier` v7 and later, where the client is the default import). Reference a template by its `nt_` id or its alias.
> A send accepts a bare Elemental element list, but storing content on a template requires the top-level elements wrapped in a channel element.
> To translate a template, write one locale at a time with `PUT /notifications/{id}/locales/{localeId}`, which merges into the existing translations. `PUT /notifications/{id}/content` and `PUT /notifications/{id}/elements/{elementId}` overwrite translations along with the content, so send each element's `id` and `locales` back, and first remove every `checksum` and any `locales` key that starts with an underscore.
> Templates and journeys can be built in the Courier app or created through the API. Either way they live in the workspace and are referenced by ID when you send.
> The hosted MCP server is https://mcp.courier.com. For a briefing on what Courier is and when to use it, read https://www.courier.com/llms.txt.
> Prefer the Guides tab for how-do-I questions and the Docs tab for how-does-it-behave questions. The API reference lives under /api-reference.

# Preference center

> Let users choose which notifications they get, and on which channels, from inside your app or on a page Courier hosts.

A preference center lets users choose which of your notifications they get, and how each one reaches them.

<Frame>
  <img src="https://mintcdn.com/courier-4f1f25dc/Ia7FGvhsFU_5CtOa/assets/preferences-default.webp?fit=max&auto=format&n=Ia7FGvhsFU_5CtOa&q=85&s=d31b2fb8c91c01bd97f26b09d0ecb4bc" alt="The Courier preference center with its default styling: a topic section with per-topic toggles and an expanded channel picker for email, push, and SMS" className="mx-auto" width="3152" height="1776" data-path="assets/preferences-default.webp" />
</Frame>

## What is a preference center

Users turn notification topics on or off, like product updates or weekly digests, and pick how each one reaches them: email, push, SMS, and more.

Courier enforces those choices on every send. When a user opts out of a topic, Courier stops delivering it, across every channel, with no checks in your code.

## How it works

1. **Create topics** in the [Preferences Editor](/docs/recipients/preferences/preferences-editor), like Account alerts or Marketing, and set each one's default.
2. **Assign each template** to a topic with its [Subscription Topic](/docs/design/templates/template-settings) setting, so Courier knows which messages each choice covers.
3. **Show the preference center** to users, in your app or on the hosted page.
4. **Courier checks preferences** at send time, and delivers only what each user opted into, on the channels they chose.

Set a topic's default to Required for messages users can't turn off, like security alerts.

## Embedded or hosted

Both read and write the same preferences, so a change in one shows up in the other.

| | [Embedded component](/docs/in-app/add-a-preference-center) | [Hosted page](/docs/guides/build-a-preference-center#hosted-page) |
| :- | :- | :- |
| Where it lives | Inside your app, next to your other settings | A Courier URL, unique to each user |
| What you build | Add one component with a Courier SDK | Nothing |
| How users get there | Your app's settings screen | A preferences link in your emails |
| Styling | Fully themeable, or build your own UI | Your brand, heading, and description |
| Get started | [Add a preference center](/docs/in-app/add-a-preference-center) | [Set up the hosted page](/docs/guides/build-a-preference-center#hosted-page) |

A common setup uses both: the component in your settings screen, and the hosted link in email footers so users can update preferences without signing in.

## SDKs

**Web:** [React](/docs/sdk-libraries/courier-react-web) · [Vue](/docs/sdk-libraries/courier-vue-web) · [Angular](/docs/sdk-libraries/courier-angular-web) · [Web Components](/docs/sdk-libraries/courier-web-components)

**Mobile:** [iOS](/docs/sdk-libraries/ios) · [Android](/docs/sdk-libraries/android) · [React Native](/docs/sdk-libraries/react-native) · [Flutter](/docs/sdk-libraries/flutter)

The preference center uses the same SDKs and sign-in as the [inbox](/docs/in-app/inbox). If you already have the inbox, it's one more component.

## Go further

<CardGroup cols={2}>
  <Card title="Customize preferences" icon="palette" href="/docs/in-app/customize-preferences">
    Theme the component or build your own UI.
  </Card>

  <Card title="How preferences resolve" icon="diagram-project" href="/docs/recipients/preferences/overview">
    What Courier checks at send time.
  </Card>
</CardGroup>
