Skip to content

Cash on delivery (COD) and courier returns: settling payments

Cash register, POS and shipments. Content verified: 12 October 2026.

When the courier delivers a cash on delivery parcel, they collect the money from the customer and transfer it to you in bulk, usually in one transfer for several parcels. Zaksio helps match such a transfer to specific parcels and propose posting.

Where the cash on delivery amount comes from

The cash on delivery amount comes from the order: if the order has a COD amount entered (cod_amount), we use it, and if there is none, the gross value of the order paid on delivery. You do not set it in the parcel creation window. You can save the account to which the courier will transfer COD payments in the courier account, in the "COD account (optional)" field. Couriers without COD (DHL Express), with COD only for a single parcel (GLS) or only for selected services (UPS Standard and Access Point Economy) are marked in the window.

  • "COD: awaiting delivery" (pending): the parcel is on its way.
  • "COD: collected, awaiting settlement" (collected): the courier has delivered the parcel and collected the money.
  • "COD: settled" (settled): the payment from the courier has been matched and posted.

Settling payments from the courier

  1. Import the bank statement in the "Bank" module so that inflows from the courier end up among the unmatched ones.
  2. In "Shipments", "COD" tab, click "Find matches".
  3. Zaksio looks for inflows whose reference contains parcel numbers and whose total matches the sum of their COD amounts (confidence 0.97). The second method: an inflow from the courier equal to the sum of all its delivered and not yet settled COD amounts (confidence 0.85).
  4. Each match goes to the "Team inbox" as a proposal (agent Marek). After approval we post Dr bank account, Cr 201, mark the inflow as matched, the orders as paid, and increase the payments on the related invoices.
  5. If there is no match, use "Settle selected manually": pick the bank inflow and the parcels it covers. This requires finance permission.
  • We settle only on an exact match of totals. The system does not guess a commission deducted by the courier or amount discrepancies: you settle them manually.
  • A single payment can cover cash on delivery amounts from only one courier and one currency.
  • We flag postings with needsReview: always confirm them with your accountant.

Returns and return labels

  1. You create a customer return in the orders module ("Returns"). It appears in the returns list in "Shipments" ("Returns" tab) with a "Generate label" button.
  2. By default we use the same courier and service as for the outgoing parcel, provided the courier supports returns. The addresses are swapped: the sender is the customer and the recipient is the account's sender address.
  3. You can download the return label in the return parcel details ("Labels" button on the return) and send it to the customer.
  4. When the courier delivers a return parcel, we record the event in the parcel log.
  5. Receiving goods into the warehouse remains manual: you do it in orders, together with the check of the goods' condition.
  • A return has at most one active return label. Closed or rejected returns do not get one.
  • Not every courier supports returns via API (for example GLS): in that case choose another courier.

Where to find it in the app

"Shipments" menu ("Warehouse" group): "COD" and "Returns" tabs. Viewing requires the shipping:read permission; generating labels and settling require the shipping:write permission (manual settlement also requires finance permission). The shipping module is enabled by the shipping feature in the business profile. You approve proposals in the "Team inbox".