# How to Confirm COD Orders Automatically on WooCommerce (2026)

> Confirm WooCommerce cash-on-delivery orders before shipping: the manual status-and-note workflow, how COD is identified, and how a keypad confirmation call writes order notes and status changes back.

Source: https://edesy.in/blog/woocommerce-cod-order-confirmation-guide-2026

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](https://edesy.in/cod-order-confirmation/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:

1. **Filter** orders by status (Processing or On hold) and open the ones paid by cash on delivery.
2. **Call** each customer and read out the order and the amount.
3. **Record** the answer as a private order note: "Confirmed on call, 11:40".
4. **Move** the order: to Processing (or a custom "Confirmed" status) if yes, to Cancelled if no.
5. **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](https://edesy.in/cod-order-confirmation).

### 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](https://edesy.in/cod-order-confirmation/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

1. **Make "waiting for confirmation" visible.** Starting COD orders as On hold means your packing team only
   sees confirmed orders in Processing.
2. **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.
3. **Keep one manual round for unreachable orders** before the pickup cut-off.
4. **Check your hosting.** Security plugins and firewalls sometimes block REST API calls or outgoing
   webhooks; test both during setup.
5. **Put a number on RTO.** Use the [COD RTO calculator](https://edesy.in/tools/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](https://edesy.in/cod-order-confirmation/woocommerce) and join the pilot. We'll set up the connection with you.

## Related reading

- [Shopify COD order confirmation guide](https://edesy.in/blog/shopify-cod-order-confirmation-guide-2026)
- [COD confirmation webhook and API guide](https://edesy.in/blog/cod-confirmation-webhook-api-guide-2026)
- [COD confirmation call script in Hindi and English](https://edesy.in/blog/cod-confirmation-call-script-hindi-english-2026)

## Frequently Asked Questions

### Does WooCommerce confirm COD orders on its own?

No. WooCommerce includes a Cash on delivery payment method, but it does not ask the customer to confirm. The order goes straight into your order list and your team decides what to ship.

### How is a COD order identified in WooCommerce?

Every order stores the payment method it was placed with. Orders placed with the built-in Cash on delivery method have the payment method id cod, which is what plugins and integrations check.

### WooCommerce has no order tags. How is the answer recorded?

With an order note, and optionally a status change. For example, a confirmed order gets a note and can move from On hold to Processing, and a cancelled order is set to Cancelled.

### Do I need to install a plugin for call-based confirmation?

Not for the connection itself. WooCommerce's built-in REST API keys and webhooks are enough: a webhook tells us about new orders and the API key lets us add notes and change status.

### Is the Edesy WooCommerce integration self-serve?

Not yet. WooCommerce is in pilot, and we set up the connection with you: the API key, the webhook, which status changes to make and your calling rules.

### What happens if the customer cancels on the website before the call?

WooCommerce reports the cancellation as an order update with status cancelled. We check the order again just before dialling, and a cancelled order is not called.
