Skip to content

WhatsApp Error Codes

Diagnose and resolve every WhatsApp delivery, template, and account error you can hit through Zavu

View .md

When a WhatsApp message fails, Zavu surfaces the upstream error code in the message's errorCode and errorMessage fields, plus on the message.failed webhook. This page maps every error you can hit, explains why it happens, and tells you the exact action to take — in code, in the dashboard, or with your end user.

How Zavu Returns Errors

Every failed WhatsApp message exposes the same shape, whether you read it from the API, the dashboard, or a webhook:

JSON
{ "id": "msg_01HX...", "status": "failed", "channel": "whatsapp", "errorCode": "131047", "errorMessage": "WhatsApp: 24-hour window closed — this contact has not messaged you in the last 24 hours, so free-form messages are refused. Send an approved template to open the conversation." }
  • errorCode — Meta's code, as a string (see tables below). Number(errorCode) is safe, and is what the switch further down does.
  • errorMessage — a sentence for a human. For a few codes Zavu replaces Meta's own wording, which points the reader at the wrong problem; the code never changes, so branch on errorCode and display errorMessage.

Quick Triage

Use this decision tree before diving into the tables:

flowchart TD
    A[Message failed] --> B{Error category}
    B -->|auth / integrity| C[Stop sending<br/>Fix account first]
    B -->|rate_limit| D[Back off,<br/>retry with delay]
    B -->|template| E[Fix template,<br/>resubmit]
    B -->|delivery| F[Check 24h window<br/>or contact validity]
    B -->|media| G[Re-encode or<br/>resend asset]
    B -->|flow| H[Edit flow JSON<br/>or republish]
    B -->|other| I[Inspect message,<br/>retry if transient]

A. Authorization Errors

These mean your WhatsApp Business Account (WABA) or the underlying app credentials aren't valid for the action you tried. They almost never resolve by retrying — you must reconnect the account.

CodeNameWhy it happensWhat to do
0AuthExceptionThe platform can't authenticate the app behind the sender.Reconnect the WhatsApp sender from Senders → Connect WhatsApp. See Connect WhatsApp.
3API MethodThe endpoint exists but the calling app lacks the right scopes.Reconnect with the full permission set; do not edit scopes manually.
10Permission DeniedThe phone number isn't registered to your WABA, or messaging permission was revoked.Verify the number appears under your sender and is in connected state.
190Access Token ExpiredThe long-lived token rotated or was invalidated.Reconnect the sender — Zavu will rotate the token automatically.
200–299Permission ErrorsA specific capability (templates, media, flows) was disabled.Check the WABA status in the dashboard; if blocked, follow the Integrity flow.

B. Rate Limit & Throttling Errors

WhatsApp enforces several independent limits: per-app calls, per-WABA throughput, per-recipient pacing, and account-level spam protection. Each has a different remediation window.

CodeNameWhat it actually limitsWhat to do
4Too Many CallsApp-level API call rateBack off with exponential delay (start 1s, cap 60s).
80007Rate Limit ReachedSender-level send rateRetry after the Retry-After hint Zavu returns.
130429Throughput LimitMessages per second on the WABASpread sends; rely on Zavu's Broadcasts for automatic pacing.
131048Spam Rate LimitVolume flagged as spammy by quality signalsStop the campaign, inspect template quality, only resume once rating recovers.
131056Pair Rate LimitToo many messages to the same recipientHold sends to that contact for ~30 min. Other recipients are unaffected.
133016Registration Limit10 phone register/deregister attempts in 72hWait out the 72h window. Don't script repeated reconnects.

Retry strategy

TypeScript
async function sendWithBackoff(payload, attempt = 0) { try { return await zavu.messages.send(payload); } catch (err) { const retriableCodes = [4, 80007, 130429]; if (retriableCodes.includes(Number(err.errorCode)) && attempt < 5) { const delay = Math.min(60_000, 1000 * 2 ** attempt); await new Promise((r) => setTimeout(r, delay)); return sendWithBackoff(payload, attempt + 1); } throw err; } }

C. Integrity Errors

Account-level enforcement actions. The message wasn't sent because the platform restricted the sender or recipient.

CodeNameWhy it happensWhat to do
368Temporarily BlockedA policy violation triggered a soft block on the WABA.Open the WhatsApp Manager link in your sender details, resolve the flagged item, wait for unblock.
130497Country RestrictionThe destination country has messaging restrictions for your business.Use a different channel for that country. See Sending Messages → SMS fallback.
131031Account LockedDisabled for repeated policy or commerce-policy violations.Contact Zavu support — recovery requires an appeal.

D. Template Errors

Triggered when sending a template message. Most are fixable by editing the template; a few require creating a new one.

CodeNameCauseFix
100Invalid ParameterThe variable keys don't match the template's parameter format — e.g. a named template ({{customer_name}}) was sent positional keys, or a required variable (including a text-header variable) was omitted.Pass values keyed to match the template body, and include every variable. See How Variables Work.
132000Parameter Count MismatchYou passed fewer/more variables than the template defines.Match {{1}}, {{2}}, … exactly. Inspect the template in the dashboard for the canonical count.
132001Template Doesn't ExistWrong name, wrong language, or template not approved.Confirm name + language match an approved template. See Sending Templates.
132005Translation Too LongA localized version exceeds the character cap.Shorten the body or header for that locale.
132007Format Policy ViolationDisallowed formatting, unsafe characters, or banned content.Edit the template, resubmit. See Template Approval.
132012Parameter Format MismatchA variable type doesn't match (e.g. text in a URL slot).Send the correct type for each component.
132015Template PausedQuality rating dropped to "low" — sending is paused.Edit the template content to improve clarity and resubmit.
132016Template DisabledPaused too many times; the template is permanently disabled.Create a new template with improved copy.
132068Flow BlockedThe attached Flow violates policy.Review the Flow, fix, republish. See Flows.
132069Flow ThrottledMore than 10 flow messages sent within an hour.Pace flow sends; investigate why the same flow triggers repeatedly.

E. Delivery Errors

The template/account was fine, but the message couldn't reach the recipient.

CodeNameWhat happenedRecommended action
131026Message UndeliverableRecipient doesn't have WhatsApp, hasn't accepted ToS, or is on an outdated client version.Fall back to SMS or email — Zavu's Smart Routing can do this automatically.
131047Re-engagement RequiredMore than 24h since the user last messaged you (no open session).Send an approved template instead of a session message.
131049Per-User Marketing LimitThe platform throttled a marketing message to protect the recipient.Reduce marketing frequency to that contact. Transactional/utility templates are unaffected.
131051Unsupported Message TypeThe combination of message type and recipient device isn't supported.Use a supported type (see Message Types).
131062Recipient Requires Phone NumberThe message was sent to a BSUID but the type requires a phone number (one-tap, zero-tap and copy-code authentication templates).Send authentication templates to the contact's phone number. Recover it with a contact info request if you only have the BSUID.

Detect the 24-hour window

TypeScript
const contact = await zavu.contacts.retrieve({ id: contactId }); const last = contact.whatsapp?.lastInboundAt; const within24h = last && Date.now() - new Date(last).getTime() < 24 * 60 * 60 * 1000; await zavu.messages.send({ to: contact.phone, channel: "whatsapp", ...(within24h ? { text: "Quick update on your order…" } : { template: { name: "order_update", language: "en", variables: ["#1234"] } }), });

F. Media Errors

Issues with the file attached to an inbound or outbound message.

CodeNameCauseFix
131052Media Download ErrorZavu couldn't fetch the media the user sent.Ask the user to resend, or request the file via another channel.
131053Media Upload ErrorOutbound media is wrong format, too large, or corrupted.Verify against the media specs for that message type.

G. WhatsApp Flows Errors

Errors specific to interactive Flows (multi-step forms inside WhatsApp).

CodeNameCauseFix
100Flow Management ErrorDuplicate flow name, invalid ID/JSON, or unreachable endpoint URL.Validate flow JSON locally; ensure your endpoint returns 200 to the health check.
139000Blocked by IntegrityThe WABA can't publish flows right now.Resolve any Integrity issues first.
139001Cannot Update Published FlowPublished flows are immutable.Clone the flow, edit, publish a new version, deprecate the old one.
139002Incomplete Flow DetailsRequired fields, validation data, or endpoint missing.Complete every required field before publishing.
139003Deprecation ErrorFlow wasn't published or is already deprecated.Check current status before calling deprecate.
139004Cannot Delete Published FlowPublished flows can't be deleted.Deprecate instead.
139006Not Enough Metrics DataToo few sessions to compute metrics.Wait for more usage before requesting analytics.

H. Miscellaneous Errors

Codes that don't fit cleanly elsewhere but you'll see eventually.

CodeNameCauseFix
131000Unknown ErrorUnidentified upstream failure.Retry once. If it persists, contact support with the message id.
131005Access DeniedPermission revoked between messages.Reconnect the sender.
131008Missing Required ParameterA required field is missing from the payload.Check the API reference for that endpoint.
131009Invalid Parameter ValueA value is outside the supported set.Validate enums and lengths before sending.
131016Service UnavailableTemporary upstream outage.Retry with backoff; check status.zavu.dev.
131021Sender Equals RecipientThe sender phone number matches the recipient.Swap one of them — you can't message yourself.
131037Missing Display NameThe sender has no approved display name.Set and approve a display name in Senders → Profile. See Profile.
131042Payment IssueThe WhatsApp Business Account has no usable payment method: none attached, credit limit reached, line of credit inactive, or currency/timezone unset.Add or fix the payment method in Meta Business Manager → Billing, then resend. Meta bills WhatsApp conversations directly, so this is never fixed from Zavu. It is also the only signal that exists for this: Meta publishes no webhook for payment configuration, so a rejection is how you find out — including when a card is removed later.
131045Incorrect CertificatePhone registration is in a bad state.Reconnect the number from the dashboard.
131057Account in MaintenanceTemporary platform-side maintenance.Wait and retry; this clears on its own.

Programmatic Error Handling

Treat errors by category, not by code, to keep your code resilient as new codes appear:

TypeScript
function classify(errorCode: number): "retry" | "fix-template" | "fix-account" | "fallback" | "drop" { if ([4, 80007, 130429, 131000, 131016, 131057].includes(errorCode)) return "retry"; if (errorCode >= 132000 && errorCode <= 132099) return "fix-template"; if ([0, 3, 10, 190, 368, 131005, 131031, 131037, 131042, 131045].includes(errorCode)) return "fix-account"; if ([131026, 131047, 131049, 131051].includes(errorCode)) return "fallback"; return "drop"; } // Webhooks are plain HTTPS POSTs to the URL configured on your sender, so this // lives in your own endpoint. Verify the signature first: see // /guides/receiving-messages/security app.post("/webhooks/zavu", async (req, res) => { const event = req.body; if (event.type !== "message.failed") return res.sendStatus(200); const action = classify(Number(event.data.errorCode)); switch (action) { case "retry": await enqueueRetry(event.data.messageId, { delay: 60_000 }); break; case "fallback": await sendViaSMS(event.data); break; case "fix-template": case "fix-account": await notifyOpsTeam(event.data); break; case "drop": await logForReview(event.data); break; } res.sendStatus(200); });

Prevention Checklist

Validate before send

Verify phone format (E.164), template params, and 24h window state on your side.

Watch quality rating

A drop from high to medium is your first warning. Pause marketing before the platform does it for you.

Use Smart Routing

Let Zavu fall back to SMS/email automatically when WhatsApp returns delivery errors.

Subscribe to webhooks

message.failed and template.status_changed catch problems before users do.

References

The error codes documented here are defined by the WhatsApp Business Platform. For the authoritative, always-up-to-date list maintained by Meta:

This guide adapts those codes with Zavu-specific handling (error shape, webhooks, Smart Routing fallback). If Meta adds a new code that isn't listed here yet, Zavu still passes it through unchanged on errorCode — please open an issue so we can add it.

Next Steps