The symptom
End of the month you open the client's Shopify admin next to their GA4 property, same date range, and the order count does not line up. GA4 is lower, by a different amount than last month, which is what makes the call awkward.
Then the client asks which number is right, and every answer is a bad one. "Shopify" makes the analytics property look like decoration you charge for, "GA4" is indefensible because the order records are what the client invoices and pays tax on, and "they measure differently" sounds like an excuse unless you can say how much of the gap each difference accounts for.
The awkwardness is not the expensive part. Purchases that never reached GA4 mostly never reached Google Ads or Meta either, because those platforms are fed from the same browser layer. The client reads the higher number while the bidding runs on the lower one.

Why don't the two numbers line up?
Because they are not two versions of one count. They are two ledgers with different rules about what an order is and when it happened, and only one depends on a browser doing its job.
One counts records, the other counts events that survived
Shopify's sales reports are built from the order records in the store: gross sales is "product price x quantity", and net sales subtracts discounts and "sales reversals", per Shopify's sales reports documentation. If the record exists, it is in the report.
GA4 has no such record. Google's guidance is that you "measure a purchase by sending a purchase event", from the page, in the visitor's browser, per Google's ecommerce measurement documentation. No event, no purchase in GA4, and the order is unaffected either way. That asymmetry, not a misconfiguration, is why GA4 is the lower number in almost every Shopify store.
What removes the events
Shopify is candid about this. Its own discrepancies page says that "customers can use browser extensions to block Google Analytics from tracking their sessions and purchases", per Shopify Help. Ad blockers strip 30-40% of events on a typical setup, and on a standard client-side build 15-30% of conversions go uncaptured.
Consent removes more. Shopify applies consent decisions to its managed pixels, and in regions configured to require it, "non-essential purposes are not allowed by default until consent is given", per Shopify's Customer Privacy API documentation. A shopper who ignores the banner still buys, and Shopify still records the order.
The checkout is the hardest page to measure
Since Shopify moved checkout customisation to apps and pixels, tracking there runs inside a sandbox: the Web Pixels API subscribes to customer events "within one of our Lax or Strict sandboxes", per Shopify's documentation, which limits what a pixel can read at the point where the purchase happens.
It is also still moving. The additional scripts field has been view-only since 28 August 2025, and 26 August 2026 is the deadline for non-Plus stores to upgrade their Thank you and Order status pages, after which they are upgraded automatically, per Shopify Help. If a client's purchase measurement still leans on that legacy page, the gap you are explaining this month will change size on its own.
The differences that survive clean collection
Even with nothing blocked or refused, these keep the two reports apart:
Refunds land on different days. In Shopify, reversals "display as a negative value for the day that they were processed", not the day of the order. In GA4 a refund exists only if a refund event carrying the original transaction id was sent, per Google's ecommerce documentation. One refund can reduce one month in Shopify and a different month in GA4.
Days start at different moments. GA4 dates activity by the property's reporting time zone, so a visit on "a Tuesday in their time zone" that is "Monday in your time zone" is "recorded as having occurred on Monday", per Google's setup documentation. Shopify names differing reporting time zones as a cause of discrepancies. Month boundaries are where it shows up worst.
Revenue is converted, not copied. For a transaction in a currency other than the property's, "Analytics will perform the necessary conversion using the prior day's exchange rate", per Google's currency documentation. A store selling in several currencies will never agree to the cent, by design.
Some orders never touched the website. Shopify's sales by channel report names "the channel or app that the customer used to place their order, such as Online Store or Buy Button". Point of sale and orders raised by hand are in the store's total and never reach a web property.
What good looks like
Stop treating the gap as a defect to eliminate and start treating it as a quantity you own. Three moves, in order.
Give each number a job. Shopify's order records are the financial account: what sold, what came back, what the client was paid. GA4 is the optimisation signal: which channel and campaign produced those orders, which the order record cannot tell you. Written down once, that retires the "which one is right" conversation, and it is the same problem one layer out as every tool showing a different number.
Size the gap and name the causes. One page per store: the gap in orders and in revenue, how much of it each known cause explains, and an honest residual for the part you cannot attribute yet. A gap of a known size that behaves the same way every month is a finding you can put in front of a client. The same gap undocumented makes them doubt the rest of the setup.
Then raise the GA4 floor instead of explaining it away. Most of the gap is collection loss, and collection loss is fixable up to a point. A first-party server-side setup recovers 15-40% more conversions than a client-side build. Archon Pixel is the piece we use for it: a first-party measurement layer that captures around 25% more than a standard GA4 setup and lands raw events in the client's own BigQuery, where reconciliation becomes a join on order ids instead of two screenshots side by side. Why the events go missing is covered in why conversions never reach GA4.
Be honest about the ceiling. Consent refusals, blockers and network failure always keep some share of events out, so roughly 95% is a ceiling rather than a promise. How close a store gets depends on its consent rate, how much of its traffic is Safari and iOS, and how much revenue arrives through channels that were never on the website.

FAQ
Should GA4 and Shopify ever show the same number?
No, and a store where they suddenly do deserves an inspection rather than a celebration. Totals that meet usually mean something is counted twice, for example a browser event and a server event landing as two purchases, which inflates the number the bidding optimises on. A modest, stable gap with GA4 below Shopify is the healthy state.
How big a gap is normal?
It depends, and any figure quoted as an industry benchmark is guesswork. It moves with consent rate, browser mix, market, and the share of revenue from outside the online store. What is worth watching is the stability against last month, and whether your named causes add up to what you see.
Which number goes in the client report?
Both, labelled, with the gap stated once. Orders and revenue from Shopify, because that is the money. Channel and campaign performance from GA4, with a line saying it counts fewer purchases and why. Reporting GA4 revenue alone to a client who checks their Shopify dashboard daily is how trust goes, over a difference you could have explained in a sentence.
Does going server-side fix it?
It closes a large part of it and does nothing for several of the causes above. Refund dating, currency conversion, day boundaries and orders from other channels are definitional, so they survive any improvement in collection. What server-side measurement addresses is the part where the event never left the browser, which is usually the largest slice and the one the ad platforms were missing too.
Does the checkout page deadline change anything for us?
If a client's purchase measurement still runs through the legacy Thank you or Order status page, yes. Those pages are being replaced, with 26 August 2026 as the non-Plus deadline and automatic upgrades after it, so a setup that depends on them changes behaviour on a date you did not choose. Working out which clients are still on the old pages is worth an afternoon.
If you would rather have that gap sized and explained than argued about, a free tracking audit reconciles one client's Shopify orders against their GA4 purchases and tells you what each cause is worth.