
7/17/2026

To calculate a truer ROAS, adjust the revenue side: take platform-reported revenue for the period, subtract cancelled, COD-failed, and returned order value from your store data, then divide the retained figure by ad spend. The result is an estimated retained ROAS, honestly labelled an estimate.
Your ad spend isn't the part that's wrong. That money left your account, real transaction, nothing ambiguous about it. What's wrong is the other side of the ratio, the revenue a platform counted the second someone finished checkout, before any of that order's actual fate played out. So the fix goes on the revenue side: same spend number you already have, a corrected revenue number sitting on top of it. This is the same Reality Gap covered elsewhere on this blog, here turned into an actual method instead of just a concept.

Five steps, same order every time.

What you end up with. Fill in your own numbers, this page doesn't have one to give you.
Some orders won't map to a campaign cleanly. No click ID, no UTM parameter, sometimes someone clicked one ad and converted through a completely different session later. Forcing those into a campaign anyway, just so every rupee is accounted for somewhere, means inventing an attribution you don't actually have.
The honest move is stating the unmatched remainder, the orders you genuinely can't map, as its own number instead of spreading them across campaigns by guesswork. It's the same discipline the month-end close uses at the account level, applied here one campaign at a time. A large unmatched remainder isn't this method failing. It's a finding about your own tracking setup, and it's worth fixing before the number underneath it gets trusted for anything bigger than a spreadsheet.

A large remainder isn't the method failing. It's a finding about your tracking setup.
Call this what it is: an estimate. Stitching platform exports together with store data by hand, or through a tool automating the same join, gets you a retained ROAS that's a lot closer to real than the platform's own number. It's still built on an estimated join though, not a guaranteed one.
What upgrades an estimate into something harder is deterministic order-level matching, every platform-recorded conversion tied to its specific store order, not categories of orders subtracted from a total. Until that level of matching exists on your account, keep calling the output an estimate. That's not a hedge, it's just the accurate word for what this method actually produces.

An estimate today. Deterministic when the matching underneath it is.
Doing this once, by hand, for one period is a spreadsheet exercise, an afternoon at most. Doing it every period, for every campaign, is what actually changes how budget gets planned, and that's the part manual spreadsheets tend to give up on after a couple of months. Tools in this category, Adverti's true ROAS calculator included, exist to run the same join continuously instead of rebuilding it from scratch each time. Whatever runs it, the output stays an estimate until the matching underneath it is deterministic. That doesn't change just because it's automated.
Same philosophy, different altitude: this method works campaign-level where identifiers allow, [Retained MER](/blog/retained-mer) is the blended account-level ratio. Use both; they answer different questions.
See your own estimated gap. Adverti Chat joins your ad spend with your store and delivery outcomes and shows a stitched estimate of what you actually kept, next to what was reported. Free plan, read-only access, no card.
Don’t miss our most popular and impactful reads.
Connect your Meta and Google accounts. Your first audit is ready in 30 seconds. Free forever on the Free plan.
We use cookies to keep Adverti working, understand how the site is used, and measure our ads. You can accept all, reject all, or choose what you allow. Read more in our Cookie Policy.