Why Meta, Shopify, and GA4 Never Agree on Your Revenue

If you run ads for an ecommerce store, you already know this feeling: it’s the end of the month, you’re pulling numbers for a report, and none of your dashboards agree with each other. Meta says you did $12,000. GA4 says $8,500. Shopify says $10,000. Same store. Same customers. Same month. Three different totals.

The first instinct is usually to go looking for the bug, a pixel that stopped firing, a tag that’s misconfigured, some setting buried in GA4 that’s quietly eating conversions. Sometimes that hunt turns up something real. But more often than not, nothing is actually broken. You’ve just asked three systems the same question — “how much revenue did we make?” — and they’ve each answered a slightly different version of it, using their own rules for what counts and who gets credit.

Once you see what each platform is actually built to measure, the gap stops looking like a mystery and starts looking like exactly what you’d expect.

They’re not measuring the same thing

Shopify is closest to a bank statement. It logs an order when a customer pays, and it doesn’t care whether that customer arrived via a Meta ad, a Google search, a text from their sister, or pure luck. When a refund comes through, Shopify quietly subtracts it. This is why Shopify’s number is usually the most conservative of the three, and honestly, the most trustworthy for anything involving actual money.

Meta is doing something completely different. It’s not counting money that landed in your account — it’s estimating how much revenue its ads caused, based on a click/view window (commonly 7 days for clicks, 1 day for views) and a fair amount of modeling to paper over data it can no longer see. Since Apple’s privacy changes, a lot of what used to be directly observed now gets estimated instead. That cuts both ways: sometimes Meta overclaims, giving itself credit for a sale that would’ve happened anyway. Other times it underclaims, because it genuinely lost the signal and never found out the purchase happened at all.

GA4 is stranger than either of those, and it’s the one people misread the most. GA4 doesn’t hand full credit to one channel — it splits credit across the touchpoints in a customer’s path using a data-driven attribution model. So if someone clicks a Meta ad, leaves, comes back later through a Google search, and then buys, Meta will claim the entire sale in its own dashboard. GA4 will slice that same sale up between Meta and organic search. Neither is wrong. They’re just built to answer different questions, and one of those questions (“who gets full credit”) produces bigger numbers than the other (“how should credit be shared”).

Where the actual gap comes from

Strip away the jargon and the mismatch mostly comes down to a short list of very mundane things:

Different attribution windows — Meta’s window isn’t Google’s window isn’t TikTok’s window isn’t GA4’s window, and none of them match Shopify’s “count it the second payment clears” approach. Different units being counted — Shopify counts orders, GA4 counts sessions that ended in a purchase event, ad platforms count conversions they believe they influenced. Full credit vs. split credit, which alone explains most of why GA4 tends to land lower than everything else. Tracking loss, from ad blockers, Safari’s privacy protections, and consent banners, patched over with statistical modeling that can shift after the fact as more data trickles in. Refunds and definitions — Shopify nets out cancellations and often excludes shipping and tax from what it reports as ad-attributed sales, while platforms tend to report the gross value at time of purchase. And plain old timezone and processing-lag mismatches, where a sale at 11:50pm ends up on a different calendar day depending on whose clock you’re using.

None of that is a malfunction. It’s just what happens when three systems built for three different jobs get compared as if they were built for the same one.

A quick example, because the abstract version never quite lands

Say Shopify shows $10,000 in real revenue for the month. Meta’s dashboard might show $7,200 in attributed revenue for its own campaigns. Google Ads might show $5,500. TikTok, $3,000. Add those three up and you get $15,700 – way more than the $10,000 Shopify actually collected, because all three platforms are independently claiming credit for overlapping orders. Meanwhile GA4, splitting credit instead of handing it out in full, might land somewhere around $8,000–$9,500 for total ecommerce revenue.

Every one of those numbers can be correct according to its own rulebook. That’s the part that’s hard to sit with, but it’s true.

So which number do you actually go with?

Depends what you’re trying to decide.

If the question is “how much money did we make,” go with Shopify. It’s the only one of the three tied to actual collected payment, which makes it the right number for financial reporting, reconciliation, and anything that ends up in front of a CFO.

If the question is “should I keep spending on this specific ad campaign,” the ad platform’s own number is more useful than it might seem, not because it’s accurate in an absolute sense, but because it’s the exact signal the algorithm itself is optimizing against. Use it directionally for budget and bidding decisions, not as your P&L.

If the question is “how do my channels compare to each other across the whole customer journey,” that’s GA4’s job. It’s the only one of the three actually trying to see the full path instead of grabbing credit for one step of it. Expect its total to run lower than Shopify’s, that’s the model working as intended, not a leak somewhere.

A rough way to hold all three in your head: Shopify tells you what happened. The ad platforms tell you what they think they caused. GA4 tells you how credit for what happened got divided up. You need all three lenses at different moments, and no amount of tag cleanup is going to make them converge into one number, they were never trying to answer the same question in the first place.

What’s actually worth fixing

You can’t close this gap completely, but you can shrink the part of it that’s just sloppy tracking rather than structural. Server-side tracking (Meta’s Conversions API, for instance) recovers some of what browser pixels miss to ad blockers and Safari’s tracking restrictions. Getting Shopify, your ad accounts, and GA4 onto the same timezone and currency settings removes a chunk of the noise for free. Giving the data a day or two to settle before comparing helps too, GA4 and ad platforms both revise their numbers after the fact as delayed conversions and modeling updates roll in, so pulling “today’s” numbers today is comparing something that isn’t finished cooking yet.

Beyond that, watch trends instead of chasing an exact match. If Meta and Shopify are both climbing or both dipping together week over week, your read on performance is fine even though the totals will never line up. What’s actually worth investigating is a gap that keeps widening over time that’s usually a sign something broke, as opposed to the ordinary distance between three systems doing three different jobs.

Which, at the end of the day, is really the whole point. Meta, Shopify, and GA4 aren’t disagreeing because something’s wrong. They’re disagreeing because you asked three instruments built for three different purposes to give you the same reading, and they never were going to.

Spread the knowledge