Meta Ads Strategy for D2C Brands With High COD Return Rates
Meta counts a COD order as a sale when it is placed, not when it is paid. Here is how to set up your events, ads and reporting so your spend goes to orders that get delivered.
Why COD returns break your Meta numbers
When a shopper places a cash on delivery order, your store fires a Purchase event straight away. Meta records the sale, adds the order value to your ROAS and learns from that buyer. Nobody tells Meta that the parcel was refused at the door five days later, or that the phone number was switched off.
So Meta keeps doing what you asked. It finds more people like the ones who placed orders. If many of those people never pay, the algorithm is learning from the wrong buyers. Your reported ROAS goes up while your bank balance does not, and the gap gets wider as you scale.
This is not a tracking bug. It is how the event is defined. The fix is partly in Meta, partly in your checkout and partly in your ads.
Work out your real numbers before you change anything
Start with a plain export from your store admin or your shipping panel for the last 60 to 90 days. Tag every order as prepaid or COD, and as delivered, returned (RTO) or cancelled. Then match orders back to campaigns using UTM parameters. Do not rely on Meta's purchase count for this. It will not match your store anyway (see why Meta purchases don't match store orders).
Now compare what Meta reports with what actually landed.
- Compare RTO share across ads, not just across the account. One impulse hook can drag the whole account down.
- Check prepaid share by campaign. A campaign with fewer purchases but more prepaid orders often wins on delivered revenue.
- Update this sheet weekly. Delivered data arrives late, so it is a weekly decision tool, not a daily one.
| What Meta shows | What you should track next to it | Why it matters |
|---|---|---|
| Purchases | Delivered orders | Only delivered orders pay for the ad |
| ROAS | Delivered revenue divided by spend | This is the ROAS your business runs on |
| Cost per purchase | Cost per delivered order | RTO orders still cost you shipping both ways |
| Purchases by ad | RTO share by ad and by campaign | Some ads attract far more refusals than others |
| Purchases by region | RTO share by state and pin code | Returns cluster in specific areas and couriers |
Choose which purchase event Meta should optimise for
You can send Meta more than one purchase signal through the Conversions API and set up custom conversions from them. The question is which one your campaigns should chase. Each choice trades signal quality against signal volume.
- Prepaid plus confirmed COD is the practical middle ground for most Indian D2C brands. Fire a custom event when a COD order is confirmed on WhatsApp or by call, and a prepaid purchase event at checkout. Optimise for both together.
- Keep sending the normal Purchase event too, so reporting and audiences stay intact.
- Meta's own guidance is around 50 optimisation events per ad set per week to exit learning. If a stricter event cannot reach that, use fewer ad sets or a broader event. Read how the learning phase reset works before switching live campaigns.
- If you use value optimisation, send a lower value for COD orders than for prepaid ones. Meta then leans toward buyers who are worth more to you.
- Get the basics right first: deduplicated browser and server events with good match quality. Our Meta CAPI setup guide covers this.
| Optimisation event | Good for | Watch out for |
|---|---|---|
| All purchases (default) | Low RTO accounts, new accounts that need volume | Teaches Meta to find people who order but refuse |
| Prepaid purchase only | Brands with a healthy prepaid share | Fewer events, so ad sets may stay in learning longer |
| Prepaid plus confirmed COD | Most COD-heavy brands | Needs a fast confirmation step so the event fires within hours |
| Delivered order | High AOV brands with enough volume | Fires days after the click, so much of it falls outside the attribution window |
Fix the checkout, because the ad cannot fix a refusal
Meta can only learn from the signal you give it. The cheapest way to get a better signal is to cut bad COD orders before they ship, and to move genuine buyers to prepaid.
- Confirm every COD order on WhatsApp within an hour or two. Unconfirmed orders get a reminder, then a call. Do not ship what nobody confirmed.
- Give people a reason to prepay at checkout and again in the confirmation message: faster dispatch, a small gift, or a partial advance that holds the order. Say it clearly, without making COD feel like a penalty.
- Use a one-click checkout that pre-fills the address and shows UPI first. Many COD orders come from people who simply found paying online slow.
- Restrict COD by pin code and order value where your RTO data shows repeated refusals. Keep prepaid open everywhere.
- Flag repeat refusers by phone number and block COD for them.
- Route by courier performance per region. Some RTO is a courier problem, not a buyer problem.
The ads that attract COD returns, and what to run instead
Creative decides who Meta shows your ad to, so it also decides who refuses the parcel. In COD-heavy accounts we see the same patterns behind high RTO ads.
Ads built on curiosity and impulse pull orders from people who never meant to pay. Ads that hide the price get orders from people who are shocked at the door. Ads that oversell a product get refused when the box looks smaller than the video.
- Judge new creatives on confirmed and delivered orders, not on first-day purchases. An ad with lower reported ROAS can be your best ad on delivered revenue.
- For apparel and footwear, a size guide in the video cuts refusals from wrong sizes. See our video ad hooks guide for hooks that sell without baiting.
| Raises RTO | Lowers RTO |
|---|---|
| Hooks built only on shock or curiosity | Hooks built on a real problem the buyer has |
| Price hidden until checkout | Price shown on screen in the ad |
| Heavy free-gift or limited-time pressure | A true reason to buy now |
| Studio shots that flatter size and colour | Real-hand demos showing actual size, fit and finish |
| No mention of delivery or payment | Prepaid benefit mentioned in the ad or the caption |
Targeting, placements and exclusions
- Stay broad, but feed it a cleaner event. Narrow interest targeting does not fix RTO. The optimisation event does.
- Exclude refusers. Upload phone numbers of customers who refused COD orders as a custom audience and exclude them from prospecting and retargeting.
- Seed from good buyers. Build lookalikes and value lists from delivered prepaid customers, not from all purchasers.
- Check placements. If a placement brings a high share of COD orders that never confirm, remove it and compare delivered results.
- Watch regions. Meta does not know your pin code data. If a state keeps refusing, you can exclude it at ad set level while you fix courier or checkout issues there.
- Retarget for prepaid. Cart abandoners already know the product. Push the prepaid benefit hard in retargeting ads.
How to report and scale when delivery data arrives late
Delivered numbers come in days after the spend, so you need two views. Use a daily view from Meta for pacing and early creative signals. Use a weekly view of confirmed and delivered results for real decisions.
Set a working ratio from your own history: for each campaign, how much of Meta's reported revenue turns into delivered revenue. Use that ratio to read daily ROAS until delivered data catches up. When you scale, watch whether the ratio drops. Scaling often pulls in colder, more COD-heavy buyers, and that is one reason ROAS falls when you raise spend.
Scale the campaigns that hold their delivered ROAS, not the ones with the best numbers in Ads Manager.
How Monastic Media helps
One in-house team in Surat scripts, shoots and edits the ads videos and runs the Meta and Google campaigns they go into, so the people who see the numbers make the next ad. See our performance marketing
Read next
Questions
Should I turn off COD to stop RTO?+
Usually no. Many Indian buyers still prefer COD, and switching it off often cuts genuine orders. Restrict it by pin code, order value and repeat refusers, and push prepaid with a clear benefit instead.
Can I tell Meta that a COD order was returned?+
Meta has no standard event for a returned order that removes a sale. What works is sending separate custom events, such as prepaid purchase and confirmed COD, through the Conversions API and optimising for those instead of the raw Purchase event.
Why is my Meta ROAS good but I am losing money?+
Meta counts every COD order as revenue when it is placed. If many of those orders are refused, you pay for the ad and for shipping both ways while earning nothing. Track delivered ROAS by campaign to see the real picture.
Is optimising for delivered orders better than optimising for purchases?+
The signal is better, but delivery happens days after the click, so many events fall outside Meta's attribution window and volume is low. For most brands, optimising for prepaid plus confirmed COD orders gives a cleaner signal that still fires fast.
Which creatives cause more COD returns?+
Impulse and curiosity hooks, ads that hide the price and ads that overstate size or finish. Showing the price, the real product in hand and the prepaid benefit usually brings in buyers who accept the parcel.

“MM helped us scale from 0 to ₹2.6 CR/month in just 6 months with clear communication and industry expertise!”Rakesh Naidu GM @ Naaptol
Ready to work with one team?
Book a call. If we can help you hit your goals, we will tell you how; if we cannot, we will tell you that too.
