> channels

Channels are the messaging surfaces your agent answers on — Telegram, WhatsApp, Discord, Slack, Signal, iMessage, and more, all served by one gateway simultaneously. Some are just a token (Telegram), some link by QR (WhatsApp), and some need an external bridge (Signal via signal-cli, iMessage via a BlueBubbles Mac). Unknown senders are gated by dmPolicy, which defaults to pairing: they get a one-time code you approve with openclaw pairing approve.

// channels

7 commands

// faq

Which channel is fastest to set up?

Telegram. It needs no plugin — create a bot with @BotFather, set channels.telegram.botToken (or the TELEGRAM_BOT_TOKEN env var), start the gateway, and DM the bot. WhatsApp is next but requires QR pairing and stores more state on disk. Signal and iMessage need external bridges, so they take the most setup.

How do I connect WhatsApp?

Run openclaw channels add --channel whatsapp (it installs the @openclaw/whatsapp plugin on first use), then openclaw channels login --channel whatsapp and scan the QR from your phone. Credentials are stored at ~/.openclaw/credentials/whatsapp/<account>/creds.json via Baileys. Login is QR-only, so on a headless host you must deliver the live QR to your phone before it expires.

Do Signal and iMessage work on a Linux server?

Not by themselves. Signal talks through a local signal-cli registered to a phone number, and iMessage requires an always-on macOS machine running a BlueBubbles server. Telegram, Discord, and Slack are self-contained bot APIs and run anywhere the gateway does.

Why does my Discord bot not see any messages?

Almost always a missing Message Content Intent — it is a privileged intent you must enable in the Discord Developer Portal, not just in OpenClaw. Enable Server Members too for role-based routing, reference the token as channels.discord.token = { source: "env", id: "DISCORD_BOT_TOKEN" }, and verify with openclaw channels status --probe.

Someone messaged my bot but it did not reply — why?

DM channels default to dmPolicy: pairing, so an unknown sender's messages are held until you approve their one-time code. Run openclaw pairing list <channel> to see pending codes and openclaw pairing approve <channel> <code> to let them in. Codes expire after one hour.