#Telegram working as a one way connection,
1 messages · Page 1 of 1 (latest)
If OpenClaw can send to Telegram but won’t react to your replies, 90% of the time it’s not “broken” — it’s being intentionally gated by policy.
Two quick questions first (because the fix differs):
- Are you replying to the bot in a DM, or in a group?
- What does
openclaw --versionprint?
If this is a DM (most common)
Telegram DMs default to dmPolicy: "pairing", which means: OpenClaw will see your messages in logs but ignore them until you approve the pairing.
Run:
openclaw pairing list telegram- then approve the shown code:
openclaw pairing approve telegram <CODE>
Docs: https://docs.openclaw.ai/channels/pairing
Telegram channel docs: https://docs.openclaw.ai/channels/telegram
If you don’t want pairing, set DM policy to allowlist and explicitly allow yourself (token redacted), then restart the gateway:
channels: {
telegram: {
dmPolicy: "allowlist",
allowFrom: ["<your_telegram_user_id_or_username>"]
}
}
(Per docs, allowFrom accepts numeric user IDs and usernames; tg: / telegram: prefixes also work.)
If this is a group
By default, group chats often require a mention to trigger, and Telegram privacy mode can hide messages from the bot.
Check these:
- Try mentioning the bot in the group (
@YourBotName hello) - If you want it to respond without mentions, set (for that group)
requireMention: false:
https://docs.openclaw.ai/channels/telegram (see “groups” + “requireMention”)
- In BotFather:
/setprivacy→ set to OFF
Important: after changing privacy mode, remove + re-add the bot to the group so Telegram applies it (docs call this out).
If you want me to pinpoint it fast
Paste (redact tokens) the few log lines around when you send a message from Telegram while running:
openclaw logs --follow
And tell me whether it’s DM vs group + your openclaw --version.
Ok I shall try these fixes now and report on how it went
Cool — when you test, do it in this order (fastest signal first):
- DM test: send the bot “ping”
- immediately run
openclaw pairing list telegram - if you see a pending request/code →
openclaw pairing approve telegram <CODE> - then DM again and see if it responds
- If it’s a group: try
@YourBotUsername ping(explicit mention). If that works, it’s just mention/privacy gating.
If it still doesn’t process inbound after pairing/mention, paste:
- your
openclaw --version - ~10 lines of
openclaw logs --followaround the inbound Telegram message (redact tokens/paths if you want)
and I’ll help you pinpoint what it’s dropping on.
🦞 OpenClaw 2026.2.12 (f9e444d)
I'm like tmux: confusing at first, then suddenly you can't live without me.
No pending telegram pairing requests.
root@srv1331671:~#
Nice, version helps: you’re on 2026.2.12.
If openclaw pairing list telegram shows no pending requests, then one of these is true:
- You’re not in pairing mode (e.g.
dmPolicy: "allowlist"or"disabled"), so no pairing request will ever appear, and your inbound DMs will be silently dropped unless you’re inallowFrom. - You’re messaging in a group, and it’s being dropped due to mention/privacy rules (pairing is DM-only).
Fastest way to pinpoint: grab the “drop reason” from logs
Run this, then send the bot “test” from Telegram:
openclaw logs --follow
Paste the few log lines that mention Telegram and include fields like chat.type, from.id, and any wording like allowlist / pairing / requireMention / dropped / unauthorized.
Also run the probe (it often prints the exact failure signature)
openclaw channels status --probe
Paste the Telegram section.
One super common config mismatch
If your config is:
channels.telegram.dmPolicy: "allowlist"(or similar)- but
channels.telegram.allowFromdoes not include your Telegram user (numeric id or username)
…then OpenClaw will notice updates but not process them. The logs will show your from.id — that’s the value you need to add to allowFrom (Telegram docs mention this flow): https://docs.openclaw.ai/channels/telegram
Two quick clarifiers so I can tell you the right fix immediately:
- Are you testing in a DM with the bot, or a group?
- Does OpenClaw respond normally on other channels (e.g. Discord), and it’s only Telegram inbound that’s dead?
11:08:07 error telegram/api {"subsystem":"telegram/api"} telegram message failed: Call to 'sendMessage' failed! (400: Bad Request: chat not found)
11:08:07 error Delivery failed (telegram to heartbeat): Error: Telegram send failed: chat not found (chat_id=@heartbeat). Likely: bot not started in DM, bot removed from group/channel, group migrated (new -100… id), or wrong bot token. Input was: "heartbeat".
11:08:07 debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1771068087586,"delayMs":60000,"clamped":true} cron: timer armed
11:08:08 debug diagnostic {"subsystem":"diagnostic"} lane enqueue: lane=session:agent:main:main queueSize=1
11:08:08 debug diagnostic {"subsystem":"diagnostic"} lane dequeue: lane=session:agent:main:main waitMs=1 queueSize=0
That log snippet is actually showing an outbound problem from the heartbeat, not your inbound Telegram message:
sendMessage ... (400: Bad Request: chat not found)
chat_id=@heartbeat
In Telegram, sendMessage needs a real chat id (usually a number, like 123456789 or a group -100...). @something only works for certain public channels/groups with usernames, and doesn’t work for “DM a user by username”.
Fix the @heartbeat mis-target first (it’s definitely broken)
Check what your heartbeat target/to is set to:
openclaw config get agents.defaults.heartbeat
If you see something like target: "telegram" + to: "@heartbeat", change it to one of these:
Option A (recommended): deliver heartbeats to wherever you last talked to the bot
openclaw config set agents.defaults.heartbeat.target "last"
openclaw config unset agents.defaults.heartbeat.to
openclaw gateway restart
Option B: hardcode it to your Telegram DM chat id (numeric)
- Run
openclaw logs --follow - DM the bot from your Telegram account (send “id test”)
- In logs, grab
chat.id(orfrom.id) number - Set:
openclaw config set agents.defaults.heartbeat.target "telegram"
openclaw config set agents.defaults.heartbeat.to "<THE_NUMBER>"
openclaw gateway restart