GA4 counts sessions that reached a thank-you page. Shopify counts orders. Those are not the same event, and the gap has a predictable shape.
Shopify recorded 10,278 orders last month. GA4 recorded 9,614 purchases. That is 664 orders GA4 never saw, a 6.5 percent shortfall, and it appears every single month.
This is not a bug and there is no configuration that closes it. GA4 and Shopify are counting two different events. Shopify counts an order. GA4 counts a browser that successfully ran a piece of JavaScript. Those diverge for structural reasons, and once you know the expected size of your gap, the gap becomes a diagnostic rather than a mystery.
Shopify writes the order server-side when payment authorizes. Nothing in the customer's browser can prevent it.
GA4 fires a purchase event from the confirmation page in the customer's browser. Every one of these breaks it:
Under Consent Mode v2, a customer who rejects analytics cookies produces a modeled estimate at best and frequently nothing. On a US-only brand this might be 5 percent of traffic. With meaningful EU or UK volume it can pass 30 percent. This is usually the single largest component.
Between 8 and 15 percent of DTC traffic blocks analytics outright, skewed higher on younger, more technical and more male audiences. Safari's Intelligent Tracking Prevention and Firefox's protections add more. None of this is recoverable client-side.
If the customer closes the tab, loses signal, or navigates away before the confirmation page finishes loading, no event fires. The order exists. Mobile checkouts on poor connections are the common case.
Browse on a phone, buy on a laptop. Without a stable logged-in user ID, GA4 sees two unrelated users and attributes the purchase to a direct session with no history, which also corrupts your channel reporting.
Recharge subscription renewals, draft orders, POS, phone orders, and anything created through the Shopify admin. These are pure Shopify events with no web session at all. On a subscription-heavy brand this alone can be 10 percent of orders.
If your GA4 property timezone does not match your Shopify store timezone, the two are cutting the month at different hours. Small, permanent, and always in the same direction.
Here is Crestline's month, with each component named.
| Component | Orders | Share |
|---|---|---|
| Shopify orders | 10,278 | 100% |
| Consent declined or not modeled | (287) | 2.8% |
| Ad blockers and tracking prevention | (198) | 1.9% |
| Tag did not fire before exit | (94) | 0.9% |
| Subscription renewals, no web session | (61) | 0.6% |
| Timezone boundary | (24) | 0.2% |
| GA4 purchases | 9,614 | 93.5% |
Crestline Co. is a simulated DTC brand used for demonstration. These figures are illustrative and are not a client result.
Note that the revenue gap and the order gap are not the same size. GA4 revenue ran 5.8 percent under net sales while orders ran 6.5 percent under. The missing orders skew slightly smaller than average, because subscription renewals and mobile abandonments both carry lower AOV than a typical desktop order.
| Gap | Reading |
|---|---|
| 0 to 2% | Suspiciously good. Check for duplicate purchase events inflating GA4. |
| 3 to 8% | Normal for a US-focused DTC brand. No action needed. |
| 8 to 15% | Normal with significant EU traffic, heavy subscriptions, or a young audience. |
| Above 15% | Investigate. Likely a real tagging fault. |
| Sudden change of 5+ points | Always investigate, whatever the absolute level. |
The absolute number matters far less than its stability. A brand sitting at a consistent 11 percent gap has better analytics than one bouncing between 4 and 9 percent, because the first can detect a real break and the second cannot.
The check worth automating. Track the gap as a percentage every week. Alert when it moves more than 3 points from its trailing average. That single alert catches theme updates that dropped the tag, consent banner changes, and checkout modifications, usually within days instead of at month end.
A few patterns that indicate a real fault rather than structural loss:
The trap is treating GA4's number as revenue. A 6.5 percent shortfall applied to a channel-level decision quietly understates every channel, and if the gap moves without anyone noticing, a month-over-month comparison shows a decline that never happened. Postlytix reconciles analytics against actual order data continuously and flags when the difference stops behaving the way it normally does.
This is one of eight places the numbers come apart. Why your e-commerce revenue numbers never match explains why fragmentation happens across the whole stack, and links to the rest.