Shopify and Google Analytics: Reconcile Revenue
The two systems will not agree and should not be forced to. The goal is a gap you can explain and track, because a stable gap is a measurement, and a moving one is a warning.
Google Analytics revenue and Shopify revenue will not match, and trying to force them to produces a worse result than explaining the gap. The practical method is to treat Shopify as the reference, align definitions and dates, then track the gap as a monthly percentage. A stable gap is background noise. A change in the gap is the thing to investigate. This post lists the causes and walks through the reconciliation.
Why they differ: seven causes, largest first
- Tags that did not fire. Consent banners, ad blockers and browsers that limit tracking mean some orders are never seen by the analytics tag. This is usually the biggest piece and it cannot be recovered.
- Different definitions of revenue. Shopify net sales deducts discounts and returns and excludes shipping and tax. A purchase event may carry a value that includes some of them. Compare matching definitions only.
- Returns timing. Shopify counts a return on the refund date. Analytics only knows about a refund if you send a refund event.
- Orders outside the tracked flow. Point-of-sale orders, draft orders created by staff, and orders placed through other sales channels never touch the website tag.
- Duplicate events. A thank-you page that fires twice on reload can inflate analytics above Shopify.
- Time zones. Shopify uses the store's time zone. Analytics uses the property's. Orders near midnight shift a day, and month-end shifts a month.
- Currency. Multi-currency stores can convert at different rates in the two systems.
The related problem for conversions rather than revenue is covered in why your conversions do not match Shopify.
The reconciliation routine
Do this once a month and keep the results in a small table:
Month Shopify orders GA4 purchases Shopify net sales GA4 revenue Gap % (example numbers only; fill in from your own reports)
First, compare order counts before revenue. Orders are unambiguous, whereas revenue depends on definition. If counts differ by 7 percent and revenue by 7 percent, the tag is the cause and the definitions line up. If counts match and revenue differs, you have a definition problem. If counts and revenue gaps differ greatly, look for duplicated events or high-value orders that are missing.
Second, express the gap as a percentage of the Shopify figure, not as dollars. A dollar gap grows with the business and looks like a deteriorating problem when it is not.
Third, ignore a stable gap and investigate a moving one. A theme change, a consent-banner update, a new checkout extension or a payment method that redirects off-site will each shift the gap for a reason you can usually date.
Using order-level source to cross-check channels
Analytics-reported revenue by channel is a model of behavior. Shopify holds a second, independent view: each order can carry the sales channel and the UTM source, medium and campaign from the customer's last visit, or their first visit when there is no last one. Grouping Shopify net sales by UTM source and comparing the shares with analytics channel shares is a cheap sanity check. If paid social is 30 percent of revenue in analytics and 12 percent of UTM-tagged Shopify sales, something is off in tagging, and no amount of dashboard tweaking will fix it. Expect a visible share of orders with blank UTM fields; report it as its own line.
Doing the Shopify side with Quiriz
The Shopify connector (in beta, read-only, refreshed daily) gives you [Shopify] Sales, which matches Shopify's sales report, and [Shopify] Orders with sales channel, utm_source, utm_medium and utm_campaign columns. Useful questions are "net sales and orders by month this year" for your reference column, and "net sales by UTM source last quarter, including orders with no source" for the channel cross-check. Net sales, Orders and Average order value are stored metrics, so the reference column is the same each month.
If you also connect Google Analytics to Quiriz, the analytics side can be asked in the same place, which puts both columns of the reconciliation table in one conversation. Even without it, you can paste the analytics figures from the GA4 report next to Quiriz's Shopify figures. The general GA4 walk-through is in Google Analytics report, and the join problem for ad data is in joining Shopify and ad exports.
An example of reading the gap
Illustrative only. Suppose the gap runs between 8 and 10 percent for five months, then jumps to 17 percent in the sixth. Orders in Shopify are normal that month, so demand did not change. Something about measurement did. Check what shipped around then: a new theme, a changed consent banner, a payment method that sends buyers off-site and back, or a checkout app that moved the confirmation step. The date the gap moved is usually the date the change was released. Once fixed, the gap returns to its range, and the useful artifact is the short note you leave about what happened.
This is also why you should not tune either system to match the other. If you adjust analytics to hit Shopify's number, you lose the signal that something broke.
Honest limits
- No reconciliation recovers orders the analytics tag never saw. The goal is a known, stable gap.
- Shopify UTM fields depend on Shopify having captured the visit. Some orders have none.
- Without full order history approved, only the last 60 days of Shopify orders are available, and very large stores import the newest whole months up to a cap.
- Guest checkouts have no customer record, which affects new-customer counts but not revenue.
Marketing teams working across both systems may find Quiriz for paid media and Quiriz for ecommerce useful.
Get the Shopify side of the reconciliation
Connect Shopify and ask for net sales and orders by month and by UTM source. Free to start.
Try Quiriz free →