Why Your Shopify ROAS Is Inaccurate (And How to Fix It)
Facebook, Google, and TikTok each report a ROAS number that assumes full credit for the same sale, while browser pixels quietly lose data to ad blockers and iOS tracking prevention. Here is what is actually driving the gap, and how to build one blended number you can trust.
By The Appnary Team
Open Meta Ads Manager and Google Ads on the same day, for the same store, and you'll often see two ROAS numbers that don't agree with each other or with your bank statement. Neither platform is lying, exactly. They're just each counting sales that, in some cases, only happened once.
This is the part nobody explains when you're setting up your first ad account: platform-reported ROAS was never designed to be an objective, external measurement. It's a self-reported metric, built on each platform's own attribution rules, and those rules are structurally biased toward making that platform look good. If you're running ads on more than one channel, and most Shopify stores are running at least Facebook and Google at once, the numbers will overlap, and the overlap points in one direction: up.
The same sale, claimed twice
Attribution windows are the first problem. Meta's default is a 7-day click and 1-day view window, meaning if someone clicks an ad and buys within a week, or just sees an ad and buys within a day, Meta counts it as an ad-driven sale. Google Ads runs its own windows on a separate clock. TikTok and Pinterest each have their own too.
None of these systems talk to each other. Picture an ordinary path to purchase: a shopper sees a Facebook ad on Monday, searches your brand name on Google on Wednesday and clicks a Google Ads result, then buys on Thursday. Facebook counts that as a Facebook-driven sale, since it fell inside the view window. Google counts it as a Google-driven sale, since it was a direct ad click. One order, two platforms claiming full credit. Add up reported revenue across every channel you run and the total can sit well above what actually landed in your Shopify orders.
This isn't a bug in either platform. It's what happens when every ad network grades its own homework.
Pixel data is also going missing
The second problem is quieter but just as damaging: a growing share of the browser-side data these pixels depend on never reaches the platform at all. iOS App Tracking Transparency lets people opt out of tracking with one tap, and most do. Safari's Intelligent Tracking Prevention limits how long a pixel's cookie survives. Ad blockers strip pixel scripts before they load. None of this is new information, but its effect on ROAS specifically is easy to underestimate.
When a pixel can't set or read a cookie, it can't recognize a returning visitor, so a customer who has bought from you three times gets logged as brand new on their fourth visit. That distorts the new-customer numbers in prospecting campaigns aimed at cold audiences, making them look like they're recruiting fresh buyers when part of that reach is really repeat customers the pixel simply doesn't remember. It also means a real conversion sometimes never gets reported back to the ad platform at all, which the algorithm reads as this ad didn't convert and optimizes away from, even though it worked. Server-side tracking, which sends conversion events from your server instead of relying on the buyer's browser to cooperate, closes a meaningful part of this gap. This guide covers how that works for Facebook Conversions API and TikTok Events API specifically, the two networks where server-side tracking is currently available for Shopify merchants.
Not every conversion is worth the same
The third issue is about weighting, not counting. Platforms generally roll click-through and view-through conversions into the same ROAS figure, but they aren't equivalent events. A shopper who clicked an ad and bought within the hour showed clear intent. A shopper who merely saw an ad in their feed and bought three days later through some unrelated path may well have bought anyway, with the ad contributing nothing at all.
View-through conversions are a legitimate signal for brand awareness campaigns, but most default reporting counts them at the same weight as a direct click. Broad prospecting campaigns, the ones with the biggest reach and impression counts, tend to accumulate the most view-through credit, which is exactly why they often report deceptively strong ROAS, while a tightly targeted retargeting campaign converting real buyers with total certainty can look comparatively weak on paper.
What to actually do about it
None of this makes platform ROAS useless. It makes it directional, not literal. Three adjustments make it far more trustworthy.
First, enable server-side tracking wherever the platform supports it. It won't fix cross-platform attribution overlap, but it recovers conversions that browser-based pixels are losing to ad blockers and tracking prevention, which makes the new-customer and conversion-volume numbers you do see meaningfully more accurate. Pixel Tracker connects your store's pixels for Facebook, Google Ads, TikTok, Snapchat, Pinterest, X, and LinkedIn from one dashboard, with server-side support for Facebook and TikTok, and installs everything through Shopify's own ScriptTags rather than requiring theme edits.
Second, stop treating any single platform's ROAS as a final answer and start reading it as a trend line instead. If Meta's reported ROAS drops from 3.2 to 2.4 week over week, that drop is real information regardless of whether 3.2 was ever fully accurate to begin with. Trend direction survives attribution noise better than any single snapshot does.
Third, build one blended number that becomes your actual ground truth: total ad spend across every channel, divided by total store revenue from Shopify for that same period, using your own order data instead of any platform's self-reported revenue. This number can't double-count a sale, because it only counts revenue once, no matter how many platforms want credit for it. This guide walks through the formula, and this post covers the adjustment most merchants skip entirely: backing out returns and refunds, which platform ROAS never accounts for.
Platform-reported ROAS will keep disagreeing with itself and with your bank account, because the platforms have no incentive to fix that and no way to see each other's data anyway. Accepting that up front, and building a blended, server-side-backed number as your real scoreboard, is a more honest way to run ad spend than chasing whichever platform's dashboard currently looks best.
Pixel Tracker is still pre-launch. If you want your store's pixels centralized and your server-side conversions actually firing once it ships, join the waitlist. It won't calculate ROAS for you, that's still your spreadsheet's job, but it makes the data feeding that spreadsheet a lot harder to argue with.