Skip to content

How to calculate ROAS after returns, step by step

Take a settled quarter, pull returns by product from Shopify and turn them into a kept share. Multiply each platform's ROAS by it, raise your break-even line for return costs, and upload Google Ads adjustments by order ID.

By , Founder & CEOUpdated 8 min read

Run the numbers for your store: the free break-even ROAS calculator.

Take one settled quarter and pull its returns from Shopify's sales reports. Divide them by gross sales to get the share that came back. Multiply each platform's ROAS by the share you kept, and raise your break-even line if returns cost you postage. Upload Google Ads adjustments by order ID; correct Meta in your own sheet.

Eight steps and three admin screens: Shopify, Google Ads and Meta Ads Manager. Every menu path below comes from Shopify's, Google's or Meta's own help pages, read on 1 October 2026. Bring a spreadsheet and the patience of a returns desk in January.

Step by step

  1. Pick a period whose returns have landed. Shopify shows each reversal on the day it is processed, not on the order's date. Return windows run from delivery, and Shopify offers 14, 30 or 90 days, unlimited or a custom length. Choose a quarter that ended at least one return window ago. Menu path: Shopify admin > Settings > Policies, where your return rules live.
  2. Read gross sales and sales reversals. In the Sales reports, note Gross sales, Discounts, Sales reversals and Net sales for the quarter. Net sales are gross sales minus discounts and sales reversals. Reversals also hold cancellations, order edits and goodwill refunds, so they can run higher than physical returns. Menu path: Shopify admin > Analytics > Reports > Category filter > Sales.
  3. Split the returns by product. Shopify's own recipe opens Total sales by product and adds one filter: Is reversed, set to Yes. The report then lists the value of returns for each product. For physical returns only, Shopify points to its Returned quantity metric and the return reason. Menu path: Analytics > Reports > Total sales by product > Filters > plus sign > Is reversed > Yes.
  4. Turn returns into a kept share. For each product, divide the returned value by its gross sales and subtract the result from one. What is left is the share of each claimed euro you keep. Then note which products each campaign mostly sells. Menu path: none, this step lives in your spreadsheet.
  5. Price what a return costs you. Add up return postage, handling and stock you cannot resell, from carrier bills and your books. Shopify's Return fees column runs the other way: it is what you charge customers, such as a restocking fee. Net the two, then express the result as a share of gross sales. Menu path: Sales reports > Return fees column; Settings > Policies for the fees you charge.
  6. Write down each platform's claim and spend. In Google Ads, add Conv. value and the Conv. value/cost column from the Conversions list. In Meta Ads Manager, add Purchases conversion value, Amount spent and Purchase ROAS. Meta calculates Purchase ROAS as purchase conversion value divided by amount spent. Menu path: Google Ads > Campaigns > Columns > Modify columns > Conversions; Meta Ads Manager > Campaigns > Columns > Customize columns.
  7. Apply the kept share and move the line. Multiply each campaign's ROAS by the kept share of what it sells. For its break-even, take your margin times that kept share and subtract the return cost share. Then divide 1 by the result. Menu path: none, spreadsheet again.
  8. Send returns where a platform listens. Google Ads restates a partial return and retracts a full refund, keyed to the order ID. GA4 lowers Purchase revenue when a refund event carrying the transaction ID arrives. Meta's standard events include no refund event, so Meta's figures stay as counted. Menu path: Google Ads > Goals > Conversions > Uploads > plus button > View templates > Conversions adjustments.

A worked example

For illustration, take one invented quarter and two campaigns in round numbers. In this worked example, each spends €10,000 and sells at a 40% margin. One store's Break-even sheet sets the starting line: at a 40% margin, break-even ROAS is 2.5x, because 1 divided by 0.40 is 2.5.

LineCampaign A (invented)Campaign B (invented)
Dashboard value and spend€40,000 on €10,000 (4x)€30,000 on €10,000 (3x)
Share of that value refunded30%5%
Sales kept€28,000€28,500
ROAS on kept sales2.8x2.85x
Gross profit at a 40% margin€11,200€11,400
Return costs, a tenth of refunded value€1,200€150
Left after ads€0€1,250
Break-even on the dashboard ROAS4xabout 2.7x

On the dashboards, Campaign A wins, 4x against 3x, in this worked example. Both clear the Break-even sheet's 2.5x, so A looks like the obvious home for next quarter's budget.

Then the returns land. In this worked example, 30% of A's value comes back, against 5% of B's. For illustration, A keeps €28,000 of sales and B keeps €28,500, so on kept sales they score 2.8x and 2.85x.

Suppose each return also costs a tenth of its value in postage and handling. For illustration, A keeps 0.70 of each claimed euro, and 0.40 of that is 0.28 of gross profit. In this worked example, return costs take 0.03, so 0.25 is left and A needs 4x on its dashboard to break even. For illustration, B's line rises only to about 2.7x.

So in this worked example, A ends the quarter at €0 after ads, while B makes €1,250. In this worked example, the €10,000 gap between the two dashboards was all returns. A deserves less budget, not more, and no dashboard said so.

What should I check when the numbers look wrong?

  • A product shows more returns than sales in one month. Reversals land on the day they are processed. So they can belong to orders from an earlier month: widen the dates to a full quarter.
  • Google Ads did not move after the upload. The order ID must match the one recorded with the original conversion. Google also warns that conversions from within one day of the click may not be recorded yet. It suggests adding an extra day of data to each upload.
  • You retracted an order that became an exchange. Google says website conversions cannot be added back to reports after removal. Retract only full refunds, restate partial ones, and leave exchanges alone.
  • Bidding still favours high-return products. Google's bidding reads adjustments only within 7 days of the conversion, while reports take them for 54 days. Upload every week, not once a month.
  • GA4's Purchase revenue matches its Gross purchase revenue. No refund events reach GA4. The Google & YouTube app's event list for Shopify has no refund event, so refunds need a feed of their own.
  • Shopify's channel report shows less than the platform claims. Shopify's campaign Sales come after discounts and sales reversals, without tax or shipping. The platforms count before returns and use their own attribution, so not all of the gap is returns. Open it from Growth, then View channel report.

What to do this week

  1. Name your three highest-return products. Run Total sales by product with Is reversed set to Yes for last quarter, then sort by value. Pass: you know which products carry most refunds and which campaigns sell them. Fail: refunds sit in one total, so every campaign pays for the worst product's returns.
  2. Upload last week's full refunds to Google Ads. Fill the Conversions adjustments template with order IDs and the type RETRACT. Pass: the Conversion adjustment segment under Campaigns shows them. Fail: the upload cannot match orders, so your purchase tag needs an order ID first.
  3. Add a kept-ROAS column to your weekly report. Put each platform's ROAS times its kept share next to every campaign. Pass: budget calls use the kept column. Fail: the meeting still quotes the dashboard figure.

Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework

Sources, 1 October 2026: Sales reports (Shopify Help Center); Setting up return and cancellation rules (Shopify Help Center); How to adjust your conversions (Google Ads Help); About conversion adjustments (Google Ads Help); Understand the impact of conversion adjustments (Google Ads Help); Add or remove columns in your statistics table (Google Ads Help); About Target ROAS bidding (Google Ads Help); Customize columns in Meta Ads Manager (Meta Business Help Center); Purchase ROAS (return on ad spend) (Meta Business Help Center); Specifications for Meta Pixel standard events (Meta Business Help Center); Measure ecommerce (Google for Developers); Analytics dimensions and metrics (Google Analytics Help); Shopify event parameters (Google for Developers); Measuring marketing performance (Shopify Help Center).

Frequently asked questions

  • Where do I find my return rate in Shopify?
    In Analytics, open Reports and filter the Category to Sales. Total sales by product with the Is reversed filter shows refunded value per product; divide it by gross sales. For units, Shopify's Returned quantity rate is the share of ordered units that were physically returned.
  • Does uploading returns to Google Ads change its bidding?
    Only if you upload them quickly. Google says bidding reads restatements and retractions made within 7 days of the conversion being recorded. Reports accept adjustments for 54 days, so a late upload corrects your ROAS columns without teaching the bidding anything.
  • Should exchanges count as returns when I calculate ROAS?
    Usually not. An exchange swaps the item without giving the money back, so the sale your ads drove still stands. Count only refunds in your kept share, and leave exchanged orders unadjusted in Google Ads.

Go deeper: Causal attribution, explained.

Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.

Keep reading

Terms in this article

Browse the full glossary

Your platforms guess.
We run the math.

Upload a GA4 export and see what each channel caused, next to last-click, in 1–2 minutes. The read is yours to keep.

Free, in your browser: your file is not uploaded. The full read is €99, refundable within 30 days. Prices exclude VAT.
Or book a 30-min call.