Skip to content

Answer

Why does GA4 show less revenue than Shopify?

By CartKernel ยท Last reviewed

In short

GA4 shows less revenue than Shopify because GA4 only records a purchase when its tag fires in the buyer's browser and consent allows it, while Shopify records every order the checkout completed. Ad blockers, declined consent, the thank-you page not loading, duplicate or missing purchase events and different definitions of revenue (tax, shipping, refunds, currency) all widen the gap. A gap of a few percent is normal; a gap of a fifth or more means the tracking is broken and should be fixed before any channel is judged by GA4 numbers.

Shopify counts orders, GA4 counts events it managed to receive

Shopify's revenue is the sum of orders the checkout created. It does not depend on the customer's browser, their consent choice or whether the order status page rendered. GA4's revenue is the sum of purchase events that reached Google's servers, and every step between the checkout and that server can drop an event.

The order status page has to load. The tag has to execute before the customer closes the tab. The browser must not block the request. Consent Mode must permit analytics storage, or the event arrives without identifiers and may be modelled rather than counted. Each of those is a place where an order exists in Shopify and never appears in GA4.

This is why the two numbers should never be expected to match exactly. The question is how big the gap is and whether it is stable. A stable gap of a few percent is the cost of client-side measurement. A gap that jumps after a theme change, a checkout update or a consent banner deployment is a defect.

The usual causes, in the order we check them

Consent is the first thing to check on any store with a cookie banner. If analytics storage is denied by default and a share of visitors never accept, GA4 loses those purchases entirely unless Consent Mode is configured and Google's modelling has enough data to fill in. Compare the gap before and after the banner went live; a step change on that date is the answer.

The second cause is the purchase tag itself. Shopify's native Google and YouTube channel sends purchase events from the checkout; a theme-level tag, a Tag Manager container on the order status page and a checkout extension can all send the same purchase again, or none of them can fire because the order status page was customised. Duplicate events inflate GA4; missing events deflate it. Check for both by comparing purchase event counts with order counts for a single day.

The third cause is definition. Shopify reports total sales including shipping and tax, or net sales after discounts and returns, depending on the report. GA4's purchase value is whatever the tag was told to send, which is often the subtotal without shipping or tax, and refunds never flow back into GA4 unless a refund event is sent. Multi-currency stores add another layer: GA4 converts at its own rate, Shopify reports in the store currency.

After those three come ad blockers and privacy browsers, which drop a share of tags regardless of consent, and the rarer cases: a filter in the GA4 property excluding internal traffic too broadly, a data stream pointed at the wrong property, or a checkout on a different domain where cross-domain measurement was never set up.

How to measure the gap properly

Pick a clean seven-day window and export orders from Shopify with created date, order number, subtotal, shipping, tax and total. In GA4, open the ecommerce purchases report for the same days and export purchase events with transaction ID and value. Match on transaction ID.

Three numbers come out of that match: orders in Shopify with no GA4 event (lost purchases), GA4 events with no Shopify order or with a duplicate ID (phantom or doubled purchases), and the value difference on the orders that matched (definition mismatch). Each points at a different fix, and looking only at the monthly revenue totals hides which one you have.

Repeat the match after any tracking change. A store that keeps a monthly reconciliation like this catches breakage in days rather than discovering it during a budget review.

How to close most of the gap

Send the purchase event once, from one place. On Shopify that is usually the native channel or a single customer event pixel in Customer events, with theme and Tag Manager copies removed. Pass transaction ID, value, currency, tax and shipping explicitly so GA4's definition is deliberate rather than accidental.

Configure Consent Mode correctly and confirm the banner sets the analytics storage signal before the tag loads. Where the legal basis allows, move the purchase event server-side so that it no longer depends on the browser finishing its work, and reconcile the server-side stream against orders the same way.

Then stop expecting a perfect match. Use Shopify as the source of truth for revenue, use GA4 for the behaviour in front of the purchase, and keep the reconciliation as a monthly health check. The goal is a small, stable, explained gap.

A seven-day reconciliation, worked

Shopify orders
412
GA4 purchase events
371
Matched on transaction ID
358
Shopify orders with no GA4 event
54 (13% lost)
GA4 events with no order or duplicated
13 (3% phantom)
Value difference on matched orders
GA4 lower by shipping and tax on every order

Illustrative numbers. In this pattern the lost purchases point at consent or a tag that does not fire, the duplicates at a second purchase tag, and the value difference at the tag sending the subtotal only.

Related questions

Should GA4 revenue ever match Shopify exactly?

No. Client-side measurement always loses some events to consent, blockers and abandoned page loads. A gap of a few percent that stays stable month to month is healthy. Chase the gap only when it is large, growing or changed suddenly.

Does server-side tagging fix the GA4 and Shopify revenue gap?

It removes the browser from the purchase event, which closes the part of the gap caused by blockers and page loads, and it makes the event more reliable. It does not remove the consent requirement, and it does not fix a tag that sends the wrong value. Reconcile before and after to see what it actually changed.

Which number should I use for reporting, GA4 or Shopify?

Shopify for revenue, orders and refunds, because it is the system of record. GA4 for sessions, landing pages, funnels and the behaviour before the purchase. Attribution is a separate question, and neither system answers it fully on its own.

Find the leak.

A free Growth Analysis ranks what your store should fix first, by revenue at stake.