2026-01-02 01:19:22 +01:00
---
2026-01-06 06:40:42 +00:00
summary: "Group chat behavior across surfaces (WhatsApp/Telegram/Discord/Slack/Signal/iMessage)"
2026-01-02 01:19:22 +01:00
read_when:
- Changing group chat behavior or mention gating
---
# Groups
2026-01-06 06:40:42 +00:00
Clawdbot treats group chats consistently across surfaces: WhatsApp, Telegram, Discord, Slack, Signal, iMessage.
2026-01-02 01:19:22 +01:00
2026-01-10 19:56:43 +01:00
## Beginner intro (2 minutes)
Clawdbot “lives” on your own messaging accounts. There is no separate WhatsApp bot user.
If **you** are in a group, Clawdbot can see that group and respond there.
Default behavior:
- Groups are allowed (`groupPolicy: "open"` ).
- Replies require a mention unless you explicitly disable mention gating.
Translation: anyone in the group can trigger Clawdbot by mentioning it.
> TL;DR
> - **DM access** is controlled by `*.allowFrom`.
> - **Group access** is controlled by `*.groupPolicy` + allowlists (`*.groups`, `*.groupAllowFrom`).
> - **Reply triggering** is controlled by mention gating (`requireMention`, `/activation`).
Quick flow (what happens to a group message):
```
groupPolicy? disabled -> drop
groupPolicy? allowlist -> group allowed? no -> drop
requireMention? yes -> mentioned? no -> store for context only
otherwise -> reply
```
2026-01-10 20:05:18 +01:00

2026-01-10 19:56:43 +01:00
If you want...
| Goal | What to set |
|------|-------------|
| Allow all groups but only reply on @mentions | `groups: { "*": { requireMention: true } }` |
| Disable all group replies | `groupPolicy: "disabled"` |
| Only specific groups | `groups: { "<group-id>": { ... } }` (no `"*"` key) |
| Only you can trigger in groups | `groupPolicy: "allowlist"` , `groupAllowFrom: ["+1555..."]` |
2026-01-02 01:19:22 +01:00
## Session keys
2026-01-06 18:25:52 +00:00
- Group sessions use `agent:<agentId>:<provider>:group:<id>` session keys (rooms/channels use `agent:<agentId>:<provider>:channel:<id>` ).
2026-01-07 02:10:56 +00:00
- Telegram forum topics add `:topic:<threadId>` to the group id so each topic has its own session.
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
2026-01-06 18:25:52 +00:00
- UI labels use `displayName` when available, formatted as `<provider>:<token>` .
2026-01-02 10:14:58 +01:00
- `#room` is reserved for rooms/channels; group chats use `g-<slug>` (lowercase, spaces -> `-` , keep `#@+._-` ).
2026-01-06 06:40:42 +00:00
## Group policy
Control how group/room messages are handled per provider:
2026-01-06 01:41:19 -03:00
```json5
{
whatsapp: {
2026-01-06 06:40:42 +00:00
groupPolicy: "disabled", // "open" | "disabled" | "allowlist"
groupAllowFrom: ["+15551234567"]
2026-01-06 01:41:19 -03:00
},
telegram: {
2026-01-06 06:40:42 +00:00
groupPolicy: "disabled",
groupAllowFrom: ["123456789", "@username "]
},
signal: {
groupPolicy: "disabled",
groupAllowFrom: ["+15551234567"]
},
imessage: {
groupPolicy: "disabled",
groupAllowFrom: ["chat_id:123"]
},
discord: {
groupPolicy: "allowlist",
guilds: {
"GUILD_ID": { channels: { help: { allow: true } } }
}
},
slack: {
groupPolicy: "allowlist",
channels: { "#general ": { allow: true } }
2026-01-06 01:41:19 -03:00
}
}
```
| Policy | Behavior |
|--------|----------|
2026-01-06 06:40:42 +00:00
| `"open"` | Default. Groups bypass allowlists; mention-gating still applies. |
2026-01-06 01:41:19 -03:00
| `"disabled"` | Block all group messages entirely. |
2026-01-06 06:40:42 +00:00
| `"allowlist"` | Only allow groups/rooms that match the configured allowlist. |
2026-01-06 01:41:19 -03:00
Notes:
- `groupPolicy` is separate from mention-gating (which requires @mentions ).
2026-01-06 06:40:42 +00:00
- WhatsApp/Telegram/Signal/iMessage: use `groupAllowFrom` (fallback: explicit `allowFrom` ).
- Discord: allowlist uses `discord.guilds.<id>.channels` .
- Slack: allowlist uses `slack.channels` .
- Group DMs are controlled separately (`discord.dm.*` , `slack.dm.*` ).
- Telegram allowlist can match user IDs (`"123456789"` , `"telegram:123456789"` , `"tg:123456789"` ) or usernames (`"@alice"` or `"alice"` ); prefixes are case-insensitive.
2026-01-06 01:41:19 -03:00
2026-01-10 19:56:43 +01:00
Quick mental model (evaluation order for group messages):
1) `groupPolicy` (open/disabled/allowlist)
2) group allowlists (`*.groups` , `*.groupAllowFrom` , provider-specific allowlist)
3) mention gating (`requireMention` , `/activation` )
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-09 12:44:23 +00:00
agents: {
list: [
{
id: "main",
groupChat: {
mentionPatterns: ["@clawd ", "clawdbot", "\\+15555550123"],
historyLimit: 50
}
}
]
2026-01-02 01:19:22 +01:00
}
}
```
Notes:
- `mentionPatterns` are case-insensitive regexes.
- Surfaces that provide explicit mentions still pass; patterns are a fallback.
2026-01-09 12:44:23 +00:00
- Per-agent override: `agents.list[].groupChat.mentionPatterns` (useful when multiple agents share a group).
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-10 19:19:22 +01:00
- Group history context is wrapped uniformly across providers; use `messages.groupChat.historyLimit` for the global default and `<provider>.historyLimit` (or `<provider>.accounts.*.historyLimit` ) for overrides. Set `0` to disable.
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-10 19:56:43 +01:00
Common intents (copy/paste):
1) Disable all group replies
```json5
{
whatsapp: { groupPolicy: "disabled" }
}
```
2) Allow only specific groups (WhatsApp)
```json5
{
whatsapp: {
groups: {
"123@g .us": { requireMention: true },
"456@g .us": { requireMention: false }
}
}
}
```
3) Allow all groups but require mention (explicit)
```json5
{
whatsapp: {
groups: { "*": { requireMention: true } }
}
}
```
4) Only the owner can trigger in groups (WhatsApp)
```json5
{
whatsapp: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
groups: { "*": { requireMention: true } }
}
}
```
2026-01-02 01:19:22 +01:00
## Activation (owner-only)
Group owners can toggle per-group activation:
- `/activation mention`
- `/activation always`
2026-01-06 14:17:56 -06:00
Owner is determined by `whatsapp.allowFrom` (or the bot’ s self E.164 when unset). Send the command as a standalone message. 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)
2026-01-07 02:10:56 +00:00
- Telegram forum topics also include `MessageThreadId` and `IsForum` .
2026-01-02 01:19:22 +01:00
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
2026-01-10 14:51:21 -06:00
See [Group messages ](/concepts/group-messages ) for WhatsApp-only behavior (history injection, mention handling details).