Why COD breaks normal Shopify accounting.
Standard Shopify accounting assumes the gateway settles the order. With COD, the courier collects cash from the customer at delivery, then remits to you on a 7-21 day cycle. Between order and remittance, you have an in-flight asset: COD receivable from courier. If you book revenue at order, you have inflated current-period revenue with cash you may never see (RTO rate is often 10-25%).
The right model: book revenue and COGS only on courier delivery confirmation, not on order placement. The order sits as a fulfillment-pending state with no journal entry. When the courier confirms delivery, the order posts: debit COD receivable from courier, credit Sales, debit COGS, credit Inventory. When the courier remits, debit Bank, credit COD receivable, debit Courier fees, credit COD receivable.
The four courier reports you need.
Each courier exposes a delivery confirmation report, a cash-collected report, an RTO (return to origin) report, and a remittance report. These four reports together let you build a defensible COD ledger. Without all four, you are guessing.
DHL, FedEx, UPS, Royal Mail, Australia Post, USPS, and most regional 3PL operators expose CSV exports at minimum, and several offer webhooks. Nonari pulls these reports daily per branch so the COD ledger stays current within 24 hours of courier activity.
- Delivery confirmation: trigger to recognize revenue and COGS
- Cash collected: confirms amount the courier holds for you
- RTO report: triggers reversal for refused or returned parcels
- Remittance report: clears COD receivable to bank
A worked example, A$84 COD order via Australia Post.
Order placed: no journal entry. Order pending. Customer accepts delivery: debit COD receivable from Australia Post A$84, credit Sales A$84. COGS: debit COGS A$19.60 (4 units × A$4.90 WAC), credit Inventory A$19.60.
Two weeks later, Australia Post remits A$562 covering 7 orders including this one, after deducting A$14 in courier fees and A$2 in COD service charge. Journal: debit Bank A$562, debit Courier fees A$14, debit COD service charge A$2, credit COD receivable from Australia Post A$578. Receivable for that batch closes to zero.
RTO handling.
A returned parcel never generated revenue if you used delivery-confirmation policy, so there is nothing to reverse. The unit is in transit back to your warehouse. Inventory is technically still gone until the parcel reaches you. Track this as an Inventory in transit account: debit Inventory in transit, credit Inventory at the moment the parcel left for delivery if you want full granularity, or simply hold inventory at the source until parcel return.
When the parcel returns: if sellable, debit Inventory, credit Inventory in transit. If damaged, debit Inventory write-off, credit Inventory in transit. Either way, COD receivable was never debited because revenue was never posted. This is the core advantage of delivery-confirmation accounting on COD.
Failed delivery vs RTO.
Failed delivery means the courier could not deliver but the parcel is still in their network, often re-attempted. Revenue stays unposted. RTO means the parcel is being returned to you. Some merchants conflate the two and post revenue on first delivery attempt. This causes whiplash in the books when the RTO arrives.
Status discipline: only the courier-confirmed delivered status triggers revenue. Failed and out-for-delivery do not. Nonari uses the courier API status as the trigger so the policy is enforced automatically, not left to the bookkeeper’s vigilance.
COD service fees and chargebacks.
3PL couriers charge per-shipment fees, COD service charge (a percent of cash collected, often 1-2%), fuel surcharge, and sometimes weight-based add-ons. Each is its own expense line. Booking them all to a single Courier expense line works but loses analytical detail.
Better: Courier shipment fees, COD service charge, Fuel surcharge as three sub-accounts under a Logistics expense parent. At quarter end, you can see whether your unit economics are degrading because of COD percentage (charges scale with cash) or per-shipment (charges scale with volume). Nonari ingests the courier remittance report and posts to the right sub-accounts automatically.
COD aging and the fraud signal.
COD receivable should age in days, not weeks. A typical 3PL remittance cycle is 7-10 days; if your COD receivable from a courier is older than 14 days for a batch, something is wrong. Either delivery is stuck (call the courier), the courier has the cash but is delayed remitting (escalate), or the report ingest broke (fix it).
Aging by courier and by branch surfaces fraud and operational issues early. A specific city showing high RTO rates may indicate address-fraud. A specific courier branch showing slow remittance may indicate cash-handling issues. The COD ledger is one of the highest-signal operational metrics in markets where COD share is meaningful.
Where Nonari fits.
Nonari treats COD orders distinctly from prepaid orders. The Shopify webhook fires order pending. The courier API or daily report ingest fires the delivery confirmation, which posts revenue and COGS. The RTO report ingest reverses if needed. The remittance report clears COD receivable to bank with sub-account breakdown of fees.
Each courier connects per branch, so a warehouse using DHL as primary and FedEx as backup has both reconciled separately. Aging reports are built in. RTO rate analysis per courier per region helps you choose suppliers. The COD reality is the operational center of your books in any market where it’s significant, and Nonari treats it as a first-class citizen instead of an exception.