COD Attribution in Nepal: Judge Ad Spend on Paid and Delivered Orders
Most Nepali e-commerce runs on cash-on-delivery, but most ad reporting runs on clicks. That gap is where money quietly disappears: the platform reports an order, you pay the courier both ways on a refusal, and the campaign that looked profitable was never profitable.
This playbook sets up attribution the other way round — from cash collected backwards to the click. It needs no paid tooling: UTM tags, click IDs, a disciplined order sheet, and one weekly reconciliation hour. For the analytics setup it sits on, see Google Analytics in Nepal.
1. Why platform ROAS lies about COD
Ad platforms optimise toward the events you send them. If the only purchase signal is “order placed”, the platform learns to find more order-placers — including the ones who never answer the courier. Returns-to-origin (RTO) then eat the margin the dashboard claims you earned.
The fix is definitional before it is technical. Decide, in writing, which event counts as success for each payment mode:
- COD: delivered and cash collected — not placed, not confirmed, not shipped.
- eSewa/Khalti: successful provider callback reconciled against settlement, not the checkout click.
- Bank transfer / FonePay QR: amount credited in your statement, not the slip upload.
Everything below exists to report those three events honestly.
2. Tag every click before spending a rupee
Nothing downstream works without clean tagging. Minimum standard for every ad, post boost, influencer link and QR placement:
-
utm_source,utm_medium,utm_campaignon all outbound links — no exceptions for “just a quick boost”. - The platform click ID captured wherever available (Meta, Google and TikTok all provide one) and stored on the lead or order record.
- One naming convention written down once and reused: lowercase, hyphens,
channel-objective-audience-datebeats creative improvisation per campaign.
Click-to-WhatsApp ads deserve special care because the conversation happens off-site. Use prefilled text or a logged click ID so each chat thread starts with its source attached; otherwise your best-performing channel is also your least measurable one. The WhatsApp marketing automation guide covers the message flows this tagging feeds into.
3. Carry the ID through confirmation, dispatch and delivery
Build the order record around the click, not the session:
- Placed: order row created with click ID, UTM set, payment mode and timestamp.
- Confirmed: yes/no from the customer plus who confirmed and when. Unconfirmed-with-no-response after your agreed window is its own status — do not leave it as “placed” forever.
- Dispatched: courier name, tracking reference, COD amount restated to the customer.
- Terminal state (exactly one): delivered-paid, delivered-unpaid-followup, refused-RTO, cancelled pre-dispatch, or payment-failed.
A row with no terminal state within your normal delivery window is a data problem first and a logistics problem second. Chase the missing status before chasing more orders.
4. Reconcile money weekly
Once a week, join three lists that rarely agree with each other — and that disagreement is the entire point:
- Ad spend by campaign from each platform, for the same seven days.
- Orders by terminal status from your sheet or system, cut by the same dates and tagged with campaign via click ID.
- Settlements: courier COD remittance for the week plus wallet provider settlement reports.
Compute per campaign: spend, delivered-paid orders, wallet-paid orders, gross collected, courier and return costs, net after delivery costs. Rank campaigns by net collected per rupee spent, not by platform ROAS. Pause the bottom of that ranking first — it is usually a different set of campaigns than the platform would pause.
Keep the routine at one focused hour. A simple sheet you actually reconcile beats a dashboard project that never ships.
5. Close the loop back into the platforms
Once terminal states are trustworthy, feed them back so optimisation targets reality:
- Import delivered-order and paid-order conversions (offline conversion import or the Conversions API equivalents) alongside the raw order event, and shift budgets toward the offline events after a few weeks of volume.
- Exclude chronic non-confirmers and RTO-heavy audiences from prospecting; retarget only confirmed buyers for repeat purchase.
- For lead-gen businesses with the same shape (consultations that no-show), apply the identical pattern: click → confirmed appointment → showed-up → paid. The mechanics are the same as COD.
Start with one channel and one product line. Prove the reconciliation habit there, then extend it — attribution that covers everything on day one covers nothing.
What to do this week
- Write down your three success definitions (COD delivered-paid, wallet settled, transfer credited).
- Add UTM + click-ID capture to your top two campaigns and the WhatsApp entry point.
- Give every open order exactly one terminal state; chase the missing ones.
- Run the first weekly join: spend vs delivered-paid vs settlements, one hour, same weekday.
Related reading: Google Analytics in Nepal, WhatsApp marketing automation, e-commerce marketing in Nepal, and email deliverability for the confirmation-mail half of the same system.


