Troubleshooting
Why Do Shopify, Meta Ads, and GA4 Never Show the Same Sales Numbers?
Which number do I trust? Compare the same paid orders, dates and revenue definition, then separate reporting differences from missing or duplicate purchases.
- Published
- Reviewed
Diagnosis
- Causes, ranked 5
- How to diagnose it 6
First answer free, within one working day. Describe your case
Sounds familiar?
The symptom
The short version
Direct answer
When Shopify, Meta Ads and GA4 never show the same sales numbers, I use the paid-order ledger to establish sales and the advertising reports to investigate credit for those sales. I do not add the ad platforms’ totals together as if they were separate orders.
My first deliverable is an explanation of the difference in your own data. If several systems disagree or an earlier fix failed, the work needs an order comparison before another rebuild.
Where to look
Causes, ranked
Causes, ranked5 causes
-
Different attribution windows and models
I record each report’s selected window and attribution method. Google’s documentation explains that changing the window changes eligible conversions. A comparison is unfinished until those settings are written down. -
Click-based versus view-through credit
I check whether each selected report includes credit following an ad view. Google Ads documents view-through conversions separately from click conversions. I compare like columns and record Meta’s current account settings rather than assuming a default window. -
Consent and unobserved activity
Shopify documents browser blocking and privacy settings as reasons for discrepancies. Google’s consent implementation changes tag behavior. I test accepted and declined paths separately instead of treating all unrecorded activity as a broken pixel. -
Modelled conversions
Google estimates some key events it cannot observe directly and includes modelling in eligible reports. An attributed estimate is not a list of identifiable orders. I keep it separate from an order-ID comparison. -
Missing or repeated collection
If a paid test order cannot be found in the receiving platform, or competing senders report it twice, the problem needs a collection check. A matching grand total can hide both faults at once.
6 steps
How to diagnose it
Start the order-ID comparison with the free Shopify orders vs GA4 purchases tool, which keeps both CSV exports in your browser and produces a downloadable ledger.
- Choose the order cohort. Export a closed period of Shopify orders. Keep paid online-store orders in one group. Label test, draft, POS, cancelled and refunded orders separately. Decide whether the question is orders created, orders paid or net sales after refunds. Keep that definition attached to the sheet.
- Align the clock. Record the store, GA4 and Ads account time zones. Convert boundary timestamps to one time zone before comparing days. For Google Ads, use a conversion-time column when comparing with orders completed in that period; ordinary reporting can place credit on the earlier ad interaction date.
- Align the money. Choose one currency. Write down whether the value includes discounts, shipping, tax and refunds. Compare the Shopify order fields with the actual
purchasepayload. Google’s ecommerce specification keeps tax and shipping separate from purchasevalue. A net-sales figure and a gross order total answer different questions. - Match IDs where available. Map the order identifier to the
transaction_idactually sent to GA4. Keep missing, repeated and value-different records in separate columns. Do not assume an order name and a numeric order ID have the same format. Keep modelled totals and platform reports without order-level identifiers outside this join. - Compare attribution separately. For the same date range, save the Meta and Google Ads windows, click/view columns, selected actions and attribution models. In GA4, distinguish all collected purchases from channel-attributed key events. Google Ads conversion imports can include modelling. These reports cannot all be reconstructed as an exact order-by-order list.
- Test the unexplained part. Pick the gateway, date or checkout path where missing records cluster. Complete a real checkout through it and inspect the receiving platform. Then test for a second sender. I change the component that failed and repeat the same path before touching anything else.
The date check follows Google’s reporting-discrepancy guidance. The value check follows Google’s purchase event specification. Use the GA4 deduplication rules when matching IDs.
Signal and fix
Decision table
| Remaining difference | What I would test | What would justify a fix |
|---|---|---|
| Only the reporting date differs | Align time zones and conversion-time columns | A gap remains in the same cohort |
| Only revenue differs | Compare value, shipping, tax, currency and refunds | The payload contradicts the agreed definition |
| Orders missing mostly on one gateway | Repeat that payment path | A paid order with no corresponding received purchase |
| GA4 has two IDs for one order | Inventory senders and inspect requests | The same order was sent through competing paths |
| Campaign totals differ but collection passes | Compare windows, view credit and modelling | No rebuild until a collection fault is demonstrated |
| Totals match but individual orders do not | Match the records instead of the totals | Missing orders concealed by duplicate ones |
A note from Daniilbefore you decide
Should you fix it yourself or bring in help?
You can make a useful first comparison with the order export, the reporting settings and a test checkout. I would bring in help when you cannot explain the remaining difference, when several systems disagree, or when a cheaper fix already failed.
I match every Shopify order against available GA4, Meta and Google Ads records, mark what cannot be matched, prove the cause, rebuild the failed parts and add a daily check. That is the larger scope described below. It starts with evidence rather than a promise that every dashboard will become identical.
— Daniil
One clear problem, fixed.
If the comparison proves one isolated missing or duplicate purchase path, I fix that path on your store.
I complete a real test order and show the corrected Purchase in the affected platform, with the order value checked.
$350 · 3 working days after access
Urgent, within 24 hours: +25%.
When several systems disagree, or a cheaper fix already failed.
I match every Shopify order against what GA4, Meta and Google Ads recorded, wherever order-level data is available. I separate attributed and modelled totals that cannot be matched to individual orders.
I prove the cause in your own data, rebuild the broken tracking, and add a daily check so it does not silently break again.
From $1,500
Questions
Questions this symptom raises
Meta says 140 sales, Shopify says 115, GA4 a third number. Which number do I trust?
I start with paid Shopify orders for the sales ledger. I compare the advertising reports separately after writing down their attribution settings. Those figures are the problem's wording, not a result from my client work.
Should GA4 vs Shopify analytics match exactly?
Not automatically. Shopify documents differences caused by time zones, tracking methods, cookies and browser blocking. I first compare the same orders and revenue definition, then investigate the remaining unexplained gap.
Is Meta vs Shopify a tracking problem or an attribution problem?
I test collection before deciding. If the controlled purchase does not arrive, or arrives repeatedly, I investigate tracking. If collection passes, I compare the selected attribution windows and reporting dates. A total alone cannot distinguish the two.
Read more, or check a neighbouring symptom.
All symptoms
Hi, I’m Daniil.
I work with you from defining the problem to implementation and handover. You talk to the person who does the work. I work in English and Russian; written correspondence in Spanish with translation support.
Tried it and still stuck?
Describe what's wrongThe first answer is free, within one working day. Or write directly: next@taskfordaniel.com