Returns, NDR & Order Cancellation
Handle failed deliveries, customer returns, RTO, and the full order cancellation cascade — stock, refunds, and courier interception.
Not every delivery goes to plan. Here's how BillionBiz handles failed deliveries, returns, and cancellations — and what happens automatically versus what needs your attention.
Failed delivery — NDR (Non-Delivery Report)
An NDR is raised when a courier agent attempts delivery but can't complete it.
| Reason | What to do |
|---|---|
| Customer unavailable | Re-attempt with a note to call first; provide an alternative contact number |
| Address incorrect | Correct the address in the re-attempt instructions |
| Phone number unreachable | Update the contact number in the re-attempt |
| Customer refused delivery | Contact the customer to understand why; if unresolvable, initiate RTO |
| Business closed / holiday | Re-attempt for a different day |
Find every NDR under the Shipment → NDR Center tab — each entry shows order number, AWB, failure reason, date of the failed attempt, and attempts so far. For each one you can:
- Reattempt Delivery — the courier tries again, with any updated instructions (call before arriving, leave with a neighbour, new phone number) you provide.
- Mark as RTO — Return to Origin. The parcel is sent back from the courier's sorting facility to your warehouse. Use this after multiple failed re-attempts, or if the customer no longer wants the order.
- Email Customer / SMS Customer — send the customer a notification about the failed delivery directly from the row, without leaving the NDR Center.
Tip
Most couriers allow 2–3 delivery attempts before automatically initiating an RTO. Check NDRs daily so you can provide updated instructions before the courier runs out of attempts.
Automating NDR handling
Instead of actioning every NDR by hand, click Edit Auto-Action Rules at the top of the NDR Center. Each failure reason (e.g. "Customer unavailable") has its own rule: a maximum number of attempts before the rule fires, the action to take once that's reached (e.g. auto-RTO), a delay in hours before it fires, and an Active toggle to turn the rule on or off. Adjust the values and click Save Rules — only active rules run automatically; anything you leave off still needs manual handling from the row actions above.
RTO — Return to Origin
When a parcel can't be delivered and either you or the courier initiates an RTO (after exhausting attempts), the parcel travels back to your warehouse. Once BillionBiz receives the RTO confirmation:
What happens automatically
- Inventory is restored — the returned stock is added back to the product variant's count.
- A refund is initiated if the order was prepaid (via Razorpay).
- The order status updates to Returned.
You don't need to take any manual action for inventory or refund — the platform handles both.
Customer returns
A return starts on the customer's side: they open their order on the customer portal, click Request Return on the item(s), choose a reason ("Wrong item received", "Damaged on arrival", "Changed my mind"), and submit. The request appears in your admin dashboard under Shipment → Return Requests — a dedicated tab for customer-initiated requests, separate from the Returns tab described below.
On the new admin panel
The same customer return requests are also listed under Orders → Returns in the left navigation, where you can approve, reject, or complete them. See The Returns screen (new admin) for the columns, filters, and actions.
The Return Requests tab
Every request moves through its own state lifecycle, shown as a filter above the list: Requested → Approved/Rejected → Picked Up → In Transit → Delivered Back → Refund Pending → Refunded, with Cancelled possible along the way. Filter the list to any one of these states, or view all.
Search return requests
On the new admin panel, the filter bar above the list has a search box with the placeholder Search by order or customer, next to the Filter by status dropdown. It appears in both places the list is shown: Shipment → Return requests and Orders → Returns.
- Open Orders → Returns (or Shipment → Return requests).
- Click the search box and type. The list updates about a third of a second after you stop typing, so you don't need to press Enter.
- Optionally pick a state in Filter by status. The search and the state filter work together: you see only requests that match both.
- Clear the box to return to the full list.
What it matches
| Type this | It finds |
|---|---|
An order number, with or without the # (for example 1042 or #1042) | Returns on any order whose number contains those digits, so 10 also finds #1042 |
A customer's name (for example Priya or Priya Sharma) | Returns on orders by customers whose first or last name contains each word you typed. With two words, both must match |
| A customer's full email address or full phone number | Returns on orders by that customer. The match is exact |
The search covers every return request in your store, not just the rows currently on screen. The page count and the page controls at the bottom follow the matches, so a search with many results is paged like the normal list. Typing a new search or changing the state filter always takes you back to page 1. Anything past 100 characters is ignored.
Why doesn't my search find the request?
- Email or phone: these are stored in a protected form, so only a complete, exact value matches.
priya@or the first six digits of a number finds nothing; type the whole address or number. - Return request ID: request IDs are not searchable. Search by the order number or the customer instead.
- Name: search for part of the customer's first or last name.
- State filter still set: if Filter by status is not All, requests in other states are hidden. Switch it back to All and search again.
When nothing matches, the list shows "No return requests match your search".
The search box is part of the new admin panel only. The older admin panel's Shipment → Return Requests tab has the state filter but no search box.
Click the row's expand chevron to see the returned item's detail (product, quantity, reason). Click Timeline to see the full history of state changes for that request instead — the two views share the same expand row and toggle between each other.
For a request still in Requested or Approved state, click Approve or Reject. Either opens a small dialog with an optional merchant note — for a rejection, use the note to tell the customer why (e.g. "outside the return window", "item shows signs of use").
Returns a customer files from the Request a Return dialog on the order detail page appear in the same list as the other requests, so you manage every return in one place. For these rows:
- Click Approve on a Requested row (or Reject on a Requested or Approved row). The same note dialog opens; add a merchant note if you like and confirm.
- Once the return is Approved or Delivered Back, a green Complete button appears on the row (in both the list and the newer card view). It opens a Complete Return Request dialog with the optional note. Confirming records the goods as received if that has not happened yet, then issues the refund. For a rejection, the note you enter is saved as the rejection reason.
- The refund is the net amount allocated to the returned lines (for a bundle component, its share after the bundle saving), and is capped at what the customer paid minus earlier refunds. If nothing is left to refund the dialog shows that no paid money remains for the return. The same limit applies as for refunds started from the order.
Their state names follow the courier workflow: a return whose pickup label has been generated shows as Approved, and one the courier has delivered back shows as Delivered Back; the other states keep the same name. Complete is only offered on these order-page returns.
The customer sees the same return in their order history and on the order tracking page, with the refund amount once it is known (see Orders, tracking and returns).
Approve or Complete shows an error
Read the message inside the dialog. If it says the request cannot be actioned, the return has already moved on (for example the courier webhook advanced it) or belongs to another store; close the dialog, refresh the tab and check the row's current state.
Approving a return initiates a reverse pickup — the courier collects the item from the customer's address and brings it to your warehouse. You'll see the reverse shipment tracking in the Returns tab.
There is no separate "confirm receipt" button for these requests. Receipt is recorded by the courier: when the return parcel's tracking reports it delivered to your warehouse, the request moves to Delivered Back on its own.
Returned stock goes back on the shelf
On delivery, only the returned lines are added back to inventory, each by the quantity the customer returned, not the whole order.
Prepaid orders: the refund is issued automatically
If the customer paid online and the payment was captured, the refund is issued to the original payment method and the request moves through Refund Pending to Refunded. For a request containing bundle components, each returned line is refunded its own net amount. If the gateway refuses the refund, the request stays in Refund Pending and the platform retries it.
Cash on delivery: no gateway refund
For COD (or a payment that was never captured) the request is closed as Refunded with a note on its Timeline saying no payment refund was required. Settle any money owed with the customer directly.
Returns filed from the order page (the Complete flow above) do not wait for the courier: Complete records receipt and issues the refund when you click it.
Return window
The return window shown to the customer is calculated from the actual delivery date (as recorded by the courier's delivery scan), not the order date. If a courier doesn't send a delivery confirmation, the window may not open at all — make sure your couriers are configured to send delivery confirmation events.
If a customer tries to return an order after the window has closed, the Request Return button disappears from the customer portal. To make an exception, create the return manually from Shipment → Returns → + New Return — manual returns bypass the window check.
Order cancellation — the full cascade
Cancel an order from the Order Detail screen (not from the Shipments tab) and the platform triggers a three-step cascade automatically.
Shipment is cancelled with the courier
If a shipment already exists, the platform sends a cancellation to Shiprocket. If accepted, your wallet balance is refunded for the label cost. If the courier rejects it (parcel already picked up or in transit), you'll see a clear error — the parcel must be intercepted directly by calling the courier. The BillionBiz order can still be cancelled manually.
Variant stock is restored
All items in the cancelled order have their quantities added back to inventory automatically.
Refund is initiated
For prepaid orders, a Razorpay refund is triggered. For COD orders, no refund is needed — the cash was never collected.
Always cancel from Order Detail
Cancelling only the shipment (from the All Shipments tab) does not trigger the stock restore or refund cascade. You need to cancel at the order level for all three steps to fire.
FSM constraint
Orders can only be cancelled while in certain states. Once a shipment is marked Picked Up or In Transit, the cancel option may be disabled — contact Shiprocket to arrange a courier-side interception, then process the stock restore and refund manually from your admin panel.