Shopify, GA4 and Meta disagree? (fix the maths first)
Published August 28, 2026
The 60-second version
- Four systems, four definitions of a sale — store timezone vs property timezone vs click-date, gross vs net.
- Tax, shipping and refunds explain most of the gap. Compare net-to-net in one timezone before blaming attribution.
- The fix: one reconciliation query, then one revenue number per audience.
It is 9am on the 5th. You open Shopify: yesterday did $48,210. You open GA4: yesterday did $44,905. You open Meta Ads Manager: it claims $31,400 in purchase value, and Google Ads claims another $14,800 on top.
Four numbers. One day. Nobody is broken.
This is not about attribution — that is a disagreement about which ad channel gets credit. This is something narrower and much easier to fix: the three systems do not agree on what a sale is worth or which day it happened on. Timezones, refunds, tax, and shipping explain most of the gap. Every single one is a checkable arithmetic line item.
The distinction that matters: attribution disagreements are about credit and can never be completely resolved. Revenue-definition disagreements are about basic arithmetic and can be reconciled to within a rounding error. Fix the arithmetic first — otherwise you will spend weeks debugging attribution while the real culprit was a timezone setting.
What each system is actually counting
Same Day, Four Definitions of Revenue
Data JourneyShopify / Your Store
Records the order at the moment checkout completes, in the store's configured timezone, at gross value including tax and shipping.
GA4
Records a purchase event only if the tag fired on the thank-you page, at whatever value the tag was configured to send.
Ad Platforms
Records purchase value against the day the ad was clicked, not the day the order was placed, in the ad account's timezone.
Shopify (or your commerce backend)
Counts an order the instant checkout succeeds. It stamps the order in the store timezone and reports gross value by default — including sales tax and shipping fees. Refunds appear on the day the refund was processed, not the day the order was originally placed.
GA4
Counts a purchase event only if the browser tag fired successfully on the confirmation page. Its reported value is whatever your tag script sent — which may or may not include tax and shipping depending on setup. Its calendar day boundary is the GA4 property timezone, which is independent of your store. GA4 never subtracts refunds unless you build custom refund pipelines.
Meta and Google Ads
Count purchase value against the day of the ad click, not the day of the order. A purchase on the 4th resulting from an ad click on the 1st appears in Meta's row for the 1st. Both platforms also stamp days in the ad account timezone, which is a third independent clock.
The timezone trap: three settings in disguise
The single largest contributor to daily revenue mismatches is timezone drift, because each system has its own setting and nothing warns you when they conflict.
Shopify records orders in your store timezone. GA4 defaults to the timezone chosen when creating the property (frequently left as America/Los_Angeles). Meta Ads and Google Ads lock your ad account timezone permanently upon creation — you cannot change it without creating an entirely new ad account. And your central database or warehouse almost universally stores raw timestamps in UTC.
An Asia/Kolkata store compared against an America/Los_Angeles GA4 property creates a 12.5-hour offset. That does not merely nudge revenue slightly; it means roughly half of each Indian evening's orders land on the previous calendar day in GA4. On a business with an evening sales peak, that creates a 20% to 40% daily gap that looks exactly like broken tracking, but is purely a clock mismatch.
Ad account timezones cannot be changed after creation. If yours is set incorrectly, you cannot edit it in place without losing historical campaign training data. The practical answer is to normalize all timestamps in your reporting database rather than clicking around dashboards.
The fix is to convert every timestamp to a single business timezone at query time:
Comparing net to net: taxes, shipping and refunds
Once timezones match, the next gap comes from comparing gross revenue to net revenue.
Tax and shipping fees
- Shopify sales reports display gross sales including taxes collected and shipping fees charged unless you explicitly filter for net sales.
- GA4 purchase tags often send subtotal value excluding tax and shipping (standard in Shopify's native app), though manual Google Tag Manager setups frequently pass the gross total.
- Meta pixels frequently track gross order totals.
At an 18% GST rate plus ₹80 shipping on a ₹2,000 order, comparing gross to net produces an instant 20% discrepancy on the exact same transactions.
When you subtract $6,900 of tax and $1,340 of shipping from Shopify's $48,210 gross, your true net revenue is $39,970. Comparing that to GA4's $44,905 reveals that GA4 is actually higher than your store.
After putting both systems on the same net revenue basis, GA4 reports $44,905 while Shopify reports $39,970. Why is GA4 higher?
Refund timing
A refund processed on the 12th for an order placed on the 5th can be recorded in two ways:
- Order-date net: Deduct it from the 5th. Historical numbers restate as returns trickle in.
- Refund-date net: Deduct it on the 12th. History stays frozen, but daily numbers mix new sales with old returns.
Ad platforms use neither convention: they record gross value at checkout and never subtract refunds unless you send offline conversion files.
Orders that never settled
Cancelled orders, failed card payments, fraud holds, and cash-on-delivery orders that get returned undelivered (RTO) sit in your store database but never fire a pixel tag. Always filter for realized revenue:
After stripping tax, shipping, refunds, and cancelled orders, any remaining 3% to 10% gap is genuine tag loss from browser ad blockers and privacy settings.
A four-way reconciliation query for your warehouse
Once all data streams land in your database, run a daily reconciliation query to verify that your ratios stay stable:
Your ga4_capture_rate should hover reliably between 0.90 and 0.97. Your platform_overclaim will typically exceed 1.0 because platforms back-date and claim credit for the same orders.
Alert on ratios, not dollar gaps. A $3,000 gap on a $50,000 day and a $6,000 gap on a $100,000 day represent the exact same 6% margin. Teams that alert on raw currency differences page themselves every time their business grows.
One revenue number per audience
Stop trying to force one number to serve every stakeholder. Give each team the specific metric suited to its role:
One Revenue Number Per Audience
Reporting HierarchyFinance and the board
Store net revenue, refund-date basis, converted to the reporting timezone. This is the only number that ties to the bank.
Marketing leadership
Store net revenue over total marketing spend — MER. Attribution-free, so no platform disagreement can distort it.
Media buyers
Platform-reported value, inside the platform, used only for bidding. Never summed across platforms, never compared to finance.
The common mistake is putting Meta's gross, back-dated number next to Shopify's net revenue in an executive slide and asking why they do not match.
Frequently asked questions
Why does Meta show revenue on a day my store had zero sales?
Because Meta credits revenue back to the ad click date, not the order date. A sale today from an ad clicked nine days ago appears in Meta's row for nine days ago.
My GA4 revenue is higher than Shopify's. How is that possible?
Almost always thank-you page double-firing. Customers refresh confirmation pages or reopen browser tabs, causing ungated tags to send duplicate transaction events. Check if GA4's unique transaction count exceeds Shopify's order count for that day.
Should I change my GA4 timezone to match my store?
Yes, but understand that GA4 does not recalculate historical data when timezone settings change. You will see a small discontinuity on the day of the switch; document the date and compare data before and after with caution.
Is a 10% gap between store and GA4 a problem?
No. A 90% capture rate is healthy and standard after accounting for privacy browsers, ad blockers, and cookie declines. Fixing the remaining 10% usually costs more engineering time than it is worth.
Which number belongs in a ROAS calculation?
Store net revenue, matched to your spend timezone and calculated on a consistent refund basis. Using ad platform revenue against actual cash spend produces a ratio built on two incompatible sources.
Takeaways for your next report
- Shopify counts at order time, GA4 counts when tags fire, and ad platforms back-date revenue to the ad click day.
- Timezone offsets between systems create massive apparent revenue shifts that look like broken tracking.
- Comparing gross sales to net product sales introduces an immediate 15% to 25% gap from taxes and shipping.
- Align timezones, normalize taxes and refunds, and track the capture ratio in SQL before debugging attribution.
MER Calculator
Total revenue divided by total marketing spend — the attribution-agnostic efficiency number, plus its contribution-margin-adjusted variant.
Chinmay Raibagkar
About author →Founder of DataLens AI. He helps non-technical teams read their ad and database numbers with confidence — which number to trust, what to do next, and what to ignore.