missing conversions

Ad blockers are blocking your analytics before it fires

Content blockers cancel the request to analytics and ad endpoints before it leaves the browser, so the event is never recorded and your page never knows. The size of the loss is specific to your audience, and the only way to know it is to compare client-side counts against a backend source of truth.

Updated

The symptom: a stable gap against your backend

GA4 reports fewer sessions than your server logs and fewer purchases than your order table, and the gap is stable. Not spiky, not tied to a deploy, just a consistent shortfall week after week. Revenue in GA4 sits below Shopify or WooCommerce revenue by a similar margin every time you check. Break the gap down by browser and it widens on Firefox and Brave, and on desktop generally. Direct traffic looks inflated, because sessions that lost their landing hit start over somewhere in the middle of the journey.

In lead gen the same pattern shows up as a CRM holding more rows than GA4 holds lead events, with the difference roughly constant.

Why ad blockers stop the event

Content blockers work from filter lists. Lists such as EasyList and EasyPrivacy enumerate hostnames, URL paths and script names associated with analytics and advertising, and the blocker cancels the network request before it leaves the browser. The tag never runs, or it runs and the beacon never reaches the endpoint. Either way nothing is recorded, and your page has no way of detecting it.

Blocking arrives from more places than the browser extension most people picture:

  • Browser extensions, the classic case.
  • Browser defaults. Brave blocks out of the box. Firefox Enhanced Tracking Protection in strict mode blocks much of the same list.
  • Content blocker apps on iOS Safari, which draw on the same lists.
  • DNS-level blocking. Pi-hole, NextDNS and similar resolve known analytics hostnames to nothing, which covers every device on the network, including phones and TVs where no extension exists.
  • Corporate network filtering, which is why B2B audiences often show the widest gaps.

The failure is upstream, not partial. If the tag manager hostname is on the list, the container never loads and every tag inside it is gone: GA4, Meta, Google Ads, all of it. A blocked container is indistinguishable from a container that was never installed.

As for how much traffic blocking affects, there is no credible universal rate. It swings enormously by audience, device and geography. Desktop technical audiences run far higher than mobile consumer ones. The only number worth acting on is the one measured on your own traffic.

How to confirm blocking, not breakage

You need a source of truth that does not depend on the browser.

Pick the count that matters most, usually orders or leads, and put the backend number next to the GA4 number for the same window in the same timezone. Backend means the order table, the payment processor, or the CRM, not another tag. Divide one by the other. That ratio is your reported coverage, and it is the number to track over time.

Do the same at page level using server or CDN logs, filtered for bots and asset requests. Expect this comparison to be rougher than the conversion one.

To separate blocking from everything else, read the shape of the gap:

  • Blocking is a steady percentage that varies by browser, device and geography, and does not move on release dates.
  • A broken tag is a step change on a specific date, or a gap confined to one template or one payment flow.
  • Consent-related loss tracks your banner’s decline rate and starts the day the banner changed.

If you want a per-page figure, log a request to a first-party endpoint on your own domain from the page and compare its count to the analytics hit count for the same page. Be deliberate about naming. Paths containing words like analytics, track or pixel are matched by generic filter rules, and you will end up measuring your own measurement endpoint being blocked.

How to recover blocked conversions

Be honest about the ceiling first. No configuration recovers every blocked event, and any vendor promising otherwise is selling something.

Move collection to a first-party endpoint. Server-side tagging sends browser events to a subdomain of your own site instead of a vendor hostname, which defeats hostname-based rules. Two conditions apply: the subdomain must resolve to infrastructure you control rather than a CNAME pointing at a vendor, and the path must not read like a tracking endpoint.

Serve the loader from your own domain. If the container script itself is blocked, first-party collection never gets a chance to run.

Send conversions from your backend. This is the part that genuinely does not depend on the browser. An order-created webhook can fire the purchase to GA4 through the Measurement Protocol and to Meta through the Conversions API regardless of whether the visitor’s browser blocked the client-side request. Consent is the exception, and it is covered below. It only preserves attribution if you stored the identity: capture the GA4 client_id and session_id and any click IDs server side when the visitor first lands, keep them with the order record, and send them with the event. Without a client_id the Measurement Protocol creates a new user and the conversion arrives unattributed, and without the matching session_id the event does not join the session it belongs to. Send it promptly as well, because GA4 accepts a backdated timestamp only within a short window, so a webhook that retries for days delivers events too late to be recorded against the right time.

Deduplicate. Any event sent from both the browser and your server needs a shared event_id for Meta and a consistent transaction ID for GA4 and Google Ads, or fixing an undercount hands you an overcount instead. The failure modes and the fix are set out in duplicate purchase events.

Do not conflate blocking with consent. A blocked pixel is not a declined consent signal, and a granted consent signal is not permission to route around a blocker. Where you hold a consent state, apply it in server-side logic as well as in the browser. That is a measurement position, not legal advice.

What blocked events cost you

The direct cost is bidding and budgeting on a partial sample. Smart Bidding sees the conversions that arrived, so channels whose audiences block more look worse than they are and lose budget to channels whose audiences block less. That is systematic bias, not noise, and it persists for as long as the gap does.

Take a store recording 1,000 orders a month whose GA4 shows 850. Every channel report, every ROAS figure and every landing page comparison is drawn from a sample missing 150 orders, and those 150 are not spread evenly across the sample.

Remarketing and Customer Match audiences under-fill for the same reason. Cohort and lifetime value analysis skews toward the population that permits tracking, which is demographically and behaviorally distinct from the population that does not.

The first step is not a rebuild, it is a number. Once you know your reported coverage by browser, device and event, you can decide how much first-party collection is worth building and where the remaining loss is simply the cost of doing business. The Missing Conversions Audit measures that coverage against your backend, logs every gap with severity, and fixes the top 10 in a separate GTM workspace, published only with your approval. $900 flat, 5 business days.

Questions

What percentage of my traffic uses an ad blocker?

There is no single blocking rate worth quoting. It varies by audience, device and geography, and desktop technical audiences run far higher than mobile consumer ones. The only number that matters is the one measured on your own traffic by comparing client-side counts against a backend source of truth like the order table or the CRM.

Does server-side tagging fix ad blocking?

It helps, and it does not solve it. Server-side tagging moves the collection endpoint to your own domain, which defeats hostname-based filter rules. The browser still has to make that first request, so a blocked loader script or a filtered URL path stops the event before it leaves. Only events sent from your own backend sit fully outside the browser.

Is a blocked pixel the same as a broken tag?

No, and the shape of the gap tells them apart. Blocking produces a steady percentage shortfall that varies by browser and device and does not move on deploy dates. A broken tag produces a step change on a specific date, or a gap confined to one page template, one device class, or one payment flow.

Can I send events from my server for users who blocked the pixel?

Technically yes, but blocking and declining consent are not the same thing and should not be conflated. Where a consent signal exists, honor it in your server-side logic as well as in the browser. This is a measurement position rather than legal advice, and the policy call belongs with your counsel.

Next step

Find out what this is costing you.

The Missing Conversions Audit is a fixed-price teardown of your GA4, Google Tag Manager, ad pixels and consent setup. Every gap logged, the top 10 fixed and validated. $900 flat. 5 business days.

A 15 minute call

  • We look at your setup from the outside and say what we can already see.
  • You get a straight answer on whether the audit is worth it for your account.
  • If it fits, we book the slot and send the access checklist.
Open the booking calendar

Opens the calendar here. Nothing loads from Calendly until you do.

Prefer email? hello@missingconversions.com