GA4 and Shopify disagreement is one of the most common analytics complaints from Shopify merchants. The numbers diverge — sometimes by 5%, sometimes by 30% — and figuring out who's right consumes hours every week. The honest answer is that both numbers are correct for what they measure, but they measure different things. Knowing which question you're asking tells you which number is the answer.

This guide explains the structural reasons GA4 and Shopify disagree, the order of magnitude of each gap, and which source to use for which kind of decision. None of this is GA4's fault or Shopify's fault — it's the consequence of two systems counting events from two different vantage points.

The five real reasons the numbers diverge

Every GA4-vs-Shopify gap is some combination of these five:

Reason 1: GA4 misses sessions where the tag didn't fire

GA4 only counts what its JavaScript tag captures. The tag misses sessions where:

  • The buyer is on a browser that blocks tracking (Safari with ITP, Firefox with strict privacy, any browser with a tracking blocker). This alone is 10–25% of traffic depending on your audience.
  • The buyer's connection drops mid-session before the GA4 beacon fires.
  • An ad blocker is installed (15–35% of desktop traffic in tech-adjacent verticals).
  • The page errors before the tag can load (rare but real).
  • The buyer arrives via Apple Mail's privacy proxy, which obscures session origin.

Shopify's order data, by contrast, comes from the order itself — there's no JavaScript-tag dependency. If the buyer paid, Shopify has the order, regardless of what their browser allowed.

This is the single biggest reason GA4 underreports revenue. For most stores, GA4 captures 75–90% of Shopify's transactions and 70–85% of Shopify's revenue.

Reason 2: Different attribution windows and models

Shopify attributes revenue to whichever traffic source landed the buyer on the converting session (or the last-non-direct, depending on your settings). GA4 by default uses data-driven attribution with a 90-day lookback, which spreads credit across multiple touchpoints in the customer journey.

Concrete example: a buyer first arrives via Google search, comes back the next day from a Meta ad, and converts via direct on day three. Shopify sees a "direct" sale. GA4 might split the credit: 30% Google, 50% Meta, 20% direct.

The aggregate dollar totals can match (sort of), but the per-channel numbers will diverge by 20–40%. Both views are useful for different decisions — see the multi-touch attribution guide.

Reason 3: Refunds and cancellations

Shopify's revenue dashboards typically show gross revenue and let you toggle to net (after refunds). GA4 by default shows revenue as captured by the purchase event — i.e., gross, before any refunds.

If your refund rate is 6% and your GA4 doesn't have refund events wired up, GA4 will overcount revenue by ~6% relative to Shopify's net figure. For some categories (apparel, footwear) where refunds run 15–25%, the gap is substantial.

The fix: implement the GA4 refund event server-side via the Measurement Protocol, triggered from your Shopify webhook when an order is refunded. Most stores skip this step.

Reason 4: Currency conversion timing

Multi-currency stores hit a subtle gap. Shopify reports in your store currency at the conversion rate at order time. GA4 reports in your GA4-property currency at... a slightly different rate, depending on how Google does the conversion. The gap is usually 1–3% but compounds over a month.

For international stores with more than 20% non-base-currency revenue, set both Shopify and GA4 to the same base currency and reconcile in that currency only.

Reason 5: Subscription orders, gift cards, and store credit

These three transaction types trip up GA4 in different ways:

  • Subscriptions: GA4 counts each subscription billing as a separate purchase event (correctly). Shopify's revenue dashboard might display them in a different bucket. See the subscription analytics treatment.
  • Gift card sales: GA4 typically counts the sale of a gift card as revenue. Shopify accounting may treat it as a liability until redemption. Different correct definitions, different numbers.
  • Store credit redemptions: When a buyer pays partially with store credit, GA4 may capture the discounted total or the full pre-credit total depending on your event configuration. Shopify usually shows the cash-collected total.

The reconciliation framework: what to use when

Stop trying to make the numbers match. Instead, use each system for what it measures best:

Use Shopify for:

  • Revenue, orders, refunds, AOV. This is your source of truth for finance, accounting, and any number you'd report to investors.
  • Per-product performance. Shopify's product reports are more reliable than GA4's enhanced ecommerce reports for SKU-level analysis.
  • Customer lifetime metrics. Shopify's customer-level data isn't subject to the same tracking-loss issues as GA4 traffic data.
  • Discount and promo performance. When a discount code is applied, Shopify knows. GA4 knows roughly.
  • Inventory and fulfillment. Self-explanatory — see our restock alerts guide and order fulfillment guide.

Use GA4 for:

  • Traffic source mix. What percentage of sessions came from Google vs. direct vs. Meta vs. email.
  • Conversion-path analysis. Which channels appear in the customer journey, and at which step.
  • Funnel analysis. Where in the PDP → cart → checkout flow buyers drop off — though for ecommerce-specific funnel analysis, PDP CRO data is often cleaner.
  • Engagement metrics. Bounce rate, pages per session, time on site, scroll depth.
  • Cohort retention from a traffic-source perspective. GA4's user-acquisition reports are useful even with the tracking gaps.

Use neither (use a third source) for:

  • Paid ads ROAS by campaign. Use the ad platform's own reporting (Meta Ads Manager, Google Ads), then sanity-check against Shopify's traffic source analysis. GA4 for paid is consistently wrong by 10–30% due to tracking loss.
  • Email revenue. Use Klaviyo / Omnisend's own reporting, which posts back to Shopify via order tag.
  • Cohort LTV. Use a dedicated tool (Lifetimely, Polar Analytics) or a properly-configured Shopify custom report.

The technical reconciliation, if you want one

For stores that genuinely need to close the gap (most don't), the canonical fix is server-side tracking via Measurement Protocol, not client-side:

  1. Drop GA4 tags from the front-end for purchase events (keep them for browse/PDP/cart events).
  2. Wire Shopify webhooks (orders/create, orders/refund, orders/cancel) to a small backend (Cloud Function, Vercel function, or a service like Stape).
  3. Forward each event to GA4 via Measurement Protocol, including the original client_id (passed through from the front-end via cookie).
  4. Test in GA4 DebugView before flipping over.

This brings GA4's transaction count to within ~3% of Shopify's, including refunds. The 3% residual is buyers whose client_id was lost (cleared cookies, cross-device with no account login, etc.).

The cost: 6–20 hours of engineering, or ~$20–80/month for a managed service like Stape that handles this. For most stores under $5M revenue, it's not worth the trouble — pick the right tool per question and stop trying to match.

How to set expectations with stakeholders

The conversation that comes up every quarter: a stakeholder (a CFO, an investor, a co-founder) sees the GA4 number and the Shopify number, asks why they don't match, and demands a single source of truth.

The right framing:

  1. Shopify is the source of truth for revenue. It's what shows up in your bank account.
  2. GA4 is the source of truth for traffic and behavior. It's what tells you why the revenue happened.
  3. The 10–20% gap is structural and isn't going away. Apple's privacy posture, ad blockers, and tracking-prevention features are all moving in directions that increase this gap, not reduce it.
  4. For finance reporting, use Shopify exclusively. For marketing decisions, use GA4 plus the ad platform reports plus Shopify's own traffic source analysis, and triangulate.

If a stakeholder needs a single dashboard, build a simple combined report: Shopify for revenue rows, GA4 for traffic rows, with a note explaining each system's scope. The clarity is worth more than a fake-precise reconciliation.

Common mistakes

  • Comparing GA4's "purchase" event count to Shopify's order count and treating the gap as an error. It's a structural difference. Stop trying to close it.
  • Using GA4 revenue numbers for finance. GA4 is missing 10–20% of revenue, doesn't track refunds out-of-the-box, and uses different currency conversion. Use Shopify.
  • Using Shopify's "Marketing" report for ad attribution. Shopify's UTM-based attribution is useful but coarse. For ad-campaign-level decisions, use the ad platform's own attribution.
  • Implementing GA4 with the default "purchase" event from Shopify's GA4 channel app and stopping there. That gives you a starting point. If you want better data, you need server-side tracking.
  • Forgetting to update GA4 attribution settings after migrating from Universal Analytics. GA4 defaults to data-driven attribution; if your team is used to last-click, the per-channel breakdown will look very different.
  • Putting GA4 and Shopify revenue side-by-side in the same dashboard without scope notes. Stakeholders will demand reconciliation. Save yourself the conversation.

Frequently asked questions

Why does GA4 show less revenue than Shopify?

GA4 typically captures 75–90% of transactions and 70–85% of revenue that Shopify records. The gap comes from: tracking-prevention browsers (Safari, Firefox), ad blockers, sessions that drop before the tag fires, and lost client_ids. Shopify counts the order regardless. GA4 only counts what its JavaScript captured.

Should I use Shopify or GA4 for revenue reporting?

Use Shopify. It's the source of truth for actual money received. GA4 is missing 10–20% of revenue structurally and isn't designed for finance reporting. Use GA4 for traffic, behavior, and conversion-path analysis only.

How do I get GA4 closer to Shopify's numbers?

Implement server-side tracking via Measurement Protocol. Wire Shopify webhooks (orders/create, orders/refund) to forward transaction events directly to GA4, bypassing the front-end JavaScript. This brings GA4's transaction count to within ~3% of Shopify's. Cost is 6–20 hours of engineering or ~$20–80/month for a managed service like Stape.

How do I track refunds in GA4 from Shopify?

GA4 supports a refund event but it's not part of the default Shopify GA4 integration. You need to wire it manually: subscribe to Shopify's orders/refund webhook and forward the event to GA4 via Measurement Protocol with the original transaction_id. Without this, GA4 overcounts revenue by your refund rate.

Why is my paid social revenue different in GA4 vs. Meta Ads Manager?

Three reasons: (1) Meta uses view-through attribution (credits a sale to anyone who saw an ad in 1–7 days) while GA4 uses click-based attribution; (2) Meta's pixel and GA4 capture different sessions due to different tracking-prevention behavior; (3) Meta credits the campaign that touched the buyer first; GA4 (data-driven) credits multiple touchpoints. The gap is structural — see our Meta ads guide for the trade-offs.

Do I need GA4 if I have Shopify Analytics?

Yes, for now. Shopify's built-in analytics covers revenue, orders, AOV, and channel mix at a basic level. GA4 adds funnel analysis, custom events, audience definitions, and conversion-path analysis that Shopify doesn't surface. Combine: Shopify for revenue, GA4 for behavior. (Shopify's analytics is improving; in 2–3 years this answer may change.)

Key takeaways

  • GA4 and Shopify disagreement is structural, not a bug. They count different things from different vantage points.
  • GA4 captures 75–90% of transactions and 70–85% of revenue. The gap is tracking-prevention browsers, ad blockers, lost client_ids.
  • Use Shopify for revenue, orders, refunds, and finance. Use GA4 for traffic, behavior, and conversion paths.
  • Use ad platform reports (Meta, Google) for paid ROAS at campaign level — neither GA4 nor Shopify tells the full paid story.
  • For real reconciliation, implement server-side tracking via Measurement Protocol. Brings the gap to ~3%. Most stores under $5M don't need this.
  • Wire the GA4 refund event from Shopify webhooks. Without it, GA4 overcounts revenue by your refund rate.
  • A weekly action plan from DropifyXL reads from Shopify directly, so the recommendations don't depend on tag-firing rates or attribution windows.

The teams that thrive on analytics are the ones that picked the right tool per question and stopped expecting two systems to produce identical numbers.