Troubleshooting: Messenger and Instagram 24-hour window closed
A Messenger or Instagram send returns 422MESSAGING_WINDOW_CLOSED when
Meta’s 24-hour messaging window has elapsed for the conversation and the
request did not carry an allowed messaging tag. The code is defined in the
Error Code Reference and is the most common
Messenger/Instagram send blocker: the conversation simply went quiet for more
than a day, and Meta treats further untagged sends as spam.
This gate is enforced by Meta and relayed by Orbit. It closes only on your
say-so: you pick the tag, pick HUMAN_AGENT, spend a one-time-notification
token (Messenger only), or route the send onto another channel.
Read the error surface
The 422 envelope carriesdetails that tell you which window tripped:
details.hours_since_last_inbound— how far past the 24-hour mark the send was attempted. Under ~25 this is usually a race; past a few hundred hours the recipient has simply gone quiet.details.last_inbound_at— the timestamp of the recipient’s last inbound message (or postback/tap, which also opens the window).
If you run multi-channel failover, match on
channel in the response before
choosing a fix — the Messenger/Instagram remediation below does not apply to
WhatsApp, and vice versa.
Root causes
Allowed Meta tags on Orbit’s Messenger/Instagram lanes (pick the one matching
your content):
HUMAN_AGENT— hands the thread to a human agent; extends the window to 7 days.ACCOUNT_UPDATE— account status changes.POST_PURCHASE_UPDATE— order updates for a prior purchase.CONFIRMED_EVENT_UPDATE— event reminders RSVP’d by the recipient.
Checking the conversation row
Pull the conversation to confirm the last inbound time before you pick a fix:last_inbound_at (or the last message’s direction: inbound and its
timestamp). If the difference to now is under 24 hours and the send still
422s, the wrong messaging_type is the culprit — not the window.
Prevention
- Tag-aware routing at send-compose time. Before calling the send
endpoint, check the conversation’s
last_inbound_at; when it is older than 24h, route the send ontoMESSAGE_TAG(with the appropriatetag) orHUMAN_AGENTinstead ofRESPONSE. The compose check eliminates the gate instead of retrying into it. - Template fallback onto SMS or Email. Arm a cascade so a Messenger or
Instagram primary leg escalates to SMS or Email when the window is closed.
See Cascade failover policy — every hop
of the cascade stays under one
message_group_id, so the fallback run is readable as one logical message. - Inbound-first nurture. Postbacks, quick-reply taps, and story replies re-open the window. Structure triggers so frequent recipients get a reply event before your outbound batch runs.
When NOT to retry
The window gate is a Meta-side gate, not an Orbit retry ladder:- Do not retry the same request body. Without a tag (or with an unapproved tag) every retry 422s identically — the response was deterministic, not transient.
- Do not retry a
RESPONSEsend against an elapsed window. Switchmessaging_typefirst; then retry once. - Do not treat sibling failure classes as window gates. A 502
MESSAGE_SEND_FAILEDwithdetails.provider_messagenaming a token or block is a different fix (reconnect / suppress); see the runbook’s escalation checklist below.
Escalation checklist
Open a ticket when the send used a valid tag, the tag matches the message content,last_inbound_at is current, and the 422 persists. Include:
- The
request_idfrommetaon the 422. - The
messaging_typeandtagexactly as sent. details.hours_since_last_inboundanddetails.last_inbound_atfrom the error.- The conversation id and recipient PSID/IGSID (already scoped to your workspace).
See also
- Messenger channel page — personas, OTN tokens, and the error table this code comes from
- Instagram channel page —
messaging_typeand the allowed tag set - Error Code Reference — the
MESSAGING_WINDOW_CLOSEDrow plus the WhatsApp siblings - Troubleshooting hub — every runbook in one index
- Cascade failover policy — SMS/Email fallback under one message group