Why client-side pixels miss conversions
Ad blockers, ITP, consent banners, and SPA routing gaps silently drop browser-side events. Here is the full failure stack — and why server-side delivery is no longer optional.
- pixels
- ITP
- consent
- SPA
Problem: Ad spend is up but reported ROAS is down. Stripe shows more completed checkouts than Meta and Google attribute. The marketing team insists the pixel is installed correctly — and they are right. It is still losing data.
The failure stack
Client-side tracking fails for multiple independent reasons: ad blockers stop requests to tracker domains, Safari ITP caps cookie lifetime, iOS ATT limits app-to-web attribution, and consent frameworks block firing until users accept marketing cookies.
Any one of these reduces signal. Together they create systematic undercount that varies by audience — especially technical and B2B traffic.
This article covers the full stack. For blocker-specific mechanics, see Why ad blockers break third-party pixels.
Consent and SPA pitfalls
Consent Mode and CMP banners delay or suppress marketing tags until users opt in. Server-side delivery still requires lawful basis for hashed PII — see Google Consent Mode before shipping.
Next.js and other SPAs often fire pageviews before navigation settles, or miss route-change events entirely when pixels only hook load. Colocate conversion events with business logic instead.
trackstack.capture("Purchase", {
email: customer.email,
value: 89.0,
currency: "USD",
transactionId: order.id,
eventId: `purchase_${order.id}`,
});The first-party proxy
Server-side tracking via a first-party endpoint fixes the delivery path. Your app sends events to your edge domain instead of facebook.net. Block lists and ITP treat first-party requests differently than third-party beacons.
The edge worker forwards to Meta CAPI, Google, or TikTok with hashed user data and click IDs from the client payload.
Keep the pixel, add the server path
Removing the pixel entirely loses click ID capture in the browser. The recommended pattern is dual delivery with shared eventId deduplication.
Meta Event Match Quality improves when both paths are active with consistent identifiers.
Build vs buy the edge layer
Building a reliable proxy requires per-platform hashing, retries, DLQ, credential rotation, and API versioning. Teams that need delivery logs today use an edge SDK rather than bespoke workers per platform.
Start with quickstart, verify in Logs, then expand destinations in Configure.
Sources
Official documentation and references cited in this article.
More in Engineering
First-party conversion tracking vs third-party pixels
Browser pixels and server-side CAPI solve different problems. Here is when to use each, how they complement each other, and what breaks when you rely on scripts alone.
Read postEvent deduplication between client and server
Sending the same conversion from browser and server without a shared event ID double-counts in ad platforms. Here is how dedup works at Meta, Google, and TikTok — and how to implement it in your app.
Read postWhy ad blockers break third-party pixels
uBlock Origin and filter lists like EasyList block requests to `facebook.net` and `google-analytics.com` by default. Understand the mechanism so you can design tracking that actually delivers.
Read postReady to fix your conversion pipeline?
Install the TrackStack SDK, route events to Meta and Google, and verify delivery from one dashboard.