Back to all posts
Analytics July 24, 2026 6 min read

How to Calculate True ROAS (Including Returns)

Ad platforms calculate ROAS from gross revenue at checkout and never adjust it when a return comes in later. Here's how to work out net-of-returns ROAS, with a worked example showing how a profitable-looking campaign can quietly go underwater.

By The Appnary Team

A campaign can look great the day you check it and be quietly underwater three weeks later, and the ad platform's dashboard will never tell you. This isn't an edge case. It happens whenever a meaningful share of the orders a campaign generated later get returned, and it happens most often in apparel and footwear, where fit and sizing alone drive a lot of returns that have nothing to do with the ad or the product being bad. The number that made you raise budget in week one can be the same number that was already wrong, you just didn't know it yet.

If you haven't seen the standard formula yet, the base guide to calculating ROAS covers it: ad spend measured against attributed revenue. This post assumes you already know that formula and focuses on one specific way it misleads you. Gross revenue at the moment of purchase is not the same number as what you actually keep once returns and refunds work their way through the following weeks.

Here's the mechanic. When Meta, Google, TikTok, or any other ad platform reports a purchase conversion, it records the order value at checkout, whether that event came from a browser pixel or a server-side call like Facebook's Conversions API. That number gets locked into the campaign's reporting the moment the event lands. As far as the ad platform is concerned, the sale is final. If the customer returns the product two weeks later, nothing in that report changes. The platform doesn't go back and subtract the refunded amount from the campaign's historical revenue. The ROAS you see for that period stays frozen at the gross figure, refund or no refund.

A worked example makes the gap concrete. Say you run a Meta campaign for a dress line at $1,000 in ad spend over one week. Meta's reporting attributes 20 purchases to that spend, each order worth $60, for $1,200 in attributed revenue. Gross ROAS is $1,200 divided by $1,000, or 1.2x. Not spectacular, but profitable on paper, assuming your margins can carry a 1.2x return.

Over the next three weeks, as customers actually try the dresses on, six of those twenty orders come back. Wrong size, color looked different online, whatever the reason. That's $360 in refunded revenue. Net revenue for the campaign is now $1,200 minus $360, or $840. Net-of-returns ROAS is $840 divided by $1,000, or 0.84x. The campaign that looked like it cleared break-even is now losing money on revenue alone, before cost of goods or fulfillment even enters the picture.

Meta's dashboard, meanwhile, still reports 1.2x. It will keep reporting 1.2x indefinitely, because nothing in that pipeline knows or cares that six shipments came back.

The two numbers, side by side:

Gross ROAS = Attributed Revenue / Ad Spend Net-of-Returns ROAS = (Attributed Revenue - Refunded Revenue) / Ad Spend

The size of the gap between the two is basically your return rate for that product, weighted by which specific campaigns drove the orders that came back. A brand selling candles or phone cases might barely notice it. A brand selling apparel or footwear, where fit-related returns are routine, cannot skip this step, because the gap is large enough to flip a channel from apparently profitable to a real loss.

Two things make this hard to fix rather than just annoying to know about.

The first is timing. Ad platforms use attribution windows, commonly something like a 7-day click or 1-day view window, to decide which ad gets credit for a sale. That window closes fast. A return window is typically 30 days or more, and the customer often doesn't start the return until they've actually worn or used the item. By the time a return lands, the attribution window that produced the original ROAS number closed weeks earlier. The platform has already moved on to reporting the next batch of campaigns. It has no mechanism, and no real incentive, to reopen last month's numbers and revise them down.

The second is that ad platforms don't retroactively adjust reported conversion value for a return. This isn't a setting buried in Ads Manager that nobody turns on. Meta, Google, and TikTok all work the same way here: the conversion event fired, the revenue got attributed, and that's the end of the story from the platform's side. If you want net-of-returns ROAS, you build it yourself, outside the ad platform, using your own order and refund data.

Matching refunds back to the campaign that generated the original sale adds another layer of friction. Shopify's refund record doesn't know which ad or which platform sent that customer, and the ad platform's conversion report doesn't carry your order number by default. Without something tying the two together, usually a UTM parameter or an order tag set at checkout, you end up eyeballing dates and matching them to order values by hand, which works for twenty orders and falls apart once volume grows.

In practice that means pulling refund records out of Shopify (orders with a refund or return, tied to a date and an amount) and matching them against the orders your ads generated, then recalculating ROAS on a delay, after most of the return window for that batch of orders has closed. For a store with a 30-day return policy, that might mean not trusting a campaign's real ROAS until five or six weeks after it ran. That's an awkward cadence for making fast budget decisions, which is exactly why it's easy to skip and why so many merchants never catch it. For more on why the ROAS number on your dashboard drifts from reality even before returns enter the picture, see why Shopify ROAS is inaccurate.

Worth being direct about what a tool like Pixel Tracker can and can't do here. Getting your pixels and server-side events (Conversions API for Facebook, Events API for TikTok) firing correctly and consistently across every platform is a prerequisite for any ROAS number being trustworthy in the first place, gross or net. But it's a data layer, not a returns ledger. Pixel Tracker doesn't calculate ROAS, and no tracking tool can retroactively tell Meta or TikTok that an order got refunded, because the ad platforms don't accept that correction after the fact. Solving the returns problem is a process you run on your end: export refunds, match them to orders, recompute net ROAS on a lag. Accurate tracking just makes sure the number you start with is actually right, so the math you build on top of it holds up.

None of this makes gross ROAS useless. It's still a fast signal for whether a campaign is in the right neighborhood. But if you sell anything with a meaningful return rate, treat what your ad platform shows you as provisional, not final, until enough time has passed for the returns to show up. Pixel Tracker is in development now; if you want to know when it's ready, join the waitlist.

ROASReturns & RefundsAd AttributionAnalytics

Frequently Asked Questions

Does Meta or Google Ads ever adjust reported ROAS after a customer returns a product?
No. Once a purchase conversion is attributed and reported, ad platforms don't go back and revise that number down when the order is later refunded. The ROAS you see is a snapshot taken at the moment of purchase, not a running total that accounts for what happens to the order afterward.
How long should I wait before trusting a campaign's ROAS?
Long enough for most returns tied to that batch of orders to have already happened. If your return policy gives customers 30 days, treat any ROAS pulled before that window closes as a provisional, gross number, and recheck it against your actual refund data once the window has passed.
Which product categories need to worry about this the most?
Apparel and footwear are the clearest cases, since fit and sizing drive returns that have nothing to do with the product being defective or the ad being misleading. Categories with low return rates, like consumables or accessories, will see a much smaller gap between gross and net ROAS.
Can Pixel Tracker calculate net-of-returns ROAS for me automatically?
No. Pixel Tracker connects tracking pixels for Facebook, Google Ads, TikTok, Snapchat, Pinterest, X, and LinkedIn, plus server-side events through Facebook Conversions API and TikTok Events API, so the ad platforms receive accurate conversion data. It doesn't have a ROAS dashboard and doesn't track refunds. Matching refunds to orders and recalculating net ROAS is a step you do separately with your own store data.
Does this mean gross ROAS is worthless?
No. It's still a useful early signal for whether a campaign is roughly in the right range. Just don't treat it as final for any product line with a meaningful return rate, and recheck it against net-of-returns numbers before scaling spend based on it.