Measurement Truth

How to track cash-on-delivery orders in Meta ads

A courier handing over a parcel for cash, with a broken dotted data line failing to reach an analytics node, symbolising the cash-on-delivery attribution gap.
July 1, 20266 min read

Cash on delivery breaks Meta's tracking because the sale only becomes real when the parcel is delivered and paid, days later and offline, long after the click. The pixel fires at order placement, not payment, so Meta optimises toward orders that may never be paid. The fix is to send a server-side Conversions API event when the order is delivered and paid, keyed back to the original click.

Why cash on delivery is invisible to the pixel

Across much of Africa, cash on delivery (COD) is not a fringe option, it is how a large share of customers prefer to pay. But COD splits the purchase into two moments: the order is placed online today, and the money changes hands at the doorstep days later. The Meta pixel only sees the first moment, if it sees anything at all.

So the event Meta records is order placed, not payment received. The real conversion, cash in hand, happens offline, off your site, and after a delay the browser pixel was never designed to capture. That gap is where COD attribution quietly falls apart.

You are optimising toward orders, not revenue

COD carries meaningfully higher cancellation and failed-delivery rates than prepaid orders. Customers change their mind, do not answer the door, or refuse the parcel. If you count order placed as your conversion, you are teaching Meta to find more people who place orders, including the ones who never pay.

The algorithm optimises toward whatever event you feed it. Feed it unpaid orders and it will faithfully bring you more unpaid orders. The number in Ads Manager climbs while the money in your account does not.

The delivered-and-paid event is your real conversion

The fix is to redefine the conversion as the outcome that actually banks money: delivered and paid. When your courier or fulfilment system marks an order as successfully delivered and collected, that is the moment to tell Meta a purchase happened.

Because that moment is offline and delayed, it can only be sent server-side, through the Conversions API, not the browser pixel. This is exactly the kind of real-order event our measurement work is built to capture and forward.

Keying the offline sale back to the ad

For Meta to credit the right campaign, the delivered event has to carry the identifiers from the original click. At checkout, capture and store the Meta click and browser identifiers (such as fbc and fbp) and any hashed customer details alongside the order.

  • At order time: store fbc/fbp and hashed customer data with the order record.
  • At delivery: fire a server-side purchase event with those same identifiers and the real paid value.
  • Deduplicate against any pixel event using a shared event ID so a sale is never counted twice.

Feed Meta the outcome, then optimise to it

Once delivered-and-paid events flow through CAPI with real values, you can optimise campaigns toward revenue that actually landed rather than orders that were merely placed. Meta starts finding buyers who complete, not browsers who abandon at the door.

This is the whole point of buying against real order truth. In a COD market, the delivered payment is the only conversion worth optimising to, and getting it back into Meta is what separates a store that scales profitably from one that scales cancellations.

Frequently asked questions

Why don't my cash-on-delivery sales show in Meta Ads Manager?+

Because the Meta pixel fires at order placement in the browser, while a COD sale only completes when the parcel is delivered and paid, days later and offline. That real conversion happens off your site and after a delay the pixel cannot capture, so it never reaches Meta unless you send it server-side.

Should I count an order or a delivered payment as the conversion for COD?+

The delivered payment. COD orders have high cancellation and failed-delivery rates, so optimising toward order placed teaches Meta to find people who order but never pay. Counting delivered-and-paid as the conversion optimises toward revenue that actually banks.

How do I send a delivered COD order back to Meta?+

Store the Meta click and browser identifiers (fbc, fbp) with the order at checkout, then fire a server-side Conversions API purchase event with those identifiers and the real paid value when the order is marked delivered and paid. Use a shared event ID to deduplicate against any pixel event.

Does COD hurt my Meta ad performance?+

Only if you measure it wrong. Untracked or order-based COD attribution makes Meta optimise toward unpaid orders, which hurts real performance. Once you feed Meta delivered-and-paid events with real values, the algorithm optimises toward customers who complete, and COD stops being a blind spot.

See your real numbers first

Measurement & Attribution runs on the same source of truth we build for every brand. Apply for a paid Measurement Audit and we will show you the gap before we touch a campaign.