If you run an ecommerce store, you have probably seen it: your Shopify admin says you did one number last month, and GA4 says something noticeably different. Someone on your team asks which one is right, and the honest answer is "both, in a way."
Neither tool is lying. They count different things, at different moments, under different rules. The problem starts when leadership budgets from one number while the marketing team reports from the other. This article explains the most common reasons the two disagree, and gives you a repeatable process to measure and reduce the gap.
Why "which number is right?" is the wrong question
Your store platform is the system of record for orders: it knows what was actually bought, paid for, refunded, and shipped. GA4 is a behavioral measurement tool: it records what browsers told it, and only for visitors it is allowed to see.
So for revenue and order counts, the store should be your source of truth. GA4's job is to explain where orders came from and what visitors did before buying. The goal is not to make the two match exactly. The goal is to know why they differ, keep the gap stable, and use each tool for what it does well.
The most common causes of a mismatch
1. Visitors GA4 never sees
GA4 depends on the visitor's browser sending data. It will miss purchases when:
- The visitor declines analytics cookies or consent. Google's consent mode overview explains how tags behave when consent is not granted.
- A browser or extension blocks the tracking script.
- The page closes before the purchase event is sent.
The store still records those orders, because it does not rely on the browser's analytics script. This alone usually makes GA4 lower than the store.
2. Different definitions of revenue
Shopify reports several revenue figures, such as gross sales, discounts, returns, net sales, shipping, taxes, and total sales. GA4's purchase revenue is whatever value your tracking sends with the event. If your event sends the order total including tax and shipping, but your finance team looks at net sales, the numbers will never agree.
Decide on one definition for "revenue" in analytics, and make sure the purchase event sends exactly that. Google's guide to setting up a purchase event shows which parameters GA4 expects.
3. Refunds, cancellations, and edits
A customer buys on Tuesday and returns the product on Friday. Shopify's net figures reflect the refund. GA4 only knows about it if you send a refund event. Cancelled, edited, and partially refunded orders create the same kind of drift, and it grows with every week of data.
4. Duplicate or missing purchase events
Some of the messiest gaps come from the purchase event itself:
- Duplicates: the event fires again when the customer reloads the confirmation page, or fires from two different tools at once.
- Missing events: the event never fires for certain payment methods, accelerated checkouts, or off-site payment pages where the customer does not return to your confirmation page.
- Missing transaction IDs: without a unique
transaction_id, GA4 cannot deduplicate repeat events. See Google's guide to minimizing duplicate events with transaction IDs.
Older tracking setups that relied on scripts placed on the legacy order status page are especially fragile on Shopify, since Shopify has moved merchants toward customer events and web pixels. Shopify's pixels overview explains how customer events work, and its developer changelog covers web pixels on the order status page. If your tracking was set up years ago and not revisited, check it.
5. Time zones and reporting windows
Your store has a time zone. Your GA4 property has a time zone. If they differ, orders near midnight land on different days, and a monthly comparison will look off at the edges. Also check that you are comparing the same date range and not mixing "orders created" with "orders paid."
6. Test, draft, wholesale, and bot orders
Staff test orders, draft orders created in the admin, wholesale orders placed through other channels, and point-of-sale sales can appear in the store totals but never touch your website's tracking. Check which sales channels are included in the report you are comparing.
7. Off-site and post-purchase purchases
Subscriptions that renew automatically, post-purchase upsells, and orders placed through marketplaces or social checkouts may be recorded by the store without ever producing a GA4 purchase event.
A five-step reconciliation process
Use this once to find the gap, then repeat it monthly.
Step 1: Pull order-level data from your store. Export orders for a one-week window with order ID, date and time, subtotal, discounts, shipping, tax, refunds, payment method, and sales channel.
Step 2: Pull the same week's transactions from GA4. In the standard interface, use the ecommerce purchases report with transaction_id. If you have the GA4 BigQuery export enabled, query the purchase events directly; it gives you event-level detail and avoids the sampling and thresholding that can affect some reports.
Step 3: Match on order ID. Join the two lists. You will find orders that exist in only one source, and orders that exist in both with different values. Count each group.
Step 4: Bucket the differences. Group the mismatches by payment method, device, browser, traffic source, and sales channel. Patterns usually jump out quickly. For example, every order paid through one wallet missing from GA4 points to a checkout tracking gap, not a consent issue.
Step 5: Fix the biggest bucket first. Often a single issue explains most of the gap. After the fix, re-run the comparison and note the new baseline.
What a "healthy" gap looks like
There is no universal target. A stable, explainable gap is healthy. Warning signs are a gap that suddenly widens, one that swings week to week, or one that is concentrated in a single payment method or device. Those almost always point to a broken event rather than normal data loss.
When to move beyond GA4 alone
If you spend significant budget on advertising, or your reporting needs to tie revenue back to customers and campaigns, consider a setup where order data from your store flows into a data warehouse alongside GA4 and ad platform data. In that model:
- The store provides the authoritative order and revenue numbers.
- GA4 and ad platforms provide the behavior and campaign context.
- Server-side collection, such as routing events through a customer data platform, reduces how much depends on the visitor's browser.
This is also where HubSpot or another CRM becomes useful, because it lets you connect orders to the same person across channels. It takes real design work, and it is not necessary for every store, but it is the right next step once reconciliation shows that browser-based tracking cannot get you to a gap you can trust.
If fixing the gap means changing your checkout or theme, our Shopify development and WooCommerce development teams can make those changes, and our web development service covers other platforms.
Quick checklist
- Pick one definition of revenue and use it in every tool.
- Confirm the purchase event fires once, with
transaction_id,value, andcurrency. - Send refund events if you want GA4 to reflect returns.
- Align time zones and date ranges.
- Exclude test, draft, and non-web orders from comparisons.
- Reconcile weekly during busy seasons and monthly otherwise.
- Use the store for revenue totals and GA4 for behavior.
Preparing for the holiday rush? Our BFCM tracking audit checklist walks through ten checks to run before Black Friday.
Need help getting the numbers to agree?
Reconciling analytics and store data is one of the things we do most often, and the fix is usually a few specific changes rather than a full rebuild. If your GA4 and store numbers have been drifting, talk to our team. We can review your tracking, find where the gap comes from, and fix it. Scope depends on your platform and how many tools are involved.




Comments
Join the conversation