---
title: "Ask before any marketing message · Agent Wranglers"
url: https://agentwranglers.se/playbook/notifications/channels-and-preferences/marketing-consent
updated: 2026-10-20
licence: "All rights reserved"
---

# Ask before any marketing message

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

- Level: Required
- Chapter: [Channels and preferences](https://agentwranglers.se/playbook/notifications/channels-and-preferences)
- Rule: Send marketing on a channel only after the person opted in to that channel. Keep the proof, and keep marketing out of transactional messages.
- How: Marketing types start with no channels on. Ask with a box that is not ticked in advance, per channel. Store who agreed, when, where and to what wording, as the [email consent rule](https://agentwranglers.se/playbook/email/email-privacy/consent-records) shows. The EU ePrivacy Directive (Article 13) needs prior consent for marketing by email and SMS. Its one exception covers your own similar products, offered to existing customers who could refuse at every message. The US TCPA needs prior express written consent for marketing texts sent by automated systems. Apple's App Review Guidelines (4.5.4) forbid push marketing without opt-in in the app's own interface. A receipt, an alert or a reminder must not carry an offer, or it becomes marketing.
- Check: Create a new account and send every marketing type. Nothing arrives. Opt in to push only, and only push arrives. A query finds no marketing send without a consent row for that user and channel.

Example:

```sql
-- Must return 0 rows
SELECT s.id FROM sends s
JOIN notification_types t ON t.id = s.type
LEFT JOIN consents c ON c.user_id = s.user_id AND c.channel = s.channel AND c.revoked_at IS NULL
WHERE t.category = 'marketing' AND c.user_id IS NULL;
```

```js
const mayMarket = (consents, channel) => consents.some(c => c.channel === channel && !c.revokedAt);
```

```python
def may_market(consents, channel):
    return any(c.channel == channel and c.revoked_at is None for c in consents)
```

**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/marketing-consent`.

- Previous: [Keep every notification type in one catalogue](https://agentwranglers.se/playbook/notifications/channels-and-preferences/notification-catalogue)
- Next: [Let people choose per type and channel](https://agentwranglers.se/playbook/notifications/channels-and-preferences/notification-preferences)
- [Channels and preferences](https://agentwranglers.se/playbook/notifications/channels-and-preferences)
