Why every ad platform claims the same sale, and how to stop double counting
16 Jul 2026 · 3 min read · Neill Brookman
Ask each ad platform how many sales it drove last month and add up the answers. In almost every business that runs more than one channel, the total is higher than the number of sales you actually made, often by a wide margin. Nobody is lying. Each platform is answering a different question.
Why the numbers overlap
Every platform attributes a conversion to itself if one of its ads touched the journey within its attribution window. A buyer who saw a TikTok video, clicked a Meta ad and finally searched on Google before buying is one sale. Meta, TikTok and Google each see a touchpoint, and each reports the sale.
The platforms do not see each other’s touchpoints, so there is no native reconciliation. Platform dashboards are each internally consistent and collectively impossible.
Why it is more than a reporting problem
If the overlap only affected dashboards, a spreadsheet could fix it. It does more damage than that:
- Budgets follow inflated ROAS. Every channel looks profitable, so spend increases everywhere.
- Bidding learns from shared credit. Each platform’s algorithm optimises on the conversions it receives, including ones another channel earned.
- Finance stops trusting marketing numbers, because they never match revenue.
The fix: decide credit before delivery
Most attribution tools analyse the overlap after the fact and produce a report. The platforms keep receiving every conversion and keep claiming them.
The alternative is to decide credit before the conversion is sent. A server that sees every touchpoint (because it collected them first-party) can apply one attribution model to each conversion and send it to the platform that earned it:
1. Every visit, with its click IDs and campaign parameters, is collected first-party and kept against the visitor. 2. When a conversion happens, one model (last click, first click, linear, position-based, time-decay or your own rules) picks the platform that gets the credit. 3. That platform receives the conversion through its Conversions API. 4. The others can still receive the event for analytics or audiences, without a duplicate conversion.
Datafly Signal works this way, with models configured per pipeline and kept under version control. You can run several models side by side for analysis and choose one for delivery.
What happens to reported ROAS
Reported ROAS on each platform drops towards real ROAS, because conversions stop being counted several times. That is uncomfortable for a week and useful afterwards: budget decisions start to reflect what each channel actually contributes. Bidding keeps working; it optimises on the conversions it receives, which are now the ones it earned.
Making the change safely
Switching every platform to single-credit delivery overnight would make every dashboard drop at once. A safer route:
- Measure first. Compare what each platform reports with the conversions your model would assign it.
- Run in parallel. Deterministic event IDs let vendors deduplicate while old and new paths both run.
- Choose a delivery mode. Some teams start by deduplicating only, then move to full single-credit delivery once stakeholders trust the numbers.
The underlying requirement
None of this works unless you can see the whole journey. That needs first-party collection that survives ad blockers and keeps identifiers longer than Safari’s 7-day limit on JavaScript cookies; otherwise the model is choosing between incomplete paths. See why 7-day cookies break attribution.
See how cross-platform attribution works in Datafly Signal, or request a demo.
Want more posts like this?
No spam newsletter, no drip campaigns. If you want technical posts on server-side data infrastructure, bookmark /blog or follow the RSS feed.