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.
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:
- 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.
- 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.
- 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.
- 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.
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.
Read next
Same category first, then the most recent. A related list that ignores the category is just the newest three posts wearing a different label.
Shopify returns management
Shopify returns management is the process of taking a return from the customer's request through to a refund, exchange or credit. Shopify's admin models the two ends — a request exists, and a refund...
Abandoned cart recovery on Shopify
Abandoned cart recovery on Shopify is the practice of bringing back shoppers who added items and left without buying. Shopify's built-in abandoned checkout email only reaches shoppers who reached checkout and entered an email...
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.
Comments
0No 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.