Shipping Costs, Returns and Refunds in Your Ad Math
How free shipping, return rates and refund timing quietly change your real ROAS and CPA ceiling — worked through with examples.
Written by Mantas Jurgutis — Founder, Adsify — builds the Google & Meta automation merchants use daily
Editorially reviewed by Adsify Editorial on April 6, 2026 — Reviewed against Shopify, Google Ads and Meta official documentation.
Why platform ROAS ignores three real costs
Google Ads and Meta report ROAS based on the order value at the moment of purchase, using whatever conversion value was passed at checkout. That figure typically doesn't subtract outbound shipping cost paid by the merchant, doesn't account for the share of orders that get returned or refunded, and doesn't reflect the cost of processing a return (return shipping, restocking, damaged-goods write-off). For a store with meaningful free-shipping costs or a non-trivial return rate, the gap between platform-reported ROAS and true profit-based ROAS can be large enough to make a campaign look profitable when it isn't.
The fix isn't a single adjustment but three separate ones layered onto the base gross margin calculation: subtract average outbound shipping cost per order (if the merchant absorbs it, as with free-shipping offers), subtract the expected cost of the return rate applied across all orders (not just returned ones, since it's an average cost per order), and account for the delay between when ad platforms count a conversion and when a return might later reverse it, since Shopify refunds don't always automatically flow back to ad platform conversion values in real time.
Worked example: adding free shipping to the margin stack
Assume a $50 AOV product with $22 COGS (56% gross margin before shipping, $28 gross profit) and the store offers free shipping, absorbing an average $6.50 outbound shipping cost per order. Shipping-adjusted gross profit = $28 - $6.50 = $21.50, a margin of 43% rather than 56%. If the store's target ROAS was set using the 56% margin figure — assuming, for example, a 40% max acquisition spend policy giving an $11.20 CPA ceiling — the shipping-adjusted ceiling drops to 40% x $21.50 = $8.60, a 23% lower acceptable CPA than the unadjusted figure would suggest.
Worked example: layering in a return rate
Continuing the example, assume this product category has a 12% return rate, and each return costs the store $9 to process (return shipping label, restocking labor, and an assumed 30% chance the returned item can't be resold at full value). Expected return cost per order, averaged across all orders including the 88% that aren't returned = 0.12 x $9 = $1.08. Applying this to the shipping-adjusted gross profit: $21.50 - $1.08 = $20.42 fully-adjusted gross profit per order, versus the original unadjusted $28 — a 27% reduction driven by shipping and returns combined. The CPA ceiling at the same 40% policy becomes 40% x $20.42 = $8.17, compared to the naive $11.20 figure — a difference of $3.03 per order, or about 27% less room to spend on acquisition than the platform-reported numbers alone would suggest.
Category variance matters enormously here
Return rate and shipping cost both vary hugely by category — apparel commonly sees return rates well above 12% in many markets, especially for sized items ordered in multiple sizes with the intent to return most of them, while categories like consumables, jewelry, or single-SKU accessories often see return rates in the low single digits. A store selling apparel needs a materially more conservative CPA ceiling calculation than a store selling a single-size accessory, even at identical AOV and headline gross margin, purely because of this difference — using a generic 'ecommerce average' return rate instead of your own measured rate can be badly wrong in either direction.
Measuring your actual return rate and cost correctly
Shopify's order and returns data can produce a genuine return rate (returned orders divided by total orders over a matched time window, being careful to use a window where returns have had time to actually happen — a 30-day return policy means recent orders haven't finished their return window yet). The cost per return should include the return shipping label cost (if the merchant covers it), any restocking labor, and a realistic resale-value discount for items that can't be resold at full price, rather than assuming a returned item recovers 100% of its original value once it's back in inventory.
Free shipping thresholds vs blanket free shipping
A free-shipping-over-$X threshold changes the math differently than blanket free shipping on every order, because it also changes average order value — customers often add items to clear the threshold, raising AOV but also raising the per-order shipping cost the store absorbs only on orders that clear that threshold. Modeling this requires knowing what share of orders currently clear the threshold and what the AOV lift has actually been since introducing it, both measurable directly from Shopify order data, rather than assuming the threshold is costless just because not every order gets free shipping.
Passing conversion value adjustments back to ad platforms
Both Google Ads and Meta support adjusted or enhanced conversions that can reflect refunds after the fact, reducing the recorded conversion value when a Shopify order is refunded, which keeps reported ROAS closer to true economics over time rather than permanently counting refunded orders at their original full value. Setting this up requires passing refund events back through the conversion tracking integration rather than relying on the initial checkout-time value alone — worth confirming is actually configured, since many stores set up purchase tracking once and never revisit it after adding a returns process.
Worked example: how much unrecorded refunds inflate reported ROAS
Assume a campaign shows a platform-reported ROAS of 4.0x on $10,000 of tracked revenue from $2,500 of spend, but 12% of that revenue, $1,200, is later refunded and never fed back to the ad platform's conversion value. True revenue is $8,800, giving a true ROAS of 8,800 / 2,500 = 3.52x — an 12% gap between reported and true ROAS purely from unrecorded refunds, before even subtracting shipping cost or margin. If decisions about scaling or pausing campaigns are made on the 4.0x figure, they're being made on a number that's overstated by that margin.
Return-heavy campaigns can still be worth running
A higher return rate doesn't automatically mean a product line should be deprioritized in ads — some high-return categories (apparel with size uncertainty, for example) also carry higher AOV or higher gross margin that can offset the return cost, and some returns convert into store credit rather than a full refund, retaining some of the original transaction's value. The point of building return rate into the CPA ceiling isn't to avoid return-prone products, it's to bid on them with an accurate ceiling instead of an inflated one that assumes every sale sticks.
A combined worked ceiling, start to finish
Pulling the full example together: $50 AOV, $22 COGS (56% base margin, $28 gross profit), $6.50 absorbed shipping cost, 12% return rate at $9 processing cost per return ($1.08 average), yields a fully-loaded gross profit of $20.42 per order, a real margin of about 41% rather than the headline 56%. At a 40% acquisition-spend policy, the defensible CPA ceiling is $8.17, not the naive $11.20 a shipping- and return-blind calculation would produce — a 27% gap that, if ignored, would systematically justify overbidding on every campaign for this product.
Building this into ongoing tracking, not a one-off spreadsheet
Because shipping cost, return rate and refund timing all drift — carrier rate changes, seasonal return spikes after gift-giving periods, a product redesign that reduces sizing-related returns — the fully-loaded margin figure used for CPA ceilings should be recalculated periodically using current Shopify data rather than a static number set once at launch. This is the same discipline behind tools like Adsify's profit and POAS tracking, which pulls Shopify product cost data on an ongoing basis specifically so ROAS and profitability figures used for budget decisions reflect current economics rather than a launch-day assumption.
