Double-Counting Detection.
When the same sale is counted in Google, Meta and TikTok at once, total ROAS appears 20-40% above reality. Making budget decisions on this fiction is dangerous — campaigns you think are profitable may actually be losing money. This guide walks detection, validation, and fix.
The double-count problem: Google's last-click, Meta's 7-day-click + 1-day-view, TikTok's 7-day-click default attributions count the same sale three times. Detection: platform totals exceed real sales by 15%+. Fix: pick a single source of truth (Shopify / web analytics), use unified attribution (data-driven, MMM, server-side) instead of platform reports. The corrected ROAS typically drops 20-30% — but it's right.
// 01How double-counting happens
Trace a sale's journey:
- User sees Meta Reels ad Monday, doesn't click but remembers the brand.
- Wednesday searches brand on Google, clicks ad, lands on site, doesn't buy.
- Friday sees product on TikTok, clicks, buys.
Who sold it? Three platforms, three answers:
- Google Ads: "Wednesday click → Friday sale, 7-day window" → 1 conversion mine.
- Meta: "Monday view → Friday sale, 7-day-click + 1-day-view" → 1 conversion mine.
- TikTok: "Friday click → sale" → 1 conversion mine.
Reported total: 3 conversions. Reality: 1. Double-counting = 200% inflation.
// 02How big is the typical gap?
| Brand setup | Typical double-count |
|---|---|
| 2-platform e-com (Google + Meta) | 15-25% |
| 3-platform e-com (+ TikTok) | 25-40% |
| 4+ platforms (display, email...) | 30-50% |
| Brand-heavy account (big branded share) | 40-60% |
So a brand spending $100K/mo, reporting "5x ROAS," may actually run 3.5-4x. Decisions on the fiction = real loss risk.
// 03Detection method
Step 1: Establish ground truth
- Shopify / e-com backend report.
- Stripe / payment processor.
- GA4 (one conversion per browser; cookie loss creates small under-count).
Step 2: Sum platform reports
Same period, sum Google Ads + Meta + TikTok + ... reported conversions.
Step 3: Compare
Example: Shopify 850 sales; Google Ads 320 + Meta 410 + TikTok 280 = 1,010 platform total. Double-count = (1,010 − 850) / 850 = 19%.
// 04Separating organic / non-attributed sales
Second factor that pollutes the math: organic sales. If someone visits directly without seeing an ad, they shouldn't go to any platform — but if they're inside attribution windows, they get claimed.
Solution: holdout / incrementality test
- Turn off ads in a specific region for 2-4 weeks.
- Track sales there.
- Difference (ads on vs off) = real incremental contribution.
- Platform reports may overstate by 30-60%.
Detail: Geo-Lift Testing Guide.
// 05Build unified attribution
Stop trusting platform reports — build your own unified attribution. Three approaches:
Method 1: Last-non-direct click (simple)
Take GA4 / web analytics last-click as truth. Limitation: ignores TOFU contribution; can't credit a video viewer who later purchases.
Method 2: Data-driven attribution
Use GA4 or Google Ads data-driven attribution. ML-based, distributes credit proportionally across touchpoints. Good single-platform; insufficient cross-platform.
Method 3: MMM (Marketing Mix Modeling)
Combines all channels + organic + external factors (season, price, competition). Extracts real incremental contribution. Detail: MMM Guide. Most robust, but needs data team + 3-6 months.
// 06The server-side fix
Server-side GTM reduces double-counting two ways:
- Single-source fan-out: server sends sale event to Google, Meta, TikTok with the same ID. Each platform says "already counted" — deduplication kicks in.
- Conversion ID unification: assign every sale a unique
order_id; pass it to every platform. Platform-level dedup activates.
Implementation: Server-Side Tracking Migration Guide.
// 07What to do after correction
The real ROAS will likely come in 20-30% below platform reports. Don't panic — you know the truth now, not less.
- Revise target ROAS: the old "4x target" was platform-reported 5x. Recompute properly: margin-based ROAS target.
- Recalibrate tROAS bidders: drop platform target numbers to match reality.
- Revisit budget allocation: which platform actually contributes more? MMM output guides this.
- Question brand search incrementality: brand campaigns are often 30-50% subsidized — ROAS looks great, real impact lower.
// 08Common pitfalls
- "Last-click is enough": last-click zeroes TOFU, gives 100% credit to brand. Solves double-count, tells the wrong story.
- Shrinking attribution window isn't the fix: 7-day → 1-day reduces double-counting but increases missed conversions. Real problem is cross-platform deduplication.
- "GA4 right, platforms wrong": GA4 has its own cookie loss. Good for comparison, insufficient for truth.
- Treating it as a product-team problem: the marketing team that decides budget owns the validation; product helps with server-side, but analysis is marketing's job.
// relatedRelated glossary terms.
Quick definitions for the concepts referenced in this guide:
Wrong numbers, wrong decisions.
d-lens combines server-side events and platform reports; auto-detects double-counting and shows corrected ROAS. Make budget decisions on real numbers.