Shopify, GA4 and Meta never agree on revenue because they count different things: Shopify records every order that actually happened, GA4 records the purchases its tag managed to see, and Meta records the purchases it can connect to an ad under its own attribution rules. Trust Shopify for what you sold, use each ad platform only to compare campaigns inside that platform, and set budgets on blended return (total revenue divided by total ad spend). As a rule of thumb from our client work, GA4 within 5% of Shopify’s online orders is healthy, 5% to 15% is leaking, and more than 15% is broken.
Every brand eventually has the meeting where three dashboards show three revenue numbers and nobody can say which is right. The answer is not that one tool is lying. Each one is answering a slightly different question, and a few of them have plumbing problems on top. Here is how to tell the difference, and a 30-minute check you can run this week.
What each system is actually counting
| System | What it counts | What it misses or adds |
|---|---|---|
| Shopify | Every order recorded in the store, from every sales channel | Nothing is missed, but it includes orders that never touched the website |
| GA4 | Purchase events its tag received from browsers | Misses blocked or non-consented visitors and any order its tag never fired for; can double count if the event fires twice |
| Meta Ads | Purchases it can link to someone who clicked or viewed an ad within its attribution window | Adds view-through credit and modeled conversions; claims orders other platforms also claim |
Once you see it this way, most of the gap stops being mysterious. The rest of this guide goes through the specific causes, roughly in order of how often we find them.
Cause 1: the purchase event is not wired correctly
Shopify’s checkout runs on its own domain and its own rules, so your theme’s tracking code does not automatically run there. Purchase tracking needs to go through Shopify’s customer events system, either via the official Google and Meta apps or through a custom pixel set up in the Customer events settings. Shopify has been retiring the older route of pasting scripts into the order status page, and stores that never moved over often have a purchase event that fires only some of the time, or not at all.
The opposite problem is just as common: duplicate events. A store installs the Google app, then a consultant adds a GA4 tag through Google Tag Manager, and now every purchase is sent twice. GA4 revenue ends up above Shopify’s, which feels like good news until someone notices it is impossible. Meta has the same failure mode when the browser pixel and the server-side Conversions API both send a purchase without a shared event ID to deduplicate them.
Cause 2: consent mode and ad blockers
When a visitor declines tracking in your consent banner, or uses a browser or extension that blocks analytics scripts, GA4 and the Meta pixel either receive nothing or receive a stripped-down signal. Google’s consent mode fills some of this in with modeled data, and Meta models conversions too, but modeled numbers are estimates, not records. Shopify still records the order, because the order is a database entry, not a browser event.
This is the main reason a healthy setup still shows a small gap between GA4 and Shopify. A gap of zero is rare. A gap that suddenly widens after a new consent banner goes live is a configuration problem worth fixing.
Cause 3: attribution windows and view-through credit
Meta’s default attribution setting credits a purchase to an ad if the buyer clicked that ad within the previous 7 days or viewed it within the previous 1 day. View-through credit means someone who scrolled past your ad yesterday and bought today after searching for your brand counts as a Meta conversion. GA4, by default, gives that same order to the channel the visitor actually arrived from, such as organic search.
Neither is wrong. They are using different rules. The mistake is adding them together, or comparing Meta’s number directly against Shopify’s and concluding the store is underperforming or overperforming.
Cause 4: every platform claims the same order
A customer clicks a Meta ad on Monday, gets a Google Shopping ad on Wednesday, opens a Klaviyo email on Thursday and buys. Meta counts the order. Google Ads counts it. Klaviyo counts it. Add up what each platform reports and you can easily get well above what Shopify recorded. Each platform is reporting honestly by its own definition, and none of them deduplicates against the others.
Cause 5: orders that never touch the storefront
Shopify’s sales total includes orders that no website tag could ever see:
- Point of sale orders from retail locations or events.
- Draft orders created by your team for phone orders, replacements or custom quotes.
- Wholesale and B2B orders, whether entered manually or through a wholesale channel.
- Subscription renewals, which are charged automatically in the background without the customer visiting the site.
- Orders from marketplaces or other sales channels connected to Shopify.
For a brand with a large subscription program, renewals alone can make GA4 look badly broken when it is working fine. Always compare GA4 against Shopify’s online store orders, not total sales.
Cause 6: different definitions of revenue
Even when everyone counts the same orders, they may not count the same dollars. Shopify’s reports separate gross sales, discounts, returns, taxes and shipping. GA4’s purchase revenue depends on what the tag sends, which may or may not include tax and shipping. Meta’s purchase value is whatever the pixel passed, often the order total. Refunds usually flow into Shopify’s reports but rarely flow back into ad platforms.
Pick one definition, usually Shopify’s net sales or total sales from the online store, and know which number each tool is sending.
Cause 7: time zones
Your Shopify store, your GA4 property and your Meta ad account each have their own time zone setting. If one is set to Eastern and another to Pacific, a three-hour slice of every day lands on different dates. Over a month this mostly washes out, but on daily reports and around big promotions it creates gaps that look like tracking failures. Check that all three match.
Which number to trust for which decision
- What did we sell? Shopify. It is the source of truth for orders and revenue.
- Which Meta campaign, ad set or creative is working better? Meta Ads Manager, compared only against other Meta campaigns using the same attribution setting.
- Which Google campaign is working better? Google Ads, compared against other Google campaigns.
- How much should we spend overall, and is marketing paying for itself? Blended return, also called MER.
MER is total revenue divided by total ad spend across every platform. If Shopify shows $300,000 in revenue for the month and you spent $60,000 across Meta, Google and TikTok combined, your MER is $300,000 ÷ $60,000 = 5.0. It ignores the arguments about who gets credit and simply asks whether the money going in is producing enough coming out. Track it weekly and watch the trend.
A 30-minute tracking check
Run this for the last full 30 days. You need admin access to Shopify, GA4 and Meta Events Manager.
- Match the time zones (2 minutes). Check the time zone in Shopify settings, the GA4 property settings and the Meta ad account settings. Write them down. If they differ, note it and keep going.
- Get Shopify’s online order count (5 minutes). In Shopify analytics, pull orders for the period filtered to the online store sales channel only. Exclude POS, draft orders, wholesale and subscription renewals if your report allows it.
- Get GA4’s purchase count (5 minutes). In GA4, pull ecommerce purchases (transactions) for the same dates.
- Calculate the gap (2 minutes). Gap = (Shopify online orders − GA4 purchases) ÷ Shopify online orders. If Shopify shows 1,000 orders and GA4 shows 920, the gap is 80 ÷ 1,000 = 8%.
- Grade it (1 minute). Using Broke Hold’s rule of thumb from client work: within 5% is healthy, 5% to 15% is leaking, more than 15% is broken. If GA4 shows more purchases than Shopify, treat it as broken, because something is double counting.
- Look for duplicates (5 minutes). In GA4, run an exploration with transaction ID as the dimension and purchases as the metric. Any transaction ID with more than one purchase is a duplicate event.
- Check how purchase tracking is installed (5 minutes). In Shopify, open the Customer events settings and list every pixel. Then check Google Tag Manager and the theme for any other GA4 or Meta purchase tags. More than one source sending the same purchase event is your duplicate.
- Check Meta’s event health (5 minutes). In Meta Events Manager, look at the purchase event: is it receiving events from both the browser and the server, and are they being deduplicated? Compare its purchase count to Shopify’s online orders, keeping in mind it will differ for the attribution reasons above.
If you would rather have the arithmetic done for you, the tracking gap checker takes the counts and grades the result. If the gap is in the broken range, fixing it is usually a matter of removing duplicate tags and rebuilding purchase tracking on customer events, which is the kind of work covered in our Commerce Tech Audit ($5,000 fixed, two weeks).
Frequently asked questions
Why is Meta reporting more sales than Shopify?
Meta counts any purchase by someone who clicked an ad within its click window or viewed one within its view window, and it adds modeled conversions for people it cannot track directly. Other platforms are claiming many of the same orders. Use Meta’s numbers to compare Meta campaigns with each other, not to measure total sales.
How close should GA4 be to Shopify?
Our rule of thumb from client work is that GA4 purchases within 5% of Shopify’s online store orders is healthy, 5% to 15% means tracking is leaking, and more than 15% means it is broken. Compare against online store orders only, not POS, draft orders or subscription renewals.
Why does GA4 show more revenue than Shopify?
Almost always because the purchase event fires twice, often from two separate installs such as the Google app and a Google Tag Manager tag. Check for duplicate transaction IDs in GA4 and remove the extra source.
What is MER and why use it for budgets?
MER, or marketing efficiency ratio, is total revenue divided by total ad spend. It sidesteps the problem of every platform claiming the same orders, so it is a better guide for how much to spend overall. Platform-reported return is still useful for choosing between campaigns inside one platform.
Do subscription renewals show up in GA4?
Usually not. Renewals are charged in the background without the customer visiting the store, so no storefront tag sees them. That is why GA4 should be compared against online store orders rather than total Shopify sales.
