Your system sends us a signed webhook when a COD order is placed. We call the customer, they press 1 to confirm or 2 to cancel, and we POST the result to your action URL. No plugin, no platform lock-in.
Two HTTPS requests per order: one from you, one back to you
POST JSON to your webhook URL when a COD order is placed. Amounts are in paise.
{
"event": "order.created",
"event_id": "evt_7f3a9c",
"order": {
"id": "10452",
"name": "#10452",
"customer_name": "Priya Sharma",
"phone": "+919800000000",
"payment_method": "cod",
"total_paise": 111000,
"cod_amount_paise": 111000,
"cod_confirmed": false,
"items": [{ "title": "Cotton Kurta", "quantity": 1 }]
}
}
event is order.created, order.cancelled or order.paid.event_id is used to ignore duplicate deliveries, so retries from your side are safe.cod_amount_paise is the amount read out to the customer. Set it when only part of the order is cash on delivery; otherwise total_paise is used.order.cancelled for the same id if the order is cancelled before we call, and the call is skipped.Add two headers. The signature is a hex HMAC-SHA256 of the timestamp, a dot, and the raw request body, using your signing secret. Requests older than 5 minutes are rejected.
X-Edesy-Timestamp: 1760256000
X-Edesy-Signature: sha256=<hex HMAC-SHA256(secret, timestamp + "." + raw_body)>
import crypto from "node:crypto";
const body = JSON.stringify(event);
const ts = Math.floor(Date.now() / 1000).toString();
const signature = "sha256=" + crypto
.createHmac("sha256", process.env.EDESY_WEBHOOK_SECRET)
.update(ts + "." + body)
.digest("hex");
await fetch(process.env.EDESY_WEBHOOK_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Edesy-Timestamp": ts,
"X-Edesy-Signature": signature,
},
body,
});
When the customer answers, we POST to your action URL:
{
"action": "confirm",
"order_id": "10452",
"order_name": "#10452",
"call_sid": "c4b1e2d0-...",
"at": "2026-10-12T11:42:05+05:30"
}
action is confirm or cancel. Depending on your rules you may also receive tag or note actions, for example to mark an order unreachable.X-Edesy-Timestamp and X-Edesy-Signature: sha256=...), but with your account's IVR signing secret, which is separate from the store webhook secret. You get both during setup. Verify the signature before updating the order.X-Edesy-Call-Sid (the call) and X-Edesy-Idempotency-Key; use the idempotency key to ignore a result you have already applied.HMAC-SHA256 signatures with a timestamp on every webhook you send and every result we send back.
Repeated deliveries of the same event are ignored, and each order gets one confirmation journey.
Delay after order, calling hours in IST, retry gaps and expiry, configured per connection.
A cancellation you send before the call stops the call.
Every incoming event is logged with its result and can be replayed.
Edit the words of the call; order number, amount and store name are filled in for each order.
Your own checkout and order database, on any stack.
Zapier, Make or n8n flows that can sign and send an HTTP request.
Magento, PrestaShop, OpenCart and others through a webhook plugin or a small bridge.
Resources to help you evaluate and implement
We'll set up your connection and share your webhook URL and signing secret.