Why does NDR management fail for most Indian SMBs?
Everyone believes hiring more call center agents fixes delivery failures. Here’s why that’s wrong.
For Indian direct-to-consumer (D2C) brands and e-commerce merchants, high Return to Origin (RTO) rates leak margin fast. Cash on Delivery (COD) orders routinely fail. Customers provide incorrect street addresses, skip phone numbers, or miss delivery windows entirely. When a courier marks a package as undelivered, your NDR clock starts ticking. You have very little time before the courier ships that package back to your warehouse. According to What Is Meant By Non-Delivery Report (NDR) And Return to Origin (RTO)? – Shiprocket, an NDR is raised the moment a courier attempts and fails a delivery, and it directly triggers the RTO reverse-pickup process this guide automates.
Traditional remediation relies on manual customer support queues or basic SMS alerts. Telecallers often reach customers too late. Plain SMS links see terrible click-through and completion rates. Even standard two-button WhatsApp alerts, like “Reattempt” or “Cancel”, don’t give couriers enough context. Couriers head out with the exact same bad address that broke the first delivery attempt.
Pairing real-time messaging with structured forms fixes this mess. You catch webhook triggers from logistics platforms and immediately serve native WhatsApp forms. You get precise updates right away. If you haven’t deployed your own automation engine yet, check out our guide on Self-Hosting n8n on a $5/mo VPS with aaPanel, Docker & Nginx SSL.
Step 1: Configure Shiprocket NDR Webhooks
First, expose an endpoint in n8n. You’ll capture delivery failures the second courier partners flag an NDR event.
- In
n8n, create a new workflow and add a Webhook node. - Set the HTTP method to
POST. Name the pathshiprocket-ndr. - In your Shiprocket dashboard, go to Settings > API > Webhooks.
- Register a new webhook pointing to your production
n8nURL. Select the events forNDR Status UpdateandReturn Request Created. - Capture test payloads. Verify you receive the tracking AWB, courier reason code, and customer contact details.
According to Shiprocket + WhatsApp API Integration Guide – WA.Expert, pairing Shiprocket’s NDR webhooks with WhatsApp messaging this way is a standard pattern for closing the loop on failed deliveries without manual follow-up calls.
Step 2: Build the Interactive WhatsApp Flow
Standard chat messages force customers to type free-form replies. Free-form text breaks API parsers. WhatsApp Flows lets you display a native form modal directly inside WhatsApp.
- Open Meta WhatsApp Business Manager and go to Flows Builder.
- Create a form screen titled
ndr_reattempt. Add these elements:- A drop-down selection for the reattempt date.
- Text inputs for building number, street name, and landmarks.
- A single-select choice for the preferred delivery time window.
- Create an alternate screen titled
return_request. Add fields for return reason selection and image attachments. - Save your Flow ID. Publish the flow configuration to your WhatsApp Business API account.
Is this starting to feel like a lot?
Let us handle the busy work. LoomVector builds and ships this exact kind of system for Indian SMBs, end to end.
Step 3: Trigger the WhatsApp Flow from n8n
When the Shiprocket webhook hits n8n, parse the payload. Then initiate a WhatsApp Business Cloud API request. According to n8n WhatsApp Integration: Connect and Automate – Goodspeed, an HTTP Request node calling the WhatsApp Business Cloud API directly is the standard way to trigger outbound messages from an n8n workflow.
- Add an HTTP Request node targeting
https://graph.facebook.com/v19.0//messages. - Set the payload type to
interactivewith the sub-typeflow. - In the request body, reference your template with the Flow token. Pull the recipient’s phone number straight from the Shiprocket event:
{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "={{ $json.body.customer_phone }}",
"type": "interactive",
"interactive": {
"type": "flow",
"header": {
"type": "text",
"text": "Action Required: Delivery Update"
},
"body": {
"text": "Your package with AWB {{ $json.body.awb }} could not be delivered: {{ $json.body.ndr_reason }}. Please confirm your address or choose a reattempt slot."
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_id": "",
"flow_cta": "Update Delivery Details",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "ndr_reattempt"
}
}
}
}
}
Step 4: Decrypt Flow Responses and Push Updates to Shiprocket
Meta WhatsApp Flows encrypt data payloads exchanged between the customer and your endpoint. They use RSA and AES-GCM encryption. According to Implement endpoints for Flows | Meta for Developers – Facebook, your endpoint must decrypt the request with your private key and encrypt the response with the same session keys the customer’s client generated; see also WhatsApp Flow Endpoint Implementation Guide – YCloud for a worked implementation.
- Use an
n8nCode node with Node.js internal modules enabled. Decrypt incoming responses with your private encryption key. - Extract the structured fields. You’ll want the updated address, landmark, and selected reattempt date.
- Add an HTTP Request node to post the customer instruction to the Shiprocket NDR Action API (
https://apiv2.shiprocket.in/v1/external/ndr/process):- Set the action parameter to
reattempt. - Pass the corrected address and desired reattempt date.
- Set the action parameter to
- For return requests, route the payload through your validation rules. If the order fits your return policy, call the Shiprocket Return Order Creation API. You’ll generate a reverse pickup label immediately.
If your engineering or operations team needs assistance designing custom WhatsApp Flows, configuring reverse logistics APIs, or deploying self-hosted workflow automation, reach out to LoomVector for end-to-end technical implementation.