---
title: "Treat WhatsApp and RCS as channels with · Agent Wranglers"
url: https://agentwranglers.se/playbook/notifications/text-messages/chat-app-channels
id: NTF-43
level: Recommended
updated: 2026-10-27
build: a2a6bdfed830
tokens: 875
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Treat WhatsApp and RCS as channels with their own opt-in

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Text messages](https://agentwranglers.se/playbook/notifications/text-messages.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-27.

- ID: NTF-43
- Level: Recommended
- Chapter: [Text messages](https://agentwranglers.se/playbook/notifications/text-messages.md)
- Rule: Add WhatsApp and RCS business messages to the catalogue as separate channels. Send on each only after an opt-in for that channel, from a verified sender profile, and use approved templates where the platform needs them.
- Check: A test sends a WhatsApp message to a user with only a text opt-in and expects a refusal. A test sends a free-form WhatsApp message 25 hours after the user's last reply and expects the code to pick a template instead.
- How: Both reach phones like a text, but each has its own rules on top of the law. WhatsApp's Business Messaging Policy lets you contact people only after they opted in, and you must honour every opt-out, on WhatsApp or off it. Outside the 24-hour window after a person's last message, you may send only approved message templates. RCS business messages come from an agent whose brand each carrier verifies and approves before launch. Store consent per channel as [Have consent before any marketing message](https://agentwranglers.se/playbook/notifications/channels-and-preferences/marketing-consent.md) says. Fall back to a plain text only when the person also opted in to texts.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
const SERVICE_WINDOW_MS = 24 * 60 * 60 * 1000;

export function whatsappMessageKind(user, now = Date.now()) {
  if (!user.consents.has('whatsapp')) throw new Error('No WhatsApp opt-in');
  return now - user.lastWhatsappReplyAt < SERVICE_WINDOW_MS ? 'free-form' : 'template';
}
```

### Python example

```python
from datetime import datetime, timedelta, UTC

SERVICE_WINDOW = timedelta(hours=24)

def whatsapp_message_kind(user, now: datetime | None = None) -> str:
    if "whatsapp" not in user.consents:
        raise PermissionError("No WhatsApp opt-in")
    now = now or datetime.now(UTC)
    return "free-form" if now - user.last_whatsapp_reply_at < SERVICE_WINDOW else "template"
```

## Sources

- [Google, Verify and launch your RCS agent](https://developers.google.com/business-communications/rcs-business-messaging/guides/launch)

## Related rules

- NTF-2 [Have consent before any marketing message](https://agentwranglers.se/playbook/notifications/channels-and-preferences/marketing-consent.md) in Notifications

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/notifications/text-messages/chat-app-channels">Agent Wranglers notifications playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Fail over to a second text provider](https://agentwranglers.se/playbook/notifications/text-messages/sms-provider-failover.md)
- [Text messages](https://agentwranglers.se/playbook/notifications/text-messages.md)
