The problem: 26% of your COD orders will never be delivered
The average Indian D2C brand ships 26 out of every 100 COD orders into a black hole. The customer ordered impulsively, gave a fake number, or simply was not home. Your warehouse packed it, your courier shipped it, and ₹80–350 in logistics went straight to waste per order.
Shiprocket processes millions of COD shipments every month. Not one of them has a default mechanism to verify the customer actually wants the order before it leaves your warehouse.
That verification step — a 60-second call confirming name, product, and delivery address — reduces RTO by 25–35% across every D2C category studied. The problem has always been: who makes those calls, and at what cost?
Human telecaller
₹15,000–25,000/month per caller. Limited hours. High attrition.
Manual IVR
Press-1 flows. No natural conversation. Low answer rate.
Vyora AI calling
₹799/month flat. Calls in 8 Indian languages. 24/7, no attrition.
How the Shiprocket + Vyora integration works
Shiprocket fires a webhook to your endpoint every time an order state changes — including when a new order is created. Your server (or Zapier) receives that payload, checks if the payment method is COD, and calls the Vyora API to trigger an outbound confirmation call to the customer.
A Shiprocket webhook is an HTTP POST request that Shiprocket sends to your server when something happens — an order is created, shipped, or delivered. You give Shiprocket a URL; Shiprocket sends data to that URL automatically. No polling. No cron jobs.
Customer places COD order on your store
↓
Shiprocket creates order
↓
Shiprocket sends webhook → POST your-server.com/webhook/shiprocket
↓
Your server checks: payment_method == "COD"?
↓ yes
Vyora API call → POST prod-api.ringg.ai/calling/outbound/individual
{
mobile_number: customer_phone,
agent_id: "your-cod-agent-id",
custom_args_values: { order_id, customer_name, amount }
}
↓
Vyora calls customer within 60 seconds
↓
Customer confirms → order ships normally
Customer cancels → order flagged in dashboardThe whole chain takes under 5 seconds from order creation to call initiation. Your existing Shiprocket workflow is unchanged — you do not need to modify how you create orders, print labels, or dispatch shipments.
Prerequisites
- A Shiprocket account (any plan — webhooks are available on all plans)
- A Vyora account — free at vyora.ai (50 call credits on signup, no card required)
- A server to receive the webhook, OR a Zapier account (Step 4 covers the no-code path)
- Node.js 18+ if you are using the server path (Express works; any HTTP framework works)
Get your Vyora API key
Log into your Vyora dashboard at app.vyora.ai, go to Settings → Integrations, and generate an API key. Copy it — you will use it as the X-API-KEY header in every request.
Also note your agent ID and from-number ID. You get these from:
- Agents → find your COD confirmation agent → copy the ID from the URL
- Settings → Numbers → copy the number ID you want calls to originate from
If you do not have a COD confirmation agent yet: go to Agents → New Agent. Describe it in plain text: "Call COD customers in Hindi and English. Confirm their name, the product they ordered, and ask if they want to proceed. If yes, thank them and end the call. If no, note the cancellation." Vyora builds the script from your description.
Store all three values as environment variables — do not put them in code:
VYORA_API_KEY=vya_live_xxxxxxxxxxxxxxxxxxxxxxxx VYORA_COD_AGENT_ID=agent_xxxxxxxxxxxxxxxx VYORA_FROM_NUMBER_ID=number_xxxxxxxxxx
Create the webhook receiver (Node.js)
Your webhook receiver is a single HTTP endpoint that Shiprocket POSTs to whenever order state changes. Filter for COD orders, then call the Vyora API.
const express = require('express')
const app = express()
app.use(express.json())
app.post('/webhook/shiprocket', async (req, res) => {
// Acknowledge quickly — Shiprocket times out at 5 seconds
res.json({ received: true })
const order = req.body
// Only process newly created COD orders
if (order.payment_method !== 'COD') return
if (order.status !== 'NEW') return
const phone = order.customer_phone
const name = order.billing_customer_name || order.customer_name
if (!phone || !name) {
console.warn('Missing phone or name for order', order.order_id)
return
}
try {
const resp = await fetch(
'https://prod-api.ringg.ai/ca/api/v0/calling/outbound/individual',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-KEY': process.env.VYORA_API_KEY,
},
body: JSON.stringify({
name: name,
mobile_number: phone,
agent_id: process.env.VYORA_COD_AGENT_ID,
from_number_id: process.env.VYORA_FROM_NUMBER_ID,
custom_args_values: {
order_id: String(order.order_id),
product_name: order.products?.[0]?.name || 'your order',
amount: String(order.payment?.total_amount || ''),
},
}),
}
)
const data = await resp.json()
console.log('Call triggered:', data.call_id, 'for order', order.order_id)
} catch (err) {
console.error('Vyora call failed for order', order.order_id, err.message)
}
})
app.listen(3000, () => console.log('Webhook listener on :3000'))
Always respond to the webhook immediately (the res.json() at the top) before doing async work. Shiprocket retries webhooks that do not respond within 5 seconds — you could end up with duplicate calls if your handler is slow.
Deploy this on any host that gives you a public HTTPS URL — Render, Railway, a basic EC2 instance, or Vercel Serverless Functions all work. The endpoint just needs to be reachable from the internet.
You can also run it locally with ngrok while testing:
npx ngrok http 3000 # Copy the https://xxxx.ngrok.io URL — paste it in Shiprocket as your webhook URL
Configure the webhook in Shiprocket
In your Shiprocket dashboard:
- 1Go to Settings → API → Webhook
- 2Click "Add Webhook" or "Configure"
- 3Paste your endpoint URL (e.g. https://your-server.com/webhook/shiprocket)
- 4Select event type: "Order Created" (the event that fires when a new order comes in)
- 5Save. Shiprocket will send a test payload to confirm the endpoint is reachable.
Shiprocket's webhook setting is labelled differently across older and newer dashboard versions. If you do not see "Webhook" under API settings, look under "Manage → Settings → Notifications" or contact Shiprocket support and ask to enable webhook delivery for order events.
Once saved, place a test COD order on your store. Check your server logs for the incoming payload. If you see the call trigger in Vyora's campaign dashboard within 60 seconds, the integration is live.
No-code alternative: Zapier
If you do not want to run a server, Zapier handles the webhook-to-API bridge without code. The free Zapier tier (100 tasks/month) is sufficient for low-order-volume stores; paid plans cover higher volumes.
- 1
Create a new Zap
Trigger app: Webhooks by Zapier → "Catch Hook". Copy the webhook URL Zapier gives you.
- 2
Paste the Zapier URL into Shiprocket
Settings → API → Webhook → add the Zapier URL as your endpoint. Fire a test COD order.
- 3
Map the fields
Zapier shows you the sample payload. Identify: customer_phone, billing_customer_name, payment_method, order_id.
- 4
Add a Filter step
Only continue if payment_method exactly matches "COD".
- 5
Action: Webhooks by Zapier → POST
URL: https://prod-api.ringg.ai/ca/api/v0/calling/outbound/individual Headers: X-API-KEY → your Vyora key Body (JSON): map name, mobile_number, agent_id, from_number_id, custom_args_values
The Zapier path introduces a 1–3 second delay compared to a direct server webhook. For COD confirmation, this is fine — a 63-second call versus a 60-second call makes no practical difference. Use the server path if you need sub-second triggers or plan to handle more than 300 orders per month.
Expected results and benchmarks
These numbers are drawn from Shiprocket and D2C industry data, not Vyora marketing claims. Your results will vary by category and current RTO rate.
| Metric | Baseline (no calling) | With Vyora AI calling |
|---|---|---|
| COD RTO rate | 22–30% | 16–22% |
| Answer rate on confirmation call | — | 60–70% |
| Cancellation on call (real intent) | — | 8–15% of answered calls |
| Logistics cost saved per 1,000 COD orders | ₹0 | ₹22,000–₹44,000 |
| Time to see measurable RTO drop | — | 2–4 weeks |
Sources: Unicommerce D2C India Report 2026, Edgistify reverse logistics research, Shipway RTO reduction data, Vyora customer avg.
Check your exact numbers with the COD loss calculator — enter your monthly order volume, current RTO rate, and shipping cost to see projected savings and Vyora plan cost.
Frequently asked questions
Ready to connect Shiprocket?
Free account. 50 call credits on signup. Your first COD confirmation agent builds itself from a plain-text description.
TRAI-compliant. 160-series numbers. DND scrubbing included.