← All articles

Why does GA4 show fewer sales than your checkout?

Short answer: GA4 isn’t counting wrong — it can’t count what it never sees. The 100 orders in your checkout are real; GA4’s 60 is also correct from where it stands. For the missing 40, the “a purchase just happened” message never left the customer’s browser. The sale is in your checkout, the money is in your account — but as far as your reports go, those sales never happened.

For most stores this means a 20–50% gap. And the real problem isn’t the number itself; it’s the ad decisions you make while looking at it.

The record can’t get out of the browser

In a standard setup, GA4 and Meta Pixel are small scripts running in your customer’s browser. When a sale happens, those scripts send a “purchase” event to Google and Meta. On paper the chain is simple; in practice it’s fragile — because the message departs from a device you don’t control.

There are three main things that cut it off: ad blockers stop the script before it even loads; iPhone/Safari privacy protections restrict tracking requests; and when a customer clicks “Reject” on your cookie banner, their browser never sends the measurement message at all. All three share one trait: the sale completes normally — only its record is never born.

The real cost: bad budget decisions

You pay for those 40 lost records at decision time, not in the report — because the loss isn’t spread evenly.

Say most of those 40 invisible sales came from your Instagram campaign (mobile traffic = more iPhones = more loss). In your dashboard, that campaign looks weak. So what do you do? Cut its budget and shift it to the “better-looking” but actually mediocre one. You throttle your best campaign with your own hands — while believing you’re being data-driven.

On the Meta side there’s a compounding effect: missing conversion data also starves the ad algorithm’s learning. If it can’t see who bought, it can’t find similar buyers; targeting gets blurry and costs climb.

The 5-minute gap test

You don’t need to be an analyst to see your own gap:

  1. Pull last month’s completed order count from your store admin.
  2. Check GA4’s “purchase” event count for the same month.
  3. Divide: GA4 ÷ checkout. Below 0.80 means at least one in five of your sales is missing from your reports.

Repeating this once a month is the simplest pulse check for measurement health. If the gap grows month over month, one of the loss sources (a new browser version, a banner change) is gaining ground.

How the gap closes

If the record can’t get out of the browser, stop trusting the browser with it: server-side measurement. When an order happens, the sales record originates on your store’s server side and travels to GA4 and Meta from there. Ad blockers can’t see that channel and browser restrictions can’t touch it — while the customer’s consent choice is enforced server-side all the same. Nobody gets secretly tracked; the measurement you’re allowed to do simply arrives complete.

That’s exactly what Stobio does: it delivers your store’s sales events server-side — deduplicated and consent-aware — to GA4 and Meta. If your checkout says 100, your reports say close to 100, and your ad decisions rest on real numbers.

Quick answers

Is my GA4 broken or misconfigured? Most likely neither. Even with a correct setup, browser-side measurement undercounts by design; the gap is an architectural limit, not a setup mistake.

Is the gap the same for every store? No. Mobile/iPhone-heavy traffic, ad-blocker-prone audiences and high cookie-rejection rates widen it. That’s why 20% and 50% can both be “normal” — what matters is knowing your own number.

Can I import the missing sales into GA4 later? GA4 has no practical way to backfill past events. The right move isn’t repairing history — it’s making sure every record arrives from now on.

Do I need a developer for server-side measurement? With Stobio, no — setup is a single script change, guided per platform (Shopify, WooCommerce, İkas), about an hour end to end.

Does Meta have the same problem? Yes, the same mechanics apply to Meta Pixel. That’s why the fix should cover both channels — Stobio delivers events to GA4 and Meta through the same server-side channel.