Why GA4 and Shopify revenue don't match (and how to fix it)

The 8 reasons GA4 shows different revenue than Shopify, how much of a gap is normal, and a step-by-step way to find exactly which orders GA4 is missing.

You open Shopify and see $48,210 in sales for the month. GA4 says $34,180 for the same dates. Meta claims $61,940. None of them is lying, exactly. But Google Ads and Meta are optimizing on the numbers they receive, so if those numbers are wrong, every budget decision you make inherits the error.

This guide covers why the numbers differ, how big a gap is normal, and a one-hour method to find exactly which orders GA4 is missing. It's written for Shopify, and almost all of it applies to WooCommerce too.

First, compare the same thing

Half of all "GA4 is wrong" conversations end here. Before you look for broken tracking, line up the basics.

  • Compare order counts, not revenue. Shopify's total sales includes tax and shipping and subtracts returns on the day they happen. GA4 revenue is whatever value your purchase event sends. Order counts don't have those problems.
  • Use the same time zone. Shopify reports in your store's time zone, GA4 in the property's. A few hours of difference moves orders between days.
  • Compare web orders only. Draft orders, phone orders, point of sale and subscription renewals never touch a browser, so GA4 can never see them. Filter them out of the Shopify side.
Quick test

Take the last 30 days. Count Shopify online store orders, then count GA4 ecommerce purchases for the same dates. Divide GA4 by Shopify. That percentage is your capture rate, and it's the most useful single number in your tracking.

The 8 reasons the numbers differ

1. Consent banners and ad blockers

Visitors who decline cookies or run an ad blocker don't send events to GA4. With Consent Mode, GA4 can model some of the gap, but modeled data can't tell you which orders those were. Stores with lots of EU or UK traffic feel this most.

2. The purchase event isn't firing

This is the big one, and it has its own step-by-step diagnosis guide. Shopify retired the old "additional scripts" box on the order status page, so purchase tracking now has to run through Customer Events (app or custom pixels) or the Google and YouTube app. Stores that migrated halfway, or never did, quietly lose purchases. On WooCommerce the same thing happens when a plugin, theme or checkout update changes the thank-you page.

In one audit we ran, a login plugin update dropped GA4 from about 95% of orders to 11% in a week, and nobody noticed until the monthly numbers looked wrong.

3. Customers never reach the thank-you page

Off-site payment methods like PayPal, Klarna and some card gateways take the buyer to another domain. If they close the tab before being sent back, the order exists in Shopify but the purchase event never fires. Post purchase upsell apps that change the checkout flow can do the same.

4. In-app browsers and Safari

Instagram, Facebook and TikTok open links in their own browsers, and Safari limits how long cookies last. Sessions get split, attribution falls back to Direct, and some events are lost entirely. Untagged links make this much worse: without UTM parameters, GA4 has no way to know the visit came from your ad.

5. Duplicate purchase events

If GA4 shows more orders than Shopify, you are almost certainly sending purchases twice, usually from the Google and YouTube app and a Tag Manager tag at the same time, or from a thank-you page that fires again on reload. Check for repeated transaction IDs.

6. Different revenue definitions

Your purchase event might send the subtotal while Shopify reports the total, or the reverse. Discounts, tax, shipping and currency conversion all shift the number. Multi-currency stores sometimes send the customer's currency instead of the store's.

7. Orders that never had a web session

Phone orders, draft orders created by a sales team, wholesale, marketplace and subscription renewals are real revenue that GA4 can never see. If they're a large share of your business, you need them sent to the ad platforms another way, with offline conversion imports.

8. GA4 reporting quirks

Data thresholds can hide rows when Google signals is on, explorations can be sampled, and the standard reports and explorations don't always agree. These rarely explain a big gap, but they explain the last few percent.

How much of a gap is normal

Every store is different, but this is how we read capture rate in the audits we run:

GA4 orders vs Shopify web ordersWhat it usually means
90% or moreHealthy. Consent and ad blockers explain most of the gap.
80 to 90%Worth a look. Often in-app browsers, off-site payments or a partial migration.
Under 80%Something is broken, usually the purchase event itself.
Over 100%Duplicate events. Fix this before trusting any ROAS number.

Find exactly which orders GA4 missed

Comparing totals tells you there's a gap. Matching orders tells you why. This takes about an hour and it's the most useful hour you can spend on your tracking.

  1. Export your orders. In Shopify, export the last 30 days of orders with the order number, date, total, payment method and source.
  2. Export GA4 transactions. In GA4, build a free form exploration with Transaction ID as the dimension and Purchase revenue as the metric, for the same dates. Export it.
  3. Line up the IDs. Check which Shopify field your tracking sends as the transaction ID. It's usually the order number (like 1042) or the long order ID. Make both columns match.
  4. Match them. Use XLOOKUP or VLOOKUP to find every Shopify order with no matching GA4 transaction. Each one is a purchase GA4 missed.
  5. Look for the pattern. Group the missing orders by payment method, by day and by source. If they cluster on one payment method, it's a redirect problem. If they start on a specific date, something changed that day. If they're spread evenly, it's consent and blockers.
Want us to do this for you?

Our free tracking check runs this exact process on your store, across GA4, Google Ads and Meta, and sends you a written note within 3 business days. Read-only, no call needed.

Get a free tracking check

Why this costs you money

A wrong GA4 report is annoying. A wrong conversion feed is expensive. Google Ads smart bidding and Meta's delivery system learn from the purchases you send them. If they only see 70% of your orders, they optimize toward the customers they can see, and the campaigns that drive the missing orders look worse than they really are. You end up cutting things that work.

What to fix, in order

  1. One source of purchase events. On Shopify, move purchase tracking to Customer Events or the Google and YouTube app, and remove the leftovers. On WooCommerce, confirm the thank-you page fires on every payment method.
  2. Deduplicate. One purchase per order across GA4, Google Ads and Meta. For Meta, send the same event ID from the pixel and the Conversions API. If Meta is the number that looks off, read why Meta revenue doesn't match Shopify.
  3. Send purchases server-side as well. Meta's Conversions API and Google Ads enhanced conversions or offline imports catch the orders browsers miss, including phone and draft orders. Our guide to server-side tracking on Shopify covers when the full setup is worth it.
  4. Tag every paid link. UTM parameters on every ad, email and influencer link, so in-app traffic keeps its source.
  5. Watch capture rate daily. Tracking will break again: a theme update, a new checkout app, a plugin. The only question is how long it takes you to notice.

Common questions

Should GA4 revenue match Shopify exactly?

No. Consent banners, ad blockers and orders that never touch a browser mean GA4 will always see fewer orders than Shopify. A healthy setup usually captures 90% or more of Shopify online store orders. Under 80% means something is broken.

Which number should I report, GA4 or Shopify?

Report revenue from Shopify, because it is your system of record and matches what lands in the bank. Use GA4 for behaviour, channels and funnels, where its job is to show patterns rather than an exact total.

Why does GA4 show more purchases than Shopify?

Almost always duplicate purchase events, for example the Google and YouTube app and a Tag Manager tag both sending purchases, or a thank you page that fires again on reload. Look for repeated transaction IDs in a GA4 exploration.

How long does it take to find the cause of the gap?

Matching Shopify order numbers against GA4 transaction IDs for the last 30 days takes about an hour in a spreadsheet, and the pattern in the missing orders usually points straight at the cause.

Owais Alam

Founder of Good Numbers. Builds tracking, attribution and reporting for DTC brands and agencies across Shopify, WooCommerce, GA4, Google Ads and Meta.