You run ads, you check GA4, and the purchases are not there, or a third of them are missing, and every channel suddenly looks unprofitable. We have fixed this for stores where the ad budget was being steered by numbers that were wrong. Shopify purchase tracking breaks in a small number of predictable places, and the fix depends on which setup you have. Here is how to diagnose it without guessing.
Quick answer: First compare Shopify orders to GA4 purchase events for the same seven days. A 5 to 15 percent gap is normal, caused by ad blockers and declined consent. Zero or near-zero purchases means the tag never fires on the order confirmation page, usually from an outdated checkout script, a broken pixel, or doubled tracking.
How do I confirm purchases are missing?
Pick a completed seven-day window. In Shopify, note total orders. In GA4, open Reports > Monetization > Ecommerce purchases (or count the purchase event in Explore) for the same dates. Under-reporting of 5 to 15 percent is the normal cost of blockers and consent. A 30 percent gap means something is broken for a segment of traffic. Near-zero means the purchase event is not firing at all, which is a configuration problem with a findable cause.
What breaks purchase tracking on Shopify?
- Leftover legacy tracking. Shopify’s move to Checkout Extensibility removed the old checkout.liquid customizations and the “additional scripts” box where many GA snippets lived. Stores that never migrated their tracking lost purchase events the day the old checkout was retired.
- A misconfigured Google & YouTube channel app: wrong GA4 property, wrong data stream, or the connection never finished.
- A custom web pixel with an error, often from a half-finished developer handoff.
- Doubled tracking, the channel app and a custom pixel both firing, which corrupts the data in ways that surface as missing or duplicated transactions.
- Consent management blocking analytics before the visitor responds, on stores serving regions with consent banners.
Which setup should you use?
For most stores, the official Google & YouTube channel app alone. It fires the standard e-commerce events, survives Shopify’s checkout changes, and needs no code. Use a custom pixel through Shopify’s customer events instead when you need control the app does not offer, such as specific parameters or server-side tagging. The rule that prevents most messes: exactly one thing should send the purchase event. Pick the app or the pixel, and remove the other.
How do I test the fix?
Place a test order, or a real low-value order you refund after. Watch it in GA4’s Realtime report or DebugView. Confirm the purchase event arrives with a transaction_id, the right value and currency, and line items. Then confirm the count over the following week against Shopify orders. One clean test order proves the pipe works. The seven-day comparison proves it works for real traffic, blockers and all.
Why will Shopify and GA4 never match exactly?
Because they measure differently, and some loss is structural. Ad blockers stop the tag for a slice of visitors. Declined consent stops it for another. Safari and iOS privacy features shorten what can be attributed. GA4 timestamps by session where Shopify timestamps the order, so day boundaries drift. Refunds, draft orders, and POS sales sit in Shopify without a matching web event. Treat Shopify as the source of financial truth and GA4 as the source of behavioral truth, and hold the gap steady rather than chasing zero.
What about Google Ads conversions?
Decide on one source of truth. Importing GA4 purchases into Google Ads and running the Ads tag in parallel double-counts conversions, and the campaigns optimize toward the inflated number. Pick one, document it, and make sure whoever manages the ads knows which it is. If your ad spend is being steered by numbers you do not trust, that is exactly the audit we do: reach out through the contact form with your store URL and which numbers disagree.
Frequently asked questions
Should I use Google Tag Manager or the Shopify channel app?
The channel app for most stores, since it survives platform changes without a developer. GTM through a custom pixel earns its complexity when you need custom parameters, multiple tags coordinated, or server-side tagging. Whichever you choose, only one should send the purchase event.
What is Checkout Extensibility and why did it break my tracking?
Shopify replaced the old customizable checkout, including checkout.liquid and the additional-scripts box, with a locked-down checkout plus a customer events pixel system. Tracking pasted into the old locations stopped firing when stores were migrated. The fix is moving tracking to the channel app or a web pixel.
Do I need server-side tagging?
Not to fix a broken setup. It recovers some of the loss from ad blockers and browser privacy limits and improves data control, at the cost of infrastructure and upkeep. Get client-side tracking correct first, then decide whether the recovered percentage justifies it.
Can missing historical purchases be backfilled into GA4?
No. GA4 has no supported way to import past e-commerce events after the fact. Fix the tracking forward and use Shopify’s own reports for the gap period. This is a strong reason to catch tracking breaks quickly.
Order counts match now, so why is revenue still different?
Configuration details: whether tax and shipping are included in the reported value, currency conversion timing, and refunds that Shopify nets out while GA4 keeps the original purchase. Small persistent revenue gaps with matching counts are usually definitional rather than broken.
Does a consent banner reduce my numbers?
Yes, by however many visitors decline or ignore it, and that traffic legally goes unmeasured. Google’s consent mode can model some of the loss for ads purposes. The GA4 reporting gap it creates is a compliance cost, and the honest move is knowing its size.