Performance

Short answer: RTO-adjusted ROAS is the revenue you actually keep from ad-driven orders, after removing orders returned to origin, divided by ad spend. Start from delivered revenue, not placed revenue, and deduct the shipping you paid on returned parcels. It is usually lower than platform ROAS, and it is the number to set targets against.

RTO-adjusted ROAS: what returned COD orders do to your real return on ad spend, cover

Every Indian D2C founder I work with has seen the same disconnect. Meta or Google says the campaign is returning a healthy ROAS, the dashboard looks good, and then the month closes and there is less money than the numbers implied. A large part of that gap is RTO, return to origin: orders that were placed, shipped and never accepted. Platform ROAS counts them as revenue. Your bank does not. This article explains what RTO does to ROAS, how I calculate an RTO-adjusted version that finance will agree with, and how to stop RTO-heavy orders from training your campaigns. If you just want the number, the RTO-adjusted ROAS calculator on this site does the arithmetic.

What RTO actually costs you

An RTO order is worse than an order that never happened. When a customer simply does not buy, you lose the ad spend that brought them. When they place a COD order and then refuse it, you lose the ad spend, pay forward shipping, usually pay return shipping, tie up inventory for the round trip, and sometimes absorb damage or repackaging cost when the parcel comes back. Platform reporting sees none of this. The ad platform recorded a purchase with a value, so the ROAS calculation uses the full order value as if it were collected. The effect is not just a reporting error. If you set budgets and targets against platform ROAS, you will overspend on campaigns, placements and audiences whose orders look good on placement and fall apart at delivery. That is why I treat RTO as a media problem as much as an operations problem. The delivery and courier team can reduce RTO with address verification and confirmation calls, but the marketing team decides which customers get acquired in the first place.

The calculation, step by step

Start with the orders attributed to a channel or campaign for a period, using whatever attribution source you trust: platform data, GA4, or UTM-tagged orders in Shopify. Split them into prepaid and COD. Prepaid orders count at their value minus genuine refunds. For COD orders, take only the ones that were delivered, and use their delivered value. That gives you kept revenue. Then work out the cost RTO added. For every RTO order, add the forward shipping and return shipping you paid, plus any COD handling fee your aggregator charged. Some brands also add a per-order packaging and handling cost. RTO-adjusted ROAS is kept revenue divided by ad spend plus those RTO costs. A stricter version, which I prefer for margin decisions, also deducts the cost of goods for orders that were damaged or unsellable on return. The exact formula matters less than consistency. Pick one definition, write it down, and use it every month so trends mean something. The RTO-adjusted ROAS calculator follows this structure and lets you plug in your own RTO rate and shipping costs.

Why the gap varies by campaign

The useful insight is rarely the account-level number. It is how unevenly RTO is spread. In my experience the variation between campaigns, placements, creatives and geographies is often larger than the variation in platform ROAS between them. Broad prospecting with discount-heavy creative can drive cheap orders that refuse at a higher rate. Certain pin code clusters have consistently weaker delivery acceptance. Audience Network or low-quality placements can generate orders that look fine in Ads Manager and fail at the door. Retargeting existing customers usually has the lowest RTO because those people have paid you before. You only see this if you join order outcomes back to the source of the order. That means storing UTM parameters and click IDs on the Shopify order, pulling delivery status from your shipping aggregator, and building a simple table by campaign: orders, delivered orders, RTO orders, kept revenue, spend. Once that table exists, the conversation with whoever runs your ads changes from which campaign has the best ROAS to which campaign has the best ROAS on money that arrived.

Stopping RTO from training your campaigns

Reporting the right number is half the job. The other half is changing what the platforms optimise toward. Meta and Google learn from the conversions you send them, so if every placed COD order is reported as a purchase, the algorithm is rewarded for finding people who place orders, not people who pay. The fix is to change the conversion event. For Meta, that means sending Purchase for COD orders only once the order is confirmed or delivered, through the Conversions API, which I cover in detail in the article on Meta CAPI for Shopify COD orders. For Google Ads, the equivalent is to keep the online purchase tag as a secondary conversion for observation and import confirmed or delivered orders as the primary conversion, using offline conversion import or enhanced conversions. Both approaches have a timing cost: the platforms prefer fast signals, and delivered status can take more than a week. Confirmation status is usually the practical middle ground. The goal is not a perfect signal but a signal that correlates far better with cash than order placement does.

Setting targets that survive finance review

Once you have RTO-adjusted ROAS, use it to set the break-even line. Work backwards from contribution margin: what does a delivered order leave after product cost, shipping, payment fees and packaging, and what share of that can you spend to acquire it? That gives a target ROAS on kept revenue. Then, because the people managing campaigns still look at platform ROAS day to day, translate the kept-revenue target into an equivalent platform ROAS for each channel using the ratio you have observed between the two. If Meta-reported revenue has been consistently higher than kept revenue for a channel, the platform target needs to be higher by roughly the same proportion. Revisit that ratio monthly, because RTO changes with season, offers and courier performance. Sale periods are the classic trap: discount-driven COD orders spike, platform ROAS looks strong, and RTO a fortnight later quietly erases it. I would rather see a team hit a sober RTO-adjusted target than celebrate a platform number that does not reconcile.

Operational levers that improve the number

Media changes are not the only lever. Several operational practices reduce RTO directly and therefore lift adjusted ROAS without touching bids. Order confirmation by WhatsApp or IVR before dispatch filters out orders the customer did not mean to place. Address validation at checkout catches incomplete or unreachable addresses. Incentives to pay online, such as a small prepaid discount or a COD fee, shift part of the mix to prepaid, which removes the RTO risk for those orders entirely. Some brands restrict COD by pin code or by order value where history shows poor acceptance. Each of these has a conversion rate trade-off, so test them rather than switching them on everywhere. What matters from a measurement point of view is that you track their effect on kept revenue, not just on order count. A COD fee that reduces orders but increases delivered revenue per rupee of spend is a win, and you will only see it if you are measuring the adjusted number.

FAQ

It is return on ad spend calculated on the revenue you actually keep, meaning prepaid orders plus delivered COD orders, divided by ad spend plus the shipping and handling costs incurred on returned-to-origin orders. It reconciles with finance in a way platform ROAS does not.

Take attributed revenue for the period, remove COD orders that were not delivered, then divide by ad spend plus the forward and return shipping paid on those RTO orders. The RTO-adjusted ROAS calculator on this site walks through it with your own figures.

Indirectly, yes. Send purchase conversions for COD orders only once they are confirmed or delivered, through Meta Conversions API and Google Ads offline conversion import. The platforms then learn from orders that are far more likely to pay.

Read this article on your favourite platform

Ready to build the system?

If this describes your funnel, a 30-minute call will find where the constraint sits in your own numbers and what it would take to fix it.

It starts with a 30-minute call. Pick a time below.

Choose a time

Prefer email?