Zalo
Zalo is Vietnam’s leading messaging app. Orbit’s Zalo channel wraps the Zalo Notification Service (ZNS) so you can deliver pre-approved template notifications to Vietnamese recipients from the same unified Messaging surface used for every other channel.Zalo is a beta channel. The send and receive paths are wired end to end, but onboarding still requires you to provision a Zalo Official Account and a ZNS access token.
How ZNS works
ZNS is template-only: a business sends a pre-approved notification template — a booking confirmation, an OTP, a shipping update — to a customer’s phone number. There is no free-form body.template_name selects the approved ZNS template id and template_params fills the template’s named variables. A send without an approved template_name is rejected with VALIDATION_ERROR (422).
Send a message
Send a single ZNS notification withPOST /api/v1/messages/zalo — the direct per-message endpoint, the same shape as every other channel’s send route (/line, /telegram, /viber). ZNS is template-only, so the body carries an approved template_name and its template_params instead of a free-form body.
Request body
The sender is selected automatically from the Zalo Official Account credentials connected to your organization — you do not pass an access token on the request.
Response
202 Accepted — the message is queued for delivery; the terminal delivered / failed state arrives later via the delivery-status webhook.
Bulk sends
To deliver an approved ZNS template to many recipients in one call, submit it through the Campaigns API withchannel set to zalo. Each recipient carries the same to, template_name, and template_params fields described above.
Rate limits
The directPOST /messages/zalo endpoint is capped at 80 requests/minute per organization. Bursts above the cap receive 429 with a Retry-After header; back off and retry, or stage high-volume sends through the campaigns API. See Rate Limits.
Configuration
Zalo is a bring-your-own-credential channel. You can connect it per organization in the dashboard, or set a platform-default credential for the whole cluster.Per organization (recommended)
- Create a Zalo Official Account and register your ZNS templates in the Zalo for Developers console. Each approved template receives a template id.
- Generate the OA access token (OAuth
oauth/access_tokengrant). The token is short-lived; rotate it through Zalo’s grant before it expires. - In the Orbit dashboard, go to Settings → Channels → Zalo and paste the access token. Orbit stores it encrypted at rest (
enc:v1:envelope) under your organization’ssettings.channels.zaloand never echoes it back through any API response.
Platform default
An operator can register a single cluster-wide Zalo provider by setting one environment variable. When it is unset the channel stays unregistered and a send fails closed withCHANNEL_NOT_CONFIGURED.
Credential handling — your responsibility
The ZNS access token is a bearer credential. Anyone holding it can send notifications as your Official Account. Orbit encrypts it at rest and masks it in the dashboard after submit, but its safety upstream of Orbit (your password manager, CI/CD variables, screenshots) is yours to protect:- Never commit an access token to git, public or private.
- Rotate immediately through the Zalo grant if you suspect exposure, then re-paste the new value in Orbit.
- Scope each environment to its own Official Account so a leaked dev token cannot reach customer conversations.
Inbound and delivery status
Inbound replies and delivery receipts are normalized by the Orbit messaging gateway and relayed to your account automatically — there is no Zalo webhook for you to register. Replies arrive on the standardmessage.received webhook with channel: "zalo"; ZNS delivery callbacks (reconciled by the tracking_id Orbit mints per send) advance your outbound message to delivered / failed. Subscribe to these under Settings → Webhooks.