OpenClaw WhatsApp is a linked-device WhatsApp Web channel. The gateway owns the active WhatsApp session.
1. Choose the Right Setup Mode
For sandbox testing on your own phone number, use the personal-number path:dmPolicy: "allowlist"allowFromincludes your own phone numberselfChatMode: truegroupPolicy: "disabled"during the first test
pairing is not the best first setup.
2. Add the WhatsApp Config
Use this exact order.channels.whatsapp.dmPolicy="allowlist" is validated immediately, so if you set it before allowFrom, OpenClaw will reject the change.
+15551234567 with the same phone number you linked in WhatsApp.
3. Link WhatsApp
Run:- Open WhatsApp
- Go to
Settings - Open
Linked Devices - Tap
Link a Device - Scan the QR code in the sandbox terminal
Linked after restart; web session ready., that is normal.
4. Start the Gateway
In the sandbox container, the simplest path is:- the gateway keeps running in the background
- you can keep using the same terminal
- logs go to
~/.openclaw/logs/gateway-sandbox.log
- WhatsApp shows linked
- a log line showing the WhatsApp web session is ready
5. Test Self-Chat
In WhatsApp on your phone:- Open
Message yourself - Send
hello
openclaw gateway, leave that terminal open and use a second terminal for logs:
nohup ... &, you can use the same terminal for:
Troubleshooting
dmPolicy="allowlist" requires ... allowFrom: SetallowFromfirst, thenselfChatMode, thendmPolicy.channels.whatsapp: Unrecognized key: "streaming": Remove that key. WhatsApp does not support it in OpenClaw.- QR login succeeded but no replies arrive:
Make sure
openclaw gatewayis still running and checkopenclaw channels status. - You previously tested Cue WhatsApp on the same number: Stop or log out the other runtime first so OpenClaw is the only active WhatsApp listener.
openclaw gateway restartsays the service is disabled: That is expected in the sandbox container. Useopenclaw gatewayin the foreground instead.
WhatsApp channel auth and model auth are separate. If the channel links successfully but the assistant still does not answer, finish the model-auth step next.