> Source: https://docs.virtuo.in/vibot/sending/failed-sends > A field guide to Meta's WhatsApp error codes — what each one means, whether to retry, and how Vibot's preflight tries to catch them before sending. # 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](/vibot/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`](https://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):** 1. **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_status` in [troubleshooting](/vibot/troubleshooting). 2. **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. 3. **Clean the list.** Remove every 131026 row from your master contact list before the next campaign. 4. **Wait if it was 131049.** 24h cool-down lets cache entries expire. 5. **Use Resume Skipped with Conservative drip** for recipients that haven't been sent yet. See [**Send a campaign**](/vibot/sending/send-campaign#after-a-cancelled-or-partial-campaign--resume-skipped). ## Internal Meta error references For anything you see that's not in this list: - [Meta — WhatsApp Cloud API error codes](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes) — full reference. - [Meta status page](https://metastatus.com) — 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_id` from a failed call. ## Next step Back to [**Sending overview**](/vibot/sending) or jump to [**Troubleshooting**](/vibot/troubleshooting) for non-send-specific issues (KB stuck, payment failed, member can't accept invite).