WooCommerce ships with a Cash on delivery payment method, so turning COD on takes a minute. What it does not ship with is any way to check, before you pack the parcel, that the customer meant it. For an Indian store with a large COD share, that missing step is where return-to-origin (RTO) costs come from.
This guide walks through the confirmation workflow you can run with WooCommerce alone, what the platform's own building blocks are (statuses, notes, webhooks, REST API), and how an automated press-1-to-confirm call records its answer in a store that has no order tags.
Running WooCommerce with COD? See COD confirmation calls for WooCommerce: what changes in your order screen, the setup and how to join the pilot.
How COD shows up on a WooCommerce order
You enable COD under WooCommerce, Settings, Payments, Cash on delivery. You can limit it to certain shipping methods there, which many stores use to switch COD off for zones where it's risky.
On the order itself:
- The payment method is stored as
cod. That id, not the label the customer sees, is what plugins and integrations should check. - The status starts as Processing by default. WooCommerce treats a COD order as ready to fulfil the moment it is placed. Some stores change this so COD orders start On hold until someone confirms them, which makes the confirmation step visible in the order list.
- There are no tags. WooCommerce orders have statuses and notes. Notes can be private (for staff) or sent to the customer. Anything tag-like comes from a plugin or from custom order meta.
The manual workflow (and where it breaks)
The typical in-house process:
- Filter orders by status (Processing or On hold) and open the ones paid by cash on delivery.
- Call each customer and read out the order and the amount.
- Record the answer as a private order note: "Confirmed on call, 11:40".
- Move the order: to Processing (or a custom "Confirmed" status) if yes, to Cancelled if no.
- Retry the ones who didn't pick up.
It works for a few dozen orders a day. It stops working when orders arrive overnight, when the calling team is also the packing team, and when the courier pickup cut-off arrives before the calling list is done. Notes written by different people in different styles also make it hard to see, later, which orders were really confirmed.
Plugins fill some of the gap. The usual categories are: plugins that add custom order statuses, plugins that send a WhatsApp or SMS confirmation link, OTP-at-checkout plugins, and call-based confirmation services. Whichever you choose, check how it records the answer, because with no tags in WooCommerce, the answer has to live in a status, a note or order meta.
Decide what "confirmed" means in your store
Because there is no tag, settle this before you automate anything:
- Which status means "waiting for confirmation"? Processing (the default) or On hold.
- Which status means "confirmed, ready to pack"? Processing, or a custom status if you use one.
- Should a "no" cancel the order outright, or move it to a review status first?
- Where should the evidence go? A private note with the time and the answer is the simplest audit trail.
How call-based confirmation works on WooCommerce
Here is the flow used by Edesy's COD confirmation calls.
1. New orders arrive by webhook
WooCommerce has built-in webhooks (WooCommerce, Settings, Advanced, Webhooks). An Order created webhook sends each new order to us. WooCommerce signs every delivery with an HMAC of the body and gives each one a delivery id, which we use to ignore duplicates.
There is no separate "order cancelled" webhook in WooCommerce. Cancellation arrives as an Order updated
event whose status is cancelled, and that is how a cancellation before the call is detected.
One practical note: WooCommerce disables a webhook after repeated failed deliveries, so the receiving end has to answer quickly. We acknowledge each event immediately and process it afterwards, and the dashboard shows when the last event arrived, so a disabled webhook doesn't go unnoticed.
2. Rules decide which orders get a call
By default only COD orders (payment method cod) that aren't confirmed yet are called. You can add
conditions, such as a minimum amount.
3. The customer is called inside your calling window
Default rules, all adjustable: first call 2 minutes after the order, only between 9 am and 9 pm IST, up to three attempts (30 minutes, then 2 hours apart), give up after 48 hours. Night orders wait for the morning.
Just before dialling, the order is fetched again. If it has been cancelled in the meantime, there is no call. The script reads out the store name, the order number and the COD amount in Hindi or English: press 1 to confirm, press 2 to cancel. Every line is editable.
4. The answer is written back with the REST API
The connection uses a WooCommerce REST API key (consumer key and secret) that you create under WooCommerce, Settings, Advanced, REST API.
| Customer outcome | What changes in WooCommerce |
|---|---|
| Pressed 1 | Private order note, plus an optional status change (for example On hold to Processing) |
| Pressed 2 | Status set to Cancelled, with a note |
| No answer after all attempts | Order note with your unreachable label, for your team to follow up |
| Answered, pressed nothing | Order note with your no-input label |
| Cancelled before the call | Not called |
Setting a cancelled order to Cancelled again is harmless, so a retry never causes damage. Payment status is not touched; the order is still paid on delivery. If your site doesn't accept the update when the customer answers (for example during a deploy), the answer is kept and the update is retried in the background.
Integration status, stated plainly
WooCommerce is in pilot. We set up the connection with you during the pilot: the REST API key, the webhook, your status mapping, your note wording, your calling rules and your script. There is no WordPress plugin to install from the directory today.
If you'd rather wire it yourself, the custom store API is live: your site sends a signed webhook and receives confirm or cancel on a URL you control.
Rollout tips for WooCommerce stores
- Make "waiting for confirmation" visible. Starting COD orders as On hold means your packing team only sees confirmed orders in Processing.
- Begin with notes only. For the first days, let the call add notes without changing status, and compare with your team's judgement. Then turn on status changes.
- Keep one manual round for unreachable orders before the pickup cut-off.
- Check your hosting. Security plugins and firewalls sometimes block REST API calls or outgoing webhooks; test both during setup.
- Put a number on RTO. Use the COD RTO calculator with your own courier charges to see what an avoided return is worth.
Pricing
Calls are paid as you go from a prepaid wallet. Share your monthly COD volume with us for pricing.
Next step: See COD confirmation for WooCommerce and join the pilot. We'll set up the connection with you.