Integration GuideShiprocketCOD ConfirmationD2C India

Shiprocket + AI Calling: Trigger Automatic COD Confirmation Calls on Every Order

Connect your Shiprocket account to Vyora AI in under 10 minutes. Every COD order gets a confirmation call within 60 seconds of checkout — before your team touches the order. Two paths: webhook server or Zapier, no code required.

R
Ratnam Sachan, Vyora
2 June 20268 min read Integration guide

1M+

Shiprocket merchants

Source: Shiprocket 2026

26%

Avg Indian COD RTO

Source: Unicommerce 2026

60s

Time to first call

Source: Vyora platform

28%

RTO drop with AI calls

Source: Industry avg

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 dashboard

The 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)
STEP 01

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:

.env
VYORA_API_KEY=vya_live_xxxxxxxxxxxxxxxxxxxxxxxx
VYORA_COD_AGENT_ID=agent_xxxxxxxxxxxxxxxx
VYORA_FROM_NUMBER_ID=number_xxxxxxxxxx
STEP 02

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.

server.js
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:

terminal
npx ngrok http 3000
# Copy the https://xxxx.ngrok.io URL — paste it in Shiprocket as your webhook URL
STEP 03

Configure the webhook in Shiprocket

In your Shiprocket dashboard:

  1. 1Go to Settings → API → Webhook
  2. 2Click "Add Webhook" or "Configure"
  3. 3Paste your endpoint URL (e.g. https://your-server.com/webhook/shiprocket)
  4. 4Select event type: "Order Created" (the event that fires when a new order comes in)
  5. 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.

STEP 04

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. 1

    Create a new Zap

    Trigger app: Webhooks by Zapier → "Catch Hook". Copy the webhook URL Zapier gives you.

  2. 2

    Paste the Zapier URL into Shiprocket

    Settings → API → Webhook → add the Zapier URL as your endpoint. Fire a test COD order.

  3. 3

    Map the fields

    Zapier shows you the sample payload. Identify: customer_phone, billing_customer_name, payment_method, order_id.

  4. 4

    Add a Filter step

    Only continue if payment_method exactly matches "COD".

  5. 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.

MetricBaseline (no calling)With Vyora AI calling
COD RTO rate22–30%16–22%
Answer rate on confirmation call60–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 drop2–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.

WooCommerce guide instead →

TRAI-compliant. 160-series numbers. DND scrubbing included.

We use cookies to improve your experience. By continuing to use this site, you agree to our Privacy Policy.