You’re running Google Ads, Meta Ads, and TikTok Ads. Last month Google reported 150 purchases, Meta reported 130 purchases, and TikTok reported 45 purchases. That’s 325 platform-reported conversions. Your actual order count? 180.
This isn’t a bug — it’s how platform attribution works. Each platform takes credit for any conversion it touched, even if another platform also touched it. A customer who clicked a Google ad on Monday and a Meta ad on Tuesday counts as a conversion in both platforms.
This guide covers how to deduplicate conversions so you know what’s real and can make accurate budget decisions.
Why Platforms Over-Count
The Attribution Overlap Problem
Each ad platform uses its own attribution window and model:
| Platform | Default Click Window | Default View Window | Model |
|---|---|---|---|
| Google Ads | 30 days | 1 day | Data-driven |
| Meta Ads | 7 days click, 1 day view | 1 day | Last touch (within Meta) |
| TikTok Ads | 7 days click, 1 day view | 1 day | Last click |
| Microsoft Ads | 30 days | 1 day | Last click |
When a customer interacts with multiple platforms before buying, every platform that falls within its attribution window claims the conversion. Nobody is lying — they’re just answering different questions.
Google asks: “Did this user click a Google ad in the last 30 days?” Meta asks: “Did this user click a Meta ad in the last 7 days?” TikTok asks: “Did this user click a TikTok ad in the last 7 days?”
If the answer is “yes” for all three, all three claim the sale.
The Pixel + CAPI Double-Count
Even within a single platform, you can double-count. If you’re running Meta Pixel alongside Conversions API without proper deduplication, Meta receives two events for the same conversion — one from the browser, one from your server.
Meta deduplicates these using event_id, but only if you send the same event_id in both the Pixel and CAPI events. If you don’t, Meta counts it twice.
The Multi-Tag Problem
Some sites have conversion tags firing more than once per transaction:
- Thank-you page reloads (user refreshes the confirmation page)
- Multiple GTM tags for the same platform
- Both native Shopify integration AND custom pixel firing
- Redirect chains that load the conversion page twice
Level 1: Deduplicate Within Each Platform
Before solving cross-platform overlap, make sure each platform isn’t double-counting on its own.
Transaction IDs (Required)
Every conversion event should include a unique transaction ID. This is the single most important deduplication mechanism.
Google Ads:
<!-- In GTM, set transaction_id on the conversion tag -->
Transaction ID: {{transactionId}}
Meta Pixel:
fbq('track', 'Purchase', {
value: 99.99,
currency: 'USD'
}, { eventID: 'order_12345' });
Meta CAPI:
{
"event_name": "Purchase",
"event_id": "order_12345",
"custom_data": {
"value": 99.99,
"currency": "USD"
}
}
TikTok:
ttq.track('CompletePayment', {
content_type: 'product',
value: 99.99,
currency: 'USD'
}, { event_id: 'order_12345' });
The event_id / transaction_id must be identical across browser and server events for the same platform. Use your order ID — it’s already unique.
Prevent Thank-You Page Reloads
When a customer refreshes the thank-you page, conversion tags fire again. Three fixes:
- One-time flag: Set a cookie or
sessionStorageflag after the first fire. Check it before firing again.
if (!sessionStorage.getItem('conversion_fired_order_12345')) {
// Fire conversion tags
sessionStorage.setItem('conversion_fired_order_12345', 'true');
}
-
Redirect after conversion: Redirect from
/thank-you?order=12345to/thank-you(no order param). Only fire tags when the order param exists. -
Server-side only: Skip browser tags entirely. Fire conversions server-side only, where you control whether the event sends once.
Audit Your Tags
Check for duplicate implementations:
- Two GA4 tags (one from Shopify, one from GTM)
- A Meta Pixel in the theme code AND in GTM
- Native platform integrations AND custom pixel code
Run a GTM container audit to find these. If your GA4 conversion numbers don’t match Google Ads, duplicate tags are a common cause.
Level 2: Establish a Single Source of Truth
Cross-platform deduplication requires one system that sees all conversions and knows which ones are real.
Option A: GA4 as Source of Truth
GA4 counts each conversion once (assuming you’ve deduplicated within GA4). Use it as the arbiter:
How it works:
- GA4 tracks all purchases with a unique
transaction_id - GA4 deduplicates automatically — same
transaction_id= one conversion - Compare platform-reported conversions against GA4
- The difference is your overlap/inflation
Example:
| Source | Reported Purchases | Revenue |
|---|---|---|
| Google Ads | 150 | $15,000 |
| Meta Ads | 130 | $13,000 |
| TikTok Ads | 45 | $4,500 |
| GA4 (actual) | 180 | $18,000 |
| Platform sum | 325 | $32,500 |
| Inflation ratio | 1.81x | 1.81x |
Platforms are collectively over-counting by 81%. This doesn’t mean any platform is “wrong” — it means 145 conversions were touched by more than one platform.
Limitation: GA4 uses its own attribution model. It doesn’t tell you which platform “deserves” credit — just how many actual conversions occurred.
Option B: Your Backend / Order System
The most accurate source of truth is your own order database.
How it works:
- Export order data from Shopify, WooCommerce, or your custom system
- For each order, check which platform’s click ID or UTM is attached
- Count unique orders, not platform-reported conversions
What to capture per order:
- Order ID (your internal ID)
- Revenue
- UTM source/medium/campaign (from the converting session)
gclid(Google click ID)fbclid(Meta click ID)ttclid(TikTok click ID)
If an order has both a gclid and fbclid, the customer interacted with both platforms. Your backend can decide attribution based on last click, first click, or whatever model you choose.
Option C: Server-Side Tracking Hub
The most sophisticated approach: route all conversion events through a single server-side endpoint that deduplicates before forwarding to platforms.
Customer Purchases
↓
Your Server (single event)
↓
┌────┼────────┐
↓ ↓ ↓
Google Meta TikTok
(CAPI) (CAPI) (Events API)
Each platform receives exactly one event per conversion. Your server controls deduplication, not the platforms.
Benefits:
- No double-counting possible (server sends once per order)
- No thank-you page reload problem (server-side, not browser)
- Better data quality (server knows the real order value)
- Server-side tracking recovers conversions blocked by ad blockers
Implementation: This is what server-side GTM (sGTM) does. Your browser sends one event to your sGTM server, which fans it out to Google, Meta, TikTok, etc. — each with proper deduplication IDs.
Level 3: Cross-Platform Attribution
Deduplication tells you the real count. Attribution tells you who gets credit.
Blended ROAS
The simplest cross-platform metric: total revenue divided by total ad spend.
Blended ROAS = $18,000 revenue / ($5,000 Google + $3,000 Meta + $1,000 TikTok)
= $18,000 / $9,000
= 2.0x
This avoids the attribution question entirely. If blended ROAS is healthy, the mix is working.
Platform-Reported ROAS (With Discount)
Apply the inflation ratio to each platform’s reported conversions:
Inflation ratio: 1.81x (325 reported / 180 actual)
Google Ads adjusted: 150 / 1.81 = 83 conversions
Meta Ads adjusted: 130 / 1.81 = 72 conversions
TikTok Ads adjusted: 45 / 1.81 = 25 conversions
Total adjusted: 180 (matches actual)
This is a rough heuristic — it assumes overlap is evenly distributed, which it isn’t. But it’s better than taking platform numbers at face value.
Multi-Touch Attribution
For the most accurate picture, implement multi-touch attribution that distributes credit across touchpoints. This requires tracking the full customer journey, not just the converting session.
Platform-Specific Dedup Settings
Google Ads
- Set Count to “One” for lead conversions (prevents counting repeat form submissions)
- Always include
transaction_idin conversion tags - If importing from GA4, GA4 handles dedup — don’t also run native conversion tags
Meta Ads
- Send identical
event_idin both Pixel and CAPI events - In Events Manager, check the Deduplicated Events column
- If dedup rate is 0%, your
event_idisn’t matching — check the case, format, and encoding
TikTok Ads
- Use
event_idin both browser pixel and Events API - TikTok deduplicates based on
event_id+eventname - In TikTok Events Manager, check for “Duplicate Events” warnings
Quick Dedup Audit
Run through this checklist:
- Every conversion tag includes a transaction/event ID
- Meta Pixel and CAPI send the same
event_id - No duplicate tags for the same platform in GTM
- Thank-you page fires tags only once (not on reload)
- GA4 conversion count is close to your actual order count
- Platform-reported totals don’t exceed 1.5x your actual conversions
- Native Shopify integrations aren’t duplicating your GTM tags
The Bottom Line
Every ad platform will over-report conversions when you run multi-platform campaigns. This is by design — each platform attributes based on its own touchpoints. The fix isn’t to “correct” any single platform, it’s to establish your own source of truth and use it for budget decisions.
Start with transaction IDs everywhere. Move to GA4 or backend data as your source of truth. Graduate to server-side tracking when your spend justifies the complexity.
Not sure how inflated your conversion numbers are? Run a free scan — we check your conversion tags, deduplication setup, and cross-platform tracking automatically.