Send automatic WhatsApp notifications at every Delhivery milestone: dispatched, out for delivery, delivered, and NDR. For brands with a direct Delhivery merchant account, this guide covers both the webhook push and the polling API options.
This guide is for brands with a direct Delhivery merchant account. If you ship through Shiprocket (which uses multiple couriers including Delhivery), use the Shiprocket integration guide instead. Shiprocket normalises events from all couriers into one webhook format.
The phone field in Delhivery's webhook payload is a bare 10-digit number such as 9876543210. WA.Expert requires +919876543210. Prepend +91 in your automation before mapping to the WhatsApp destination.
| Option | How it works | Best for |
|---|---|---|
| A: Webhook push (recommended) | Delhivery POSTs to your WA.Expert URL on every status change. Real-time. | Direct Delhivery accounts with API access. |
| B: Polling API | WA.Expert calls Delhivery's tracking API at intervals to check AWB status. | Accounts without webhook access, or for on-demand WISMO lookups. |
In WA.Expert, create a new automation with an Inbound Webhook trigger. Copy the webhook URL.
X-Secret: your-secret-value) so you can verify requests in WA.Expert.Delhivery API: delhivery-express-api-doc.readme.io
{{
"waybill": "1610000000001",
"status": "Out for Delivery",
"status_code": "OFD",
"remarks": "Shipment out for delivery",
"timestamp": "2026-06-24T09:30:00Z",
"phone": "9876543210",
"consignee": "Priya Sharma"
}}
Map to WA.Expert variables:
consignee -> customer_name
'+91' + phone -> wa_phone <- PREPEND +91
waybill -> awb
status -> shipment_status
status_code -> status_code (use for branching)
timestamp -> event_time| status_code | Full status | WhatsApp to send |
|---|---|---|
| PKD / Manifested | Picked up / Dispatched | Dispatch notification with waybill, expected delivery, tracking link. |
| OFD | Out for Delivery | OFD alert: 'Your order is out for delivery today. Please be available.' |
| DL | Delivered | Delivery confirmation + review request. |
| UD | Undelivered (NDR) | NDR rescheduling prompt within 60 minutes of the event. |
| RTO | Return to Origin | RTO notification: 'Your shipment is being returned. Contact us to rearrange.' |
Branch your WA.Expert automation on status_code for reliable routing. Use status (full text) only as a display value in the message.
If webhook push is not available on your Delhivery account, or if a customer asks for tracking status on WhatsApp, use the tracking API directly.
GET https://track.delhivery.com/api/v1/packages/json/?token=YOUR_TOKEN&waybill={{awb}}&verbose=2
Authorization: Token YOUR_DELHIVERY_TOKEN
Response (simplified):
{{
"ShipmentData": [
{{
"Shipment": {{
"AWB": "1610000000001",
"Status": {{"Status": "Delivered", "StatusCode": "DL"}},
"Consignee": {{"Name": "Priya Sharma", "MobileNo": "9876543210"}}
}}
}}
]
}}
Map:
ShipmentData[0].Shipment.Status.Status -> status_text
ShipmentData[0].Shipment.Status.StatusCode -> status_code
ShipmentData[0].Shipment.Consignee.Name -> consignee_name
Token from: Delhivery Merchant Portal → Settings → API → Generate Token
Token format: pass as query param (?token=TOKEN) AND in Authorization header.Delhivery uses Token not Bearer. The Authorization header must be: Authorization: Token YOUR_TOKEN. Also pass the token as a query parameter: ?token=YOUR_TOKEN. Both are needed for the tracking API.
1. Delhivery fires OFD webhook to WA.Expert:
waybill: '1610000000001'
status_code: 'OFD'
phone: '9876543210'
consignee: 'Priya Sharma'
2. WA.Expert automation:
wa_phone = '+91' + '9876543210' = '+919876543210'
3. Branch on status_code:
OFD -> Send OFD template to wa_phone:
'Hi Priya! Your Delhivery shipment 161000001
is out for delivery today. Please be available.'
UD -> Send NDR template within 60 minutes:
'Hi Priya, we tried delivering your order today but
couldn\'t reach you. Tap to reschedule your delivery.'
DL -> Send confirmation:
'Your order has been delivered. How was your experience?'| Symptom | Likely cause | Fix |
|---|---|---|
| Webhook not firing | Webhook not registered or wrong URL | Log in to Delhivery Merchant Portal and confirm the webhook URL is saved. Ask your Delhivery account manager to send a test push. |
| WhatsApp not sending | Missing +91 prefix | Prepend +91 to the phone field from Delhivery before mapping to WA.Expert. |
| Phone field empty in payload | Phone not stored in shipment | Ensure the customer's phone was provided when creating the Delhivery shipment. Without it, the webhook has no phone to send. |
| Token API returning 401 | Wrong auth format | Delhivery uses 'Token' not 'Bearer'. Header: Authorization: Token YOUR_TOKEN. Also include token as query param: ?token=YOUR_TOKEN. |
| Wrong template sent | Not branching on status_code | Use status_code (OFD, DL, UD, PKD) for branching, not the status text string which can vary slightly. |
| Works with Delhivery Express but not Surface | Same integration applies | The webhook format and status codes are identical across Delhivery Express, Surface, and Reverse services. |
Shiprocket: multi-courier normalised webhooks for 17+ couriers.
Read guide →Order and shipping notifications from WooCommerce stores.
Read guide →Free trial, no credit card. If you get stuck, we answer live on WhatsApp.