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.

