brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
whatsapp-ultimateThe most comprehensive WhatsApp skill for AI agents. Full messaging (text, media, polls, stickers, voice), reactions, replies, edits, unsend, and complete group management. Native Baileys integration - no external services required.
Independent GitHub snapshot · Automated classification · Original documentation governs
Everything you can do in WhatsApp, your AI agent can do too.
This skill documents all WhatsApp capabilities available through OpenClaw's native channel integration. No external Docker services, no CLI wrappers — just direct WhatsApp Web protocol via Baileys.
openclaw whatsapp login)| Category | Features |
|---|---|
| Messaging | Text, media, polls, stickers, voice notes, GIFs |
| Interactions | Reactions, replies/quotes, edit, unsend |
| Groups | Create, rename, icon, description, participants, admin, invite links |
Total: 22 distinct actions
message action=send channel=whatsapp to="+34612345678" message="Hello!"
message action=send channel=whatsapp to="+34612345678" message="Check this out" filePath=/path/to/image.jpg
Supported: JPG, PNG, GIF, MP4, PDF, DOC, etc.
message action=poll channel=whatsapp to="+34612345678" pollQuestion="What time?" pollOption=["3pm", "4pm", "5pm"]
message action=sticker channel=whatsapp to="+34612345678" filePath=/path/to/sticker.webp
Must be WebP format, ideally 512x512.
message action=send channel=whatsapp to="+34612345678" filePath=/path/to/audio.ogg asVoice=true
Critical: Use OGG/Opus format for WhatsApp voice notes. MP3 may not play correctly.
message action=send channel=whatsapp to="+34612345678" filePath=/path/to/animation.mp4 gifPlayback=true
Convert GIF to MP4 first (WhatsApp requires this):
ffmpeg -i input.gif -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4 -y
message action=react channel=whatsapp chatJid="34612345678@s.whatsapp.net" messageId="ABC123" emoji="🚀"
message action=react channel=whatsapp chatJid="34612345678@s.whatsapp.net" messageId="ABC123" remove=true
message action=reply channel=whatsapp to="34612345678@s.whatsapp.net" replyTo="QUOTED_MSG_ID" message="Replying to this!"
message action=edit channel=whatsapp chatJid="34612345678@s.whatsapp.net" messageId="ABC123" message="Updated text"
message action=unsend channel=whatsapp chatJid="34612345678@s.whatsapp.net" messageId="ABC123"
message action=group-create channel=whatsapp name="Project Team" participants=["+34612345678", "+34687654321"]
message action=renameGroup channel=whatsapp groupId="123456789@g.us" name="New Name"
message action=setGroupIcon channel=whatsapp groupId="123456789@g.us" filePath=/path/to/icon.jpg
message action=setGroupDescription channel=whatsapp groupJid="123456789@g.us" description="Team chat for Q1 project"
message action=addParticipant channel=whatsapp groupId="123456789@g.us" participant="+34612345678"
message action=removeParticipant channel=whatsapp groupId="123456789@g.us" participant="+34612345678"
message action=promoteParticipant channel=whatsapp groupJid="123456789@g.us" participants=["+34612345678"]
message action=demoteParticipant channel=whatsapp groupJid="123456789@g.us" participants=["+34612345678"]
message action=leaveGroup channel=whatsapp groupId="123456789@g.us"
message action=getInviteCode channel=whatsapp groupJid="123456789@g.us"
Returns: https://chat.whatsapp.com/XXXXX
message action=revokeInviteCode channel=whatsapp groupJid="123456789@g.us"
message action=getGroupInfo channel=whatsapp groupJid="123456789@g.us"
Returns: name, description, participants, admins, creation date.
Control who can DM your agent in openclaw.json:
{
"channels": {
"whatsapp": {
"dmPolicy": "allowlist",
"allowFrom": ["+34612345678", "+14155551234"],
"triggerPrefix": "Jarvis"
}
}
}
| Policy | Behavior |
|---|---|
"open" | Anyone can DM |
"allowlist" | Only numbers in allowFrom can DM |
"pairing" | Unknown senders get pairing code prompt |
"disabled" | No DMs accepted |
{
"channels": {
"whatsapp": {
"groupPolicy": "open",
"groupAllowFrom": ["+34612345678", "+14155551234"]
}
}
}
| Policy | Behavior |
|---|---|
"open" | Responds to mentions in any group |
"allowlist" | Only from senders in groupAllowFrom |
"disabled" | Ignores all group messages |
{
"channels": {
"whatsapp": {
"selfChatMode": true
}
}
}
Allows messaging yourself (your "Note to Self" chat) to interact with the agent.
{
"channels": {
"whatsapp": {
"triggerPrefix": "Jarvis"
}
}
}
Messages must start with this prefix to trigger the agent. Works in:
WhatsApp uses JIDs (Jabber IDs) internally:
| Type | Format | Example |
|---|---|---|
| Individual | <number>@s.whatsapp.net | 34612345678@s.whatsapp.net |
| Group | <id>@g.us | 123456789012345678@g.us |
When using to= with phone numbers, OpenClaw auto-converts to JID format.
Always use OGG/Opus format:
ffmpeg -i input.wav -c:a libopus -b:a 64k output.ogg
Convert images to WebP stickers:
ffmpeg -i input.png -vf "scale=512:512:force_original_aspect_ratio=decrease,pad=512:512:(ow-iw)/2:(oh-ih)/2:color=0x00000000" output.webp
WhatsApp has anti-spam measures. Avoid:
To react/edit/unsend, you need the message ID. Incoming messages include this in the event payload. For your own sent messages, the send response includes the ID.
| Feature | whatsapp-ultimate | wacli | whatsapp-automation | gif-whatsapp |
|---|---|---|---|---|
| Native integration | ✅ | ❌ (CLI) | ❌ (Docker) | N/A |
| Send text | ✅ | ✅ | ❌ | ❌ |
| Send media | ✅ | ✅ | ❌ | ❌ |
| Polls | ✅ | ❌ | ❌ | ❌ |
| Stickers | ✅ | ❌ | ❌ | ❌ |
| Voice notes | ✅ | ❌ | ❌ | ❌ |
| GIFs | ✅ | ❌ | ❌ | ✅ |
| Reactions | ✅ | ❌ | ❌ | ❌ |
| Reply/Quote | ✅ | ❌ | ❌ | ❌ |
| Edit | ✅ | ❌ | ❌ | ❌ |
| Unsend | ✅ | ❌ | ❌ | ❌ |
| Group create | ✅ | ❌ | ❌ | ❌ |
| Group management | ✅ (full) | ❌ | ❌ | ❌ |
| Receive messages | ✅ | ✅ | ✅ | ❌ |
| Two-way chat | ✅ | ❌ | ❌ | ❌ |
| External deps | None | Go binary | Docker + WAHA | ffmpeg |
Symptom: You added someone to groupAllowFrom but their DMs don't work.
Fix: Add them to allowFrom too. groupAllowFrom only controls group message access, not DMs.
{
"allowFrom": ["+34612345678", "+14155551234"],
"groupAllowFrom": ["+34612345678", "+14155551234"]
}
Symptom: All messages in a DM conversation show the same phone number.
Cause: Prior to OpenClaw 2026.2.1, DM messages showed the chat ID (the other person's number) instead of the actual sender.
Fix: Update to latest OpenClaw. The agent now correctly distinguishes between messages you send and messages the other person sends in the same conversation.
Symptom: Audio file sends but shows as unplayable.
Fix: Use OGG/Opus format, not MP3:
ffmpeg -i input.mp3 -c:a libopus -b:a 64k output.ogg
Then send with asVoice=true.
Your Agent
↓
OpenClaw message tool
↓
WhatsApp Channel Plugin
↓
Baileys (WhatsApp Web Protocol)
↓
WhatsApp Servers
No external services. No Docker. No CLI tools. Direct protocol integration.
MIT — Part of OpenClaw