
OpenClaw Integration with Zalo

By Sarah Jenkins


By Sarah Jenkins
Status: experimental. DMs are supported. The Capabilities section below reflects current Marketplace-bot behavior.
Zalo ships as a plugin and is not bundled with the core install.
openclaw plugins install @openclaw/zaloopenclaw plugins install ./path/to/local/zalo-pluginopenclaw plugins install @openclaw/zaloZALO_BOT_TOKEN=...channels.zalo.accounts.default.botToken: "...".Minimal config:
{
channels: {
zalo: {
enabled: true,
accounts: {
default: {
botToken: "12345689:abc-xyz",
dmPolicy: "pairing",
},
},
},
},
}Zalo is a Vietnam-focused messaging app; its Bot API lets the Gateway run a bot for 1:1 conversations.
It is a good fit for support or notifications where you want deterministic routing back to Zalo.
This page reflects current OpenClaw behavior for Zalo Bot Creator / Marketplace bots.
Zalo Official Account (OA) bots are a different Zalo product surface and may behave differently.
numeric_id:secret). For Marketplace bots, the usable runtime token may appear in the bot's welcome message after creation.Example:
{
channels: {
zalo: {
enabled: true,
accounts: {
default: {
botToken: "12345689:abc-xyz",
dmPolicy: "pairing",
},
},
},
},
}If you later move to a Zalo bot surface where groups are available, you can add group-specific config such as groupPolicy and groupAllowFrom explicitly. For current Marketplace-bot behavior, see Capabilities.
Env option: ZALO_BOT_TOKEN=... (works for the default account only).
Multi-account support: use channels.zalo.accounts with per-account tokens and optional name.
channels.zalo.webhookUrl.channels.zalo.mediaMaxMb (default 5).channels.zalo.dmPolicy = "pairing". Unknown senders receive a pairing code; messages are ignored until approved (codes expire after 1 hour).openclaw pairing list zaloopenclaw pairing approve zalo <CODE>channels.zalo.allowFrom accepts numeric user IDs (no username lookup available).For Zalo Bot Creator / Marketplace bots, group support was not available in practice because the bot could not be added to a group at all.
That means the group-related config keys below exist in the schema, but were not usable for Marketplace bots:
channels.zalo.groupPolicy controls group inbound handling: open | allowlist | disabled.channels.zalo.groupAllowFrom restricts which sender IDs can trigger the bot in groups.groupAllowFrom is unset, Zalo falls back to allowFrom for sender checks.channels.zalo is missing entirely, runtime still falls back to groupPolicy="allowlist" for safety.The group policy values (when group access is available on your bot surface) are:
groupPolicy: "disabled" — blocks all group messages.groupPolicy: "open" — allows any group member (mention-gated).groupPolicy: "allowlist" — fail-closed default; only allowed senders are accepted.If you are using a different Zalo bot product surface and have verified working group behavior, document that separately rather than assuming it matches the Marketplace-bot flow.
channels.zalo.webhookUrl and channels.zalo.webhookSecret.X-Bot-Api-Secret-Token header for verification.channels.zalo.webhookPath (defaults to the webhook URL path).Content-Type: application/json (or +json media types).event_name + message_id) are ignored for a short replay window.Note: getUpdates (polling) and webhook are mutually exclusive per Zalo API docs.
For a quick support snapshot, see Capabilities. The notes below add detail where the behavior needs extra context.
This table summarizes current Zalo Bot Creator / Marketplace bot behavior in OpenClaw.
| Feature | Status |
|---|---|
| Direct messages | ✅ Supported |
| Groups | ❌ Not available for Marketplace bots |
| Media (inbound images) | ⚠️ Limited / verify in your environment |
| Media (outbound images) | ⚠️ Not re-tested for Marketplace bots |
| Plain URLs in text | ✅ Supported |
| Link previews | ⚠️ Unreliable for Marketplace bots |
| Reactions | ❌ Not supported |
| Stickers | ⚠️ No agent reply for Marketplace bots |
| Voice notes / audio / video | ⚠️ No agent reply for Marketplace bots |
| File attachments | ⚠️ No agent reply for Marketplace bots |
| Threads | ❌ Not supported |
| Polls | ❌ Not supported |
| Native commands | ❌ Not supported |
| Streaming | ⚠️ Blocked (2000 char limit) |
openclaw message send --channel zalo --target 123456789 --message "hi".Bot doesn't respond:
openclaw channels status --probeopenclaw logs --followWebhook not receiving events:
The flat top-level keys (channels.zalo.botToken, channels.zalo.dmPolicy, and similar) are a legacy single-account shorthand. Prefer channels.zalo.accounts.<id>.* for new configs. Both forms are still documented here because they exist in the schema.
Provider options:
channels.zalo.enabled: enable/disable channel startup.channels.zalo.botToken: bot token from Zalo Bot Platform.channels.zalo.tokenFile: read token from a regular file path. Symlinks are rejected.channels.zalo.dmPolicy: pairing | allowlist | open | disabled (default: pairing).channels.zalo.allowFrom: DM allowlist (user IDs). open requires "*". The wizard will ask for numeric IDs.channels.zalo.groupPolicy: open | allowlist | disabled (default: allowlist). Present in config; see Capabilities and Access control (Groups) for current Marketplace-bot behavior.channels.zalo.groupAllowFrom: group sender allowlist (user IDs). Falls back to allowFrom when unset.channels.zalo.mediaMaxMb: inbound/outbound media cap (MB, default 5).channels.zalo.webhookUrl: enable webhook mode (HTTPS required).channels.zalo.webhookSecret: webhook secret (8-256 chars).channels.zalo.webhookPath: webhook path on the gateway HTTP server.channels.zalo.proxy: proxy URL for API requests.Multi-account options:
channels.zalo.accounts.<id>.botToken: per-account token.channels.zalo.accounts.<id>.tokenFile: per-account regular token file. Symlinks are rejected.channels.zalo.accounts.<id>.name: display name.channels.zalo.accounts.<id>.enabled: enable/disable account.channels.zalo.accounts.<id>.dmPolicy: per-account DM policy.channels.zalo.accounts.<id>.allowFrom: per-account allowlist.channels.zalo.accounts.<id>.groupPolicy: per-account group policy. Present in config; see Capabilities and Access control (Groups) for current Marketplace-bot behavior.channels.zalo.accounts.<id>.groupAllowFrom: per-account group sender allowlist.channels.zalo.accounts.<id>.webhookUrl: per-account webhook URL.channels.zalo.accounts.<id>.webhookSecret: per-account webhook secret.channels.zalo.accounts.<id>.webhookPath: per-account webhook path.channels.zalo.accounts.<id>.proxy: per-account proxy URL.About the author

Sarah Jenkins is a seasoned OpenClaw developer with a strong focus on optimizing high-performance computing solutions. Her work primarily involves crafting efficient parallel algorithms and enhancing GPU acceleration for complex scientific simulations. Jenkins is renowned for her meticulous attention to detail and her ability to translate intricate theoretical concepts into practical, robust OpenClaw implementations.

by Sarah Jenkins
by Sarah Jenkins