Where it sits on the path: Sale · Revenue

E-commerce growth · Practical guide

How to find out why cash-on-delivery orders get refused, and cut refusals before the order ships

A refused parcel brings the product back, but not the two-way shipping or the ad spend behind it. Read refusals in your store and courier reports, and confirm each order before it ships.

The short answer

The common reasons cash-on-delivery orders get refused are visible before shipping: an impulse order with no commitment, a phone or address that doesn't connect, or a slow delivery. First check: calculate the refusal rate on shipped orders, not recorded ones, for a week whose deliveries have settled, split by reason, city and campaign. Then confirm every order before it ships, and follow each parcel with the courier.

The bottom line

  • Measure refusals on parcels shipped in a week whose deliveries have settled, and keep orders cancelled at confirmation in a column of their own.
  • Split refusals by reason, city, product, campaign and courier; a single store-wide rate hides where they come from.
  • No order reaches the warehouse until the customer has confirmed it, by phone or by a utility message with no offer in it.
  • Confirmation saves shipping and frees stock; only fixing the campaign that brings in refused orders protects the ad money.
  • Chase every stuck parcel with the courier on the day it stalls, before it starts the trip back.
In this article6 sections
  1. Where do refused COD orders show up in your reports?
  2. Why does a customer refuse an order they placed?
  3. How do you measure the refusal rate so the cause shows?
  4. What does each refusal pattern mean, and what do you do first?
  5. How do you cut refusals before the order leaves the warehouse?
  6. When does this stop being an in-house fix?

The courier's settlement statement comes in: a long column of cash collected, a shorter one of parcels that brought in nothing. They now sit in a corner of the warehouse, some marked "refused" or "no answer" in the driver's hand. Your Salla or Zid dashboard (two Saudi store platforms) still counts them as orders; the ad report counted them as purchases on day one; the bank hasn't seen a riyal.

In my reading, most refusals are settled before the parcel leaves the warehouse, not at the door. Your cash-on-delivery (COD) refusal rate is COD parcels refused at the door or returned to sender undelivered, divided by COD parcels shipped in the same period, by ship date. Orders cancelled at confirmation count separately: they show confirmation working, not refusals.

Refusal is an operations problem before it's a matter of customer mood, and my rule for it has three parts: chase confirmation on every order before it leaves the warehouse, follow up with the courier precisely and, best of all, have a smart tracking system.

A hypothetical example with round numbers: a Riyadh store on Salla takes 1,000 orders in a month whose parcels have all settled, all COD, averaging SAR 200. It spends SAR 20,000 on ads, SAR 20 per recorded order, and pays SAR 20 to ship a parcel and SAR 20 more if it comes back. It ships every order unconfirmed.

Where do refused COD orders show up in your reports?

In five places, all before the bank:

  • The courier's settlement statement. A payout short of what you shipped that a late transfer can't explain.
  • The returns report. Reasons, in the courier's own labels.
  • Order statuses in your store dashboard. Orders still "shipped" days past the usual delivery time for their city.
  • The ad report. More purchases than deliveries: the tracking tag usually fires when the order is placed, before anyone knows whether it'll be accepted.
  • The warehouse. Stock neither on the shelf nor with a customer.

In the hypothetical example, the ad report shows 1,000 purchases worth SAR 200,000. The settlement statement shows 800 parcels delivered, SAR 160,000 collected and 200 returned: a 20% refusal rate. Each return cost SAR 40 in two-way shipping, SAR 8,000 in all. Behind them sit SAR 4,000 of ad spend and SAR 40,000 of stock, at selling price, off the shelf until it came back.

Why does a customer refuse an order they placed?

Because a COD order costs the customer nothing at the click, and everything after it tests a commitment they never made. The ranking is my judgment, not a statistic: I know of no official source publishing refusal rates for Saudi Arabia or Jordan.

An impulse order with no commitment. The ad pushes for an instant purchase, checkout asks for no card, and people order what they haven't decided on, then forget it before it arrives.

A phone number or address that doesn't reach anyone. A number one digit short, an address with no landmark, a customer who ignores unknown numbers. The parcel comes back "no answer"; the fault was an address nobody checked.

A slow delivery. Every day between order and door gives the customer time to change their mind or buy elsewhere, especially far from your warehouse or when nobody watches the driver's attempts.

A mismatched expectation, or an order that isn't serious. A photo that makes the item look bigger, a cash amount higher than the customer understood, an order placed twice.

How do you measure the refusal rate so the cause shows?

Measure it on a settled week's shipped parcels, then split it until the refusals cluster. This is the order I'd check in:

  1. Pick a settled week: not the latest, which understates refusals while its returns are on the road, but one with no parcel still open in the courier statement.
  2. Join two files, shipped orders and the courier's statement, on order or waybill number.
  3. Do the division, using the definition above.
  4. Split it, first by reason as the courier recorded it (refused at the door, no answer, wrong address or phone); find duplicates by mobile number in your own export.
  5. City and delivery time. One store-wide rate hides the city dragging the average.
  6. Product and basket value. A product refused more often usually has a problem on its page.
  7. Campaign or source, next to the ad report; why the two differ is in High ROAS, losing money.
  8. Courier, if you use more than one, compared city by city.

I read sales and operations data before the ad report, not after; otherwise you judge a campaign by its own numbers.

In the hypothetical example, the 200 returns: 90 "no answer", 60 refused at the door, 40 wrong address or phone and 10 duplicates from your own export. By city: inside Riyadh, 100 of 800 parcels came back; outside Riyadh, 100 of 200, half. By campaign: one brought in 500 orders, 160 of them refused (32%), while all other sources brought 500 with 40 refused. The question becomes what this campaign promises, and to whom.

What does each refusal pattern mean, and what do you do first?

Each pattern from your split points to a likely cause and a first move.

Pattern Likely cause Where to check What to do
Refusals concentrated in one campaign An ad promise pulling in impulse orders Shipped parcels by campaign, beside the ad report Confirm its orders first; review its promise and audience before raising budget
"No answer" is the top reason Wrong number, a customer wary of unknown callers, or weak driver attempts Return reasons and attempt log in the courier statement Confirm the number; say the driver will call; flag stalled waybills to the courier weekly
A city at twice the store average or more Longer delivery, or incomplete driver attempts Refusals by city, with delivery time Honest delivery promise and courier comparison there; in Zid, hide COD there; otherwise, phone-confirm its orders
Duplicates on one number, or a customer who cancelled before refusing again A double tap, or a non-serious customer Order export by mobile number, then order history Merge or cancel at confirmation; in Zid, hide COD for past cancellers once you've checked refused orders are recorded as cancelled; otherwise, call first
Large baskets refused more than small A large cash amount due at the door Refusals by basket-value band A confirmation call above a set threshold; in Zid, hide COD above a cart value
One product refused at the door Photo, description or final amount not as expected Refusals by product, "refused" reason only Fix the product page; state the amount due in the confirmation

How do you cut refusals before the order leaves the warehouse?

Cheapest first: a gate before the warehouse, daily courier follow-up, then a system linking the two.

  1. The confirmation gate. Nothing goes to picking until the customer confirms; confirm the same working day. In Salla, add a custom sub-status such as "awaiting confirmation" before fulfillment; the name is only a suggestion. The call or WhatsApp message covers store name, order number and contents, amount due at the door, expected delivery date, and a simple way to confirm or change. In the same exchange, get a landmark and a good delivery time for the driver. Decide in advance what happens to silence, for example: a message, then a call, and if there's still no answer by the next working day, cancel and record the reason as "unreachable at confirmation".
  2. A utility message, not a sales message. Meta classes a promotion-free order confirmation as utility; add a discount or suggested product and it becomes marketing. Opt-in must also name the business, so add a clear consent line at checkout saying [your store name] will message the customer on WhatsApp about this order; the placement is my suggestion, not a Meta requirement. These messages aren't free: check Meta's pricing for your market first.
  3. Narrow COD where refusals cluster, not everywhere. In Zid, a payment constraint can hide COD for cities, above a cart value or for customers with cancelled orders, without blocking anyone. A constraint applies only when all conditions are met, so hiding it by city and by cart value, each on its own, takes two constraints.
  4. Follow parcels with the courier daily. Each morning, list every parcel past due or with a failed attempt, and call the customer that day, before the parcel heads back. With SPL (Saudi Post) Express, after three failed attempts to contact the recipient, the parcel waits 10 days at the local branch, then returns at the sender's expense. That is SPL Express's rule, not a general one; check your own courier's terms.
  5. The smart system. Once volume outgrows a manual list, one system should link each order's store and waybill statuses, flag stuck parcels and failed attempts, and tell customers their parcel is out.

In the hypothetical example, say confirmation cancels 100 orders that would all have come back and saves 10 more by fixing a number or address. The store ships 900: 90 come back (10%) and 810 are delivered. Wasted shipping falls from SAR 8,000 to SAR 3,600, before subtracting confirmation's own cost in staff time and message fees. The ad money behind undelivered orders barely moves: 190 orders at SAR 20, SAR 3,800 instead of SAR 4,000. If the ad spend split evenly, SAR 10,000 each, the problem campaign paid about SAR 29 per delivered order before confirmation (10,000 ÷ 340), the rest about SAR 22 (10,000 ÷ 460). Confirmation protects shipping and stock; only fixing that campaign protects the ad money. The figures are hypothetical: they show the arithmetic and don't promise a result.

What not to do

  • Don't switch COD off for everyone over one campaign.
  • Don't start by blaming or defending the ads; judge each campaign on delivered orders, not platform purchases.
  • Don't ask for a deposit before checking your platform's terms and local regulations.

When does this stop being an in-house fix?

In three situations: several couriers whose waybills nobody ties to order numbers and sources; refusals clustered in campaigns their managers defend with the platform report; more orders than one person can call. Then nobody can trace a returned parcel to its campaign, and every decision becomes a guess.

Short of that, start today: pick a settled week, calculate the rate, split it by campaign and city, and add the confirmation status before fulfillment.

To have me read your orders, courier statements and ad reports with you and rank the fixes, request a consultation on e-commerce growth and send one month's settlement statement with it. Want your team trained on the confirmation gate? See training for companies.

Questions

Should I switch off cash on delivery if refusals go up?

Not as a first move. Turning it off for everyone loses you the customers who accept and pay, just to avoid the ones who refuse. Narrow it where refusals cluster instead: in Zid you can hide this payment method for a specific city, above a set cart value or for a customer with cancelled orders.

Are WhatsApp order confirmation messages free?

Not necessarily. Meta charges for messages on the WhatsApp Business Platform by type and market, and since 1 October 2026, according to Meta's pricing page, utility templates sent inside the customer service window are no longer free. And a confirmation you send before the customer has messaged you opens no service window at all. Check Meta's pricing for your market before you cost confirmation.

How long should I wait before calculating a week's refusal rate?

Until every parcel in it has been delivered or has come back. That varies by courier: with SPL Express, for example, after three failed attempts to contact the recipient, an undelivered parcel stays 10 days at the recipient's local branch, then goes back to the sender's branch. So go back as many weeks as it takes until no parcel in the week still shows as open in the courier statement; with a 10-day branch hold, that is more than one week.

Should I call the customer or send a WhatsApp message?

My view: message first, because it stays in writing and the customer can reply when it suits them. Call anyone who hasn't replied within the same working day, and the customer on every high-value order or order from a campaign where refusals cluster. What matters most is that confirmation has one owner and a visible status in the store dashboard, rather than living on one employee's phone.

Sources

  1. قيود الشحن و الدفع (لوحة التحكم الجديدة) · Zid Help Center, Arabic page (checked on 25 Oct 2026)
  2. Update Order Status · Salla Docs (checked on 25 Oct 2026)
  3. Template categorization · Meta for Developers (checked on 25 Oct 2026)
  4. Get opt-in for WhatsApp · Meta for Developers (checked on 25 Oct 2026)
  5. Pricing on the WhatsApp Business Platform · Meta for Developers (checked on 25 Oct 2026)
  6. CEP Terms and Conditions · SPL, Express service section (checked on 25 Oct 2026)
Portrait of Mohammad Marwan Al-Qudah

Mohammad Marwan Al-Qudah

Marketing & Business Development Manager

Marketing & Business Development Manager at CoderZ in Amman, working with companies and online stores in Jordan and Saudi Arabia since 2014. He starts with the market and the offer before any ad, and judges marketing by what reaches the bank, not by what the platform dashboard shows.

Want this applied to your business?

Tell me where things stand. I usually reply within two working days with what I need to start.