If you sell on Cash on Delivery, the ROAS in Ads Manager is not the ROAS your bank account sees. This article shows three ways to measure ROAS, how to calculate the real one per campaign, and how to set it up for your store.
Three kinds of ROAS
- Ads Manager ROAS. The purchase value Meta attributes to your ads, divided by ad spend. A COD order counts as a purchase the moment it is booked.
- Blended ROAS. All store revenue, from every source, divided by total ad spend. Useful as a whole-business check, but it mixes ad orders with organic ones.
- Real ROAS. Revenue you actually kept from ad orders, after cancellations, RTO, returns and exchanges, divided by ad spend. This is the one that pays your bills.
Cancelled orders cost you nothing in freight, but they still were never revenue. RTO and refunded returns are revenue you lost after shipping. Exchanges keep the revenue, but add shipping both ways, so track their cost separately.
Worked example: two campaigns
Hypothetical numbers, to show the method only.
A store runs two Meta campaigns with the same budget. Ads Manager makes Campaign A look like the winner.
| Campaign A | Campaign B | |
|---|---|---|
| Ad spend | ₹40,000 | ₹40,000 |
| Booked revenue | ₹1,60,000 | ₹1,20,000 |
| Ads Manager ROAS | 4.0x | 3.0x |
| Lost to cancellations, RTO and returns | 45% | 10% |
| Kept revenue | ₹88,000 | ₹1,08,000 |
| Real ROAS | 2.2x | 2.7x |
Campaign A books more but loses almost half of it. Campaign B books less but keeps nearly all of it. On real ROAS, B is the better campaign. If you had moved budget from B to A based on Ads Manager, you would have lost money.
This pattern is common with COD. Creatives that push urgency, freebies or very low prices can bring a lot of impulse orders. Many of them come back.
Know your break-even ROAS
Real ROAS only means something next to your break-even. A simple version, before RTO costs:
If real ROAS is below break-even, the campaign loses money even if Ads Manager looks healthy. For a stricter view, subtract RTO shipping and damaged stock from kept revenue before dividing, as shown in our COD RTO guide.
How to set it up
1. Tag every ad with UTM parameters
In Meta Ads Manager, add URL parameters at the ad level so each Shopify order carries the campaign, ad set and ad that brought it. Meta supports dynamic values, for example:
Shopify stores the landing page with these tags on each order.
2. Wait for outcomes
RTO is not known on the day of the order. Parcels need time to be delivered or come back. Judge an ad only once enough of its orders have a known outcome. A few days of data can mislead you.
3. Compare kept revenue, not booked revenue
For each campaign, ad set and ad, group orders by their tags and follow each order to its end: cancelled, returned, refunded or kept. Divide kept revenue by spend. Rank worst first.
4. Act on it
- Pause or rework ads with real ROAS below break-even.
- Move budget to ads that keep their sales, even if their booked ROAS is lower.
- Check if a losing ad is tied to one discount code, product or set of pin codes.
Doing it without spreadsheets
You can do all of this in a spreadsheet, but it means exporting orders, matching courier outcomes and splitting by UTM tags every week. RTOGuard does it inside Shopify. It shows booked, cancelled, returned and kept revenue, blended ROAS next to real ROAS, and on the Starter plan grades every campaign, ad set and ad from A to F on the money it kept. You type in your monthly ad spend. It never changes your ads.