Most stores only reconcile purchases between GA4 and Shopify. But if you’ve ever compared sessions or traffic, you’ve seen the same thing: those don’t match either — and confusingly, GA4 can be higher or lower than Shopify. Both directions have specific, fixable causes.
Here’s how to read the gap.
First: they measure different things
GA4 and Shopify don’t define a “session” identically. Both use a 30-minute inactivity timeout, but GA4 also restarts a session on a new campaign/source and attributes traffic with its own channel grouping, while Shopify counts in its own way. So exact parity is not the goal — a stable, explainable gap is. Chase the direction and size of the gap, not zero.
When GA4 is HIGHER than Shopify
This surprises people, because for purchases GA4 is usually lower. For sessions, GA4 often runs higher — and the number-one reason is:
- Payment redirects starting new sessions. When a shopper bounces out to PayPal, Klarna, or a hosted payment page and returns, GA4 treats the return as a new session from a referral — unless that domain is on your referral-exclusion / unwanted-referrals list. Every checkout can spawn a phantom second session. This also shows up as self-referrals in your traffic sources.
- Cross-domain gaps. If your store and checkout (or a headless front end) live on different domains and cross-domain measurement isn’t configured, the journey splits into two sessions with a self-referral in the middle.
- UTM re-tagging mid-journey — internal links carrying campaign parameters restart attribution and inflate session counts.
Fix: add payment providers and any checkout/subdomain hosts to GA4’s unwanted-referrals list, and configure cross-domain measurement for any domain the shopper legitimately crosses.
When GA4 is LOWER than Shopify
The familiar direction, same root cause as the purchase discrepancy: GA4 is client-side.
- Ad blockers & tracking protection stop the GA4 tag from firing; Shopify still logs the visit server-side.
- Denied consent. Under Consent Mode v2, a no-consent (or over-blocking) setup means sessions never reach GA4 in the EU/UK.
- Bot filtering differences. GA4 auto-excludes known bots; Shopify’s bot handling differs, so the two baselines diverge.
- Tag not on every page / late load. If the GA4 config tag misses some templates or loads after a quick bounce, those sessions are lost.
The reconciliation routine
- Compare a closed period (last week), not today — GA4 takes 24–48h to finalize.
- Align time zones between GA4 and Shopify, or midnight-edge sessions land on different days.
- Check your referral-exclusion list first if GA4 is higher — this is the fastest, highest-impact fix.
- Check consent + ad-blocker loss if GA4 is lower — test in a clean profile and confirm your own consent banner isn’t over-blocking.
- Compare like for like: GA4 “sessions” vs Shopify “sessions” (not “visitors”), same channel definitions where possible.
- Expect a residual gap. Once the above are handled, a steady 5–15% difference is normal. Document your baseline so you notice when it changes — a sudden swing is the real signal something broke.
Quick reference
| Direction | Likely cause | Fix |
|---|---|---|
| GA4 higher | Payment redirect / self-referral starts new session | Add providers to referral-exclusion list |
| GA4 higher | Cross-domain journey split | Configure cross-domain measurement |
| GA4 lower | Ad blockers / tracking protection | Expect loss; move to server-side |
| GA4 lower | Denied/over-blocked consent | Fix Consent Mode |
| Either | Time-zone / open-period mismatch | Compare closed periods, aligned time zones |
Want your session and purchase gaps checked in one pass? The free Tracking-Health Mini-Audit reconciles GA4 against Shopify and flags the exact cause in ~10 minutes.
FAQ
Why are GA4 sessions higher than Shopify? Usually payment redirects (PayPal/Klarna/hosted gateways) starting new sessions because those domains aren’t on your referral-exclusion list.
Why are GA4 sessions lower than Shopify? Client-side loss — ad blockers, tracking protection and denied consent drop sessions Shopify still counts server-side.
Do they define sessions the same way? No — both use a 30-min timeout, but GA4 also restarts on new campaigns and attributes differently. A stable gap, not parity, is the goal.
How do I stop GA4 counting extra checkout sessions? Add payment providers and checkout subdomains to GA4’s unwanted-referrals list and set up cross-domain measurement.
Related
- Why GA4 purchases don’t match Shopify
- Consent Mode blocking GA4 events
- The GA4 ecommerce tracking audit checklist
Sources
- Google — How a web session is defined in GA4
- Google — Identify unwanted referrals / referral exclusions
- Google — Set up cross-domain measurement