Meta says your ROAS is 4.2x. Google claims 3.8x. TikTok insists it drove 2.1x. Add it all up and you apparently generated $180K in attributed revenue last month. But Shopify says you made $62K.
The math does not add up. And if you have ever stared at a spreadsheet trying to reconcile these numbers, you are not alone. This is the single most common problem in DTC analytics, and it is getting worse.
Let's break down why.
The fox is guarding the henhouse
Here is the fundamental issue: every ad platform is grading its own homework.
When Meta tells you a campaign produced a 4.2x ROAS, that number comes from Meta's own measurement system. They decide what counts as a conversion. They decide the attribution window. They decide whether that customer would have bought anyway.
Ad platforms have a financial incentive to make their numbers look good. They are not lying — but they are not objective, either.
This is not a conspiracy. It is a structural problem. Meta's business model depends on you spending more on Meta ads. Their measurement system is designed, consciously or not, to encourage that.
Google does the same thing. So does TikTok. Each platform takes credit for every conversion it can plausibly claim, and the overlap between them creates the inflated totals you see in your dashboards.
Three forces making it worse
The self-reporting bias has always existed. But three recent shifts have made the gap between reported ROAS and reality dramatically wider.
1. iOS privacy changes gutted tracking
When Apple rolled out App Tracking Transparency (ATT) in iOS 14.5, it gave users a simple prompt: "Allow this app to track your activity across other companies' apps and websites?"
About 75% of users said no.
That single change blew a hole in Meta's conversion tracking. Before ATT, Meta could follow a user from ad impression to your Shopify checkout with near-perfect accuracy. Now, for the majority of iOS users, Meta is guessing.
Meta's own internal studies estimated that ATT caused them to underreport iOS conversions by roughly 15% in the months after launch. Their Aggregated Event Measurement (AEM) and modeled conversions are attempts to fill that gap — but "modeled" means "estimated," not "measured."
The result: Meta's reported ROAS for iOS traffic is a statistical model, not a measurement. Sometimes it overestimates. Sometimes it underestimates. You have no way to verify which.
2. Cookie deprecation is shrinking the window
Third-party cookies — the mechanism that let ad platforms track users across websites — are disappearing. Safari and Firefox already block them by default. Chrome has been tightening restrictions with its Privacy Sandbox initiative.
Even first-party cookies are under pressure. Intelligent Tracking Prevention (ITP) in Safari caps the lifetime of JavaScript-set cookies at 7 days. Some configurations reduce that to 24 hours.
What this means in practice: a customer clicks your Meta ad on Monday, browses your site, leaves, and comes back on Thursday to buy. If they are on Safari, the cookie that tied them to the original Meta click may already be gone. Meta never sees the conversion. Your reported ROAS drops — not because the ad stopped working, but because the measurement broke.
A 7-day cookie cap means that any attribution window longer than 7 days is partially blind on Safari, which accounts for roughly 50% of mobile e-commerce traffic in the US.
3. Ad blockers erase events entirely
Somewhere between 30-40% of web users run an ad blocker or privacy-focused browser extension. These tools do not just hide ads — many of them block the tracking pixels and JavaScript that ad platforms use to record conversions.
If a customer has uBlock Origin installed, clicks your Google ad, and completes a purchase, Google's pixel never fires. That conversion vanishes from your Google Ads dashboard entirely. Your reported ROAS goes down, but your actual performance has not changed at all.
The problem compounds: the customers most likely to use ad blockers tend to be higher-income, tech-savvy shoppers — often your most valuable buyers.
The attribution window shell game
Even when tracking works perfectly, ad platforms use attribution windows that inflate their numbers.
Meta's default is a 7-day click, 1-day view window. That means if someone sees your ad (without clicking) and then buys within 24 hours, Meta takes credit. If they click and buy within 7 days, Meta takes credit — even if they also clicked a Google ad, an email link, and a direct URL in between.
Google uses a 30-day click window by default.
TikTok defaults to 7-day click, 1-day view.
When a customer interacts with all three platforms before purchasing, all three claim the conversion. One order. Three platforms. Three times the "attributed" revenue.
If every ad platform takes full credit for every conversion it touches, of course total attributed revenue exceeds actual revenue. The question is by how much — and the answer is usually 40-200%.
What actually fixes this
The root cause is clear: client-side tracking (browser cookies and JavaScript pixels) is unreliable, and platform self-reporting is biased. The fix requires both a different data collection method and an independent source of truth.
Server-side measurement
Instead of relying on JavaScript that runs in the browser — where it can be blocked by ad blockers, restricted by ITP, or broken by ATT — server-side measurement captures events on your server.
Here is the difference:
Client-side (traditional): Customer visits your store. A JavaScript pixel fires in their browser. The browser sends data to Meta/Google. If anything blocks that JavaScript, the event is lost.
Server-side: Customer visits your store. Your server records the event directly. No browser JavaScript required for the core measurement. Ad blockers cannot block a request your server makes on its own.
Server-side collection does not magically solve every privacy constraint — you still need proper consent and cannot circumvent ATT — but it eliminates the entire class of data loss caused by ad blockers, cookie expiration, and client-side JavaScript failures.
Server-side measurement typically recovers 15-30% of conversions that client-side tracking misses. For brands spending $50K+/month on ads, that can mean the difference between a campaign looking unprofitable and being clearly positive.
Independent attribution
The second piece is separating measurement from the platforms being measured. Instead of asking Meta how well Meta ads performed, you compare every ad platform's claims against a single source of truth: your actual Shopify orders.
This means:
- Stitching identity across touchpoints — connecting the ad click, site visit, and purchase into a single customer journey, using first-party data you own
- Reconciling against Shopify revenue — the total attributed revenue across all channels should match (within a small margin) what Shopify actually processed
- Choosing your own attribution model — last-click, linear, time-decay, or position-based, applied consistently across all channels instead of letting each platform pick the model that flatters it most
The path forward
If you are running a DTC brand on Shopify, the numbers you are making decisions on are probably wrong. Not by a little — by enough to change which campaigns you scale and which ones you kill.
The fix is not complicated in principle: collect data server-side, own your measurement, and reconcile everything against Shopify. In practice, building and maintaining that infrastructure is a significant lift for most teams.
That is exactly what we are building at ArchwayAI. Server-side event collection that works alongside your existing pixels. Identity stitching across sessions and devices. Attribution models you can inspect and verify. Daily reconciliation against Shopify revenue so you know the numbers add up.
No black boxes. No mystery math. Every metric links back to the orders that generated it.
If you want measurement you can actually trust, join the waitlist. We are onboarding brands now and would love to show you what your real ROAS looks like.