Docs menu · Failed Event Recovery

Docs / Server-side GTM

Last updated

Every plan sGTM containers · always on

Failed Event Recovery

Events your server container never received are sent again, for up to 24 hours

What it does

Every tracking hit for an sGTM container goes through PixelFly to your server GTM container once. If that server can't be reached at that moment (it is restarting, or the connection times out), not one of your tags runs for that hit, and the browser does not keep it to send later. The purchase, add to cart or page view is simply gone.

With Failed Event Recovery, PixelFly keeps a copy of a hit that never reached your server and sends it again once the server answers. Your tags then run as normal: Meta, GA4, Google Ads and the rest get the event.

When it sends again

After 1 minute, then 5 minutes, 30 minutes, 1 hour, 2 hours and 4 hours, then every 4 hours, until 24 hours after the first failure. Each wait varies a little, so a server that just came back is not hit by everything at once. Most server outages last minutes, so most events go out within the first few tries.

What is sent again, and what is not

No connection · HTTP 502 · 503 · 521 · 522  sent again
GA4 hits (/g/collect, /j/collect) · Data Client (POST /data) · other GET hits  sent again
HTTP 520 · 504 · 524  not sent: the server may already have run the tags
HTTP 4xx (for example 400)  not sent: the request itself is wrong
GTM Preview / debug traffic · gtm.js and gtag.js loads  not sent
POST to other paths · bodies over 100 KB · older than 24 hours  not sent

520, 504 and 524 mean the server got the request but did not finish answering. Its tags may have fired already, and sending the hit again could count the event twice. Meta removes a repeat with the same event_id, and GA4 removes a repeated purchase with the same transaction ID from the same visitor, but other events would be counted again. A 400 fails the same way every time; fix the setup instead (GTM Preview shows why).

What your server and tools see

  • The resent request is the original one: same URL, body, cookies, user agent and visitor IP, plus a header X-PixelFly-Replay with the attempt number.
  • Whoever sent the hit hears 202 {"status":"queued_for_resend"} once the copy is safely kept, so a server that retries on errors (a CRM, the WooCommerce plugin's server purchase, PixelFly's COD fire) does not send it a second time. If the copy could not be kept, the real error goes back instead.
  • The original hit is counted once and shows in Event Logs with its real status, for example 522. A resend is never counted again.
  • Tracking Health shows "sGTM request failed" with how many hits failed, how many were recovered, how many are still being retried, and how many couldn't be resent (for example a 400).

Limits

  • A resent event arrives late. Meta and GA4 record it when it is sent again, not when the visitor did it.
  • A resend cannot set cookies in the visitor's browser. This only matters for the first hit of a visit.
  • Events the browser never sends cannot be recovered, because nothing reached PixelFly: a page closed before the tags loaded, scripts delayed by a cache plugin until the visitor touches the page, or tags blocked before they run. Custom Loader and a first-party domain help with blocking.

Proxy containers (Meta CAPI, GA4, TikTok, LinkedIn and Snapchat without sGTM) already retry each ad platform on their own: a quick retry, then up to six more over about four hours.

Official references

We use cookies to enhance your experience, analyze site traffic, and for marketing purposes. By continuing to use our site, you consent to our use of cookies. Learn more