Why GA4 revenue is different from Shopify
By the HonestTag team ยท Published October 27, 2026
GA4 and Shopify are not measuring the same number. Shopify's total sales adds taxes, duties, shipping and fees to what products sold for, and subtracts discounts and sales reversals. A sale counts on the day it was made, and a reversal on the day it was processed. Google tells sites to send a purchase value without shipping or tax, and GA4's purchase revenue only knows about the purchases a tag or server actually sent it, minus the refunds it was told about. Part of the gap is those definitions, and part is purchases that never reached GA4.
Install HonestTag free and run the Mirror plan beside your current tracking. It sends no purchases or conversions to your ad platforms, so it cannot double-count a sale or change your current setup, and it shows which platform claims hold up against the new customers in your real orders. Free at any store size.
What each one counts
Shopify. Shopify's sales reports page defines total sales as "gross sales - discounts - sales reversals + taxes + duties + shipping charges + fees." Gross sales is "product price x quantity (before taxes, shipping, discounts, and sales reversals)," and net sales is "gross sales - discounts - sales reversals." Sales reversals include returned products, cancellations, edits, and adjustments to shipping, taxes, fees, and discounts. On dates, Shopify says sales show "as a positive value for the day that they were made, and reversals display as a negative value for the day that they were processed." So a refund lands on the day it was processed, not on the day of the order.
Shopify also says what its reports leave in and out. Pending, canceled, and unpaid orders are included in gross sales, and the sales reports also include draft orders that have been converted into orders. Test orders placed while Shopify Payments was in test mode, and deleted orders, are not. A gift card product that you sell "isn't included in any sales reports, nor the total sales number in the Home analytics card," so a tag that sends every checkout as a purchase reports revenue for gift cards that total sales leaves out. When a customer pays with a gift card, the item is in the sales reports at its full value. Report data is in your store currency unless you pick another one, and its time zone is a store setting; Shopify's discrepancies page notes that "Discrepancies might be introduced because of different reporting time zones."
GA4. GA4 has no orders of its own. It counts purchase events. For the purchase value, Google's event reference says: "Set value to the sum of (price * quantity) for all items in items. Don't include shipping or tax." Shipping and tax have their own parameters. Google also says "If you set value then currency is required for revenue metrics to be computed accurately." Google's metrics table defines purchase revenue as "The sum of revenue from purchases made on your website or app, minus any refunds given," and says refund amounts are "populated from the refund and app_store_refund events." A refund GA4 never receives as an event is not subtracted.
GA4 dates an event in the property's time zone: Google's example is a visit on Tuesday in the visitor's time zone that is "recorded as having occurred on Monday" in yours. Revenue sent in another currency is converted "using the prior day's exchange rate" and shown in the property's currency (Google's currency reference). And recent days are not final: Google says "Data processing can take 24-48 hours. During that time, data in your reports may change." Compare days that are at least two days old.
A worked example
The numbers below are illustrative, not from any store. Say every order in a week is the same: products $100, shipping $10, tax $8, no discount. The store takes 20 orders.
- Shopify total sales: $100 + $10 + $8 = $118 an order, so 20 × $118 = $2,360. Net sales, which leaves out tax and shipping, is 20 × $100 = $2,000.
- GA4 purchase revenue, if the tag follows Google's value rule and fires on all 20: 20 × $100 = $2,000. Already $360 below Shopify's total sales, with nothing broken.
- The same tag, if it fires on 17 of the 20: 17 × $100 = $1,700.
- A tag that sends the order total instead: 17 × $118 = $2,006. Closer to Shopify's net sales, for the wrong reason: the $306 of tax and shipping on 17 orders almost offsets the $300 of products on the 3 that were missed.
- A full refund of one order the next week: Shopify shows −$118 in total sales on the day the refund was processed. GA4 subtracts nothing unless something sends a
refundevent for that order, and a refund event that follows Google's value rule carries $100, not $118.
To compare your own store, line up GA4 purchase revenue with Shopify's net sales rather than total sales, on the same days in the same time zone and currency, and check the purchase count before the revenue. The two will still drift apart once there are reversals, because Shopify's net sales also subtracts cancellations, edits, and shipping, tax, fee, and discount adjustments.
Send GA4 purchases keyed to your orders. On the Starter plan and up, HonestTag sends GA4 its own purchase event with your Shopify order ID, so it does not add to the revenue GA4 already reports.
Why the two numbers differ
- The browser tag never fired. A purchase sent from the browser needs the buyer's browser to run it. Shopify says "Google can only count visitors with JavaScript and cookies activated," and that "Customers can use browser extensions to block Google Analytics from tracking their sessions and purchases." Shopify's order exists either way. Server-side tracking covers the other ways a browser tag misses.
- Consent. On Shopify, in markets configured to require consent, Shopify says web pixels "run only when visitors have provided the permissions required in the pixel configuration." A buyer who declines is still in Shopify's sales report. Google Consent Mode v2 explains why conversions drop once a cookie banner goes in.
- Duplicate or missing transaction IDs. Google says "Google Analytics deduplicates purchase events with the same transaction ID," that this only works for web streams, and that you must add a transaction ID to every ecommerce event "to deduplicate transactions from the same user and to properly process refunds." Two tags sending one order with different transaction IDs can count it twice. An empty ID fails the other way. Google says "Don't send an empty string as the transaction ID," because "Google Analytics will deduplicate all purchase events that have
transaction_id=""," so separate orders sent with an empty ID collapse into one. Shopify warns that adding Google Analytics through Google Tag Manager on top of its built-in integration "can result in duplicate tracking." - Value with or without tax and shipping. One tag sends the product subtotal, another the order total. The product subtotal leaves out the tax, shipping, duties, and fees that total sales includes. On a simple order the order total can equal that order's total sales, but then it no longer follows Google's value rule. Either way, the two tags do not match each other. Conversion value vs order total walks through one order's values.
- Refunds and other reversals. Shopify's sales reports subtract returns and other reversals on the day they are processed. That includes a refund with no product returned: Shopify lists full refunds without product returns and custom refunds, such as goodwill refunds, as reversals, and says "the negative value still displays in your sales reports." GA4 subtracts only the refund events it receives, and has no event for an order edit or a shipping adjustment unless something sends one.
- Orders made outside the online checkout. Shopify's sales reports include draft orders that have been converted into orders, and it keeps separate retail sales reports for point of sale. A tag that only runs on the online store's pages has nothing to run on for an order created another way (see draft and manual orders).
- Cents dropped. If a tag sends the value as a whole number, a $49.99 order arrives as $49 or $50. Over many orders that is a steady gap with every purchase present.
- Dates, time zones and currency. A late evening order can fall on different days in the two reports if the GA4 property and the store use different time zones, and the two convert other currencies at different rates on different days.
What server-side delivery fixes, and what it cannot
A purchase sent from your server through Google's Measurement Protocol does not depend on the buyer's browser running a tag, so for the orders it sends it fixes the tag that never fired, and, when it uses the order ID as the transaction ID, the missing ID. It does not replace the Google tag. Google's Measurement Protocol page says: "The intent of the Measurement Protocol is to augment automatic collection through gtag, Tag Manager, and Google Analytics for Firebase, not to replace it." and "You must use tagging (gTag, Tag Manager, or Google Analytics for Firebase) to use this protocol."
Google says the event's client_id "should match the ID generated by the Google Analytics tag on your website," and that events received more than 48 hours after the tag's own event "may not be processed as expected, particularly for purposes like conversion attribution." So the visit, the traffic source, and the funnel steps before the purchase still come from the tag in the browser. A server-side purchase is one event, not GA4's ecommerce funnel. Server-side tracking covers the general trade-offs.
How HonestTag handles GA4
- On the Starter plan and up. Every paid plan can deliver to Google Analytics 4, within the plan's limit on destinations at once. The free Mirror plan sends GA4 no purchases.
- No double count by default. Each purchase goes to your GA4 web data stream as HonestTag's own
ht_purchaseevent, with your Shopify order ID as the transaction ID. It does not add to GA4's purchase and revenue reports, so you can keep the Google & YouTube app or your GA4 tag. - The standard purchase switch. Turn it on only if HonestTag is your only GA4 purchase source. HonestTag then sends GA4's standard
purchaseevent, and each refund as arefundevent with the same transaction ID, so GA4's purchase revenue subtracts it. A GA4 connection saved before this switch existed keeps sending the standardpurchaseuntil you save the GA4 card again, which records your choice. - A value net of tax and shipping. The value is the order's total net of tax and shipping, with shipping on GA4's own
shippingparameter. It is not rebuilt as a sum of the products. - On time, under the tag's client ID. A purchase passes the recorded consent check first, and none older than Google's 72-hour backdating window is sent. It goes out under the client ID from your Google tag's
_gacookie when HonestTag's pixel saw one; otherwise a stand-in ID is used, and HonestTag counts how often.
Each purchase also sends goal events saying whether the buyer was new or returning (ht_purchase_nc, ht_purchase_rc, and ht_purchase_fcnc as well when a new buyer's first ad click or ad-tagged link was Google's). Their value is net of tax but not of shipping, so do not add them to purchase revenue. Keep your Google tag for page views, sources, and the funnel. With the switch off, GA4 purchase revenue is still whatever your Google tag or app sends. With it on, expect GA4 purchase revenue to sit below Shopify's total sales by about the tax, duties, shipping and fees, and refunds can land on different days in the two reports. The GA4 connection guide has the steps, and if another tool also sends purchases to the same stream, read duplicate purchase events first.
Frequently asked questions
Should GA4 revenue match Shopify's total sales?
No. Shopify's total sales includes taxes, duties, shipping, and fees, and Google says a purchase value should not include shipping or tax. Compare GA4 purchase revenue with Shopify's net sales instead, on the same dates, time zone, and currency. Expect drift once there are reversals, because Shopify's net sales also subtracts cancellations, edits, and shipping, tax, fee, and discount adjustments.
Does GA4 subtract refunds?
Yes, if it receives them. Google defines purchase revenue as purchases minus refunds, and refund amounts come from refund events. A refund that is only recorded in Shopify is not subtracted in GA4.
Why does GA4 show fewer purchases than Shopify has orders?
A browser tag only counts a purchase when it runs. Shopify says Google can only count visitors with JavaScript and cookies activated, and that browser extensions can block it. Consent rules and orders created outside the online checkout also count differently in the two.
Can a server-side purchase replace my Google tag?
No. Google says the Measurement Protocol is meant to augment the Google tag, not replace it, and that a tag is required to use it. The tag still provides the sessions, sources, and funnel; a server-side purchase adds the order the browser missed.
Send GA4 purchases keyed to your orders
On the Starter plan and up, HonestTag sends GA4 its own purchase event with your Shopify order ID, so it does not add to the revenue GA4 already reports.
- No risk to your setup. The Mirror plan sends no purchases or conversions to your ad platforms, so it cannot double-count a sale or change your current setup.
- Claims against real orders. It shows what Google Ads, Meta, Microsoft Advertising and TikTok claim beside the new customers whose first recorded ad click or ad-tagged link was that platform, counted from your own orders.
- Free at any store size. The Mirror plan stays free whatever your sales.