A DTC apparel brand connecting their ad accounts to Flyweel last month noticed something immediately: the ROAS numbers in their Meta Ads Manager were consistently 30 to 40% higher than anything showing up in their Shopify revenue data. They had been optimizing campaigns for months based on Meta's reported numbers. The campaigns looked profitable. The business felt tighter than the numbers suggested it should.
This gap is extremely common. Platform-reported ROAS and business-realized ROAS are not the same number, and treating them as interchangeable is one of the most expensive mistakes in performance marketing. Here is a systematic breakdown of the gaps and where they come from.
Attribution Window Inflation
The most common source of inflated platform ROAS is the attribution window mismatch. Meta's default attribution window is a 7-day click plus 1-day view. That means if someone clicked your ad on Tuesday and purchased on the following Monday, Meta counts that purchase as attributed revenue. The click-to-purchase lag is real for many product categories, and capturing it is legitimate.
The problem is view-through attribution. If someone saw your ad but did not click, then visited your site directly three days later and bought, Meta counts that as attributed revenue too. The conversion is real. The attribution credit, for most purposes, is not. When you are running significant impression volume, view-through attribution can inflate your reported ROAS by 15 to 25% depending on the product category and the audience overlap between your paid and organic channels.
Google has its own version: cross-device attribution. A user sees your Search ad on mobile, then converts on desktop through a direct visit. Google can credit that to the search campaign through logged-in user data. This is directionally better than nothing, but it can attribute conversions to campaigns that played a genuinely supporting role rather than a primary one.
The core point: platform attribution windows are set to maximize the credit each platform claims, not to give you the most accurate picture of what drove each purchase.
Cross-Channel Double Counting
If you sum the attributed revenue across all your channels and compare it to your actual Shopify revenue, you will almost certainly see total attributed revenue exceed total actual revenue. Sometimes by 2x or more.
This happens because each platform counts the same purchase when their attribution window was active during the path to conversion. A customer who saw a Meta ad on Monday, clicked a Google Shopping ad on Wednesday, and then purchased after clicking a Google Retargeting ad on Friday will show as attributed revenue in: Meta's 7-day click window, Google Shopping's last-click, and Google Retargeting's last-click. Three channels claim credit for one purchase.
For budget allocation decisions, this matters enormously. If you are deciding how to split budget between Meta and Google based on reported ROAS from each channel, you are comparing numbers that both contain a large slice of the same converted revenue. The comparison is not between two independent revenue streams. It is between two overlapping credit claims on the same pool of transactions.
Return Rate and Net Revenue Gaps
Platform ROAS is calculated on gross revenue at the time of purchase. It does not account for returns, which in apparel and footwear can be 25 to 40% of orders. If a campaign generated $50,000 in attributed gross revenue and you report 5.0x ROAS against $10,000 in spend, that looks strong. If 30% of those orders are returned, net revenue was $35,000 and net ROAS was 3.5x. Still profitable, but the allocation decision you make at 5.0x versus 3.5x is meaningfully different.
Returns do not feed back into ad platform data. Shopify can track them. Klaviyo can track them. Meta Ads Manager cannot. Return-adjusted ROAS is a calculation you have to do outside the platform, and most teams do not do it at the campaign level where it would actually change decisions.
Time-Lag Distortion on Recent Campaigns
There is a specific distortion that affects decisions on campaigns that are less than 14 days old. Platforms report attributed revenue as it is recognized within the attribution window. For a campaign that is 5 days old, only 5 days of the 7-day click window have elapsed. Revenue attributable to clicks from days one through five is showing up. Revenue from clicks on day five that will convert over the following two days has not materialized yet.
This means recent campaigns systematically appear to have lower ROAS than older campaigns, even when their true performance is equivalent. The practical result is that teams undervalue new campaigns and overvalue campaigns that have been running long enough for the full attribution window to mature. Budget allocation decisions made in the first week of a campaign are based on an incomplete picture of that campaign's performance.
What We Are Trying to Fix with Forecasting
The point of building channel-specific ROAS forecasting is not to perfectly solve attribution. That is a problem the industry has been wrestling with for a decade and has not cleanly resolved. The point is to give performance teams a forward signal that is less dependent on the current-week attribution numbers being accurate.
If you know that a channel's realized ROAS historically runs 20 to 30% below its platform-reported ROAS, that offset is a learnable pattern. A model trained on the relationship between platform-reported signals and actual subsequent revenue can produce forecasts that are calibrated closer to reality, even if the input data from the platform is inflated.
We are not claiming the forecasts are attribution-perfect. They are not. But they are calibrated against each account's own historical relationship between platform numbers and actual revenue, which makes them more useful for forward-looking budget decisions than taking platform ROAS at face value.
What to Actually Do Right Now
The practical step that costs nothing is to calculate a channel-level correction factor for your accounts. Pull the last 90 days of platform-reported ROAS per channel, then pull your Shopify (or equivalent) total revenue for the same period. The ratio of actual revenue to total attributed revenue across channels tells you roughly how much double-counting and window inflation is built into your platform numbers. Apply that ratio per channel to understand what your actual yield from each channel more realistically looks like.
This is a rough correction, not an incrementality study. But it is honest, and it gives you a working number that is closer to reality than the dashboard figures you are currently acting on.
The gap between platform ROAS and real ROAS is not a conspiracy. Platforms are measuring what they can measure, with windows designed to maximize the credit they can claim. The problem is that performance teams make allocation decisions as if those measurements were a clean ground truth. They are not, and the brands that understand the gaps are the ones making better calls about where to move the budget next week.