Cash on delivery still accounts for a large share of GCC e-commerce. It is also the reason many operators cannot tell you, with confidence, how much money they are actually owed.
The mechanics look simple. Customer orders, courier delivers, customer pays cash, courier sends you the money. In practice there are two to four weeks between the second and fourth steps, hundreds of orders bundled into a single remittance, a fee deducted before it arrives, and a proportion of deliveries that never completed at all.
Businesses that have not built the reconciliation carry all of that as an unexamined balance. This piece sets out what actually needs matching and how to structure it.
Why COD is harder than card
A card payment settles in a predictable window, net of a fee you can calculate, and the gateway gives you a settlement report tying each payout to specific transactions. Imperfect, but tractable.
COD has none of that reliability:
- The courier holds your money. Between collection and remittance the cash sits on their balance sheet, not yours.
- Remittances are aggregated. One bank credit might cover four hundred orders across eleven days.
- Fees are deducted first. COD handling charges, sometimes per order, sometimes as a percentage, occasionally both.
- Not every delivery completes. Refused at the door, customer unavailable, wrong address, returned. Each needs different treatment.
- File formats vary. Aramex, SMSA and Naqel each report differently, and formats change without notice.
The four things that must reconcile
| What | Against what | Why it matters |
|---|---|---|
| Delivered orders | Courier delivery confirmation | Revenue should not be recognised as collectable until delivery is confirmed. Orders in transit are not receivables in the ordinary sense. |
| Cash collected | Order value | Partial collection and price disputes at the door happen more than people expect. The difference has to land somewhere deliberate. |
| Remittance received | Cash collected, less fees | This is the line most operators never match. Without it you cannot tell whether the courier has paid you everything they collected. |
| Failed deliveries | Returned stock | A refused delivery is not just lost revenue — it is stock that should come back into inventory, and often a return fee. |
How to structure it in Odoo
1. A COD clearing account
The single most useful change. When an order is delivered, revenue is recognised and the balance sits in a COD clearing account rather than ordinary receivables. When the courier remits, the clearing account is relieved and the fee posted separately.
The balance on that account is, at any moment, the money couriers are holding on your behalf. If it does not roughly match what you expect, something is wrong — and you find out this week rather than at year end.
2. Per-courier sub-accounts
If you use Aramex in the UAE and SMSA in Saudi Arabia, keep them separate. Aggregating them hides the problem you most need to see, which is one courier's remittances slipping.
3. Fees to their own account
COD handling charges are a real cost of sale and should be visible as one. Netting them off revenue makes your gross margin look better than it is and removes any ability to negotiate.
4. Automated matching, human exceptions
The remittance file should be imported and matched automatically on order reference. Anything that does not match cleanly — short payment, missing order, unexpected credit — goes to an exception queue for a person. Manual matching of four hundred lines is not a process, it is a hostage situation.
A pattern worth adopting. Reconcile weekly, not monthly. Courier remittance disputes are far easier to resolve within days of the event, when the delivery record is still fresh and the rider is still contactable. A month later, you will usually just write it off.
What operators find when they finally do this
Consistently, three things.
Uncollected cash is higher than assumed. Not usually fraud — more often deliveries marked complete that were not, or cash collected and recorded against the wrong reference. Small percentages of large volumes add up.
COD fees are material. Once visible as a line rather than buried in net revenue, they are frequently significant enough to change which products are worth selling on COD terms at all.
Return rates on COD are higher than prepaid. Predictable in hindsight — a customer who has not paid has less commitment to accepting delivery. Seeing the number usually prompts a look at whether COD should be offered on every order or restricted by value or category.
The uncomfortable one. Businesses that reconcile COD properly for the first time often find their apparent growth was partly a receivable that had been accumulating rather than collecting. Better to know.
Where to start
- Create a COD clearing account, with sub-accounts per courier.
- Move revenue recognition to delivery confirmation rather than order placement.
- Get remittance files from each courier and map their format once.
- Automate matching on order reference; route exceptions to a person.
- Post COD fees to their own expense account.
- Reconcile weekly and treat the clearing balance as a number you watch.
For a business already running Odoo cleanly, this is typically three to five weeks of work, most of it in mapping courier file formats. The detail sits within our integrations and reconciliation work.
Not sure what your couriers are holding?
Thirty minutes to look at how your COD flow is recorded and what it would take to reconcile it properly.
Book a discovery call