Purchases counted twice
Two independent fires for one order — commonly a container tag alongside a hardcoded snippet. Revenue and conversions inflate, and bidding optimises toward numbers that were never real.
Tracking integrity for Shopify
CommerceTrace runs a real checkout through your store, watches every step of the funnel report itself, and matches your Shopify orders against what analytics actually received — then tells you which handover lost the signal.
Private beta · no credit card Read-only No customer personal data
Four orders in a row, within about an hour, that never reached your analytics. The pattern is unusual enough to investigate.
The problem
Shopify says one thing. GA4 says another. Your ads platform says a third. Every dashboard is confident, and none of them tells you which step in between stopped working — or whether anything is broken at all.
Is it actually broken? GA4 takes hours to process, reports the item subtotal rather than the total, and converts currency. Several differences are supposed to be there.
Since when? A theme update, an app install, or a container publish can break tracking silently. The reports keep rendering, just with less in them.
Which step failed? The order exists. Somewhere between the checkout and Google's servers the event stopped. Knowing which link failed is the difference between a fix and a week of guessing.
Why it matters
Every bidding algorithm, budget decision and channel comparison you make runs on the conversions your tracking reported. When those are wrong, the decision is wrong — and nothing in the report looks broken.
Same store · same 7 days
Four sales that happened, and that no report will ever show. This is a measurement gap — not money CommerceTrace recovers.
You cut budget on a campaign that was profitable.
You scale spend into a campaign that was losing money.
Trace the signal
CommerceTrace runs a real checkout on your store and watches each handover report itself. Where it can prove a step worked, it says so. Where the evidence runs out — and inside Shopify's checkout it sometimes does — it says that instead of guessing.
Order confirmed paid. This is the ground truth every other stage is measured against.
The checkout reached the thank-you page and the purchase event was emitted.
Event present with transaction ID, value, currency, tax and shipping.
Shopify's checkout runs tags in a sealed sandbox, so whether the tag ran cannot be seen from outside. This step is honestly marked unknown.
No sale ever arrived. This is observed directly, not inferred.
What it finds
Each of these is a distinct check with its own evidence and its own confidence grade. Every one has been reproduced against a real store by deliberately breaking tracking, detecting the break, and restoring it.
Two independent fires for one order — commonly a container tag alongside a hardcoded snippet. Revenue and conversions inflate, and bidding optimises toward numbers that were never real.
GA4 receives a value that does not match the order. A frequent cause is sending the grand total where Google expects the item subtotal, which inflates every revenue figure by tax and shipping.
Shopify confirms the order; no GA4 purchase carries a matching transaction ID. Reported revenue and conversion counts silently understate what actually sold.
The customer was charged in one currency and GA4 was told another. Distinguished from GA4's own reporting-currency conversion, which looks identical in a report and is not a fault.
Revenue arrives correctly but the ecommerce item array is empty. Product-level reporting and any audience built on items stop working, while the revenue total looks perfectly healthy.
A shopper demonstrably viewed a product, added to cart, or began checkout, and no matching GA4 event followed. Sales figures are unaffected; funnel reports and remarketing audiences quietly stop filling.
After the fix
The hardest question after a tracking fix is whether it actually worked. A single clean result can be luck. CommerceTrace keeps the issue open until it has seen the problem stay fixed twice in a row.
And if it breaks again later, the issue reopens rather than quietly staying green.
Something that worked on Tuesday does not work now. Because the earlier run proved it healthy, the change is the evidence — you know it broke, and roughly when, without reconstructing it from a report.
Today this is run-to-run comparison. You run a check and it compares against the last one. Scheduled unattended checks and alerting are the next thing being built — they do not exist yet, and this page will not pretend they do.
Evidence, not guesses
Every sale has to clear each of these before it becomes a figure in a report. CommerceTrace asks all six, and answers the last one honestly.
The fourth answer is the one that matters. Shopify runs checkout tags in a sealed sandbox, so we cannot watch your tag manager work — and we will not pretend we can. The sale is missing, that much is certain. Blaming the step we could not see would send you to fix the wrong thing.
The mechanism is observable and no benign explanation fits.
A GA4 purchase exists for the order and reports a value that cannot be reconciled with Shopify by tax, shipping, discounts, or currency conversion.
Strong enough to act on, not strong enough to assert.
An order fifteen hours old with no GA4 purchase. Very likely a real gap — but Google does not guarantee when processing finishes, so it is not stamped confirmed yet.
The reason is named, so you know what would settle it.
An order placed twenty minutes ago, or one whose transaction ID Google grouped into an (other) row. Neither absence proves anything.
Not every gap is a fault. Most of them are not.
GA4 reporting in USD while the customer paid in CAD. The values differ by exactly that day's exchange rate — the tracking is working correctly.
It would rather say “I don't know yet” than say “this is broken” and be wrong.
The product
Findings are written for the person who has to decide whether to act — what happened, what it affects, and what to check next — with the technical classification kept one click away rather than in the headline.
What it can reach
A diagnostic tool should not be able to do more than diagnose. Everything below is a limit of what the software can do, not a policy it promises to follow.
One Shopify scope: read_orders. The client issues read queries exclusively — there is no write path in the code to reach.
No theme edits. No tag changes. No Google Tag Manager container writes.
The order query requests no name, email, phone, or address, which keeps it at Shopify's protected customer data Level 1.
Order numbers, amounts, currencies, timestamps and line items. Nothing that identifies a shopper.
Google access uses one read-only scope through Google's own consent screen. No service account to create, nothing to paste.
Revoke from your Google account at any time, or disconnect here — which revokes it at Google too.
How it works
During early access we connect your store with you: read-only Shopify orders, and Google Analytics through Google's own consent screen using your account. Nothing to install, nothing to paste.
Every order in the period is matched against what Google Analytics recorded — allowing for the several ways Google may have stored the order number.
To see how sales are reported now, CommerceTrace shops your store the way a customer does and watches each step of the journey report itself.
Each result says how sure it is, what it affects, and the one specific thing worth checking next.
Who it's for
You can see that GA4 is missing sales you know happened. You need to know whether it is a real fault and what to send your developer.
Bidding optimises toward the conversions it is fed. Duplicated or missing purchases distort spend long before anyone notices the reports look odd.
Prove tracking was intact when you handed it over, and catch a client's theme update breaking it before the monthly report does.
Reconcile the storefront against the warehouse with a defined verdict vocabulary rather than a spreadsheet and an argument.
For agencies
So tracking breaks are found by the client, in a monthly report, weeks after the theme update that caused them. The useful question is not "is everything fine" — it is "which two stores should I look at today".
An illustration of the shape, not a live screen. Portfolio view is planned; today CommerceTrace checks one store at a time.
A graded result on the day you shipped is a record you can point at when tracking breaks three months later.
Finding a break yourself and reporting it is a very different conversation from being told your reporting is wrong.
"Tracking is broken" costs a week. "The purchase event is not reaching GA4, and here is the evidence" costs an afternoon.
Questions
Some difference is normal and expected. GA4 reports the item subtotal rather than the order total, converts into the property's reporting currency, takes hours to finish processing, and drops events entirely when a shopper declines analytics consent.
Beyond that, the common causes are purchase events that never fire, events that fire twice, and events that report the wrong value. CommerceTrace separates the explainable differences from the real faults, and names which one applies to each order.
Six reasons a tracking tool reports a fault that isn't there →
Take each Shopify order and look for a GA4 purchase carrying a matching transaction ID — allowing for the fact that GA4 may hold the order name, the order ID, or the confirmation number. An order with no match after GA4 has finished processing is a genuine gap.
CommerceTrace runs that comparison for every order in the window, then traces the chain — customer event, Data Layer, Google Tag Manager, GA4 request — to show how far the signal travelled before it stopped.
Usually the same purchase tag firing from more than one place: a GA4 tag in Google Tag Manager alongside a hardcoded gtag snippet in the theme, a duplicated tag or trigger, or a thank-you page a shopper reloads.
Duplicates inflate revenue and conversion counts. CommerceTrace distinguishes two genuinely independent fires from one event observed twice through transport retries or reporting aggregation, and only calls the first case a duplicate.
No. It requests the read_orders scope only, and its Shopify client issues read queries exclusively — there is no write path in the code. GA4 is read through the Data API using read-only access you grant with your own Google account.
It never edits your theme, your tags, or your Google Tag Manager container.
No. The Shopify query requests no customer name, email, phone, or address, and the GA4 reports it runs are aggregate and carry no user-level identifiers.
It reads order numbers, amounts, currencies, timestamps, and line items — what is needed to reconcile an order against an analytics event, and nothing more. See the privacy policy for the full inventory.
That the evidence does not support a verdict, and that saying so is more useful than guessing. An order placed twenty minutes ago with no GA4 data yet is not missing — GA4 has not finished processing it.
If Google groups transaction IDs into an (other) row, samples the report, or applies thresholding, a specific order cannot be confirmed absent. In each case the result is inconclusive and the reason is named, rather than a false alarm being raised.
No. The Shopify-to-GA4 reconciliation works regardless of how your tracking is implemented, because it compares two records of the same sale rather than inspecting your setup.
Google Tag Manager appears in the tracking chain because it is where breaks most often occur on Shopify stores. If you do not use it, that stage simply is not part of your chain.
CommerceTrace is in private beta. We set the connection up with you, run a check against your real orders, and walk you through what the comparison found — before any of it costs you anything.
The request takes one line each:
Opens your mail app with those lines ready.
Private beta · no credit card · read-only access you can revoke at any time.
The first audit is free. CommerceTrace will be a paid product after the beta — pricing is not set yet, and beta participants will hear it from us before anything changes.