Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.zavu.dev/llms.txt

Use this file to discover all available pages before exploring further.

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.
All error codes on this page are the canonical codes returned by the WhatsApp Business Platform. Zavu passes them through unchanged so you can keep your existing handlers if you migrate from another stack.

How Zavu Returns Errors

Every failed WhatsApp message exposes the same shape, whether you read it from the API, the dashboard, or a webhook:
{
  "id": "msg_01HX...",
  "status": "failed",
  "channel": "whatsapp",
  "errorCode": 131047,
  "errorMessage": "Re-engagement message",
  "errorCategory": "delivery",
  "retriable": false
}
  • errorCode — numeric code (see tables below)
  • errorCategory — one of auth, rate_limit, integrity, template, delivery, media, flow, other
  • retriable — whether retrying the same payload could succeed without changes
Subscribe to the message.failed event on your webhook to react in real time instead of polling. See Webhooks.

Quick Triage

Use this decision tree before diving into the tables:

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.
If you see auth errors on every message, treat it as an outage on that sender. Pause broadcasts until the sender is connected again to avoid burning quality rating.

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.
Zavu Broadcasts automatically respect WABA throughput limits. If you’re hitting 130429 from your own send loop, switch to broadcasts.

Retry strategy

async function sendWithBackoff(payload, attempt = 0) {
  try {
    return await zavu.messages.send(payload);
  } catch (err) {
    const retriableCodes = [4, 80007, 130429];
    if (retriableCodes.includes(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.
Don’t keep retrying integrity errors. Each rejected send weighs against your quality rating.

D. Template Errors

Triggered when sending a template message. Most are fixable by editing the template; a few require creating a new one.
CodeNameCauseFix
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.
A template that fails with 132015 or 132016 is a quality problem, not a code problem. Look at the template’s quality rating in Senders → Templates before editing blindly.

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).

Detect the 24-hour window

const contact = await zavu.contacts.get({ 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.
Common gotchas: PNGs over 5MB, MP4s without h264 video + aac audio, and stickers that aren’t 512×512 WebP.

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 IssueBilling block on the WABA.Update payment details in Settings → Billing.
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:
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";
}

zavu.webhooks.on("message.failed", async (event) => {
  const action = classify(event.data.errorCode);
  switch (action) {
    case "retry":
      await enqueueRetry(event.data.id, { 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;
  }
});

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

Smart Routing

Automatic channel fallback when WhatsApp delivery fails

Template Approval

Avoid 132xxx errors by getting templates right the first time

Webhooks

React to failures in real time

Rate Limiting

How Zavu paces sends to stay under WABA limits