WhatsApp error 131047: Re-engagement message
Last verified against Meta for Developers - Cloud API error codes
More than 24 hours have passed since the recipient last replied to the sender number.What error 131047 means
Code 131047 is the most common WhatsApp Cloud API error in production, and it is not a malfunction: it is the platform's central rule being enforced. A business may send free-form (non-template) messages only inside a customer service window that opens when the customer messages you and closes 24 hours after their most recent message. Once it closes, the only permitted outbound message is a pre-approved template. Attempting anything else produces 131047.
The window resets on every inbound message, not just the first, so an active back-and-forth stays open indefinitely. It closes quietly when the customer goes silent. Meta now also opens the window when a user calls the business. Note that the error is often reported asynchronously in a statuses webhook as failed, because the send was accepted and then refused at delivery.
Nothing about the token, recipient, or content format is wrong. The timing is.
Where the error appears depends on when the check runs. Most 131047 responses come back synchronously with HTTP 400, but a share arrive later in a statuses webhook with status: "failed", so a dispatcher that only inspects the HTTP response will undercount window failures; if webhook events are not reaching you at all, work through the webhook debugging guide first. One adjacent gotcha: a conversation that starts from a Click-to-WhatsApp ad or a Facebook Page call-to-action button opens a 72-hour free entry point conversation, but that affects billing, not permissions - free-form eligibility is still measured from the customer's last message, so 131047 can fire in the middle of a free entry point conversation. If you send through a BSP, the code may be renamed: Twilio reports this situation as its error 63016 ("Outside messaging window"), while API-passthrough providers such as 360dialog return Meta's 131047 unchanged.
What it looks like
{
"error": {
"message": "(#131047) Re-engagement message",
"type": "OAuthException",
"code": 131047,
"error_data": {
"messaging_product": "whatsapp",
"details": "Message failed to send because more than 24 hours have passed since the customer last replied to this number."
},
"fbtrace_id": "A2tNqXmKeLsPbRv"
}
}Why it happens
- A support agent or bot replying to a conversation after the customer has been silent for more than 24 hours.
- A scheduled follow-up (delivery update, reminder) implemented as free-form text instead of a template.
- Tracking the window from the first inbound message instead of the latest one, so the app thinks it is still open.
- Clock skew or timezone bugs in the stored last-inbound timestamp.
- A drip sequence that assumes a reply will arrive in time and does not check before sending.
How to fix WhatsApp error 131047
- 1Look up the timestamp of the customer's last inbound message; if it is older than 24 hours, the window is closed.
- 2Send an approved template instead (utility or marketing as appropriate); the customer's reply will reopen the window.
- 3Fix the window check to use the latest inbound message timestamp, compared in UTC.
- 4Do not retry the free-form message; it will fail identically until the customer replies.
- 5Handle the statuses webhook so the failure is recorded against the conversation rather than silently dropped.
- 6If the fallback template itself fails with error 132001, verify its name and language against the approved list before blaming the window.
How to stop it recurring
Store the last inbound timestamp per contact and check it before every free-form send, falling back to a template automatically when the window is closed. Design any workflow that reaches people at unpredictable times, such as reminders and shipping updates, on templates from day one; retrofitting is slow because templates need approval. Do not try to keep windows open with filler messages. The window rules, including the free entry point and the call-opened window, are tabulated in the WhatsApp limits reference, and the symptom-first walkthrough is in the WhatsApp error-code guide.
Official reference: Meta for Developers - Cloud API error codes. See all WhatsApp error codes or the WhatsApp limits and quotas.
Related codes
- 131026: Message UndeliverableUnable to deliver message. Reasons can include: The recipient phone number is…
- 131049: Meta chose not to deliver.This message was not delivered to maintain healthy ecosystem engagement.
- 132001: Template does not existThe template does not exist in the specified language or the template has not…
- 132000: Template Param Count MismatchThe number of variable parameter values included in the request did not match…
Error 131047 - quick answers
What does WhatsApp error 131047 mean?
Code 131047 is the most common WhatsApp Cloud API error in production, and it is not a malfunction: it is the platform's central rule being enforced. A business may send free-form (non-template) messages only inside a customer service window that opens when the customer messages you and closes 24 hours after their most recent message. Once it closes, the only permitted outbound message is a pre-approved template.
How do I fix WhatsApp error 131047?
1. Look up the timestamp of the customer's last inbound message; if it is older than 24 hours, the window is closed. 2. Send an approved template instead (utility or marketing as appropriate); the customer's reply will reopen the window. 3. Fix the window check to use the latest inbound message timestamp, compared in UTC. 4. Do not retry the free-form message; it will fail identically until the customer replies. 5. Handle the statuses webhook so the failure is recorded…
Should I retry after error 131047?
No. Retrying the same request produces the same error; the condition has to be fixed first. Treat it as a permanent failure for that message and surface it, rather than looping.
Stop debugging WhatsApp by hand
Connect the channel through Conferbot: tokens, webhooks and retries are handled, failures show as readable status.