Why sends fail
When a campaign recipient’s row shows FAILED, there’s a numeric Meta error code attached. This page is the field guide — what each code means, whether retrying helps, and how Vibot’s preflight tries to catch the recipient before you spend wallet credits on a guaranteed-fail send.
You can find the per-row error code on the campaign detail page → Recipients tab → filter by status FAILED.
The five codes you’ll actually see
131026 — “Message Undeliverable” / Not on WhatsApp
The recipient phone number is not registered on WhatsApp. Either it’s a landline, a misformatted number, or a mobile number that has never installed WhatsApp.
Retry? No. This is permanent. Retrying just wastes wallet credits and pollutes your quality rating.
How Vibot helps: every 131026 is cached in the dead-number cache with a 30-day TTL, cross-tenant. Future preflights on any tenant short-circuit this number — it’s skipped before Meta is even called. The cache is also seeded by Meta’s contacts-API check during preflight.
How to fix the list: the campaign report shows which rows hit 131026. Export to CSV → delete those rows from your master contact list → re-import to Contacts.
131049 — “Ecosystem Spam Block” / Marketing Frequency Cap
The recipient is currently rate-limited by WhatsApp’s global marketing-frequency cap — they’ve received too many marketing messages today from any business, not just yours. Meta’s current ceiling is approximately 2 marketing messages per user per day across the entire ecosystem.
Retry? Maybe, but not now. The cache entry is cleared automatically after 24 hours and the recipient becomes sendable again. Wait at least a day before retrying.
How Vibot helps: every 131049 is cached for 24 hours. Preflight surfaces a WARNING (not a block) — you can still send if you want to, but it’ll likely fail again until the cache expires.
How to avoid: spread your Marketing sends across the day instead of bursting; reduce frequency to specific recipients (i.e. don’t send the same person Marketing twice in 24h regardless of business).
131048 — “Spam Rate Limit Hit”
You have exceeded your number’s 24-hour tier limit. Sending to MORE unique recipients than your tier allows.
Retry? Wait 24h. Vibot’s tier-cap math should prevent this in normal use — if you’re hitting 131048 you’ve likely sent campaigns from multiple BSPs or split-brain scenarios.
How Vibot helps: preflight shows your current tier (TIER_250 / TIER_1K / etc.) so you know your ceiling. Vibot does NOT auto-throttle to keep you under the cap (Meta’s cap is a moving 24h window which is harder to enforce client-side than it sounds). Don’t blast more recipients than your tier allows.
131000 — generic delivery failure (“Something went wrong”)
Catch-all Meta error. Could be transient (Meta-side outage), could be permanent (recipient blocked you). The error usually carries a sub-detail in the errors[0].error_data.details field.
Retry? Once. Vibot’s BullMQ retry config already retries 3 times with exponential backoff. By the time you see this in the recipient row, it’s already been retried.
Common cause we see most: code_verification_status expired on your number (see troubleshooting). When this happens, Meta accepts the API call but never delivers — and on the FAILED row you see 131000 with details like “Number verification expired.”
132002 — Temporary Rate Limit
You’ve burst too many sends per minute. Different from 131048 — this is a per-minute throughput limit, not a per-day unique-recipient cap.
Retry? Yes, automatically with backoff. Vibot’s worker handles this.
How Vibot helps: the per-tenant algoMaxMessagesPerMinute setting (configurable by Virtuo admin on the admin panel during your first 30 days) sets a maximum send rate that stays well below Meta’s per-minute ceiling. If you’re hitting 132002 often, ask support to set a cap on your tenant.
Rarer codes you might see
131047 — Re-engagement required
You’re trying to send a Marketing template to a recipient who hasn’t messaged you in > 24h and who has not opted in to Marketing. Marketing templates are technically allowed cross-window if the recipient gave consent — but Meta’s signal here is “you should have an opt-in record we can audit.”
Fix: ensure your opt-in flow is documented (privacy policy link, signup form screenshot). For specific recipients, ask them to message you first to open a service window.
132000 — Generic platform error
Meta-side outage. Rare. Status page: metastatus.com.
Retry: automatic via Vibot’s retry config.
131051 — Unsupported Message Type
Sending audio/video/document to a number that has WhatsApp on a deprecated platform (very old phone). Rare in 2026.
Retry: no — re-send as text.
131056 — (Business Account or User) Pair Rate Limit
Same business + same recipient sending too rapidly. Different from 131049 (cross-business cap). This is a per-pair throttle.
Fix: space your sends to the same recipient over time. Don’t send the same person 5 templates in 5 minutes.
470 — Re-engagement Window Expired
24-hour customer-service window has closed; free-form messages no longer allowed. Switch to a template.
Vibot side: if your AI agent tries to reply outside the 24h window, the AI replies through a fallback template if you have one configured. Otherwise the reply is dropped.
What the preflight catches vs what it can’t
Caught by preflight (won’t even reach Meta)
- Dead numbers (cached 131026, last 30 days) — hard skip with
skipReason='not_on_whatsapp'. - Opted-out recipients — hard skip with
skipReason='opted_out'. - Length overflow (body > 1024 chars) — hard skip.
- Duplicates — hard skip; only first occurrence sends.
- Already-received (template-dedup window) — hard skip.
- Number verification expired — campaign-level block. Won’t launch.
- Template quality RED — campaign-level block.
- Insufficient wallet — campaign-level block.
Warned but allowed through
- 131049 cache hit (last 24h) — recipient sent, will likely fail again.
- Tier-cap unverified recipients — sent without contacts-API verification.
- Template quality YELLOW or UNKNOWN — sent, but at risk.
Not catchable client-side
- Live 131049 errors — Meta’s frequency cap is dynamic and recipient-specific. We don’t know who’s globally rate-limited at any given moment; we only learn from the response.
- 131048 spam rate limit — Meta’s tier counter is 24h-rolling and updated continuously on Meta’s side. The cap is enforceable only by Meta.
- 131000 transient failures — generic.
Bulk recovery strategy
After a campaign that has a high failure rate, the right recovery isn’t to mass-retry. It’s:
Recovery order (don’t skip):
- Audit the failure distribution. Campaign detail → Insights tab → top-10 failure reasons. If it’s mostly 131026 (dead numbers), your list quality is the issue. If it’s mostly 131049, you blasted Marketing too fast / too broadly. If it’s mostly 131000, check your number’s
code_verification_statusin troubleshooting. - Don’t blanket-retry. Vibot’s Retry Failed (N) button is intentionally a manual click, not a default. Mass-retrying dead numbers tanks your quality rating + costs you wallet credits to fail again.
- Clean the list. Remove every 131026 row from your master contact list before the next campaign.
- Wait if it was 131049. 24h cool-down lets cache entries expire.
- Use Resume Skipped with Conservative drip for recipients that haven’t been sent yet. See Send a campaign.
Internal Meta error references
For anything you see that’s not in this list:
- Meta — WhatsApp Cloud API error codes — full reference.
- Meta status page — global outages.
- Filing a Meta support ticket: WhatsApp Manager → top-right (?) → Help. Be prepared to provide your WABA ID, Phone Number ID, and a sample
fbtrace_idfrom a failed call.
Next step
Back to Sending overview or jump to Troubleshooting for non-send-specific issues (KB stuck, payment failed, member can’t accept invite).