In Bangladesh and many other markets, a large share of online orders are cash on delivery (COD), and many sales happen in WhatsApp or Messenger chat. That is good for customers, but it confuses Meta. A COD order placed on the website may be fake or refused at the door, and a WhatsApp sale never touches your website at all. If Meta learns from the wrong signals, it finds more fake orders and fewer real buyers.
Why are COD and WhatsApp orders hard to track?
- COD: the website order is placed immediately, but the money arrives days later, and some orders are cancelled or refused.
- WhatsApp: the visitor clicks a WhatsApp button, chats, and orders in the chat. The website only sees the click.
- Both: Meta sees the first step, not the real result.
Step 1: Track the first action immediately
Send Meta the first action as soon as it happens, so it gets fast feedback:
| Action | Event |
|---|---|
| COD order placed on the website | Purchase (with value, currency, order ID) |
| WhatsApp button clicked | Contact or a custom whatsapp_click event |
| Messenger button clicked | Contact |
Use both the Pixel and the Conversions API, with the same event_id, as in Meta Pixel vs Conversion API. On WooCommerce stores I usually send purchases from the order itself, as covered in WooCommerce server-side tracking.
Step 2: Keep the identifiers with the order
When the order is placed or the WhatsApp click happens, save what Meta needs to match the customer later:
_fbcand_fbpcookies (click and browser IDs)- the customer's phone number and email, if given
- the order or chat reference
For a WhatsApp click, you can add a short reference code to the pre-filled message, so the chat can be linked to the click.
Step 3: Send confirmed orders back to Meta
When an order is confirmed or delivered, send it to Meta through the Conversions API, with hashed phone and email and the saved identifiers. Meta has moved offline events into the Conversions API, so the same connection works for website and offline sales.
You have two common options:
- Separate event: keep Purchase for placed orders and send a custom event such as
ConfirmedPurchasefor delivered orders. Later, you can optimise for the confirmed event once there is enough volume. - Corrected purchase: send Purchase only when the order is confirmed, if speed matters less than accuracy.
For WhatsApp, record confirmed chat orders in a sheet, CRM or order system that can send events to your server container.
Which should Meta optimise for?
- New store, few orders: optimise for Purchase (placed) to get enough volume.
- High fake or refused rate: move optimisation to the confirmed event once it has steady volume.
- Mostly WhatsApp sales: run messaging campaigns, and use confirmed chat orders to judge which ads bring real buyers.
See how to choose the right optimisation event for the trade-offs.
Checklist
- COD purchase sent with value, currency and order ID, from browser and server
- WhatsApp clicks tracked as Contact or a custom event
- fbc, fbp and phone saved with each order
- Confirmed or delivered orders sent through the Conversions API
- Cancelled and refused orders excluded from optimisation
Final thoughts
COD and WhatsApp selling do not have to mean guessing. Track the first step quickly, keep the identifiers, and tell Meta which orders became real sales. This is the setup I build for Bangladeshi stores in my Meta Ads management service; you can book a free audit to see how it would work for yours.