---
title: "7 mistakes that take a WhatsApp AI agent down in production (and how to catch each one first)"
url: https://samambai.com/blog/whatsapp-ai-agent-production-mistakes/
date: 2026-10-14
author: samambai
---

Chat still replies while reminders stop. The causes are billing, currency or verification, a service window counted from the wrong side, templates, a handoff with no transcript, a bad phone number, and a workflow that reports success when nothing was delivered. Delivery status shows each failure before a customer does.

Seven failures take a WhatsApp agent down while the thread still looks fine: billing, currency or verification, a 24-hour window counted from the agent's reply, a bad or unreviewed template, a handoff with no transcript, a malformed phone number, and a run marked success when nothing was delivered. An expired token belongs in that last group. Delivery status (delivered, read, or failed) surfaces each one before a customer does.

See [WhatsApp AI agents](/whatsapp-ai-agents/).

## What changed on October 1, 2026

The pricing page, updated on September 30, 2026, applies from October 1, 2026, in the messaging account's timezone. Meta charges a delivered message. A zero invoice does not prove the reminder went out. The free entry point window stays free of charge [1]. If two pages disagree, the WhatsApp Manager invoice decides [1][11].

- Since October 1, 2026, a reply inside the 24-hour window is charged at that country's utility rate. Inside the allowance below, the type is `free_customer_service` (free service). Above it, the type is `regular` (billed) [1].
- Each phone number gets 1,000 free service messages a month, with no rollover. The count resets at midnight in the account timezone [1].
- With no payment method, only those free messages go out. Utility inside an open window is charged too, as of October 1, 2026, and it sits outside the allowance. That send was free from July 1, 2025. Only service messages draw on the 1,000 [1].

## 1. No payment method on the account

**What happens.** Reminders and notices go out as templates and fail with error 131042, no payment method. Published causes: payment account not on the WhatsApp Business account, credit line over the limit or inactive, account deleted or suspended, timezone or currency missing, or an On Behalf Of request (to operate for another business) pending or declined [2]. The template can fail while a free-form reply still goes out inside the 1,000 [1]. A solution provider or a directly integrated business with no payment method on September 30, 2026 loses service delivery when charging starts on October 1 [1].

**How it shows up.** The thread still answers, and tomorrow's reminder never leaves. We saw this in production.

**How to catch it.** Read `health_status`: the phone (`PHONE_NUMBER`), the WhatsApp Business account (`WABA`), the business (`BUSINESS`), and the app (`APP`). `BLOCKED` blocks the set. Otherwise `LIMITED` limits it [3]. On the status webhook, `failed` (the send failed) with 131042 confirms the cause [4].

**How to avoid it.** Add the card in Billing Hub, on the messaging account [1]. We saw the card on the ads account in production, with the messaging account unpaid. The payment account has to sit on the WhatsApp Business account [2].

## 2. No currency, or the business is not verified

**What happens.** With no currency, the API returns error 131042 [2]. Unverified, a new portfolio is capped at 2 numbers until verification or a messaging limit of 2,000, then the cap is 20 [8]. Template caps are 250 unverified, 6,000 with verification plus an approved display name [6]. Set currency at creation. Since July 1, 2026 there are 16 currencies, and a later change is a migration [1].

**How it shows up.** The number limits or blocks, the reminder goes quiet, and a live test can still pass. We saw `health_status` return 141006 and 141010 in production. Missing currency is still error 131042. Missing verification is the cap on numbers and templates [2][6][8].

**How to catch it.** A `LIMITED` node includes `additional_info` (extra detail). A `BLOCKED` node includes `error_code` (the code), `error_description` (what went wrong), and `possible_solution` (what to do) [3]. Registration has to read `CONNECTED`. A disconnected number does not send [8].

**How to avoid it.** Verify the portfolio before you depend on automatic reminders, and before a third number. Currency is fixed at creation [1][8].

## 3. The 24-hour window, counted from the wrong side

**What happens.** The window lasts 24 hours and opens or resets only when the person messages or calls. An agent reply does not open it [5]. Outside it, free-form text returns error 131047, meaning more than 24 hours have passed since the recipient last replied. Send a template [2]. Meta documents a rare case in which the message arrives and you still cannot reply inside the window [5]. Tomorrow's reminder needs an approved utility template. A promotion, or copy mixed with a promotion, is marketing [7].

**How it shows up.** The demo works because someone texted. The morning reminder does not go out.

**How to catch it.** Free-form text to an internal number quiet for more than 24 hours has to return 131047. The approved utility template has to reach `delivered`, meaning it reached the phone [2][4].

**How to avoid it.** Store the time of the person's last message, and approve the reminder before go-live. If order matters, wait for `delivered`. Several messages have no guaranteed order [6]. `read` (opened) already means delivered, and the `delivered` webhook may never arrive [4].

## 4. Wrong template category, or the template is still in review

**What happens.** Only `APPROVED` sends. Review can take 24 hours. Rejected, paused, and disabled templates do not send. An active template still sends at quality `pending`, `high`, `medium`, or `low` [6]. Error 132001 means a missing language or a template that is not approved [2]. Since April 9, 2025, utility that WhatsApp reads as marketing is approved as marketing [7]. A normal change gets one day's notice, switches the category, and stays `APPROVED`. An abuse warning from April 16, 2025 drops that notice. `template_category_update` reports the switch. The API shows `category` (in use) and `correct_category` (what Meta considers correct). You pay whichever category was billed [7]. Error 131064, an abuse penalty, blocks templates and direct messages until it ends [2]. Appeal within 60 days in Business Support Home [7].

**How it shows up.** A send fails on a template that looked published, or the marketing bill grows in a category you did not choose.

**How to catch it.** Read the status, subscribe to `message_template_status_update` (a status change), and do not schedule a template still in review [6]. Category switches arrive on `template_category_update` [7].

**How to avoid it.** Keep offers, coupons, and invitations out of utility copy. One promotional line makes the template marketing [7]. Resubmitting the same text feeds error 131064 [2].

## 5. Handing the chat to a person with no transcript

**What happens.** The alert reaches someone who cannot see the conversation. They ask the customer to repeat it, and the customer decides the company forgot. We saw this in production. This failure does not come from the Cloud API. The transcript lives in your system.

**How it shows up.** The customer says they already explained, and your side says nothing arrived. The alert went out without the transcript.

**How to catch it.** The test payload needs the person's recent messages, the agent's last reply, and the reason for the handoff. If one field is missing, the test fails.

**How to avoid it.** Write the transcript in the same step as the alert. If that write fails, the handoff fails with it. Do not send only the phone number.

## 6. The phone number is in the wrong shape

**What happens.** The Cloud API accepts a plus, hyphens, parentheses, and spaces, and recommends a plus with the country code [5][8]. Drop the plus and it prefixes the business number's country. `(631) 555-1234` becomes `+916315551234` for a business number in India [5]. For Brazil and Mexico, the API may change that prefix. Meta calls this standard behavior, not a bug [5][8]. The value you sent may not match `wa_id`, the contact's WhatsApp id [5]. We saw a Brazilian mobile missing the ninth digit in production, and a sheet that duplicated that 9. A 10-digit US number with no country code fails the same way [5].

**How it shows up.** Some spreadsheet rows never arrive, or `wa_id` opens a different thread.

**How to catch it.** Test plus, no plus, a duplicated Brazilian 9, a 10-digit US number, and Mexico. Store the value you sent and the `wa_id`. Do not require the two strings to match for Brazil or Mexico [5][8].

**How to avoid it.** Normalize to E.164 before any send: a plus sign, the country code, and the number, digits only. Do not pass the raw spreadsheet cell.

## 7. "Success" when nothing was sent

**What happens.** A query with no rows lets the next step run on an empty field. We saw this in production. Success JSON means Meta accepted the send, not that it delivered [5]. Webhook statuses are `sent` (sent out), `delivered` (on the phone), `read` (opened), `failed` (with the code), and `played` (media played) [4].

The other case is an expired token. Embedded Signup builds Facebook Login for Business from "WhatsApp Embedded Signup Configuration With 60 Expiration Token", a 60-day token [9]. We saw HTTP 401 (unauthorized) in production after it expired. Read `code` and `details`. Code 190 means the token expired. Code 0 means the app user was not authenticated: expired, invalidated, or a setting they changed [2].

A system user token is separate. Refresh it every 60 days with `grant_type=fb_exchange_token` and `set_token_expires_in_60_days=true` (app id, secret, current token). Skip that and you lose it. The new token replaces the old one, valid until the original date. Revoke it after that [12]. Non-expiring tokens exist, and the page recommends expiring ones. If a business allows only expiring tokens, omitting the flag or sending `false` makes the call fail [12]. Versions 2 and 3, public previews included, stop on October 15, 2026. Move to version 4 before that date [9][10].

**How it shows up.** The console is green and the customer gets nothing. With the token, yesterday worked and today authentication fails. The run counter hides both.

**How to catch it.** Over seven days, compare API accepts with `delivered` or `read`. Treat 190 and 0 as failures [2]. On the 60-day token, record the issue date and alarm before day 60 [9].

**How to avoid it.** Count success only on `delivered` or `read`. An empty query stops the run. The short wait on the morning check is a bar samambai sets, not a Meta deadline.

## What not to do

Do not send without opt-in, consent for that contact [5]. Do not pull a live card to force 131042. Do not treat a zero invoice as a send [1]. Do not time the window from the agent's message [5]. Do not schedule a template unless it is `APPROVED`, and do not hide marketing in utility copy [6][7]. Do not pass a spreadsheet number [5]. Do not hand off without the transcript. Do not use the ads account as the messaging account.

## What to monitor every week

On the live number:

- `health_status` for `PHONE_NUMBER`, `WABA`, `BUSINESS`, and `APP` anything other than `AVAILABLE` [3].
- `failed` over seven days: 131042, 131047, 132001, and 190 [2][4].
- API accepts against `delivered` or `read` [4][5].
- Any template that is not `APPROVED`, and any `template_category_update` [6][7].
- Service volume near 1,000 per number for the month. Past that, the type is `regular`. With no card, that message is not delivered [1][4].
- An alarm before day 60 if the token is the 60-day one [9].
- Each morning, one approved utility template to an internal number. Each week, free-form text outside the window has to return 131047, and the utility template has to reach `delivered` [2][4].
- Test numbers: plus, no plus, a duplicated Brazilian 9, a 10-digit US number, and Mexico [5][8].

## When not to hire samambai

Skip samambai if one person on the WhatsApp Business app can carry the volume, with no system behind the number.

Skip it if a product for your industry already runs the inbox, with no outside CRM, ERP, or calendar, no reminder it fails to send, and no plan to outgrow it. See [off the shelf or custom](/blog/whatsapp-ai-agent-off-the-shelf-or-custom/).

Skip it if you will not add a payment method, verify the business, or approve a template before go-live. Skip it if nobody reads the handoff. Skip it for a guaranteed category, a per-message rate, or a promise that Meta will not restrict the account. Category, price, and delivery belong to Meta [1][7].

Do not buy this for customers who are not on WhatsApp. In the US that is often iMessage and SMS. A US team selling into Latin America, Spain, or Israel is different: those customers are on WhatsApp. Prices are in US dollars.

The studio is in São Paulo and has shipped, in Portuguese and English, for teams in São Paulo, New York, Madrid, and Tel Aviv. A two-week sprint (US$1,200, cancel anytime) fits a live agent with account, templates, and access ready. A project from US$3,000 fits an agent not yet in the system: fixed scope, time, and price, one delivery each sprint, then support. A partnership from US$900 a month fits when the weekly check stays with the studio (roadmap, priority, monthly check-in). All three are on [pricing](/pricing/). The first call is 30 minutes, with no commitment. Automation takes 2 to 4 weeks. A project takes 4 to 8, in sprints of 2. That does not cover a Meta outage.
