What happens when a send to Meta fails, how retries and backoff work, and how to read the health badge.
Every Shopify order that qualifies for CAPI triggers a server-side "Purchase" send to Meta. Most sends succeed on the first try. This article explains what nod. does when one doesn't, so you know when to act and when to leave it alone.
When an order comes in, nod. tries the send once. If that attempt fails with a network error, a timeout, or a 5xx from Meta, it retries once more after a short delay. A 4xx response (a permanent rejection, like a bad token) is not retried inline — retrying it wouldn't change the outcome.
If both the first attempt and the inline retry fail, nod. doesn't drop the event. It writes the event to a durable queue so the conversion isn't lost. A cron job checks that queue every 15 minutes and works through the oldest pending rows first.
Rows in the queue follow a backoff ladder — each failure pushes the next attempt further out, so a temporary Meta outage doesn't turn into a hammering loop:
After 5 failed attempts, the row is marked dead. Nothing brings a dead row back automatically — the conversion is permanently given up on. In practice this only happens when something stays broken for hours (an expired token nobody reconnected, a dataset that was deleted, and so on), not from a single blip.
Some situations aren't really "failures" — they're just not send-able yet. If a queued row's workspace is unconfigured, the master switch is off, or the Meta token is expired at retry time, nod. skips that row without counting it as a failed attempt. It pushes the row's next try out by about an hour and moves on, so one stuck workspace doesn't crowd out everyone else's retries. As soon as the underlying issue is fixed, the row picks back up with all its attempts still available.
If your Meta access token expires, sends don't fail loudly — they pause. Live orders stop generating new sends, and any rows already sitting in the retry queue wait rather than burn attempts against a token that would just get rejected again. Nothing is lost during this window.
Reconnecting Meta resumes everything: new orders start sending again immediately, and queued rows pick up on the next cron pass (within about an hour at most) using the fresh token. You don't need to do anything beyond reconnecting — no manual retry, no re-sending old orders.
The status badge answers one narrow question: can nod. currently deliver an eligible server event? It is not proof of consent coverage, Meta browser/server dedup, or Meta match quality.
A failed-send badge clears itself back to Healthy the moment any later send succeeds — including a successful retry from the queue. You don't need to clear it manually.
Below the badge, nod. shows identifier-free 28-day readiness aggregates:
Browser/server dedup has its own status. A delivered CAPI event does not prove that Meta observed a browser event with the same event id. nod. therefore shows Dedup not verifiable until matching provider evidence exists.