Updated on October 25, 2026
WhatsApp error 131049 means Meta did not deliver a marketing template because the recipient hit the per-user marketing message limit. The limit is adaptive: WhatsApp reduces how many marketing messages a person receives, from any business, when they are less likely to read them. A message that fails with this error is not charged, and the official guidance is to wait at least 24 hours before trying again.
This article explains how the limit works, how the error reaches your webhook, what counts and what does not, and how to adjust your campaigns to lose fewer messages.
What the per-user marketing limit is
The Per-user marketing template message limits page says WhatsApp may cap the number of marketing templates a user receives from any business in a given period when they are less likely to engage. The decision considers, among other factors:
- that person’s recent marketing message read rate;
- how many messages they have in their inbox from friends, family and businesses.
Three points change how you should think about campaigns:
- The limit belongs to the user, not to your business. If the person received a lot of marketing from other brands, yours may be the one left out.
- It is dynamic. Meta does not publish a fixed number. The limit adapts to each person’s recent engagement.
- It is different from the portfolio messaging limit. The portfolio limit controls how many unique recipients you can reach in 24 hours outside the customer service window (250, 2,000, 10,000, 100,000 or unlimited). The per-user limit controls how many marketing messages each person receives.
How error 131049 shows up
The send call returns 200 as usual. The failure only appears later, in the status webhook, with status: "failed" and code 131049. Meta’s error code table describes it as: “This message was not delivered to maintain healthy ecosystem engagement.”
A status with this error looks like this:
{
"object": "whatsapp_business_account",
"entry": [{
"id": "<WABA_ID>",
"changes": [{
"field": "messages",
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "5511999999999",
"phone_number_id": "<PHONE_NUMBER_ID>"
},
"statuses": [{
"id": "wamid.HBgLNTUx...",
"status": "failed",
"timestamp": "1761400000",
"recipient_id": "5511888888888",
"errors": [{
"code": 131049,
"title": "This message was not delivered to maintain healthy ecosystem engagement."
}]
}]
}
}]
}]
}
So never treat a campaign as “delivered” based on the API response alone. Store each send’s wamid and match it against the statuses that arrive later. The full status lifecycle is covered in message status via webhook.
What counts toward the limit and what does not
| Situation | Counts toward the per-user limit? |
|---|---|
| Delivered marketing template | Yes, each one counts |
| Marketing template sent inside the 24-hour window opened when the user replied to a marketing message | No |
| Failed template (not delivered) | Not a delivery; not charged |
| Utility and authentication templates | Meta’s rule covers marketing templates |
The second row is the most useful in practice. When a user replies to a marketing message, a 24-hour customer service window opens, and marketing messages sent within it do not count. Campaigns that spark real conversations are hit less by the limit.
On billing: the pricing page states that Meta only charges for delivered messages. A message with a failed status due to 131049 was not delivered, so it is not charged.
How long to wait before resending
The official guidance is to wait at least 24 hours before resending a marketing template to someone who has reached the limit. Meta adds two warnings:
- resending sooner will likely produce more errors and reduces the accuracy of campaign delivery reporting;
- if your account repeatedly tries to resend, within 24 hours, to users who already reached their limit, further attempts to those users may be unavailable for up to 24 hours, also with error 131049. This does not affect sending to other users.
In code, the rule is simple: on 131049, schedule the next attempt for 24 hours or more later, and cap the number of attempts.
const ONE_DAY_MS = 24 * 60 * 60 * 1000;
const MAX_ATTEMPTS = 2;
export async function handleStatus(status, db) {
if (status.status !== 'failed') {
return db.updateSend(status.id, status.status);
}
const code = status.errors?.[0]?.code;
await db.updateSend(status.id, 'failed', code);
if (code === 131049) {
const send = await db.findSend(status.id);
if (send.attempts < MAX_ATTEMPTS) {
await db.scheduleResend({
contact: status.recipient_id,
template: send.template,
notBefore: Date.now() + ONE_DAY_MS + 60 * 60 * 1000, // 25 h buffer
attempts: send.attempts + 1,
});
}
}
if (code === 131050) {
await db.markOptOut(status.recipient_id, 'marketing'); // do not resend
}
}
It is worth asking whether a resend makes sense at all. An offer that has expired should not be resent. And someone who keeps hitting the limit is, by definition, someone who reads little marketing: the better call may be to take them out of that sequence.
131049 and similar errors
| Code | What it means | What to do |
|---|---|---|
131049 | Not delivered to maintain healthy ecosystem engagement (per-user marketing limit) | Wait 24 h or more before resending |
131050 | The user chose to stop receiving marketing messages from your business | Do not resend; mark as opted out |
131048 | Sending restriction on the number, for example due to blocks and spam reports | Check quality in WhatsApp Manager |
131047 | More than 24 h since the user’s last message | Send a template instead of a free-form message |
131026 | Unable to deliver (no WhatsApp on the number, old app version, terms not accepted) | Confirm the number through another channel |
Source: Meta error codes. For the full list and how to handle each one, see WhatsApp API errors.
United States phone numbers
The same per-user limits page states that WhatsApp currently does not deliver marketing templates to US phone numbers (+1 dialing code with a US area code). If your base includes US customers, filter those numbers out before marketing campaigns.
How to reduce 131049 in your campaigns
There is no way around the limit, and trying is not worth it. What you can do is send messages people actually read:
- Segment by engagement. Separate people who read or replied recently from those who have not opened anything in months. Send to the engaged group first.
- Lower frequency. One strong offer a week usually performs better than three average ones.
- Personalize for real. Name, product of interest, last order. Generic messages get read less.
- Invite a reply. Quick reply buttons (“Show me”, “Not now”) create interaction and open the customer service window, inside which marketing messages do not count toward the limit.
- Do not disguise marketing as utility. Meta can recategorize the template and restrict new utility templates. See how Meta categorizes templates.
- Keep your list healthy. Clear opt-in and easy opt-out keep read rates high. See how to build an opt-in list.
- Track the 131049 rate per campaign. If it climbs, the issue is usually targeting or frequency, not the API.
When you estimate a campaign’s cost, remember that messages not delivered because of this error are not charged, but they also produce no results. The guide on how much a WhatsApp campaign costs shows how to estimate.
Error 131049 with Vectalk
Vectalk is a proxy for the official Cloud API, and the webhooks are Meta’s: the failed status with errors[0].code = 131049 arrives in the same format at the URLs you register with POST /api/webhooks. Templates are sent with POST /api/messages, using the same payload as Meta. The webhooks documentation shows the status format. To get started, create an account at apps.vectalk.com.br/register.
Frequently asked questions
Is error 131049 charged?
No. Meta only charges for delivered messages, and a message with a failed status was not delivered.
How long should I wait before resending?
At least 24 hours, according to Meta. Resending sooner tends to produce the same error and can block further attempts to that user for up to 24 hours.
Does the limit apply to utility templates?
Meta’s documentation describes the limit for marketing templates. Labeling marketing as utility to avoid it breaks the categorization rules and can lead to recategorization and restrictions.
Does error 131049 lower my number’s quality rating?
The error itself is not a negative user signal like a block or report. But repeatedly sending to people who do not read increases the chance of blocks, and that affects your phone number quality rating.
Can I find out each user’s limit?
No. Meta does not disclose individual limits; they change with each person’s recent engagement. The only signal is error 131049 in the webhook.
Official sources consulted on October 25, 2026: Per-user marketing template message limits, Error codes, Messaging limits, Pricing, Send messages and customer service windows.
