Duplicates in the statistics: the real causes
A duplicate (the same order counted twice) almost always has a traceable material cause: a container installed twice, a hard-coded tag alongside the one managed by the tag manager, a purchase event that refires on reload, or on Shopify two pixels coexisting for the same tool.
The situations I handle
- Purchases in GA4 clearly exceed the actual number of orders
- Revenue in ecommerce reports is visibly higher than the real figure
- The same Purchase event shows up twice in Meta’s Events Manager
- Duplicates mostly appear when a customer refreshes the confirmation page
- The duplicate appeared after adding an extra tracking module
- On Shopify, the same sale shows via both the official channel and a custom pixel
How to spot a duplicate concretely
-
1. Network tab: count the requests
On the confirmation page, dev tools (F12), Network tab, filter on collect (Google) or tr (Meta). A legitimate event sends one request per tool. Two requests with the same transaction_id or event_id at once: confirmed duplicate, not assumed.
-
2. Check how many GTM containers load
Still in Network, filter on gtm.js. If this script appears twice with the same ID (GTM-XXXXXXX), it’s installed twice: once hard-coded in the theme, once via a module that loads it too.
-
3. GTM preview: a tag firing twice
For the purchase event, I check if the same tag appears twice in fired tags on one page load. If so, a duplicated trigger, or an identical hard-coded tag running in parallel, outside GTM.
-
4. Search the page source for a hard-coded tag
Search (Ctrl+F on ’View page source’) for gtag(, fbq( or the GTM container name. A call found next to a GTM already handling that tag confirms the hard-coded tag as the cause: remove it from the theme.
-
5. Test reloading the confirmation page
On the thank-you page, refresh (F5), then go back and revisit the URL. If purchase refires on every reload, there’s no replay protection: the most common cause of duplicates building up over time.
-
6. On Shopify: app channel vs custom pixels
Settings > Customer events, list active pixels. If the same tool shows both as an official app and a manual custom pixel, both send in parallel: disable one, not both.
Once the cause is identified
The fix depends on the cause found, never a general assumption:
- Duplicate GTM container: remove the hard-coded point once a module already handles GTM properly.
- Hard-coded tag alongside GTM: remove it from the theme, let GTM drive the event alone.
- Purchase replay: add protection based on transaction_id (local storage or a dataLayer check).
- Duplicate Shopify pixel: keep one active channel per tool, official or custom depending on actual use.
Go further
-
Installing Google Tag Manager on Shopify
Placing the container once, accounting for the new checkout.
-
Meta pixel and Conversions API
Deduplication via event_id between browser pixel and server-side send.
-
Checking a tag without paid tools
GTM preview, Tag Assistant, Meta Pixel Helper and the Network tab.
-
My conversions aren’t showing up
The opposite symptom: nothing firing at all.
-
ChatGPT Ads conversion tracking
OpenAI pixel, Conversions API, oppref and consent: the same pixel-plus-server logic, applied to ChatGPT ads.
Describe your need in one minute
A few targeted questions so I can reply with an estimate rather than another questionnaire.