Every COD confirmation call ends in one outcome. Here is each outcome, what Edesy does on your store for it, and how you control the exact request we send.
When a COD confirmation call ends, Edesy decides the outcome, such as confirmed, cancelled, no input or unreachable, and runs the store actions you chose for it: add a tag, add a note, cancel the order or record no answer. Stores on a generic webhook get a signed JSON result at their action URL instead.
Press 1 to confirm or 2 to cancel. Confirm and cancel are sent to your store during the call itself.
When the call, or the last attempt, ends, the order gets one outcome: confirmed, cancelled, no input, unreachable, expired, update failed, or confirmed or cancelled elsewhere.
For each outcome you choose what happens on the store: add a tag, add a note, cancel the order, record no answer, or nothing.
Connected platforms are updated through their API with the request shown in the action-request editor. Generic webhook stores receive a signed JSON result at their action URL and update the order themselves.
The Orders view shows the event received, each call attempt, the key pressed, the store's response and the final outcome. You can retry or replay from there.
Every outcome a COD order can end with, and what happens by default
| Outcome | When it happens | Default result |
|---|---|---|
| Confirmed | Customer pressed confirm and the store accepted it | Order confirmed on the store (tag, note or status, by platform) |
| Cancelled | Customer pressed cancel and the store cancelled the order | Order cancelled |
| No input | Customer answered but pressed no key, after the last attempt | Tagged with your no-input label |
| Unreachable | No answer, busy or failed on every attempt | Tagged with your unreachable label |
| Expired | The give-up time passed before the customer was reached | Closed, no more calls |
| Update failed | Customer chose, but the store update failed | Update retried in the background |
| Confirmed elsewhere | Order already confirmed on the store before the call | Not called |
| Cancelled elsewhere | Order already cancelled on the store | Not called |
What you can do on the store for each outcome
Add a tag or status text such as COD-UNREACHABLE. Use {labels.unreachable}, {labels.no_input} and the other label tokens to reuse the labels you set once.
Add an order note, for example "Not reachable after {job.attempts} calls", so your team sees why an order was held.
Cancel the order on the store. Because this cancels real orders, it needs an explicit opt-in.
Write a no-answer result to the store, on platforms that support it.
Each store integration declares what it can do. Actions a platform can't perform are hidden, so a rule never asks for a write the store can't take.
If the store times out or returns an error, the outcome shows as Update failed and the same request is retried in the background. If updates keep failing, calls pause so answers don't pile up unsaved.
If your store connects through a generic webhook (see the custom store API), Edesy does not log in to your store. Instead we POST a JSON result to your action URL and your system updates the order:
{
"action": "confirm",
"order_id": "10452",
"order_name": "#10452",
"call_sid": "c4b1e2d0-...",
"at": "2026-10-12T11:42:05+05:30"
}
action is confirm or cancel, and, depending on your outcome actions, tag or note.X-Edesy-Timestamp and X-Edesy-Signature: sha256=..., signed with your account's IVR signing secret (separate from the store webhook secret). Verify it before you change the order.For every store integration, the editor shows exactly what we send for each action (confirm, cancel, tag and note) and lets you change it:
| You can set | Details |
|---|---|
| Method and URL | The HTTP method and the store endpoint |
| Body | With placeholders such as {order.external_id}, filled per call |
| Extra headers | Your own headers. Authorization is added for you and can't be set here |
| Success status codes | Which store responses count as success |
| Preview | Filled with your latest order, or an example order if you have none yet |
| Send test | Sends the real request for an order number you type, so a test cancel really cancels |
| Reset to default | Back to the integration's standard request |
| Revision history | When each action's request was last changed |
Changes apply to every call rule that uses the integration. Your store API key is only ever sent to the store's own API.
Share your use case and volume. We reply within one working day with a setup plan and pricing.
Explore more comparisons, alternatives, and resources
COD confirmation guides
Connect your store, get a number and create your first call rule at orders.edesy.in. Calls are billed per minute from your Edesy wallet.