Features Pricing Cost calculator Use cases Compare Blog

How Long Meta Retries a Failed WhatsApp Webhook

12 min read

The short answer

Meta's WhatsApp webhook pages both say failed deliveries are retried "with decreasing frequency until the request succeeds, for up to 7 days"; Meta's generic Graph webhooks page says 36 hours. Retries duplicate, so deduplicate on the message id. Anything unacknowledged past the window is dropped, and no replay API exists. Checked 25 September 2026.

Webhooks and API screen with an outgoing webhooks panel and its green Add endpoint button, an empty endpoint table, an API tokens card offering a Generate token control, and a list of available REST endpoints for contacts and conversations

How long does Meta retry a failed WhatsApp webhook?

For WhatsApp, Meta's own figure is up to seven days. Both of Meta's WhatsApp webhook pages state, in identical words:

"If a webhook request to your endpoint receives an HTTP status code other than 200, or if the webhook cannot be delivered for another reason, Meta retries delivery with decreasing frequency until the request succeeds, for up to 7 days." (Meta — WhatsApp webhooks overview)

So a server that goes down on Friday night and comes back on Monday morning has lost nothing yet: every delivery that failed over the weekend is still inside the window, and Meta will backfill it. What the weekend does cost you is duplicates, ordering, and a hard deadline — the three things the rest of this piece is about.

This is a different problem from the two webhook failures this blog has already covered. If Meta never validated your callback URL in the first place, that is the verify-token handshake failing; if the URL is verified and receives nothing even while your server is healthy, that is a subscription or configuration gap. This post assumes the integration worked, then your endpoint stopped answering — a deploy gone wrong, a certificate expiring, a box falling over — and asks what Meta does about it.

Six rungs tracing a failed WhatsApp webhook delivery from the non-200 answer through Meta's two documented retry windows to the duplicate-laden recovery and the events dropped past the deadline
Downtime shorter than the window is survivable; the price is deduplication.

Why do Meta's own pages give two different windows?

Because Meta's documentation disagrees with itself, and has for as long as anyone has been checking. The generic Graph API webhooks page — the one that covers webhooks for every Graph product, Pages and Instagram included — says:

"If any update sent to your server fails, we will retry immediately, then try a few more times with decreasing frequency over the next 36 hours." (Meta — Graph API webhooks, getting started)

and, on the same page:

"Unacknowledged responses will be dropped after 36 hours." (Meta — Graph API webhooks, getting started)

The WhatsApp-specific pages say seven days. Not one WhatsApp page against one generic page, either: the seven-day sentence quoted at the top of this article appears word for word on both the WhatsApp webhooks overview in Meta's new documentation tree and the older Cloud API set-up-webhooks guide. Nothing on any of the three pages acknowledges the other figure, and nothing reconciles them.

Page Window Scope
Graph API webhooks, getting started 36 hours Every Graph webhook product
WhatsApp webhooks overview Up to 7 days WhatsApp Business Platform
Cloud API set-up-webhooks guide Up to 7 days WhatsApp Cloud API

For WhatsApp traffic the sensible reading is that the product pages govern: they are the specific documentation for the exact webhooks you are receiving, they agree with each other verbatim, and the generic page reads like an older default that WhatsApp's infrastructure overrides. But that is a reading, not something Meta states, so the honest engineering position is to split the difference by role: treat 36 hours as the deadline for getting your endpoint repaired, and seven days as the horizon for deduplication and reconciliation. Built that way, you are safe whichever figure Meta's systems actually apply to your account.

What counts as a failed webhook delivery?

The WhatsApp sentence defines it in two halves: an "HTTP status code other than 200", or a webhook that "cannot be delivered for another reason". The second half is the ordinary catalogue of a dead server — DNS that stops resolving, a connection refused, a TLS certificate that expired, a request that hangs until Meta gives up waiting.

The first half is stricter than most people assume. The sentence says other than 200 — not "outside the 2xx range". A 201, a 204, or a redirect to a page that eventually returns 200 are all, by the letter of Meta's own text, failed deliveries. Whether Meta's infrastructure is in practice more forgiving is not documented, so return a literal 200 and nothing else. A signature check that fails is a special case with its own trade-offs — what your endpoint should do when X-Hub-Signature-256 does not match covers why answering 200 and discarding is usually better than answering 403 and inviting a retry of the same mismatch.

Should you answer 200 before processing finishes?

Yes. The generic Graph page's instruction is that your endpoint "should respond to all Event Notifications with 200 OK HTTPS" (Meta — Graph API webhooks, getting started), and none of the three pages publishes the timeout Meta applies while waiting for that response. That absence cuts against you, not for you: an unpublished deadline is one you cannot budget for, so the only safe response time is "immediately".

The pattern that survives is acknowledge-then-process. Persist the raw request body, return 200, and hand parsing, media downloads and database writes to a queue. A handler that does the work inline is betting its response time against an undocumented number on every request, and it fails in the worst possible way: under load, the work completes but the response arrives late, Meta counts the delivery failed, and the retry re-runs work that already happened. That is not a hypothetical — it is why the deduplication section below is not optional.

Does Meta disable a webhook when its success rate drops?

A claim circulates — in webhook-platform blog posts, in engineering runbooks, in at least one conference talk — that Meta throttles or disables a webhook subscription once its delivery success rate falls below 95%. That figure appears on no Meta page this article's research could find. It is not on the WhatsApp webhooks overview, not on the Cloud API set-up-webhooks guide, and not on the generic Graph getting-started page, all three read in full on 25 September 2026. The overview page's failure-handling section describes exactly two consequences of failed deliveries: retries, and duplicates. No percentage, no throttle, no disablement.

Trace the 95% claim back and the chain ends in third-party webhook-infrastructure vendors citing each other, not Meta. That does not prove Meta's systems never degrade a chronically failing endpoint — an undocumented behaviour can still exist — but it does mean you cannot plan around the figure, and you should be suspicious of any dashboard or alert threshold that presents it as Meta policy. The documented cost of sustained failure is the one worth engineering against: every failed delivery spends its retry window, and everything unacknowledged at the end of it is dropped.

Why does the same message arrive twice after recovery?

Because Meta says it will. The retry mechanism is a re-delivery of the same notification, and the WhatsApp documentation is explicit about the consequence:

"Meta sends retries to all apps that have subscribed to webhooks (and their appropriate fields) for the WhatsApp Business account. These retries can result in duplicate webhook notifications." (Meta — WhatsApp webhooks overview)

The failure mode this bites hardest is the near-miss: your endpoint received the notification, processed it, and then the 200 was lost — a proxy timeout, a worker killed mid-response. From Meta's side that delivery failed, so it retries a message your database already holds. An endpoint that files every arrival as new will double-file customer messages, double-fire automations, and double-count statuses for as long as the backlog drains.

The dedupe key is the message id — the wamid. Every inbound message carries one, and every status notification carries the wamid of the message it describes:

"statuses": [{
  "id": "wamid.HBgMOTE5NjY3NDg1NTY5FQIAERgS...",
  "status": "delivered",
  "timestamp": "1758790000",
  "recipient_id": "919667485569"
}]

Deduplicate messages on the id alone, and statuses on the id plus the status value — sent and delivered for one message are two distinct facts, and a retried sent must not block a fresh delivered. Keep the set of processed keys for at least seven days, the longest window Meta documents, and treat insertion into that set and the side effects as one transaction, or a crash between them recreates the duplicate problem you were solving.

Do retried deliveries arrive in the right order?

Assume not. Meta publishes no ordering guarantee for webhook deliveries — the webhook payload reference and both webhook pages were checked for one on 25 September 2026 and none of them addresses ordering at all — and the retry mechanism makes interleaving structurally inevitable. A sent status that failed to deliver on Friday is retried on Monday, landing in the same queue as Monday's fresh delivered and read for the same message. After any outage, your endpoint will observe time moving backwards.

The defence is to treat statuses as a set with precedence rather than a sequence: read outranks delivered, which outranks sent, which outranks failed-then-recovered edge cases you decide explicitly. A handler that assigns whatever status arrived last will show customers' conversations regressing from read back to sent for hours after recovery — cosmetically alarming, and corrosive to anyone's trust in the numbers downstream.

What is gone once the retry window closes?

Everything that was never acknowledged. The generic page says unacknowledged responses "will be dropped after 36 hours"; the WhatsApp pages promise retries "until the request succeeds, for up to 7 days", after which the promise simply ends. Neither the WhatsApp webhook pages nor the generic Graph page documents any endpoint for requesting a re-delivery, and no replay mechanism appears anywhere in the webhook documentation read for this article — the retry schedule is the only recovery Meta describes, and it runs on Meta's clock, not yours.

Concretely, for an outage longer than the window: inbound customer messages sent during the gap will never reach your system, and no API call afterwards can fetch them. The messages still exist on the customer's phone and in the business's WhatsApp clients — Meta has not deleted anyone's conversation — but the webhook was your only feed of them, and it has moved on. Status updates for messages you sent before the outage are equally unrecoverable once dropped: a message your records show as sent forever may well have been delivered and read, with the evidence expired.

How do you reconcile after the endpoint comes back?

In this order, because each step feeds the next:

  1. Fix the endpoint and prove it answers 200 fast. Nothing else matters until this is true, and every hour it is not spends more of the window.
  2. Let the backlog drain without fighting it. The retried deliveries arrive on Meta's decreasing-frequency schedule mixed into live traffic. Keep acknowledging quickly; do not rate-limit or firewall the burst, because a rejected retry just goes back into the queue.
  3. Find your high-water mark. The last inbound message timestamp and wamid your database holds from before the outage marks the edge of what you know. Anything after it either arrives by retry over the following days or was dropped — there is no third category, so schedule the audit for after the window closes, not the morning of recovery.
  4. Reconcile your own sends from your own records. Every message you sent through the API returned a wamid in the response. Statuses for those wamids may backfill inside the window; any that never do should be marked unknown rather than failed, because absence of a status is now evidence of nothing.
  5. Only then compare against Meta's aggregate analytics if the account's numbers matter to billing or reporting — aggregate counts survive an outage even where per-message webhooks did not.

How does WabaCRM handle retries on its own outgoing webhooks?

Everything above is Meta's side of the contract: Meta delivering WhatsApp events to a platform like WabaCRM. WabaCRM then operates the same pattern one hop downstream — outgoing webhooks from a workspace to a customer's own CRM or backend — and publishes its own rules, which are deliberately not Meta's. In WabaCRM's production behaviour, an endpoint that fails twenty consecutive deliveries is switched off rather than retried for a week, because a receiver that has been down that long is better served by a visible "disabled" state and a manual re-enable than by a silent backlog. And a WabaCRM retry is a newly built payload carrying a fresh sent_at, which means a fresh X-WabaCRM-Signature on every attempt — so receivers must deduplicate on the event name plus the record id and status, never on a hash of the body.

Outgoing webhooks panel above API token generation and the available REST endpoints a receiver can reconcile against after downtime
The endpoint list, and the API a receiver can query to reconcile what an outage missed.

The reason to say this here is not the product; it is the general lesson. Every webhook platform chooses its own retry count, window, disablement rule and signature scheme, and none of them inherits Meta's. If your architecture receives webhooks from more than one system, read each system's own page — the 36-hour figure, the 7-day figure and the 20-failure figure on this page are three different answers to the same question from two providers, and only one of the three is a number you can see and change in a dashboard.

Every Meta quotation on this page was read from Meta's own documentation on 25 September 2026. Meta changes that documentation without notice; the linked pages are authoritative and this one is not.

Questions people also ask

Will Meta keep sending WhatsApp webhooks after a weekend of downtime?

Yes. Both of Meta's WhatsApp webhook pages state that a failed delivery is retried with decreasing frequency for up to 7 days, and a weekend outage sits comfortably inside that window — it even sits inside the 36-hour figure Meta's generic Graph webhooks page gives. When the endpoint comes back, expect a burst: the retried backlog arrives interleaved with fresh traffic, and Meta's own documentation warns that retries can produce duplicate notifications. Answer every request with a 200 as quickly as you can and deduplicate on the message id, and the backlog drains on its own. The subscription itself does not need re-verifying after downtime.

Is there an API to replay WhatsApp webhook events I missed?

No. Neither of Meta's WhatsApp webhook pages nor its generic Graph webhooks getting-started page documents any endpoint for requesting a re-delivery — the only mechanism Meta describes for a missed event is its own retry schedule, checked on 25 September 2026. Once the retry window closes on an unacknowledged delivery, that event is gone from your side. Recovery is reconciliation from what you already own: the last message id and timestamp your database holds from before the outage, and the message ids returned in your own send responses, whose delivery statuses may still be backfilled by retries inside the window.

Does the 36-hour retry window or the 7-day one apply to WhatsApp?

Both figures are Meta's own and Meta has never reconciled them. The 36-hour figure sits on the generic Graph API webhooks page, which covers every Graph product; the 7-day figure sits on both WhatsApp-specific webhook pages, word for word. For WhatsApp traffic the product documentation is the closer authority, so plan around 7 days — but the cautious engineering split is to treat 36 hours as your repair deadline and 7 days as your deduplication horizon, so you are safe whichever figure Meta's infrastructure actually honours for your account.

How quickly should my endpoint answer a WhatsApp webhook request?

Meta's guidance is to respond to all event notifications with a 200, and none of the three webhook pages publishes a numeric timeout, so the safe design is to acknowledge immediately and process asynchronously. A handler that finishes its database writes, media downloads and business logic before answering will start missing whatever unpublished deadline Meta applies as soon as load rises, and every miss is counted a failed delivery — which triggers a retry of work your slow handler may already have half-completed. Persist the raw body, return 200, and do everything else on a queue.

What should I use to deduplicate retried WhatsApp messages and statuses?

The message id — the wamid. For inbound messages, deduplicate on the id field of each entry in the messages array. For statuses, combine the id with the status value, so that a retried sent and a fresh delivered for the same message both apply without either being dropped. Keep processed ids for at least 7 days, the longest window Meta documents. Do not hash the whole body: WabaCRM's own outgoing webhooks, for example, rebuild the payload with a fresh sent_at on every retry, so a body hash sees each retry as new — the event id is the stable key on any platform.

Keep reading

Your customers are already on WhatsApp

Free for your first 1,000 contacts, with no time limit and no card. Setting up the workspace takes minutes; connecting a number takes as long as Meta's own review of it.

Sign up with your company email address. No sales call, no onboarding fee, nothing to schedule.

Why this is safe to point your customer list at

Payments are processed by Razorpay on their own checkout — your card details are never entered on, or stored by, WabaCRM. Every inbound WhatsApp webhook is checked against its signature before it is trusted.

Tech Provider is a Meta platform access tier — not a partnership, a reseller agreement or an endorsement.