Shopify and GA4 revenue mismatch: the eight reasons
Shopify and GA4 never show the same revenue. The eight causes from time zone to test orders, how to check each one, and which gap is still normal.

Contents
Example: Shopify reports $41,200 for the month, GA4 shows $36,900. Which one is right? Both. They measure different things. A Shopify and GA4 revenue mismatch is the rule, not the exception. This article shows first how to check whether your gap is normal, then the eight causes with a way to test each and what to do about it, and finally which number belongs to which decision.
Diagnosis: is your Shopify and GA4 revenue mismatch normal?
Never start with revenue. Start with the order count. The reason: revenue gaps come from two completely different sources — missing orders and different amounts per order. Only the order count separates the two.
How to do it:
- Pick the same period. A completed month. In Shopify under Analytics, in GA4 under the Monetization reports. Check the time zone in both systems first (cause 1).
- Count orders. Shopify: number of orders in the sales report. GA4: the number of
purchaseevents, or transactions in the ecommerce purchases report. - Calculate the gap in percent. Example: 640 orders in Shopify, 572 in GA4, so roughly 10 percent fewer in GA4.
- Compare revenue per order. Shopify revenue divided by Shopify orders, GA4 revenue divided by GA4 transactions. If the two per-order values differ noticeably, you have a definition problem (causes 2 to 4). If they are similar, GA4 is simply missing orders (causes 5 to 8).
- Compare with previous months. A stable gap is normal. A gap that suddenly changes has a date, and that date leads you to the cause.
As an experience value rather than a rule: stores with a consent banner and the standard integration often see a single-digit to low double-digit percentage fewer orders in GA4 than in Shopify. Considerably more suggests a problem. Considerably less can point to a missing consent prompt or to double counting. If GA4 shows more orders than Shopify, it is almost always double counting — the article on GA4 ecommerce tracking not working handles that case in detail.
The eight causes
1. Time zone
What happens: Shopify books orders in the store's time zone. GA4 books events in the property's time zone. If the property sits on a different zone, orders shift by hours, which at month boundaries means they shift into a different month. Over a full month the effect is small; on individual days, and on promotions that start at midnight, it is obvious.
How to check: Compare the time zone in your Shopify general settings with the property time zone in the GA4 admin. Then compare a single day with many orders around midnight.
Fix: Set both to the same time zone. In GA4 the change only applies going forward; historical data stays as it is.
2. Currency
What happens: If you sell in several currencies through Shopify Markets, Shopify converts reports into the store currency. GA4 receives the amount in the purchase currency and converts it into the property's reporting currency at that day's rate. Two systems, two rates, two moments in time.
How to check: Compare the GA4 reporting currency with the store currency. Then look up one foreign-currency order in both systems.
Fix: Use the same reporting currency in both. Residual differences from exchange rates remain and are negligible when the foreign-currency share is small.
3. Gross, net or total
What happens: Shopify distinguishes gross sales, net sales and total sales including tax and shipping. GA4 knows exactly one figure per purchase: the value parameter of the purchase event. Which Shopify amount ends up there — with or without tax, with or without shipping — depends on the integration. Compare GA4 revenue against the wrong Shopify figure and you will chase a gap that does not exist.
How to check: Place a test order with shipping costs and compare the value of the purchase event in GA4 DebugView against the amounts on the order. Also look at the tax and shipping parameters, if they are being sent.
Fix: Pick the Shopify metric that corresponds to the value being sent and compare only that one. If a different definition matters to you, the amount can be adjusted through a custom pixel in Shopify's customer events.
4. Refunds and returns
What happens: Shopify deducts returns from net sales, on the day of the refund. GA4 only reduces revenue when a refund event arrives. Shopify does not publish an exhaustive list of the events the standard Google & YouTube integration sends; as an experience value, refund is not among them. GA4 then keeps the original purchase value while Shopify shows the adjusted one.
How to check: In GA4, open Reports, then Engagement, then Events, and look for a refund event. If it is not in the list, none is arriving — do not assume either way, look. Then put the returns value from the Shopify sales report for the month next to your revenue gap. If they roughly match at an equal order count, you have found the cause.
Fix: For the comparison, use the Shopify revenue figure before returns. Sending refunds to GA4 requires a custom integration, which for most small stores is not worth the effort.
5. Consent
What happens: Without the customer's consent, the browser sends no data or only limited data to GA4. Shopify records the order regardless — it has been paid. This is the single largest cause of missing orders in GA4, and it cannot be optimized away, only measured.
How to check: Look at the consent rate in your consent tool. If it sits at, say, 70 percent, then roughly 30 percent of buyers are missing from GA4, assuming buyers behave like all visitors. With consent mode active, GA4 can close part of the gap through modelling and marks it in the reports.
Fix: There is no technical fix. How the banner must be designed and what is allowed without consent is a question for your lawyer or data protection officer, not for an analytics article. For analysis purposes: the consent rate is part of your expected gap.
6. Ad blockers and browser protection
What happens: Ad blockers and browser tracking protection block the GA4 script or the request to Google. The customer buys, GA4 never hears about it. Shopify's own recording runs on the store domain and is less affected. The share varies with your audience; technically minded and desktop-heavy audiences block more.
How to check: Compare the share of GA4 sessions by browser with the share of Shopify sessions by browser. If a browser is conspicuously underrepresented in GA4, that is your hint.
Fix: Server-side tagging can reduce the share but is too much work for most small stores. Realistically, accept the share as part of the expected gap.
7. The return from payment
What happens: The purchase event fires on the order status page the customer sees after paying. If they pay at an external provider and close the tab without being sent back to your store, that page never loads in their browser, so no event fires. Shopify books the order as soon as the provider's confirmation arrives.
How to check: The simple version: place a test order with every payment method you offer and check whether the order status page is actually reached.
Fix: Use a pixel in Shopify's customer events rather than theme code, because it hooks into the checkout_completed event instead of depending on a particular page loading. With a few payment providers the gap still cannot be closed entirely.
8. Test, draft and manual orders
What happens: Orders created in the admin, draft orders, phone orders, in-store POS sales and orders from channels without a browser never pass through a customer's browser checkout. GA4 cannot see them.
Real test orders in test mode are not a reason for a gap, though: Shopify's documentation on test orders states that test orders and simulated transactions do not display in your payouts or reports. If you instead place a small real order with a real payment to test, it exists in both systems — and you should exclude it from the comparison.
How to check: Break the Shopify sales report down by sales channel. Everything other than Online Store is systematically absent from GA4.
Fix: For the comparison, filter Shopify to the Online Store channel only, and write down your own real test purchases so you can account for them later.
The overview
| No. | Cause | Affects | Recognise it by | Correctable? |
|---|---|---|---|---|
| 1 | Time zone | Order date | Shifts at day boundaries | Yes, going forward |
| 2 | Currency | Amount | Foreign-currency orders differ individually | Partly |
| 3 | Revenue definition | Amount | Revenue per order differs consistently | Yes, by choosing the matching metric |
| 4 | Refunds | Amount | Gap matches the returns value | Only with extra work |
| 5 | Consent | Count | Gap roughly matches the rejection rate | No, it is part of the measurement |
| 6 | Ad blockers | Count | Browsers underrepresented in GA4 | Barely |
| 7 | Return from payment | Count | Gap tied to specific payment methods | Partly, via customer events |
| 8 | Orders without a browser | Count | Channels other than Online Store | Yes, by filtering the comparison |
When the gap is actually a problem
Three situations. Everything else is a property of the measurement.
- The gap jumps. It was roughly constant for three months and has suddenly doubled. Something changed on a specific date: a theme update, a new app, a modified consent banner, a new payment provider. Look for the date, not the cause.
- GA4 shows more than Shopify. That is not one of the eight causes. It is double counting, usually two parallel integrations sending the same purchase.
- Revenue per order drifts. If the GA4 figure moves relative to Shopify from month to month, some orders are probably sending different amounts, for example after a change to discounts or shipping rules.
In every other case, document the gap once and factor it in. In ecomando you can see per day what share of Shopify orders arrived in GA4, so a jump in the gap is visible immediately rather than at month end.
Which number for which decision
- Revenue, orders, average order value, returns: Shopify. Complete, adjusted, close to your books. Which of those figures to track regularly is covered in the overview of ecommerce metrics that matter.
- Which channels and campaigns produced purchases: GA4, knowing a share is missing. For channel shares that is good enough, because the gap hits all channels similarly.
- The funnel from product view to purchase: GA4, through the events
view_item,add_to_cart,begin_checkoutandpurchase. Where people drop out of that funnel is the subject of ecommerce conversion rate and, for the last step, reducing cart abandonment. - Advertising performance per campaign: neither Shopify nor GA4 alone. Google Ads attributes with its own model — only data-driven or last click — and will therefore show a third number again. What to do with the resulting figures is in how to calculate ROAS.
Checklist for the monthly reconciliation
- Same month, same time zone, same currency in Shopify and GA4.
- Shopify filtered to the Online Store sales channel.
- Order counts compared, gap noted in percent.
- Revenue per order compared in both systems.
- Returns value for the month placed next to the revenue gap.
- Gap compared with the three previous months; a jump means you look for a date.
- Changes to theme, apps, consent banner and payment methods recorded with a date.
- Once a year: a test order with every payment method plus a look in DebugView.
If the reconciliation keeps failing in the same place, the problem is upstream of reporting and belongs in the store itself — the Shopify SEO and setup guide covers the platform settings that most often get in the way.
Frequently asked questions
Why does GA4 show less revenue than Shopify?
Shopify counts every order from its own database. GA4 only counts purchases that the customer's browser actually sent, after consent. Consent banners, ad blockers, interrupted returns from a payment provider and orders created in the admin are missing from GA4 entirely.
How big can the gap between Shopify and GA4 be?
There is no official threshold. As an experience value, many stores see somewhere between a single-digit and a low double-digit percentage fewer orders in GA4 than in Shopify. What matters more than the size is that the gap stays stable month to month.
Which Shopify revenue figure matches GA4 revenue?
It depends on which amount is sent as the value parameter of the purchase event. Place a test order and check in DebugView whether that value matches net sales, total sales or an amount excluding shipping, then compare only that figure.
Does GA4 count refunds?
Only if a refund event is sent. In practice the standard Shopify integration does not send one, but check rather than assume: look for a refund event under Reports, Engagement, Events in your property. Shopify net sales deduct returns while GA4 keeps showing the original purchase value.
Should I use Shopify or GA4 as my revenue source?
Shopify for revenue, orders and products, because every order is recorded there completely. GA4 for the question of which channels and campaigns led to purchases. Both numbers have a purpose and neither replaces the other.

