#Cross channel communication

1 messages ยท Page 1 of 1 (latest)

tidal mantle
#

Is there a way to comunicate betwean channels. ( telegram->whatsapp->slack ) I tried sending instructions from Telegram channel to slack bot to send DM-s to some of the members and it was constantly refusing.

molten raptorBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> โœ… Mark Solution

candid berryBOT
#

Yes โ€” but there are two different things that are easy to mix up:

  1. Normal replies route back to the same channel the message came from. If you message from Telegram, OpenClawโ€™s default reply goes back to Telegram. The model doesnโ€™t โ€œbecome the Slack botโ€ automatically. Docs: https://docs.openclaw.ai/channels/channel-routing

  2. Cross-channel sending is possible through the message tool, if that tool is allowed and the destination channel is configured. For Slack DMs the target shape is usually user:U..., and the Slack app needs scopes like chat:write, im:write, users:read, etc. Docs: https://docs.openclaw.ai/cli/message and https://docs.openclaw.ai/channels/slack

So a Telegram instruction like โ€œsend this Slack DM to user:U123โ€ฆโ€ can work, but it may refuse if:

  • the agent does not have message / group:messaging in its tool allowlist
  • Slack is configured for inbound chat but the bot token/scopes donโ€™t permit DMs
  • the request looks like unsolicited outreach/spam or sending messages to other people without clear approval
  • the target is a name instead of a stable Slack user ID and directory lookup canโ€™t resolve it

Iโ€™d set this up as a narrow, explicit workflow: allow the message tool, use Slack user IDs, and phrase the request as a one-off approved send, e.g. โ€œUsing the Slack message tool, send exactly: โ€ฆ to Slack user:U123.โ€

If you want help debugging the actual refusal, paste:

  • openclaw --version
  • the exact refusal text
#
  • whether your agentโ€™s tools include group:messaging or message
  • whether the Slack app has chat:write + im:write
tidal mantle
#

is there a way to set this up. Can you explain step by step how to implement this

candid berryBOT
#

Yep. The clean setup is: one OpenClaw Gateway with Telegram/WhatsApp/Slack enabled, then give the agent permission to use the outbound message tool. Donโ€™t think of it as Telegram talking to the Slack bot directly โ€” Telegram talks to OpenClaw, and OpenClaw sends to Slack.

Step-by-step:

  1. Check version first
openclaw --version
openclaw status --all

If youโ€™re on an older/beta build, weird channel/tool behavior can be version-specific.

  1. Configure the inbound channel you want to command from

Example Telegram:

#
{
  channels: {
    telegram: {
      enabled: true,
      botToken: "123:abc",
      dmPolicy: "allowlist",
      allowFrom: ["YOUR_NUMERIC_TELEGRAM_USER_ID"]
    }
  }
}

Telegram allowFrom must be the numeric Telegram user ID, not @username.

Docs: https://docs.openclaw.ai/channels/telegram

#
  1. Configure Slack with DM-capable scopes

Use the Slack manifest from the docs. For sending DMs, make sure the Slack app has at least the relevant bot scopes like:

chat:write
im:write
im:read
users:read

The docs manifest includes the normal full set.

Config shape:

#

If your config uses tool allowlists, add group:messaging or message.

Example:

{
  tools: {
    allow: ["group:messaging"]
  }
}

If you already have a bigger allowlist, add it there instead of replacing everything. group:messaging is the group that contains the message tool.

Docs: https://docs.openclaw.ai/gateway/configuration-reference#tools

  1. Restart the Gateway
#
openclaw gateway restart

Then verify:

openclaw status --deep
  1. Test Slack sending directly before involving the agent

Use a real Slack user ID, usually like U123ABC...:

openclaw message send \
#
  --channel slack \
  --target user:U123ABC456 \
  --message "Test from OpenClaw"

If this fails, the issue is Slack config/scopes/target ID, not the model.

Docs: https://docs.openclaw.ai/cli/message

  1. Then ask from Telegram/WhatsApp with a very explicit instruction

Example:

Send a Slack DM using the message tool to user:U123ABC456. Send exactly: Hey, quick reminder about the meeting at 3.

That should route: Telegram โ†’ OpenClaw agent โ†’ Slack DM.

#

Important: if you ask it to mass-DM people, send vague outreach, or message members without clear consent, the model may refuse for safety/spam reasons. Best pattern is a narrow allowlisted workflow: exact recipients, exact message text, and preferably one-off human-approved sends.

For cross-channel routing behavior generally: https://docs.openclaw.ai/channels/channel-routing

tidal mantle
#

Slack โ”‚ ON โ”‚ OK โ”‚ tokens ok (bot config, app config) (bot xoxbโ€ฆYYV5 ยท len 59, app xappโ€ฆe43a ยท โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ len 98) ยท accounts 1/1 โ”‚
โ”‚ Telegram โ”‚ ON โ”‚ OK โ”‚ token configร—5 (8635โ€ฆjj2I ยท len 46) ยท accounts 5/5

candid berryBOT
#

Nice, that status means the channel tokens are basically healthy. So if itโ€™s still refusing, Iโ€™d look at these next:

  1. Check whether the agent is allowed to use message

Run:

openclaw config get tools

If you see a restrictive allowlist, add messaging:

{
  tools: {
    allow: ["group:messaging"]
#
  }
}

If you already have entries there, donโ€™t replace them โ€” add group:messaging alongside the existing ones.

  1. Test Slack outbound directly

This bypasses the model, so it tells us whether Slack DM sending itself works:

openclaw message send \
  --channel slack \
  --target user:U_SLACK_USER_ID \
  --message "Test from OpenClaw"
#

If that fails, itโ€™s Slack scopes/target/user ID. If it succeeds, the remaining issue is agent/tool policy or the wording/safety refusal.

  1. Be explicit from Telegram

Use Slackโ€™s stable user ID, not a display name:

Send a Slack DM using the message tool to user:U_SLACK_USER_ID. Send exactly: Hello, this is a test from Telegram via OpenClaw.

  1. Because you have Telegram accounts 5/5

If commands come from a specific Telegram account, make sure that account is routed to the same agent that has the message tool enabled. Multi-account setups can accidentally route one Telegram account to an agent/profile without messaging tools.

If you paste the output of:

openclaw config get tools
#
openclaw config get bindings

redacting tokens if any appear, I can help spot the missing piece.

tidal mantle
#

{
"profile": "messaging",
"loopDetection": {
"enabled": true
},
"message": {
"crossContext": {
"allowWithinProvider": true,
"allowAcrossProviders": true,
"marker": {
"enabled": true,
"prefix": "[from {channel}] "
}
}
}
}

candid berryBOT
#

That config looks like the right shape for cross-provider sending:

tools: {
  profile: "messaging",
  message: {
    crossContext: {
      allowAcrossProviders: true,
      marker: { enabled: true, prefix: "[from {channel}] " }
    }
  }
}

So next Iโ€™d implement/debug it like this:

  1. Restart after that config change
#
openclaw gateway restart
  1. Verify Slack can send a DM without the model involved
openclaw message send \
  --channel slack \
  --target user:U_SLACK_USER_ID \
  --message "Test from OpenClaw"

If this fails, fix Slack first. Common causes: wrong user ID, missing im:write, app not reinstalled after scopes changed.

  1. Verify Telegram โ†’ Slack using an exact instruction
#

From Telegram, send something very explicit:

Use the message tool to send a Slack DM to user:U_SLACK_USER_ID.
Send exactly: Hello, this is a Telegram โ†’ Slack test through OpenClaw.
  1. If you want Telegram โ†’ WhatsApp โ†’ Slack as separate sends

Ask for both sends explicitly:

Use the message tool twice:
1. Send this WhatsApp message to +15551234567: "Test from Telegram via OpenClaw"
2. Send this Slack DM to user:U_SLACK_USER_ID: "Test from Telegram via OpenClaw"
#

Target formats matter:

  • Slack DM: user:U...
  • Slack channel: channel:C...
  • WhatsApp DM: +15551234567
  • Telegram chat: numeric chat id or @username
  1. Important: your config permits cross-provider tool use, but it does not create an automatic bridge by itself

Meaning: a Telegram message wonโ€™t automatically forward to Slack unless the agent is instructed to do it, or you build a standing workflow around it.

For a reliable โ€œbridge commandโ€, add a standing instruction in your agent/workspace like:

When I ask to "forward to Slack", use the message tool with channel=slack. Require an explicit Slack `user:...` or `channel:...` target and exact message text. Do not guess recipients.
  1. If it still refuses
tidal mantle
#

i want to say like this on telegram hey agent send a messag to "Some person" on slack. Just say Hello from Openclaw.
is That possible

candid berryBOT
#

Yes โ€” possible, with one caveat: Slack display names are messy. The reliable version is using the Slack user ID (user:U...).

Best setup:

  1. First find the Slack user ID for โ€œSome personโ€. In Slack it usually looks like U123ABC456.
  2. Then from Telegram say:
Hey agent, send a Slack DM to user:U123ABC456. Say exactly: Hello from OpenClaw.

That should work if:

  • Slack outbound test works
  • tools.profile: "messaging" is active for the Telegram-routed agent
  • tools.message.crossContext.allowAcrossProviders: true is loaded

If you want to say the human-friendly version:

#
Hey agent, send a message to Some Person on Slack. Just say: Hello from OpenClaw.

โ€ฆit may work only if OpenClaw/Slack directory lookup can resolve that person unambiguously. If there are duplicate names, nicknames, stale cache, or the Slack app lacks user lookup access, the agent should ask you for the exact user:U... ID instead of guessing.

My recommendation: create a small contact note in your workspace/agent instructions, like:

Slack contacts:
- Some Person = user:U123ABC456

Then your natural Telegram command can be short, and the agent has a stable ID to use. ๐Ÿฆž

tidal mantle
#

i am encountering the same issue on the cross channel messaging. When i try to send a message from telegram to whatsapp i get this error
18:26:16-04:00 error [tools] message failed: Error: No active WhatsApp Web listener (account: 8635213747). Start the gateway, then link WhatsApp with: openclaw channels login --channel whatsapp --account 8635213747. raw_params={"action":"send","channel":"whatsapp","target":"+38761877000","message":"hello"}
Log tail truncated (increase --max-bytes).

candid berryBOT
#

This one is not a cross-channel permission problem anymore โ€” the message tool got as far as WhatsApp, then WhatsApp said: โ€œI donโ€™t have an active linked WhatsApp Web session for account 8635213747.โ€

That account id looks suspiciously like your Telegram account id being carried into the WhatsApp send. WhatsApp needs its own linked account/listener.

Do this:

  1. Check what WhatsApp accounts OpenClaw knows about:
openclaw config get channels.whatsapp
openclaw status --deep
  1. If you actually want WhatsApp account 8635213747, link it:
#
openclaw channels login --channel whatsapp --account 8635213747
openclaw gateway restart
  1. More likely: set WhatsApp to the account you actually linked, usually default or whatever appears in your WhatsApp config:
{
  channels: {
    whatsapp: {
      defaultAccount: "default"
    }
  }
}
#

Then restart:

openclaw gateway restart
  1. Test WhatsApp outbound directly, bypassing Telegram/the model:
openclaw message send \
  --channel whatsapp \
  --account default \
  --target +REDACTED_NUMBER \
  --message "hello"

If your WhatsApp account is not default, replace it with the real account id.

#
  1. From Telegram, make the agent specify the WhatsApp account explicitly:
Use the message tool to send a WhatsApp message with accountId "default" to +REDACTED_NUMBER. Say exactly: hello

If that works, the fix is to make your standing instruction include: โ€œWhen sending WhatsApp messages from Telegram, use WhatsApp accountId default.โ€

Also please run/paste this if it still fails:

openclaw --version
openclaw config get channels.whatsapp
openclaw message send --channel whatsapp --account default --target +REDACTED_NUMBER --message "hello" --verbose

Redact phone numbers/tokens before posting. ๐Ÿฆž

tidal mantle
#

OpenClaw 2026.5.7 (eeef486)
{
"accounts": {
"default": {
"enabled": true
}
},
"enabled": true,
"dmPolicy": "allowlist",
"allowFrom": [
"+38761877000",
"+38762409924"
],
"blockStreaming": true,
"groupPolicy": "allowlist",
"debounceMs": 0,
"mediaMaxMb": 50
}

candid berryBOT
#

Thanks โ€” that confirms WhatsApp is configured as account default, but the failed tool call tried account 8635213747.

So the problem is account selection, not the phone number allowlist.

Try this direct test first:

openclaw message send \
  --channel whatsapp \
  --account default \
  --target +38761877000 \
  --message "hello from OpenClaw"

If that works, then from Telegram say:

#
Use the message tool to send a WhatsApp message using accountId "default" to +38761877000. Send exactly: hello from OpenClaw

Why this happened: the inbound Telegram account id is 8635213747, and it looks like the model/tool call reused that as the outbound WhatsApp account. But your WhatsApp listener is only registered as default, so WhatsApp correctly says thereโ€™s no active listener for 8635213747.

For a durable fix, add a standing instruction to the agent, for example in AGENTS.md or your workspace instructions:

When sending WhatsApp messages via the message tool, always use accountId "default" unless the user explicitly provides a different WhatsApp account id.

If the direct test with --account default fails too, then the WhatsApp Web listener isnโ€™t actually active yet โ€” run:

openclaw channels login --channel whatsapp --account default
#
openclaw gateway restart
openclaw status --deep

But based on your config, Iโ€™d bet the explicit accountId: "default" fixes the cross-channel send.

tidal mantle
#

โ—‡ Config warnings โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ โ”‚
โ”‚ - plugins.entries.whatsapp: plugin whatsapp: blocked plugin candidate: suspicious โ”‚
โ”‚ ownership (/data/.openclaw/npm/node_modules/@openclaw/whatsapp, uid=1000, expected โ”‚
โ”‚ uid=0 or root) โ”‚
โ”‚ - plugins.entries.whatsapp: plugin present but blocked: whatsapp (see preceding plugin โ”‚
โ”‚ warning; source: /data/.openclaw/npm/node_modules/@openclaw/whatsapp; fix the blocked โ”‚
โ”‚ plugin path instead of removing config) โ”‚
โ”‚ - plugins.allow: plugin present but blocked: whatsapp (see preceding plugin warning; โ”‚
โ”‚ source: /data/.openclaw/npm/node_modules/@openclaw/whatsapp; fix the blocked plugin โ”‚
โ”‚ path instead of removing config) โ”‚
โ”‚ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
โ”‚
โ—‡
Error: Channel is unavailable: whatsapp
root@bdf3dd688352:~#

candid berryBOT
#

Yep โ€” this explains the new failure.

WhatsApp is configured, but the WhatsApp plugin is being blocked before it loads:

suspicious ownership (.../@openclaw/whatsapp, uid=1000, expected uid=0 or root)
Error: Channel is unavailable: whatsapp

Youโ€™re running the CLI as root inside the container, but the plugin files under /data/.openclaw/npm/node_modules/@openclaw/whatsapp are owned by UID 1000. OpenClaw blocks that as a plugin safety check, so the WhatsApp channel never becomes available.

Fix one of these two ways:

Option A โ€” if the container/gateway runs as root

#
chown -R root:root /data/.openclaw/npm/node_modules/@openclaw/whatsapp
openclaw gateway restart

Then verify:

openclaw status --deep
openclaw message send --channel whatsapp --account default --target +38761877000 --message "hello"

Option B โ€” better long-term if your /data volume is owned by UID 1000

Run the OpenClaw container/process as UID 1000 instead of root, so the current process UID matches the plugin ownership. In Docker setups this usually means setting the container user / OpenClaw docker.user to the same UID:GID as the mounted /data volume.

Docs mention the same ownership principle here: https://docs.openclaw.ai/install/docker#troubleshooting