Why COD payment reconciliation matters more than your courier rate
COD payment reconciliation means matching every parcel you shipped to the money your courier actually paid you, line by line. Most Pakistani sellers skip it. They look at the payment that lands in the bank, see a round-looking number, and move on. The problem is that a COD parcel passes through a rider, a branch, a settlement team and a bank transfer before it becomes your money, and at each step a parcel can be missed, short-paid or charged twice.
This post gives you a three-tab Google Sheet you can copy today: one tab for your orders, one where you paste the courier's payment report, and one that flags every parcel that needs a phone call. There is a worked Rs example and a weekly routine, so it takes about 20 minutes a week once it is set up.
How long does the courier keep your COD money?
Long enough for mistakes to get lost. An April 2026 comparison of Pakistani courier rates lists these indicative COD settlement times:
| Courier | Indicative COD settlement (April 2026 comparison) |
|---|---|
| TCS | 7 to 14 working days for retail accounts |
| Leopards | 7 to 10 working days |
| M&P | 7 to 14 working days (standard) |
| PostEx | Upfront or same day |
These are ranges from one public comparison, not promises, and your contract may say something else. TechCrunch reported in 2024 that most couriers in Pakistan take 10 to 15 days to settle COD transactions. Returns are slower still: a June 2026 OrderNation study of one large Pakistani retailer found that a failed COD delivery took a median of 21.7 days to show up in the seller's books.
So at any moment, two to three weeks of your sales are somewhere between the rider and your bank. If you ship 50 parcels a day, that is 700 to 1,000 parcels in the pipeline. Nobody checks that many by memory. A sheet does.
What goes wrong between delivery and payment
These are the five problems the sheet is built to catch. None of them needs bad intent; most are data-entry errors at a branch or a status that was never updated.
- Delivered but not paid: tracking says delivered, but the parcel is missing from every payment report so far.
- Short paid: the parcel is in the report, but the amount collected is less than your COD amount, for example because the buyer was given a discount at the door or the wrong amount was entered.
- Overcharged: the shipping, COD fee or return charge in the report is higher than your rate card, or a parcel is charged twice.
- Returned but not received: tracking says returned to shipper, but the parcel never reached your warehouse.
- Tax deduction does not match: couriers deduct tax from collected cash, and the amount should match the rate that applies to your account.
On tax: according to a Taxation PK summary, couriers collecting cash on delivery for digitally ordered goods collect 2% income tax under Section 6A of the Income Tax Ordinance, 2001, and 2% sales tax on the gross value of supplies. Which rate applies to you depends on your tax status, so check with your accountant and enter your own rate in the sheet. The point here is only to check that what was deducted matches that rate, and to keep the record for your tax return.
The template: copy this COD reconciliation sheet into Google Sheets
Create a Google Sheet with four tabs named exactly Rates, Orders, Settlement and Summary, so the formulas below work without changes. Use one sheet per courier.
Tab 1, Rates. Type the labels in column A and your numbers in column B.
| Cell | Label (column A) | What to enter in column B |
|---|---|---|
| B1 | Forward charge per parcel | From your rate card, in Rs |
| B2 | COD fee per delivered parcel | From your rate card, in Rs |
| B3 | Return charge per returned parcel | From your rate card, in Rs |
| B4 | Tax rate on collected cash | The total rate that applies to you, e.g. 4% |
| B5 | Days before you chase an unpaid parcel | Your contract's settlement time in calendar days, plus a few days |
| B6 | Overcharge tolerance | Rs difference you ignore, e.g. 10 |
Tab 2, Settlement. Every time the courier sends a payment report, paste its rows here, one row per tracking number, in this order: A Tracking number, B Payment date, C Amount collected, D Shipping charge, E COD fee, F Return charge, G Tax deducted, H Net paid. If your courier's export has different columns, move them into this order once and keep the layout fixed.
Tab 3, Orders. One row per parcel shipped. Fill columns A to H yourself or from your order export: A Order number, B Tracking number, C Booking date, D COD amount, E Status (Delivered, Returned, In transit or Lost), F Status date, G Product cost, H Received back (Y or N, for returns only). Then add these formulas in row 2 and drag them down:
| Column | Name | Formula (row 2) |
|---|---|---|
| I | In a payment report? | =COUNTIF(Settlement!A:A,B2)>0 |
| J | Collected per courier | =SUMIF(Settlement!A:A,B2,Settlement!C:C) |
| K | Short paid | =IF(AND(E2="Delivered",I2),D2-J2,0) |
| L | Charged | =SUMIF(Settlement!A:A,B2,Settlement!D:D)+SUMIF(Settlement!A:A,B2,Settlement!E:E)+SUMIF(Settlement!A:A,B2,Settlement!F:F) |
| M | Should be charged | =IF(E2="Delivered",Rates!B1+Rates!B2,IF(E2="Returned",Rates!B1+Rates!B3,0)) |
| N | Overcharge | =IF(I2,L2-M2,0) |
| O | Days since status | =IF(F2="","",TODAY()-F2) |
| P | Action | =IF(AND(E2="Delivered",NOT(I2),O2>Rates!B5),"CHASE: not paid",IF(K2>0,"CHASE: short paid",IF(N2>Rates!B6,"CHECK: overcharged",IF(AND(E2="Returned",H2<>"Y",O2>7),"CHASE: return not received","")))) |
If your courier charges the COD fee on every shipment and not only on delivered parcels, change the M formula to add Rates!B2 in both cases. If returns are charged at the forward rate, put the same number in B1 and B3.
Tab 4, Summary. Type these labels in column A and formulas in column B:
| Label | Formula |
|---|---|
| Delivered COD value | =SUMIF(Orders!E:E,"Delivered",Orders!D:D) |
| Net cash received | =SUM(Settlement!H:H) |
| Delivered, not yet paid | =SUMIFS(Orders!D:D,Orders!E:E,"Delivered",Orders!I:I,FALSE) |
| Of which overdue (to chase) | =SUMIFS(Orders!D:D,Orders!P:P,"CHASE: not paid") |
| Short paid total | =SUM(Orders!K:K) |
| Overcharges total | =SUMIF(Orders!N:N,">"&Rates!B6) |
| Returns not received (at cost) | =SUMIFS(Orders!G:G,Orders!P:P,"CHASE: return not received") |
| Tax deducted | =SUM(Settlement!G:G) |
| Tax expected at your rate | =SUM(Settlement!C:C)*Rates!B4 |
Finally, add a filter on Orders column P. Filtering for anything that starts with CHASE gives you the exact list of tracking numbers to send to your account manager.
Example: what one month of reconciliation finds
Example (illustrative numbers, not real courier rates or store data). A seller ships 200 parcels in a month with one courier. Each COD amount is Rs 3,000, product cost is Rs 1,100, the rate card says Rs 200 forward, Rs 100 COD fee and Rs 200 per return, and the tax rate entered is 4%. Three weeks after the month ends, the status is: 160 delivered, 36 returned, 4 still in transit.
| What the sheet flags | Parcels | Rs |
|---|---|---|
| Delivered, in no payment report, older than the chase limit | 3 | 9,000 |
| Delivered, in no report yet, still within the limit | 5 | 15,000 (wait) |
| Short paid: Rs 2,500 collected on a Rs 3,000 parcel | 1 | 500 |
| Return charged Rs 250 instead of Rs 200 | 36 | 1,800 |
| Returned per tracking, not received after 7 days (at cost) | 2 | 2,200 |
| Total to chase this month | 42 | 13,500 |
Rs 13,500 is about 2.8% of the Rs 480,000 delivered COD value in this example, and it shows up only because each parcel was checked against the report. Looking at the bank transfer alone, none of it would be visible.
The tax check in this example: the 152 paid parcels collected Rs 455,500 (151 at Rs 3,000 and one at Rs 2,500). At the 4% entered in Rates, the expected deduction is Rs 18,220. If the reports show a different total, ask the courier which rate is applied to your account and confirm it with your accountant.
Weekly routine: 20 minutes every Monday
- Download every payment report the courier sent last week and paste the rows at the bottom of the Settlement tab. Never delete old rows; duplicates will show as overcharges, which is also something you want to know.
- Update the Status and Status date columns on Orders from the courier portal or your tracking export. If you ship with Leopards, PostEx, DEX, Daewoo or Avix, RabbitROI updates courier tracking automatically, which keeps this column current without copying.
- Mark Received back as Y for every returned parcel that physically reached you, after opening it and checking the product.
- Filter column P for CHASE and CHECK. Send the list of tracking numbers in one message to your account manager, with the amount you expect for each.
- Write the date you raised each case in a notes column. If a case is not solved in two weeks, escalate in writing and, for lost parcels, file a claim before the courier's deadline.
- Once a month, compare the Summary tab's Tax deducted with Tax expected, and save that month's payment reports in one folder for your accountant.
Mistakes that make reconciliation useless
- Matching on order number instead of tracking number. Couriers report by tracking number, and one order can have two parcels.
- Trusting the tracking status for cash. Delivered on tracking means the rider marked it; only the payment report means you were paid.
- Checking only the bank total. A total can look right while one parcel is missing and another is counted twice.
- Leaving returns out. A return you never received is lost stock, and if you do not chase it within days, it is very hard to prove later.
- Mixing two couriers in one sheet. Rate cards and report layouts differ, so keep one copy per courier and add the Summary totals together.
- Waiting for month end. A weekly check means each case is still fresh when you raise it, and the rider or branch can still trace it.
FAQ
What is COD payment reconciliation?
It is matching every parcel you shipped to the courier's payment reports, so you can see which delivered parcels were paid, short-paid, overcharged or not paid at all, and which returns never came back.
How long do couriers in Pakistan take to pay COD money?
An April 2026 rate comparison lists indicative settlement of 7 to 10 working days for Leopards, 7 to 14 working days for TCS and M&P retail accounts, and upfront or same day for PostEx. Check your own contract and bank statements.
What should I do if a delivered parcel is not in any payment report?
Wait until your contract's settlement time has passed, then send the tracking number, delivery date and COD amount to your courier account manager in writing, and keep a record of the date you raised it.
How much tax does the courier deduct from COD payments?
According to a Taxation PK summary, couriers collect 2% income tax under Section 6A and 2% sales tax on cash collected for digitally ordered goods. Your rate depends on your tax status, so check with your accountant.
How often should I reconcile courier payments?
Every week. Weekly checks keep cases fresh enough for the courier to trace, while monthly checks leave three to four weeks of parcels unexamined.
Comments
No comments yet. Start the conversation.