Your attribution is wrong. Here's how wrong.
What the numbers say
- 01
Four ad platforms claim 1,260 conversions in a month where Shopify recorded 1,000 orders, a 26% overcount before any analysis.
Modelled on stated assumptions: Meta, Google Ads, email and TikTok reporting at their default windows with no cross-platform deduplication.
- 02
Of those 1,260 claimed conversions, a modelled 550 are incremental, or 44% of the claim.
Modelled on stated assumptions about view-through inflation, brand search cannibalisation and email claiming returning customers.
- 03
Roughly 450 orders a month, 45% of the total, are claimed by no ad platform at all.
Modelled on stated assumptions: the residual after paid claims are deduplicated against a 1,000-order base.
- 04
At ₹6,00,000 of monthly spend, the claimed conversion count implies a CAC of ₹476 against a modelled ₹1,091.
Modelled on stated assumptions: total spend divided by claimed conversions versus by modelled incremental orders.
- 05
A modelled 210 of Meta's 640 claimed conversions are view-through, meaning nobody clicked anything.
Modelled on stated assumptions using a 7-day click and 1-day view attribution setting.
On the first of the month somebody opens four tabs and writes four numbers on a notepad. Meta says 640. Google says 310. Klaviyo says 190. TikTok says 120.
That is 1,260. Shopify says 1,000 orders.
Nobody is lying. Every one of those numbers is correct according to the rules that platform uses, and the rules are different in four different ways. (Composite, drawn from monthly reviews we have sat in.)
The number that does not add up
The overcount is not a bug and it will never be fixed by the platforms, because each one is answering a question about itself.
Meta is answering: how many orders happened within seven days of someone clicking our ad, or one day of someone seeing it. Google is answering a similar question over thirty days. Klaviyo is answering it over five days from an email click.
An order that was clicked from Meta on Monday, searched on Google on Wednesday, and finally placed after an email on Thursday appears in all three. Each platform is right. The sum is meaningless.
Nobody deduplicates because nobody can. Meta cannot see Google’s clicks, and neither of them can see your Shopify order list unless you show them.
What each platform is actually counting
Three variables differ, and all three matter more than most teams realise.
The event differs. A pixel fires on a purchase page, a webhook fires on order creation, an ad platform records a conversion against an ad rather than against an order.
The window differs. Seven days here, thirty there, five somewhere else, which means the same order gets counted or ignored depending on which dashboard you open.
The timestamp differs, and this is the sneaky one. Ad platforms usually credit a conversion back to the date of the ad interaction rather than the date of the order, so a sale placed on the 2nd appears in the previous month’s report. The full reconciliation of what each system counts and when is in what to do when Shopify, Meta and GA4 disagree.
Reported against actual, on 1,000 orders
Modelled on a store doing 1,000 orders a month at ₹1,450, spending ₹6,00,000 across four channels.
| Source | Orders claimed | Window | Modelled incremental |
|---|---|---|---|
| Meta | 640 | 7-day click, 1-day view | 310 |
| Google Ads | 310 | 30-day click | 140 |
| 190 | 5-day last click | 60 | |
| TikTok | 120 | 7-day click, 1-day view | 40 |
| Claimed total | 1,260 | 550 | |
| Shopify orders | 1,000 |
Three adjustments produce that right-hand column.
View-through comes out first. A modelled 210 of Meta’s 640 involved no click at all, which for most D2C categories is a correlation with being on Instagram rather than evidence of persuasion.
Brand search comes out second. Google’s 310 includes people who typed your brand name and clicked a paid result sitting above your own organic listing, which is a toll rather than an acquisition.
Email comes out third and hardest. A returning customer who was going to buy anyway, who happens to open an email first, is not an email-acquired order, and the modelled 190 shrinks to 60 once you separate acquisition from timing.
The 45% that nobody claims
Subtract the modelled 550 from 1,000 and 450 orders are left with no platform claiming them.
Some of that is genuine direct and organic demand you have built over years. Some of it is dark: a WhatsApp forward, a friend at a dinner table, a packaging insert somebody photographed.
Two parts of it are recoverable with identifiers you can issue yourself.
SB&R is a Shopify app for chained referral rewards. Every referral link belongs to someone who has already bought. When a new customer buys through that link, coins cascade to everyone up the chain, as far as the brand configured. Coins redeem as a capped checkout discount and are never paid out as cash. Referral orders arriving through those links carry their own identifier, so they stop hiding inside direct.
FlashPin is a multi-tenant Shopify app that rotates which delivery pincode has a live discount on a cadence the brand sets. Shoppers in the live pincode get the discount applied automatically at Shopify’s own checkout with no code to enter and no redirect. Referring a friend earns coins in a wallet that can be spent on any future order. The rotation is incidentally the cleanest holdout most stores will ever have, because the zones not currently live are a control group you did not have to design.
The rest of the 450 stays dark, and the honest position is to report it as unattributed rather than distributing it across channels to make a pie chart look complete.
What the overcount does to your CAC
₹6,00,000 divided by 1,260 claimed conversions is ₹476.
₹6,00,000 divided by 550 modelled incremental orders is ₹1,091.
Both numbers get called CAC in meetings, and the gap between them is 2.3x. On a ₹1,450 order at 45% gross margin, ₹652 of contribution, the first number describes a business that prints money and the second describes one that does not cover acquisition on the first order.
The decision this breaks is budget allocation. Channels get scaled on reported efficiency, the reported number is inflated by different amounts per channel, and the channel with the loosest attribution window wins the budget regardless of what it actually produced.
Three fixes that cost nothing
Set every platform to the same window and the same setting before comparing anything. They will still disagree, but they will disagree for reasons you can name.
Report view-through in its own column, permanently. The moment it is folded into clicks it cannot be separated again without a rebuild.
Use Shopify’s order count as the only denominator. Every channel number becomes a share of that total, the shares are allowed to sum to less than 100%, and the residual gets a name of its own. That single rule ends most attribution arguments, because it converts them from “whose number is right” into “what do we do about the unclaimed 45%”.
Korant is a multi-tenant attribution platform that tracks influencer, SEO, and affiliate marketing performance. Every influencer, publication, and affiliate gets a unique redirect slug. Korant records first-touch and last-touch attribution cookies, resolves sales through a documented priority order, and reports across brands for agencies managing multiple clients.
Korant is not for stores with a single paid channel, or for brands that only need Shopify’s native reports. With one channel there is nothing to deduplicate, and the whole problem described above requires at least two platforms competing for the same order.
What accurate attribution still cannot tell you
None of this measures incrementality. It measures which touchpoints were present, which is a different question from which touchpoints caused anything, and no amount of cookie discipline closes that gap.
The only instrument that answers the causal question is a holdout, and holdouts cost money by design because you are deliberately not spending in a place where you might have earned. Most teams run one, dislike the answer, and never run another.
Attribution is worth fixing anyway, for a smaller reason than the one usually given. A consistent wrong number tells you the direction of a change. An inconsistent number tells you nothing at all, and inconsistency is what you have when four dashboards each use their own rules and somebody adds them up on a notepad.
Questions people actually ask
Why do ad platforms report more conversions than I have orders?
Each platform counts every order it touched, inside its own window, with no knowledge of the others. An order clicked from Meta on Monday and from Google on Thursday appears in both dashboards. Nobody deduplicates, because no platform has visibility into a competitor's data, so the totals overlap by design rather than by error.
What is a realistic ecommerce attribution accuracy rate?
Client-side pixels typically miss somewhere between 5% and 15% of orders to ad blockers, tracking prevention and abandoned sessions, and that is before the overlap problem. The useful target is not accuracy per order but a consistent method that produces the same answer every month, because trend direction survives measurement error and absolute numbers do not.
Should I turn off view-through attribution?
Report it separately rather than turning it off. View-through counts a person who saw an ad and did not click, which is real for some categories and worthless for others, and folding it into your click numbers makes the two impossible to separate later. Two columns, always.
How do I know if my paid channels are actually incremental?
Run a holdout. Turn a channel off in a defined geography or audience for two to four weeks and compare total orders, not platform-reported orders. It is the only method that answers the question, and it is uncomfortable precisely because it sometimes answers it badly.
Which number should I report to investors or a board?
Total orders from Shopify as the denominator, with channel contribution as a stated model underneath it. Reporting the sum of platform dashboards means reporting a number larger than your actual business, which is a difficult conversation to have twice.