Channels & routing
OpenClaw routes replies back to the channel where a message came from. The model does not choose a channel; routing is deterministic and controlled by the host configuration.Key terms
- Channel:
whatsapp,telegram,discord,slack,signal,imessage,webchat. - AccountId: per‑channel account instance (when supported).
- Optional channel default account:
channels.<channel>.defaultAccountchooses which account is used when an outbound path does not specifyaccountId. - AgentId: an isolated workspace + session store (“brain”).
- SessionKey: the bucket key used to store context and control concurrency.
Session key shapes (examples)
Direct messages collapse to the agent’s main session:agent:<agentId>:<mainKey>(default:agent:main:main)
- Groups:
agent:<agentId>:<channel>:group:<id> - Channels/rooms:
agent:<agentId>:<channel>:channel:<id>
- Slack/Discord threads append
:thread:<threadId>to the base key. - Telegram forum topics embed
:topic:<topicId>in the group key.
agent:main:telegram:group:-1001234567890:topic:42agent:main:discord:channel:123456:thread:987654
Main DM route pinning
Whensession.dmScope is main, direct messages may share one main session.
To prevent the session’s lastRoute from being overwritten by non-owner DMs,
OpenClaw infers a pinned owner from allowFrom when all of these are true:
allowFromhas exactly one non-wildcard entry.- The entry can be normalized to a concrete sender ID for that channel.
- The inbound DM sender does not match that pinned owner.
lastRoute.
Routing rules (how an agent is chosen)
Routing picks one agent for each inbound message:- Exact peer match (
bindingswithpeer.kind+peer.id). - Parent peer match (thread inheritance).
- Guild + roles match (Discord) via
guildId+roles. - Guild match (Discord) via
guildId. - Team match (Slack) via
teamId. - Account match (
accountIdon the channel). - Channel match (any account on that channel,
accountId: "*"). - Default agent (
agents.list[].default, else first list entry, fallback tomain).
peer, guildId, teamId, roles), all provided fields must match for that binding to apply.
The matched agent determines which workspace and session store are used.
Broadcast groups (run multiple agents)
Broadcast groups let you run multiple agents for the same peer when OpenClaw would normally reply (for example: in WhatsApp groups, after mention/activation gating). Config:Config overview
agents.list: named agent definitions (workspace, model, etc.).bindings: map inbound channels/accounts/peers to agents.
Session storage
Session stores live under the state directory (default~/.openclaw):
~/.openclaw/agents/<agentId>/sessions/sessions.json- JSONL transcripts live alongside the store
session.store and {agentId} templating.
WebChat behavior
WebChat attaches to the selected agent and defaults to the agent’s main session. Because of this, WebChat lets you see cross‑channel context for that agent in one place.Reply context
Inbound replies include:ReplyToId,ReplyToBody, andReplyToSenderwhen available.- Quoted context is appended to
Bodyas a[Replying to ...]block.