Those operating with the official API face an error screen designed for developers: numeric code, phrase in English, and no guidance on what to do. The result is predictable — the team treats everything as a "WhatsApp error," resends what shouldn’t be resent, switches a number that was healthy, and blames the database for a configuration problem. This article organizes this chaos into three groups, explains what each common failure really means, and defines the only correct decision for each.
In this article
- Three groups, three different decisions
- Configuration errors
- Database and recipient errors
- Platform rejections
- The window and the template: the costliest confusion
- Limit, quota, and quality
- Media and header errors
- What can and cannot be resent
- How to build a decision-making error dashboard
- A campaign in numbers
- Five mistakes when handling errors
- Key metrics to monitor
- Frequently asked questions
Three groups, three different decisions
The first thing to do with a list of failures is to stop treating it as a single list. Every rejection from the official API falls into one of three groups, and each group requires a different reaction — sometimes opposite.
- Configuration. Something on the company’s side is wrong: template doesn’t exist for that number, missing permission, closed window, parameter in invalid format. It affects the entire campaign or a large portion of it. Fix once and it disappears.
- Database and recipient. The contact itself prevents delivery: number without a WhatsApp account, mistyped phone, device absent for too long, block. Distributed throughout the list in a stable proportion.
- Platform rejection. Meta decided not to deliver that message, due to policy, limit, or its own criteria. There is no fix on the company’s side, and insisting only worsens the situation.
The rule that separates the reaction is simple and applies to the entire operation: configuration errors are fixed and resent; database errors are cleaned from the records; platform rejections are not resent. Confusing the third with the first is the behavior that most damages serious company numbers.
Configuration errors
These are the most frequent in new operations and the easiest to resolve because they have a clear signature: the failure rate hits close to 100% from the first message.
- Template not found or not approved for this number. The classic cause in operations with number rotation. The model was approved on one business account, and the campaign chose a number from another account where it doesn’t exist. It’s not a bug: template approval belongs to the account, not the company.
- Number of parameters different from expected. The template has three variables and the system sent two, or the text has a line break where it’s not allowed. The returned phrase usually mentions "invalid parameter" and rarely specifies which one.
- Incorrect language. The template exists in Brazilian Portuguese and the send requested European Portuguese. These are different models for the platform.
- Missing permission. The account or app lacks the necessary authorization for that operation. Usually appears as a generic permission error and is resolved in the Meta dashboard, not in the code.
- Expired or changed token. Everything stops working at once, including what worked minutes before.
The diagnosis is always the same: if the failure starts with the first message and affects almost all, stop the campaign. Letting it run discovers nothing and wastes reputation.
Continue reading for free
Fill out once and unlock this and all other blog articles. We charge nothing — we just want to know who we’re writing for.
Takes 20 seconds. Prefer to talk directly on WhatsApp?
Database and recipient errors
These appear scattered throughout the campaign, in similar proportions from one campaign to another, and relate to the company’s records — not the sending.
- Number without a WhatsApp account. The phone exists but doesn’t use the app. There’s nothing to resend. The value is in marking the contact so you don’t pay for it every month.
- Number in invalid format. Missing country code, extra character, field came from a spreadsheet with mask. It’s rejected before sending.
- Brazilian cell phone spelling. A particular and tricky case: old numbers stored without the ninth digit, or with a digit not used in that region. WhatsApp itself decides which spelling exists, and the only correct way is to check before sending rather than guessing by digits.
- Expiration. The message waited for the device to appear and the deadline expired. It’s not an invalid number — it’s an absent device. Resending at another time usually recovers a good portion.
- Blocked by recipient. That person blocked the company. It’s definitive and the record must be marked, or the list keeps paying and quality degrades.
Platform rejections
Here is the group that most causes wrong decisions because the returned message looks like a defect but isn’t.
- Message could not be delivered. Generic rejection, no detailed reason. Could be anti-fraud filter, recipient behavior, or internal criteria. Do not resend.
- Number in platform experiment. Meta separates user segments for internal tests and rejects sends to them. It’s unrelated to the company or database and doesn’t change with insistence.
- Template paused for quality. That specific model accumulated blocks and was suspended. The number remains healthy and other templates work — changing the number doesn’t solve it, rewriting the message does.
- Policy restriction. Content the platform doesn’t accept, even with an approved template.
The typical confusion: the team sees many of these rejections, concludes "the number is burned," and migrates the campaign to another number. The campaign restarts, the same rejections appear, and now two numbers have worse quality. The right path is to check what the platform is rejecting, accept the portion that doesn’t depend on the company, and review content when the proportion rises.
The window and the template: the costliest confusion
Much of the failures in new operations come from a single misunderstanding about when each type of message can be used.
When the customer writes to the company, a service window opens — commonly 24 hours — during which the company can reply with free-form messages however it wants. Outside this window, free-form messages are rejected, and the only path is an approved template.
The two mirrored errors:
- Trying free-form message outside the window. Happens when automation replies to an old contact, or when an agent opens an archived conversation and writes. The rejection mentions the window, and the fix is to use a template.
- Using a template with the window open. Doesn’t fail but wastes money and sounds robotic to someone who just wrote.
There is a variation that confuses even more: on Instagram Direct and Messenger, the window logic also exists with its own rules. A lock written thinking only about WhatsApp ends up blocking legitimate replies on other channels — the customer wrote, the window is open, and the system rejects because it applied the wrong rule. The channel of that conversation is the authority.
Limit, quota, and quality
Three different things that teams often call by the same name.
The limit on initiated conversations is the cap on how many new contacts that number can open in a period. It increases as the operation demonstrates volume and quality. When reached, the failure appears mid-campaign — it starts well and degrades.
The number quality is a platform indicator based on blocks and reports. Low quality doesn’t by itself prevent sending but usually comes with limit restrictions and is the alarm before serious problems.
The financial pending is the quietest: a commercial account with an open invoice can have sends blocked even with a green number and approved template. The failure doesn’t say "open invoice" — it says something generic — and the team spends hours looking for technical defects. It’s worth checking before any long investigation.
Media and header errors
Templates with image, video, or document in the header have their own category of failures, often misdiagnosed because the returned phrase mentions parameters.
- Format not accepted. Exotic image format, PNG with transparency or unusual color profile, file extension not matching content.
- Size above limit. Each media type has its own cap.
- Media identifier from another number. Files sent to the platform are associated with the sending number. Using that identifier on another number fails — again, rotation runs into this.
- Expired media address. Links to files hosted by the platform have short validity and can’t be used for later resends.
A design principle is golden here: media preparation should not block sending. If image conversion fails but the original file is already in an accepted format and within size limits, the right approach is to proceed with the original and let the platform decide — not stop the entire campaign due to an auxiliary step.
What can and cannot be resent
The mental table that avoids most damage:
- Resend after fixing: wrong template, invalid parameter, wrong language, missing permission, expired token, server network failure.
- Resend after a delay, at another time: expiration due to absent device.
- Never resend: generic platform rejection, number in experiment, blocked by recipient, number without WhatsApp account, policy restriction.
And a golden automation rule: automatic resend loops are forbidden. A system that retries on its own without classifying the reason turns an isolated rejection into hundreds of attempts against the same recipient — exactly the pattern the platform punishes.
How to build a decision-making error dashboard
A useful dashboard has four characteristics, none of which are technical.
First: message in Portuguese. Numeric codes and English phrases mean nothing to operators. "Failed to send message because this user's phone number is part of an experiment" needs to appear as "Meta blocked this number because it’s part of an internal test." The original text can be stored for investigation but should not be shown on the screen.
Second: grouping by reason, with counts. Thirty identical lines are not thirty problems; they are one problem with thirty occurrences.
Third: classification by group — configuration, database, or platform — so the decision comes from the dashboard itself.
Fourth: suggested action by group. Resend, clean records, fix configuration, or accept. Without this, every error becomes a support ticket.
A campaign in numbers
An example campaign with 3,173 contacts shows how classification changes interpretation.
The dashboard without grouping shows 130 red lines and the team concludes "the campaign failed." Grouped, the picture is different:
- 62 numbers without WhatsApp account — 2.0% of the database
- 34 generic platform rejections — 1.1%
- 19 expirations due to absent device — 0.6%
- 11 numbers in platform experiment — 0.3%
- 4 blocks — 0.1%
There are 130 failures in 3,173, or 4.1% — a normal level. And the decisions are three, not one: 62 contacts are removed from the database and stop costing; 19 are scheduled for resend at another time; and the 49 remaining are platform rejections with no action. No line in this report justifies changing the number, rewriting the template, or opening a ticket — which is exactly what would have happened with the 130 loose red lines.
Five mistakes when handling errors
- Resending what the platform rejected. The result is the same and the number’s quality drops with each attempt.
- Changing numbers due to platform rejection. Transfers the problem to the new number and now two have bad history.
- Letting the campaign run with high failure from the start. Configuration failures aren’t discovered by insisting; they’re discovered by stopping.
- Showing Meta’s text on the operator’s screen. Error in English doesn’t produce decisions — it produces tickets.
- Looking for technical defects before checking the account. Open invoice and missing permission cause failures that look like bugs and are resolved in the Meta dashboard.
Key metrics to monitor
Five indicators keep the operation under control. The total failure rate per campaign, compared to the company’s historical average, is the simplest alarm. The composition of failures by group — configuration, database, and platform — shows who needs to act. The percentage of invalid contacts in the database, which only decreases with record work and costs money in every campaign. The block rate, the most sensitive indicator, which precedes number quality decline. And the amount of automatic resends triggered, which should be near zero for platform rejections — when this number grows, the system is working against the operation itself.
Frequently asked questions
Can I resend a message that the API rejected?
It depends on the group the rejection falls into, and confusing them is the biggest cause of serious company numbers failing. Configuration errors — template not existing for that number, invalid parameter, wrong language, missing permission, expired token — should be fixed and resent. Expiration due to absent device can be resent after a delay, preferably at another time. Platform rejections should never be resent: message could not be delivered, number in Meta’s internal experiment, blocked by recipient, number without WhatsApp account, and policy restriction do not change outcome with insistence, and each new attempt wastes reputation. There is also an automation rule: automatic resend loops without classifying the reason turn an isolated rejection into hundreds of attempts against the same recipient — exactly the pattern the platform punishes.
What does "this user's phone number is part of an experiment" mean?
It means Meta has separated that number for an internal test and is rejecting sends to it. It’s unrelated to your company, your database, or your number’s quality, and doesn’t change with insistence: resending produces exactly the same rejection. It’s one of the failures in the "platform rejection" group, where there is no fix on the sender’s side. In a healthy campaign, these occurrences appear in a small, stable proportion, and the right decision is to record them and move on. The practical problem is different: since the message arrives in English and without explanation, the team interprets it as a defect, concludes the number is burned, and migrates the campaign to another number — which solves nothing and puts a second number in the same situation.
My campaign started failing almost everything. What should I do?
Stop immediately. High failure from the first message is almost never a database problem — it’s configuration, and letting it run discovers nothing while wasting reputation. The most common causes are template not existing or not approved for that specific number, classic in rotation operations; number of parameters different from what the template expects; wrong language, since Brazilian and European Portuguese are different models; missing permission in the account or app; and expired token, which breaks everything at once, including what worked minutes before. Diagnosis is quick when failures are grouped by reason: one dominant cause with hundreds of occurrences points directly to what to fix. After fixing, resending is legitimate because the error was the company’s, not a platform rejection.
The template image is failing. Is this a Meta error?
Usually not. Templates with media in the header have their own family of failures, often misdiagnosed because the returned message usually says "invalid parameter" instead of mentioning the image. The most common causes are unacceptable format, size above the limit for that media type, file identifier belonging to another number — the file sent to the platform is associated with the sending number, and reusing it on another fails — and expired media address, since links hosted by the platform have short validity. A design principle applies: media preparation should not block sending. If image conversion fails but the original file is already in an accepted format and within limits, the right approach is to proceed with the original and let the platform decide, rather than stopping the entire campaign due to an auxiliary step.
Why does the message fail even with a green number and approved template?
There are three frequent causes that don’t appear in the number’s status. The first is the limit on initiated conversations: there is a cap on how many new contacts that number can open in a period, and when reached, failure appears mid-campaign — it starts well and degrades. The second is that specific template being paused for quality: the model accumulated blocks and was suspended while the number remains healthy and other templates work, meaning changing the number doesn’t solve it but rewriting the message does. The third is the quietest: financial pending on the commercial account can block sends even with everything green, and the returned failure doesn’t say "open invoice" — it says something generic. It’s worth checking the account before starting any long technical investigation.
Error that doesn’t lead to a decision becomes a support ticket
VeyloCRM translates each Meta rejection into Portuguese, groups failures by reason instead of listing loose lines, separates configuration, database, and platform rejections, doesn’t resend what Meta blocked, and keeps WhatsApp, Instagram, and Messenger in the same dashboard — so the team knows what to do without opening a ticket for every campaign.