Every Tag Was Firing Perfectly. That Was the Problem.
When Google Ads reports two to three times more conversions than your store has orders, the culprit usually isn’t broken tracking. It’s tracking that works from too many places at once.
Three ad platforms. Three different conversion counts. And a Shopify order list that agreed with none of them.
The director of marketing and e-commerce at a forged hand-tool manufacturer came in after an intro call with a clear worry. Conversion data was inconsistent across every platform, and a large share of traffic was showing up unattributed. The store — a Shopify DTC operation — already had a serious stack in place: GA4, Google Ads, Meta Pixel and Conversions API, Microsoft Clarity, and server-side tracking through Stape.
This wasn’t a beginner setup with obvious holes. It was a professional one. Which made the real question harder to answer:
How many sales are our ads actually driving?
The setup wasn’t under-tracking. It was answering that question three times per sale — and every answer looked legitimate. Google Ads was counting the same conversion two to three times, not because tracking was broken, but because three separate tracking systems were all reporting it.
And the audit that followed found the duplication wasn’t one bad tag. It was baked into the architecture itself.
Why over-counting goes unnoticed
Duplicate conversions flatter everyone.
The ad platform looks like it’s performing. The dashboard shows growth. And no system in the chain has any incentive to raise its hand and say the numbers are inflated. Meanwhile, Smart Bidding quietly optimizes against phantom conversions — spending real money to chase sales that were only ever counted twice.
This is the trap. Under-tracking gets noticed immediately, because the numbers look too low and someone goes looking. Over-tracking gets celebrated. The graphs look great, everyone’s happy, and the overspending hides in plain sight.
Three paths to the same conversion
The audit covered everything: both GTM containers, the Shopify theme code, the custom data-layer pixel, and the GA4 property. Every script and tag on the site was traced back to its source.
The same conversion events were reaching the ad platforms through three independent routes at once. Standalone tracking scripts hardcoded directly into the Shopify theme. Web-side GTM tags. And server-side GTM tags. All three firing for the same events — with the main Google Tag actually loading twice, from two separate hardcoded snippets in the theme.
The right way to picture it: GTM is supposed to work like the electrical panel of a store’s measurement. Every tool wired through one panel, one place to inspect, one place to control. Here, wires had been run around the panel and straight into the walls — scripts pasted directly into the theme, bypassing the system that was supposed to govern them.
And once the tracing started, the scale of the accumulation showed. Fifty-five tags in the web container. Eleven separate Facebook Pixel tags where one clean setup would do. A custom data-layer pixel fragile enough to break on every theme update. None of it malicious, none of it incompetent — just years of tracking piled on top of tracking, with nobody removing the old layer before adding the next.
One path per platform
The fix wasn’t to hunt down duplicates one by one. It was to restructure the whole thing so each platform could only receive each conversion through exactly one path. The order of the work mattered.
First, the data source. The custom data-layer pixel — the one that could break on any theme update — was replaced with the Stape Shopify App as the single ecommerce data layer, integrated with the existing server infrastructure. A purpose-built app data layer survives redesigns with nothing to maintain; custom code does not.
Then, the root of the duplication. Every standalone tracking script was stripped out of the Shopify theme, making GTM the single entry point for all tracking. These hardcoded scripts were the real source of the double-counting — and because they lived outside GTM, no audit of the containers alone would ever have found them.
Then, Google Ads. All five web-side conversion tags came out, leaving the server-side tag as the single conversion path. And the one thing that was actually missing got added: the Enhanced Conversions tag that sends securely hashed customer data, so Google can match conversions it would otherwise lose. One path in, better matching on what remains.
Then, Meta. The eleven web-side Pixel tags were consolidated into one lean browser setup, with the server-side Conversions API kept as the primary source and deduplication verified between the two. The browser pixel gives Meta fast delivery signals; the server connection gives the reliable record — and with deduplication confirmed, each sale is counted once.
Then, the cleanup. The web container went from 55 tags down to 20. Orphaned triggers removed. Variables cut from 103 to 57. A consistent numbered naming convention applied throughout — so the next agency or developer inherits something readable instead of an archaeology project.
With the restructure live, a full end-to-end test traced all nine ecommerce events — from product-list view through purchase — arriving at each platform exactly once, with correct value and currency. Then the numbers were monitored daily against actual Shopify orders for a week of live traffic to confirm the fix held under real conditions.
The most expensive problem was the one thing missing
Nearly everything about this store was excess. Too many tags, too many paths, too many conversions counted.
But the costliest issue wasn’t excess at all. It was an absence.
Among 55 web tags, the server container was missing one: the Google Ads Enhanced Conversions tag. Without it, Google Ads couldn’t use securely hashed customer data to match conversions — so even the conversions it counted correctly were matched less accurately than they could have been.
A store drowning in duplicate data was, at the same time, missing the single signal that would have helped Smart Bidding most. That’s what an audit surfaces that a quick look never will — not just what’s firing too much, but what was never there to begin with.
Worth saying plainly: nothing here was neglect. The infrastructure was professionally built — hashed data, event IDs, a proper dual-container design. The failure mode wasn’t carelessness. It was accumulation. And accumulation is what happens to every tracking setup that keeps growing without anyone pruning it.
What the store runs on now
One conversion path per platform. Google Ads server-side only, with Enhanced Conversions active. Meta on a lean pixel with the Conversions API as the deduplicated primary source. GA4 receiving the full nine-event funnel from a data layer that no longer breaks when the theme changes. Twenty web tags where there were 55. Zero orphaned triggers. Zero scripts firing outside GTM.
When a platform’s numbers drift from the Shopify order count now, that’s information — a signal worth investigating, not background noise to be ignored. And the team can hand any future agency or developer a plain-language guide and a clean, consistently named container, instead of a mess only its author could navigate.
Three questions worth asking about your own tracking
If you run ads on top of a Shopify store, you can check for this yourself:
01
Compare last month’s Google Ads conversion count against your actual store order count.
Modest differences are normal attribution behavior. But if any platform reports more conversions than you have orders, something is counting twice — and you’re bidding against it.
02
View your site’s page source, search for “gtag,” and check whether every instance loads through GTM or is pasted directly into the theme.
Hardcoded scripts outside your tag manager are invisible to container audits and are the most common source of silent duplication.
03
Open your GTM container, count the tags, then count the ones you can confidently explain.
A large gap between those two numbers means your tracking has become an accumulation, not an architecture — and every future change gets riskier.
Ad platforms will never warn you that your conversion numbers are inflated. Flattering data is a feature of the system, not a bug in yours.
Which means the numbers will keep looking good right up until you set them next to your real order count — and that’s a comparison only you can decide to run.