WhatsApp error 131047: Re-engagement message — fix
WhatsApp error 131047 (Re-engagement message) means the 24-hour window is closed. Why Meta refuses the free-form message and how to switch to a template.
WhatsApp error 131047 means more than 24 hours have passed since the recipient last messaged you: the customer service window is closed, and only an approved template can still reach them. The fix is simple: resend the content as a template, then go back to free-form messages as soon as the customer replies.
What does error 131047 mean?
"More than 24 hours have passed since the recipient last replied to the sender number." — Meta, Cloud API error codes
Meta's suggested fix is one line: "Send the recipient a template message instead." In the
response's message field, the code is followed by its title, "Re-engagement message"
(360dialog's list); Meta warns
these titles will be deprecated, so do not code against them.
The rule behind the code is the customer service window. When a user messages or calls you, a 24-hour timer starts; each new message or call from them resets it to 24 hours. While it runs you can send any free-form message: text, image, buttons, list. Once it expires, only approved templates go through (Meta, Send messages).
When does error 131047 happen?
- A free-form message sent too late: the support answer goes out the next morning, while the customer wrote at 8 a.m. the day before.
- A first free-form message to someone who never wrote to you: there is no window at all.
- A Flow sent as an interactive message outside the window: same rule, see Flows in the library.
- Blocking a user: Meta only lets you block a number that messaged you in the last 24 hours
(Meta, Block users).
POST /api/v1/blocked-usersthen reports the failure number by number, with code 131047 and the message "Failed to block due to re-engagement check failed", which we recorded on a live number on August 13, 2026.
Why does the API answer 200 when the message never arrives?
This is the main trap with this code. On August 13, 2026, on a live number, we sent three
free-form texts outside the window: Meta answered HTTP 200 with a valid wamid for each, and
none was delivered. No 131047 on the call. A template sent to the same recipient right after
arrived immediately.
Depending on the case, the error comes back on the call, later on the status webhook, or not at all. That is why Genuka WA checks the window on its side before every free-form message and says so in the response, without blocking the send:
{
"data": {
"messageId": "wamid.HBgLMjM3...",
"warning": {
"code": "outside_service_window",
"message": "This contact last messaged you at 2026-10-06T08:12:44.000Z, more than 24 hours ago, so the service window is closed. Meta will most likely drop this message; send an approved template instead."
}
}
}Where do you see it in Genuka WA?
| Channel | What you get |
|---|---|
200 response of POST /api/v1/messages | data.warning.code: outside_service_window (last inbound message more than 24 h ago) or unverified_service_window (no inbound message on record for this contact) |
400 response of POST /api/v1/messages | "error": "send_needs_template", meta.code: 131047, when Meta refuses on the call |
message_status webhook | data.status: "failed" and data.errors[0].code: 131047 |
| Dashboard, Inbox section | The failed bubble; "See why" shows Meta's code and details |
The warning is never a refusal: our record of the window comes from the webhook feed, and an
outage on our side must not block a send Meta would have delivered. The decision is yours.
How do I fix error 131047?
Do not resend the free-form message. It will fail exactly the same way. Genuka WA classifies
131047 as needs_template and never retries it, in a single send or in a campaign.
Pick an approved template of the right kind: UTILITY for order or account information,
MARKETING for a promotion. The list is at GET /api/v1/templates?status=approved for templates
created through Genuka WA; those created in WhatsApp Manager are not in it, but send the same way.
Send it with the template field on the same endpoint, always passing language.
Go back to free-form when the customer replies. Their reply opens a new 24-hour window.
curl -X POST https://wa.genuka.com/api/v1/messages \
-H "Authorization: Bearer $GENUKA_WA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"connectionId": "con_1",
"to": "+237690000001",
"template": { "name": "order_update", "language": "en", "body": ["Awa", "ORD-1042"] }
}'
# { "data": { "messageId": "wamid.HBg..." } }If the free-form message already went out and a message_status webhook comes back failed with
code 131047, the same rule applies: resend the content as a template, once.
How do I prevent error 131047?
- Keep your own window clock. Every inbound message reaches your webhook with the sender and a timestamp: store the latest one per contact and choose template or free-form before sending.
- Read
data.warning. When it is present, assume the free-form message will probably not be delivered, and watch its status. - Use a template for anything you initiate: order confirmation, appointment reminder, login code. The order notifications guide is built on that principle.
- Keep a re-engagement template in the
UTILITYcategory, short, inviting the customer to reply so the conversation reopens.
Related error codes
- 132001: the template you picked to re-engage does not exist in that language or is not approved.
- 132000: the template is found, but the number of variables does not match.
- 131050: the recipient stopped marketing messages; a
MARKETINGtemplate will not go through either. - 131026: the recipient cannot receive any message, templates included.
FAQ
Do the 24 hours start from my last message or theirs?
Theirs. The window starts at the customer's last message or call; the messages you send do not extend it.
Does a template reopen the 24-hour window?
No, the customer's reply does. Meta spells it out for marketing templates: if the user responds, a 24-hour customer service window starts (Meta, Per-user marketing limits).
Is a free-form message sent inside the window billed?
Meta marks it free_customer_service in the status webhook: a non-template message sent within a
customer service window is free, as is a UTILITY template sent within the window
(Meta, status webhook).
Templates are billed by Meta directly to the client's WhatsApp Business account; Genuka WA adds no
markup.
Can I block a number that never wrote to me?
No. Blocking requires an inbound message from the last 24 hours, otherwise Meta answers 131047
for that number. POST /api/v1/blocked-users returns 207 when some numbers went through, 422
when none did.
Sources
WhatsApp error 131042: payment method issue — fix
WhatsApp error 131042: Meta refuses the send because the WhatsApp Business account has no valid payment method. Where to add the card and how to check it.
WhatsApp error 131049: marketing message not delivered
WhatsApp error 131049: Meta held back your marketing template to keep engagement healthy. The per-user limit, and when to resend without making it worse.