Auth model
Installed plugin + QR login + personal account session state
Personal-account automation adds convenience but also raises operational and policy risk sharply.
Zalo Personal support for OpenClaw covers plugin-backed QR login, personal-account constraints, risk posture, and verification for cautious operators.
Auth model
Installed plugin + QR login + personal account session state
Safety stance
Make the personal-account tradeoffs explicit before anyone treats the lane as a safe default.
Verification ritual
Validate login, session persistence, and one reconnect path before trusting the lane for routine use.
Rollout mode
35–50 min setup
Experimental · Unofficial personal account
Zalo Personal runs through native `zca-js` login on the gateway, with QR-linked session state and a platform-risk posture you need to accept before rollout.
Risk watch
Personal-account automation can create higher support and policy risk than teams expect from “just another QR flow.”
zalouseris not just another login method. It is an experimental, unofficial personal-account integration powered byzca-js, and the upstream docs explicitly warn that it may lead to account suspension or ban. Treat it as a deliberate exception, not a quiet default.
Use zalouser only when the real requirement is a personal-account lane and the official Bot API is not the path available to you.
That makes it useful in a narrow set of situations:
It also has real strengths once you accept the posture:
But those conveniences should never hide the core tradeoff: this is an unofficial personal-account automation path.
Use this dossier when you need to decide:
zalouser has three separate risksThis is the one the upstream docs put in bold.
The integration is unofficial and may cause suspension or ban. That means the first design decision is not technical; it is whether the account is truly expendable enough for this role.
This channel does not use a bot token.
It logs in through:
openclaw channels login --channel zalouser
Then a QR code must be scanned on the gateway machine. If that machine, session state, or reconnect behavior is not stable, the channel will not feel stable either.
The official docs make an important point many operators would otherwise miss:
pairingopen unless you override the policySo a cautious rollout should almost always set the group posture deliberately rather than inheriting the default and discovering it later.
The safest practical starting shape is:
pairing,{
channels: {
zalouser: {
enabled: true,
dmPolicy: 'pairing',
groupPolicy: 'disabled',
},
},
}
This is intentionally stricter than the default docs behavior for groups. The point is to make the personal-account risk posture visible in config instead of relying on a permissive default.
zalouser is a plugin, not part of core.
Install it first:
openclaw plugins install @openclaw/zalouser
Or from source checkout:
openclaw plugins install ./extensions/zalouser
Then log in directly in OpenClaw:
openclaw channels login --channel zalouser
The official docs are clear that no external zca or openzca CLI is required. Scan the QR code with the Zalo mobile app on the actual gateway machine you intend to operate.
The upstream docs support four DM modes:
pairingallowlistopendisabledpairingKeep the first-contact behavior explicit:
openclaw pairing list zalouser
openclaw pairing approve zalouser <code>
That gives you a narrow way to validate the account without assuming every inbound DM should be trusted.
allowFromallowFrom accepts user IDs or names, and the onboarding flow resolves names to IDs using the in-process contact lookup.
That is convenient, but the docs also recommend numeric IDs or exact names when troubleshooting resolution issues. If the lane matters, numeric identifiers are the safer long-term record.
This is the biggest operating trap in the official docs.
If you leave group policy unset, zalouser defaults to groupPolicy = 'open' unless overridden through channel defaults.
That is broader than many teams expect from a personal-account connector.
{
channels: {
zalouser: {
groupPolicy: 'disabled',
},
},
}
When you are ready, move to a narrow group policy:
{
channels: {
zalouser: {
groupPolicy: 'allowlist',
groupAllowFrom: ['1471383327500481391'],
groups: {
'*': { allow: true, requireMention: true },
'Work Chat': { allow: true, requireMention: false },
},
},
},
}
This example stays inside what the official docs actually support:
groupPolicy: 'allowlist'groupAllowFromgroupsrequireMentionThe docs also note two important behaviors:
groupAllowFrom falls back to allowFrom when unsetchannels.zalouser.groups.<group>.requireMention is one of the most useful controls in this channel.
The official docs say:
*, then default,true.They also note that when a group message is skipped because mention is required, OpenClaw stores it as pending group history and includes it on the next processed group message.
That is worth understanding early because it affects how group context feels once the bot does respond.
The upstream docs provide a better path than guessing IDs:
openclaw directory self --channel zalouser
openclaw directory peers list --channel zalouser --query "name"
openclaw directory groups list --channel zalouser --query "work"
Use these before writing allowlists or group rules. It reduces the chance of relying on an inexact display name that later fails resolution.
A personal-account connector should not be considered healthy after QR login alone.
Start with:
openclaw channels status --probe
Verify that the account receives the inbound message, creates the pairing flow you expect, and replies after approval.
The official troubleshooting section explicitly calls out login persistence. Do one deliberate restart and confirm the session still holds.
Validate one allowed group message under your chosen requireMention rule. Do not assume “bot is in the group” proves anything about the real policy path.
The docs say reaction action react is supported, and delivered/seen acknowledgements are sent best-effort when inbound metadata is present. Those are real capabilities, but they should be confirmed in your environment if they matter operationally.
The official docs support several specifics that matter more here than generic bot copy:
accounts.<id>.profileThose details make zalouser feel more like a stateful client integration than a plain webhook bot.
zalouser failures to expectThe official docs give the recovery sequence directly:
openclaw channels status --probe
openclaw channels logout --channel zalouser && openclaw channels login --channel zalouser
The troubleshooting note is specific: use numeric IDs or exact friend and group names.
That often means you inherited the default open group posture instead of setting groupPolicy deliberately.
The docs explicitly say the channel now runs fully inside OpenClaw and no longer depends on an external CLI process.
For a disciplined zalouser rollout:
pairing first,If those constraints feel too heavy, that is often a sign that the official zalo Bot API channel is the better fit.
If you need the raw configuration surface, continue with:
Verification & references
References