Skip to content

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

  1. Causes, ranked 5
  2. How to diagnose it 6

First answer free, within one working day. Describe your case

Sounds familiar?

The symptom

Symptom report

You need to decide whether to keep spending, but each dashboard gives a different answer. I would first ask what each total includes. A paid order, a received Purchase event and an attributed conversion are three different records.

Tick what you see

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Sources: Shopify analytics discrepancies, Google Ads conversion windows, view-through conversions, Google consent management, and modelled key events.

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.

  1. 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.
  2. 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.
  3. 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 purchase payload. Google’s ecommerce specification keeps tax and shipping separate from purchase value. A net-sales figure and a gross order total answer different questions.
  4. Match IDs where available. Map the order identifier to the transaction_id actually 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.
  5. 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.
  6. 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 differenceWhat I would testWhat would justify a fix
Only the reporting date differsAlign time zones and conversion-time columnsA gap remains in the same cohort
Only revenue differsCompare value, shipping, tax, currency and refundsThe payload contradicts the agreed definition
Orders missing mostly on one gatewayRepeat that payment pathA paid order with no corresponding received purchase
GA4 has two IDs for one orderInventory senders and inspect requestsThe same order was sent through competing paths
Campaign totals differ but collection passesCompare windows, view credit and modellingNo rebuild until a collection fault is demonstrated
Totals match but individual orders do notMatch the records instead of the totalsMissing 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

See a redacted sample report

Free first step: Describe what's wrong

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.

Daniil Maximkin

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 wrong

The first answer is free, within one working day. Or write directly: next@taskfordaniel.com

Discuss your task

Describe what needs to be built, fixed or connected.

Write your task next@taskfordaniel.com