2026-01-02 01:19:22 +01:00
---
summary: "Group chat behavior across surfaces (WhatsApp/Telegram/Discord/iMessage)"
read_when:
- Changing group chat behavior or mention gating
---
# Groups
2026-01-04 14:32:47 +00:00
Clawdbot treats group chats consistently across surfaces: WhatsApp, Telegram, Discord, iMessage.
2026-01-02 01:19:22 +01:00
## Session keys
2026-01-02 10:14:58 +01:00
- Group sessions use `surface:group:<id>` session keys (rooms/channels use `surface:channel:<id>` ).
2026-01-02 01:19:22 +01:00
- Direct chats use the main session (or per-sender if configured).
- Heartbeats are skipped for group sessions.
2026-01-02 10:14:58 +01:00
## Display labels
- UI labels use `displayName` when available, formatted as `surface:<token>` .
- `#room` is reserved for rooms/channels; group chats use `g-<slug>` (lowercase, spaces -> `-` , keep `#@+._-` ).
2026-01-06 01:41:19 -03:00
## Group policy (WhatsApp & Telegram)
Both WhatsApp and Telegram support a `groupPolicy` config to control how group messages are handled:
```json5
{
whatsapp: {
allowFrom: ["+15551234567"],
groupPolicy: "disabled" // "open" | "disabled" | "allowlist"
},
telegram: {
allowFrom: ["123456789", "@username "],
groupPolicy: "disabled" // "open" | "disabled" | "allowlist"
}
}
```
| Policy | Behavior |
|--------|----------|
| `"open"` | Default. Groups bypass `allowFrom` , only mention-gating applies. |
| `"disabled"` | Block all group messages entirely. |
| `"allowlist"` | Only allow group messages from senders listed in `allowFrom` . |
Notes:
- `allowFrom` filters DMs by default. With `groupPolicy: "allowlist"` , it also filters group message senders.
- `groupPolicy` is separate from mention-gating (which requires @mentions ).
- For Telegram `allowlist` , the sender can be matched by user ID (e.g., `"123456789"` , `"telegram:123456789"` , or `"tg:123456789"` ; prefixes are case-insensitive) or username (e.g., `"@alice"` or `"alice"` ).
2026-01-02 01:19:22 +01:00
## Mention gating (default)
2026-01-02 22:23:00 +01:00
Group messages require a mention unless overridden per group. Defaults live per subsystem under `*.groups."*"` .
2026-01-02 01:19:22 +01:00
```json5
{
2026-01-02 22:23:00 +01:00
whatsapp: {
groups: {
"*": { requireMention: true },
"123@g .us": { requireMention: false }
}
},
telegram: {
groups: {
"*": { requireMention: true },
"123456789": { requireMention: false }
}
},
imessage: {
groups: {
"*": { requireMention: true },
"123": { requireMention: false }
}
},
2026-01-02 01:19:22 +01:00
routing: {
groupChat: {
mentionPatterns: ["@clawd ", "clawdbot", "\\+15555550123"],
historyLimit: 50
}
}
}
```
Notes:
- `mentionPatterns` are case-insensitive regexes.
- Surfaces that provide explicit mentions still pass; patterns are a fallback.
2026-01-06 01:38:36 +01:00
- Mention gating is only enforced when mention detection is possible (native mentions or `mentionPatterns` are configured).
2026-01-02 22:33:26 +01:00
- Discord defaults live in `discord.guilds."*"` (overridable per guild/channel).
2026-01-02 01:19:22 +01:00
2026-01-06 04:27:21 +01:00
## Group allowlists
When `whatsapp.groups` , `telegram.groups` , or `imessage.groups` is configured, the keys act as a group allowlist. Use `"*"` to allow all groups while still setting default mention behavior.
2026-01-02 01:19:22 +01:00
## Activation (owner-only)
Group owners can toggle per-group activation:
- `/activation mention`
- `/activation always`
2026-01-02 12:59:47 +01:00
Owner is determined by `whatsapp.allowFrom` (or the bot’ s self E.164 when unset). Other surfaces currently ignore `/activation` .
2026-01-02 01:19:22 +01:00
## Context fields
Group inbound payloads set:
- `ChatType=group`
- `GroupSubject` (if known)
- `GroupMembers` (if known)
- `WasMentioned` (mention gating result)
The agent system prompt includes a group intro on the first turn of a new group session.
## iMessage specifics
- Prefer `chat_id:<id>` when routing or allowlisting.
- List chats: `imsg chats --limit 20` .
- Group replies always go back to the same `chat_id` .
## WhatsApp specifics
See `docs/group-messages.md` for WhatsApp-only behavior (history injection, mention handling details).