Skip to content

COD & payments · 8 min read

Courier paid less than you sold? Reconcile COD parcel by parcel.

Your courier collects the cash, takes its fees and tax, and sends one lump sum. Shopify never sees that payment report. Here's where the money slips out, how to match it to your orders in a spreadsheet, and the ledger that stops it for good.

FA

Fahad Azhar

Shopify & full-stack developer ·

In 30 seconds

The whole article, in four cards.

  1. 01

    Four leaks

    Short payment, wrong fee, RTO charged on a delivered parcel, and parcels never paid.

  2. 02

    Shopify can't see it

    COD orders stay pending. There's no import for your courier's payment report.

  3. 03

    Match by tracking number

    Every courier line to one Shopify order. Anything that doesn't match goes on a claim sheet.

  4. 04

    Make it a ledger

    Import, match, flag, claim, mark paid, restock RTOs. One place, every payment.

Where COD money goes missing

Your courier collects cash at the door, takes its charges and tax, and sends one payment for hundreds of parcels. Unless someone checks each parcel on that report, these four leaks go unnoticed:

  • Short payment. The parcel was delivered, but less than the COD amount reached you.
  • Wrong fee. A charge that doesn't match your rate card: the wrong weight slab, a city charged as out-of-zone, or a fee applied twice.
  • RTO on a delivered parcel. The customer has the goods, the report says returned. You lose the cash and pay a return fee.
  • Never paid. Tracking says delivered, but the parcel isn't on any payment, well past your agreed settlement cycle.

There's also tax. Since the Finance Act 2025, couriers collecting COD for online sellers withhold tax for the FBR before paying you. KPMG reported the 2025 rate as 2% on cash-on-delivery orders, and couriers told sellers they would deduct sales tax as well. It isn't a leak, but it must sit in its own column. Check it against the current FBR rate and keep the certificate, or it hides the real errors.

Why Shopify can't catch it

Shopify knows what you sold. It has never seen what the courier paid. Four gaps stop it from reconciling:

  1. No remittance import. There's nowhere to upload a courier's payment report and match it to orders.
  2. COD stays pending. Shopify's help centre says manual payment orders, COD included, are marked as unpaid, and you mark each one paid after you receive the money.
  3. Returns don't settle COD orders. A merchant in the Shopify Community reports that closing a return on a COD order doesn't update it, because the order is still payment pending. There was never a payment to refund.
  4. Fulfilled orders can't simply be cancelled. Shopify says a partially fulfilled order can't be cancelled until you cancel the fulfillment. So RTOs pile up as open, unpaid orders that look the same as parcels still on the road.

Shopify tells you what you sold. Only your courier's report tells you what you were paid. Reconciliation is matching the two.

Is your courier paying you right?

Two steps: work out what your courier should have paid for last month, then compare it with what actually reached your bank.

COD payout check · runs in your browser

Put in last month's numbers from your courier's rate card and payment statement. The starting values are only an example.

1. Last month

The rest came back (RTO)

As shown on your payment statement

Cash collected (240 delivered)
PKR 600,000
Courier charges (240 delivered + 60 RTO)
− PKR 72,000
Tax withheld
− PKR 12,000
Your courier should pay you
PKR 516,000

2. What did they actually pay?

Add up the payments for those parcels

Enter what you received to see the difference.

Each delivered parcel wrongly marked RTO costs you

PKR 2,400

Each delivered parcel never paid costs you

PKR 2,200

Get my payments matched on WhatsApp

Should pay = cash collected − delivery charges − RTO charges − tax. It uses your averages, so a small difference can come from order values; a big one means parcels to check.

Reconcile it in a spreadsheet

You can start today with what you have. Do this every time a payment lands:

  1. Export both sides. The courier's payment or settlement report for that payment (from its merchant portal or the email it sends), and your Shopify orders for the same period, with the tracking number on each order.
  2. Match on tracking number. Use the tracking (AWB or consignment) number, not the order number. It's the only ID both sides carry exactly. In Google Sheets or Excel, pull each courier line onto its order with XLOOKUP.
  3. Add a difference column. COD amount − courier charges − tax − amount paid. Anything not zero needs a reason.
  4. Check every RTO against tracking. If the tracking history shows a delivery, or the customer confirms they have it, it's a wrong RTO.
  5. List the delivered parcels that aren't paid. Filter delivered orders with no payment line and note how many days since delivery.
  6. Send one claim sheet. Tracking number, issue, amount, and proof, all in one file to your courier's account manager. Then mark only the fully matched orders as paid in Shopify.

Where this breaks

It works for one courier and a few hundred parcels. With two or three couriers, each with its own report format, part-payments across weeks and RTOs arriving late, the sheet goes stale and claims are missed.

The lasting fix: a reconciliation ledger

A ledger is the spreadsheet above, made permanent and automatic. It does six jobs:

  • Import each courier's payment report as it is, PostEx, TCS, Leopards or Trax, without retyping.
  • Match every line to its Shopify order by tracking number, saved when the parcel is booked.
  • Flag short payments, overcharges against your rate card, RTOs on delivered parcels, and parcels unpaid past your settlement cycle.
  • Build the claim sheet for you, and track each claim until it's paid or rejected.
  • Mark matched orders paid in Shopify, so "payment pending" means money you're still owed.
  • Restock RTOs when they arrive, not when the courier marks them returned, and feed real cash, fees, tax and returns into your P&L.

Does your store need one yet? Tick what's true.

0/5

You're in good shape.

Keep matching every payment. Recheck once you add a courier or volume grows.

Why I build it this way

I ran e-commerce operations at a Pakistani fashion brand. I put in an OMS and warehouse system for 5,000+ SKUs and 1,000+ daily orders, set up the courier integrations, including TCS and DHL, and did COD reconciliation myself. The money we found was almost never fraud. It was parcels nobody matched.

Today I run the Shopify stack for a store in Pakistan and in three other countries: webhooks, Shopify apps, and Supabase dashboards, including an inventory ledger and a P&L. A COD ledger is the same pattern: every movement recorded once, matched to an order, and checked.

Want to know what your last payment was missing? Send me the courier report on WhatsApp and I'll match it against your orders.

Questions

What is COD reconciliation?

Checking that every cash-on-delivery parcel your courier delivered was paid to you in full, with the right fees and tax taken off, and that returned parcels were charged as returns only. You match the courier's payment report to your Shopify orders, one tracking number at a time.

What should I match courier payments on: order number or tracking number?

Tracking number (the AWB or consignment number). It's the one ID that appears on both sides exactly. Order numbers are often missing, shortened or typed differently in courier reports. Save the tracking number on the Shopify order at booking so the match is automatic.

Why do my COD orders stay 'Payment pending' in Shopify?

Cash on delivery is a manual payment method. Shopify marks those orders as pending or unpaid and expects you to mark each one as paid after you receive the money. It has no link to your courier's remittance, so it never updates on its own.

Can I cancel a COD order in Shopify after it was returned?

Not directly once it's fulfilled. Shopify's help centre says a partially fulfilled order can't be cancelled until you cancel the fulfillment, and that returned goods on a fulfilled order go through the returns process. Track the RTO and restock in your own record so the order and stock stay correct.

Is the tax the courier deducts a courier charge?

No. Since the Finance Act 2025, couriers collecting COD for online sellers withhold tax for the FBR. Keep it as a separate column, check the rate against the current FBR notification, and keep your courier's tax certificate for your adviser.

How often should I reconcile COD?

Every time a payment lands, not at month end. A claim is easier to win while the parcel is recent, and a weekly habit means a wrong RTO or a missing parcel is found in days, not after the courier's dispute window has passed.

Find out what your courier still owes you.

Send me your last courier payment report and Shopify order export. I'll match them by tracking number and show you every short payment, wrong RTO and unpaid parcel.

Start a project

Get a free audit of your store.

Send your store link and what you're aiming for. Within 48 hours you'll get a short video with the biggest wins for conversion and speed. No obligation.

What you get, free

  • Your top 3 conversion leaks, with fixes
  • Mobile speed check and what's slowing it
  • A clear quote if you want me to do the work
Prefer WhatsApp?Message me on WhatsApp
What do you need?
Budget

Replies within one working day. Your details are never shared.