Skip to content
HomeAbout UsInsightsContact UsBook a free consultation

Cash on delivery reconciliation

Cash on delivery reconciliation

Cash on delivery reconciliation is the process of matching every COD order in Shopify against the money a courier actually remits to your bank. It matters because Shopify marks a COD order as paid when the courier says it was delivered — not when the cash reaches you. The gap between those two events is where the losses live.

Shopify handles prepaid orders end to end. The customer pays, the payment gateway settles, and the payout in your bank matches the orders it covers. COD breaks that chain in one specific place: a third party holds your money for days or weeks before passing on some of it. Everything difficult about COD follows from that sentence.

Where cash-on-delivery money goes between checkout and your bank A COD order passes through five stages — order placed, out for delivery, cash collected by the courier, a batched courier remittance, and a bank credit. Reconciliation compares the bank credit against the orders it is meant to cover, and every mismatch falls into one of four queues: short payment, missing remittance, an RTO or return-to-origin fee, or a delivered order never remitted. The COD cash path Every stage below is a place the amount can change. Shopify only knows about the first one. Order placed Shopify records the full amount Out for delivery Courier holds the parcel Cash collected Customer pays the courier Courier remits Batched, on the courier's cycle minus fees Bank credit One line, many orders THE RECONCILIATION GAP Days to weeks, and the amount that arrives is rarely the amount Shopify recorded Reconcile Match each bank credit back to its orders Every mismatch lands in one of four queues Short payment Remitted less than the order value. Usually an undeclared fee, sometimes a partial. Missing remittance Delivered, cash collected, never appeared in any payout. The costly one. RTO fee Returned to origin. No revenue, and you are still charged both legs. Matched Amount and fees agree. The only queue that should need no human attention.
The cash path of a COD order: placed, out for delivery, cash collected by the courier, batched remittance minus fees, then a single bank credit covering many orders. Reconciliation sorts every order into matched, short paid, missing remittance, or RTO.

Why doesn't Shopify reconcile COD orders automatically?

Because Shopify never sees the money. For a prepaid order, Shopify Payments or your gateway is party to the transaction, so Shopify can tell you exactly what settled and when. For a COD order, the cash goes from your customer to a courier's rider, into the courier's account, and eventually to your bank as a single batched transfer. Shopify has no visibility into any of those steps.

What Shopify records is the order value. What arrives is the remitted value. Those differ by courier fees, COD handling charges, return-to-origin (RTO) charges, tax withholding in some markets, and — often enough to matter — errors. Reconciliation is the work of explaining every difference between the two numbers.

What makes COD reconciliation hard in practice?

Three structural problems, none of which is solved by working harder in a spreadsheet.

1. Remittances are batched, orders are not

A courier does not pay you per order. It pays you per cycle — weekly, fortnightly, or on its own schedule — as one bank credit covering an arbitrary set of deliveries. One credit might cover 340 orders placed across eleven days, minus fees, minus RTOs from an earlier batch. Matching is many-to-one, and the courier's statement is usually the only document that says which orders a given credit covers.

2. Every courier reports differently

If you ship with three couriers you have three remittance formats, three fee structures, three definitions of when an order counts as delivered, and three ways of representing an RTO. A merchant on a single courier can hold the process in their head. A merchant on three cannot, and that is usually the point at which reconciliation quietly stops happening.

3. RTO is a cost with no revenue attached

A return to origin produces no payment, and you are typically charged for both the outbound and return legs. In the Shopify admin it looks like a cancelled order. In your accounts it is a negative number that has to be attributed to a specific order, a specific courier and, ideally, a specific customer — because repeat refusers are a pattern, not bad luck.

What does a correct COD reconciliation process look like?

Five steps. The order matters: each one is only possible once the previous one exists.

Step What it produces What breaks without it
1. Record the expected amount Order value, courier, and expected fee at the moment of dispatch You have nothing to compare a remittance against later
2. Track delivery state per order Delivered, RTO, in transit, lost Undelivered orders sit in the "awaiting payment" pile forever
3. Import the remittance The courier's statement, as data rather than a PDF Matching is manual, so it stops when volume rises
4. Match and classify Every order in one of four states You know the total is wrong but not which orders are wrong
5. Work the exception queue Claims raised with the courier, within their window Claim windows expire and the loss becomes permanent

Step five is where the money is recovered, and it is the step most stores never reach — not because it is hard, but because steps one to four were never built, so there is no queue to work.

What are the four outcomes of a reconciliation run?

Every order, after matching, is in exactly one of these states. If your process cannot put every order in exactly one, it is not finished.

  • Matched. Remitted amount equals order value minus agreed fees. Needs no attention. On a healthy account this should be the overwhelming majority.
  • Short paid. Money arrived, but less than expected. Usually an undeclared or misapplied fee; occasionally a partial delivery. Worth a claim when the pattern repeats, rarely worth one in isolation.
  • Missing remittance. Delivered, cash collected from the customer, never appeared in any payout. This is the expensive category and the one with a hard deadline — most couriers will not entertain a claim after their stated window.
  • RTO. No revenue, and charges on both legs. Not a reconciliation error, but it must be attributed rather than absorbed, because RTO rate by courier, by region and by customer is the input to every decision you will make about reducing it.

How do you reduce RTO rather than just accounting for it?

Reconciliation tells you where RTO is concentrated. Acting on it is a separate job, and the levers are ordered by how much they cost you to pull:

  1. Verify the order before dispatch. A phone or address confirmation step catches wrong numbers and unserviceable addresses before you have paid for an outbound leg.
  2. Score repeat refusers. A customer who has refused three COD deliveries is not a customer. You need order history keyed to a phone number to see it at all.
  3. Ask for partial prepayment. Even a small prepaid deposit filters low-intent orders, at the cost of some genuine ones. Test it rather than assuming the direction.
  4. Restrict COD by signal. Region, order value, or customer history. The bluntest lever, and the one most likely to cost real revenue, so reach for it last.

When does a spreadsheet stop working?

Sooner than most merchants expect, and the trigger is couriers rather than order volume. One courier and a few hundred orders a month is a manageable monthly spreadsheet. The moment you add a second courier with a different remittance format, the work roughly doubles rather than growing by half — you are now maintaining two mappings, two fee models and two claim processes, and reconciling them against one Shopify order list.

The practical signal is simpler than any threshold: if you cannot answer "which specific orders is this bank credit paying for?" within a few minutes, reconciliation has already stopped being a real control and has become a monthly ritual that confirms the total looks approximately right.

What to do next

If you run COD at any volume, the first thing worth doing is not choosing software. It is running one cycle manually, end to end, and classifying every order into the four states above. That single exercise tells you your actual short-payment rate, your actual RTO rate by courier, and whether you have any missing remittances — three numbers most COD merchants have never seen, and all three of which change what you do next.

We build Ordexa for the stores where that exercise proves the problem is structural: courier automation, COD remittance reconciliation and customer lifecycle history in one place. If the exercise shows your process is fine, you have lost an afternoon and gained three numbers worth knowing.

Ahmad Naeem

Shopify developer, TLX Apps

Comments

0

No comments on this post yet. Be the first.

Leave a comment

Corrections welcome, especially if you have run into a failure mode this piece does not cover.

Your email is not published. Comments are reviewed before they appear.

FAQ

Questions this raises

Almost never. Shopify Markets handles currency, language and domain from one store, and a second store doubles every maintenance job you have — theme updates, app installs, catalogue changes. A separate store is justified when the catalogue and the legal entity genuinely differ, not when only the language does.

For product specifications and shipping copy, largely yes, with review. For anything that carries brand voice — a homepage headline, a campaign, a product story — machine output reads as machine output in exactly the places a customer is deciding whether to trust you.

Prices and availability, then legal copy. Both are the kind of wrong that costs money rather than credibility, which is why monitoring should watch them first.

Make the source of truth structured — Shopify metafields and metaobjects rather than hardcoded theme strings — so a new translation is a content task rather than a developer ticket. That single decision is most of the difference between a store that stays translated and one that does not.

Yes, for making sure the right regional page ranks for the right audience instead of competing with itself. It does not rescue a store where the translations are thin — fix the content first.

Something here apply to your store?

Describe the problem rather than the service. We reply within one business day, including when the answer is that you do not need us.