Your ROAS Counts Money You Never Kept: VAT, Shipping and Sales That Never Happened
Many shops report the full order total to their ad platforms, VAT and shipping included, and never take back the orders that are refused or returned. The ROAS you set budgets by looks better than the business behind it.
Daniel Eberhat · 5 November 2026 · 5 min read
ROAS, return on ad spend, is the number that decides where the advertising money goes. Meta says a campaign returns €5 for every €1 spent, so it gets more budget. Google’s automated bidding, when set to a ROAS target, reads the same number and adjusts every bid to it, around the clock.
So it is worth asking what, exactly, the return in “return on ad spend” is. In many online shops, the answer is the order total, as the customer saw it at checkout. And that total contains money that was never yours to begin with.
What the ad platform is told
Take an ordinary order: €100 of products, €21 of VAT and €5 of shipping. The customer pays €126, and €126 is what many tracking setups report to Meta, Google Ads or TikTok as the value of the sale.
But the €21 goes to the state. The €5 goes to the courier. What the shop actually earned from that order is €100, and the ad platform has been told €126: 26% more.
The ad spend, meanwhile, is counted without VAT, so you are dividing a gross revenue by a net cost. Spend €25 to get that order, and the dashboard shows a ROAS of 5.04. The real figure is 4.
If your margins mean a campaign needs a ROAS of 4 just to break even, the dashboard is telling you that you are comfortably in profit when you are, in fact, at zero.
Shipping does more damage than it seems
VAT at least inflates every order by roughly the same proportion. Shipping doesn’t, and that is where it gets worse.
Many shops offer free shipping above a threshold. That means the shipping fee appears only on the small orders. A basket with €20 of products, plus €4.20 of VAT and €5 of shipping, is reported as €29.20, 46% more than the shop earned. A basket with €80 of products, €16.80 of VAT and free shipping is reported as €96.80, 21% more. The small order, the one with the thinnest margin after packing and delivery, is the one that looks best.
Automated bidding doesn’t know any of this. It is told that some customers are worth more than they are, and it learns to look for more customers like them. Without anyone deciding it, the budget drifts towards exactly the orders you would least want more of.
The sales that never happened
The second problem is time. The sale is reported the moment the order is placed, before anyone knows whether the money will arrive.
Some of it won’t. A parcel sent cash on delivery is refused at the door. A customer uses their right to return the product within fourteen days. An order is cancelled because the item turned out to be out of stock. In the shop’s accounts, these sales are gone. In the ad platform, they stay sales forever.
Google Analytics 4, where most shops read their sales, accepts a correction: send it a refund and the revenue in its reports goes down. Google Ads accepts corrections too, but only as a separate upload, by file or through its API. Meta, TikTok and ChatGPT Ads currently offer no way to take a reported sale back. Whatever they were told on the day of the order is what they keep.
There is no fixing that from the outside, but there is a way to allow for it. If one sale in ten comes back, take 10% off the ROAS the platform shows. If one in five comes back, take 20% off. Or, which comes to the same thing, raise your targets: a break-even ROAS of 4 becomes 4.44 if one sale in ten comes back, and 5 if one in five does.
Put the two together
Back to the campaign the dashboard shows at a ROAS of 5.04. Take out VAT and shipping, and it is 4. Allow for one sale in ten coming back, and it is 3.6.
The same campaign, the same spend, the same customers. The only difference is whether the number tells you what you sold or what you kept, and the second is almost 30% lower. Put the other way, the dashboard is 40% too optimistic.
None of this means the platforms are lying. They report exactly what they are told. The question is what you tell them.
What we did about it
We ran into this at caruselbooks.ro, a Romanian bookshop where cash on delivery is common and every refused parcel used to stay in the reports as a sale. The fix became part of Slova Tracking, the module we built for the store.
It sends Meta, Google Ads, TikTok and ChatGPT Ads the value of the products, after discounts and without VAT or shipping, worked out from the amounts each order was actually charged rather than from a fixed VAT rate. In Romania, books carry a reduced rate and most other goods the standard one, and on 1 August 2025 both went up. A single fixed rate would have been wrong twice over. Because each order keeps its own amounts, a refund on a July order takes back exactly what was reported in July.
Google Analytics 4 still receives the full amount, with tax and shipping listed separately, so the figures your finance team works from still match the orders. And when an order is cancelled, refused or returned, in full or in part, GA4 receives a refund for what it was told at the time of the sale, and only once.
Meta, TikTok and ChatGPT Ads can’t take a sale back. Google Ads can, but the module doesn’t send those corrections. For all four, the allowance for returns from earlier still applies.
If you can’t change what your shop sends, do the arithmetic yourself: work out what share of your average order is VAT and shipping, and how many sales don’t survive to the end. Then read every ROAS figure with those two numbers in mind. Either way, set budgets from the money you kept, not the money that passed through.