
Hey automation builders — if you're wiring up OpenClaw to Telegram and wondering how routing actually works when messages start flying in from DMs, groups, and topics, stick around.
I spent the last two weeks running OpenClaw through Telegram in three different setups: personal DMs, team groups, and forum topics. Not demo scenarios. Real routing tests where I deliberately broke session isolation, flooded it with concurrent requests, and watched how the Gateway handled multi-account configs.
The question I kept coming back to: Can this actually maintain clean session boundaries when you're juggling multiple chats, or does it all collapse into one messy conversation thread?
Here's what I found, plus the exact config patterns that survived.
For context, OpenClaw (previously Moltbot and Clawdbot) gained over 100,000 GitHub stars in early 2026 as an open-source autonomous AI assistant. Created by Peter Steinberger, it connects messaging platforms like Telegram to AI agents running locally or on private servers.

Every OpenClaw Telegram setup starts with @BotFather, Telegram's official bot creation interface. This hasn't changed since Telegram launched bots — it's still the only way to generate API tokens.
What you'll need:

/start to see available commands/newbot
bot (e.g., YourProjectBot)123456789:ABCdefGHIjklMNOpqrsTUVwxyz/revoke in BotFather to generate a new oneCritical BotFather settings (optional but recommended):
/setjoingroups → Allow/deny adding bot to groups
/setprivacy → OFF = bot sees all group messages
ON = bot only sees mentions and commands
I learned this the hard way: if you set privacy to ON and wonder why your bot ignores group messages, that's why. OpenClaw's routing expects full message access by default.
Getting the token into OpenClaw is where most setup guides stop — but that's where real testing should start.
OpenClaw supports two token input methods:
Environment variable (quick testing):
export TELEGRAM_BOT_TOKEN="your_token_here"
openclaw gateway
Config file (production approach):
{
"channels": {
"telegram": {
"enabled": true,
"botToken": "123456789:ABCdefGHIjklMNOpqrsTUVwxyz",
"dmPolicy": "pairing"
}
}
}
Here's the sequence I run every time to confirm the Gateway actually sees Telegram updates:
openclaw gateway --log-level debug
/start to your bot in Telegram
dmPolicy: "pairing"openclaw logs --follow
Common failure point: Bot token typo. If you see 401 Unauthorized in logs, regenerate the token in BotFather and update your config. Don't waste an hour troubleshooting like I did.
Security note: For production deployments, consider using DigitalOcean's hardened OpenClaw image which includes firewall rules, container isolation, and non-root execution by default.

OpenClaw's command system is where routing logic starts to matter. The Gateway recognizes slash commands across all channels, but Telegram adds its own command autocomplete layer.
The official OpenClaw repository documents the full command set, but after real-world testing, only a handful prove essential.
These are the commands I actually use in production setups (not the full list — just what survives real usage):
Important: /activation always only affects the current session. To persist it, add it to your config's requireMention settings.
This is what makes your bot feel native in Telegram:
/mybots → Select your bot → Edit Commandsnew - Start fresh sessionstatus - Check session statehelp - Show all commands
/ autocomplete menuReality check: I initially set up 15 commands. After two weeks, I only use 4. Start minimal.
For deeper understanding of Telegram's bot architecture, see the official Telegram Bot tutorial which covers the Bot API fundamentals.

This is where OpenClaw's session architecture either makes sense or falls apart. Session keys determine whether conversations stay isolated or bleed together.
OpenClaw generates session keys using this pattern:
agent:<agentId>:telegram:<chatType>:<chatId>[:topic:<topicId>]
Breakdown:
main sessiontelegram:group:<chatId>):topic:<threadId> suffix)Here's a real config I ran for testing three separate Telegram bots routing to different agents:
{
"channels": {
"telegram": {
"accounts": [
{
"name": "personal",
"botToken": "token1...",
"routing": { "agent": "main" }
},
{
"name": "work",
"botToken": "token2...",
"routing": { "agent": "work-agent" }
},
{
"name": "testing",
"botToken": "token3...",
"routing": { "agent": "sandbox" }
}
]
}
}
}
Each account routes to a separate agent workspace with independent memory and tools. No cross-contamination.
Default behavior: groups require @mention to trigger responses. Override per-group:
{
"channels": {
"telegram": {
"groups": {
"*": { "requireMention": true },
"-1001234567890": {
"requireMention": false
}
}
}
}
}
Group ID discovery: Add bot to group, send a message, check openclaw logs --follow for the chat.id value (always negative for groups).

Telegram forums add message_thread_id to messages. OpenClaw appends :topic:<threadId> to session keys automatically.
Critical edge case I hit: Topic ID 1 (general topic) requires special handling. OpenClaw omits message_thread_id when sending to topic 1 because Telegram rejects it.
Config example for per-topic system prompts:
{
"telegram": {
"groups": {
"-1003595003457": {
"requireMention": false,
"topics": {
"14": {
"requireMention": false,
"systemPrompt": "You are a coding assistant."
},
"27": {
"systemPrompt": "You focus on deployment issues."
}
}
}
}
}
}
Each topic maintains isolated conversation history.
When messages disappear into the void, it's usually one of these three culprits.
/mybots → Your Bot → Bot Settings → Group Privacy → OFF
openclaw logs --follow | grep "skipping group message"
channels.telegram.groups is defined, unlisted groups are ignored.openclaw logs --level debug --filter telegram
I run this sequence weekly to catch routing drift:
# List active sessions
openclaw sessions list
# Check specific session state
openclaw sessions show <sessionKey>
# Force session cleanup (last resort)
openclaw sessions prune --older-than 7d
When sessions leak: If you see context bleeding between chats, it's usually a config error where multiple chats map to the same session key. Review channels.telegram.accounts[].routing.agent settings.
After two weeks of daily use across three different Telegram setups, here's what survived:
{
"channels": {
"telegram": {
"enabled": true,
"botToken": "env:TELEGRAM_BOT_TOKEN",
"dmPolicy": "pairing",
"groups": {
"*": { "requireMention": true }
}
}
}
}
Why this works:
/new, /status, /help — Users forget themOpenClaw Telegram routing is solid for:
It gets messy when:
Security reminder: As noted in security analysis, OpenClaw stores session transcripts and credentials locally. Treat your ~/.openclaw directory as sensitive — use encrypted drives and restrict file permissions.
If OpenClaw + Telegram gets you where you need to go, run with it. Just keep session keys clean and know which groups get which agent.
At Macaron, we handle the same routing challenges automatically — session isolation across platforms, no manual config patching when you add channels. If you want to test multi-platform routing without rebuilding configs every time you scale, try it with a real workflow and see how it handles your setup.
FAQ
Q: My bot isn't responding to group messages at all. Where do I check first? BotFather privacy settings. If it's set to ON, the bot only sees direct @mentions — everything else gets silently dropped. Go to BotFather → /mybots → Bot Settings → Group Privacy → turn it OFF. This is the most common "why isn't it working" for group setups.
Q: How do I find my group's chat ID? Add the bot to the group, send any message, then run openclaw logs --follow. The chat.id shows up in the incoming update — it'll be a negative number for groups. That's the value you put in your whitelist config.
Q: Do I need a separate bot token for each Telegram account I'm routing? Yes. Each entry in channels.telegram.accounts[] needs its own BotFather token. One token, one bot identity. If you're running multiple bots and things are bleeding together, the OpenClaw gateway config reference breaks down how account-level routing isolation actually works.
Q: Forum topics — do I need to configure each one manually? Only if you want per-topic system prompts. OpenClaw handles the session key isolation automatically (:topic:<threadId> suffix), so conversations stay separate without any config. Manual setup is only needed when you want different agent behavior per topic.
Q: Sessions keep losing context after Gateway restarts. Is that expected? By default, yes — session state doesn't persist across restarts unless you've configured persistence. If that's a dealbreaker for your use case, check the OpenClaw quick start guide for the persistence options available at the Gateway level.
Q: I'm setting this up on a VPS. Anything Telegram-specific I should know? Make sure your server's outbound connections to api.telegram.org aren't blocked — some cheap VPS providers restrict this. Beyond that, the usual hardening applies: non-root execution, firewall rules, token in env vars not hardcoded. The OpenClaw VPS deployment guide covers the full setup if you're starting from scratch.
Q: I used to run Moltbot for Telegram. Is migration straightforward? Mostly yes, but the config structure changed. If you hit conflicts or unexpected behavior after switching, the Moltbot Telegram setup comparison is worth checking — it maps out what changed between the two.