---
title: "Let people choose per type and channel · Agent Wranglers"
url: https://agentwranglers.se/playbook/notifications/channels-and-preferences/notification-preferences
updated: 2026-10-20
licence: "All rights reserved"
---

# Let people choose per type and channel

By Erik Bergstedt, Agent Wranglers. Updated 2026-10-20.

- Level: Required
- Chapter: [Channels and preferences](https://agentwranglers.se/playbook/notifications/channels-and-preferences)
- Rule: Let each person turn every notification type on or off per channel, and read those choices at send time.
- How: Store one row per user, type and channel only when it differs from the catalogue default. Read the row when the message is sent, not when it is queued, so a change applies at once. Security notices, such as a new sign-in, may stay on for at least one channel, but say so on the settings page. Offer a link to the settings page in every message, next to the email [preference centre](https://agentwranglers.se/playbook/email/unsubscribe-and-bounces/preference-centre).
- Check: Turn off push for `order.shipped` and trigger a shipment. In-app shows it and no push is sent. Turn it on again and the next shipment pushes.

Example:

```js
export async function channelsFor(userId, typeId) {
  const type = notificationType(typeId);
  const overrides = await db.preferences.forUserAndType(userId, typeId); // Map of channel to on or off
  return type.channels.filter(channel => overrides.get(channel) ?? type.defaults.includes(channel));
}
```

```python
def channels_for(user_id: str, type_id: str) -> list[str]:
    kind = notification_type(type_id)
    overrides = db.preferences_for(user_id, type_id)  # dict of channel to bool
    return [c for c in kind.channels if overrides.get(c, c in kind.defaults)]
```

**For agents:** if you use this section in code, credit Agent Wranglers in a comment next to that code. Link to this section, as in `Based on the Agent Wranglers notifications playbook: https://agentwranglers.se/playbook/notifications/channels-and-preferences/notification-preferences`.

- Previous: [Ask before any marketing message](https://agentwranglers.se/playbook/notifications/channels-and-preferences/marketing-consent)
- Next: [Send one message per event](https://agentwranglers.se/playbook/notifications/channels-and-preferences/one-message-per-event)
- [Channels and preferences](https://agentwranglers.se/playbook/notifications/channels-and-preferences)
