22 min read

Refunds

The admin refund queue, the approval workflow, partial refunds, and what happens to your stock and receipts once a refund completes.

Go to Returns & refunds in the left navigation (on the new admin the page masthead reads returns & refunds.). This is the queue and ledger for every refund request on your store, whether it started from an order cancellation, a customer return, or an item that arrived damaged.

Returns versus refunds

A return is the parcel coming back; a refund is the money going out. They are two separate screens, because a return can be rejected, or can finish with no money to give back, and a refund can start without any parcel travelling at all (a cancellation, for example).

ReturnsRefunds
What it tracksA customer asking to send items back, from Requested through pickup to RefundedA request to pay money back, from Pending to Completed
Where to open itOrders → Returns in the left navigation (new admin)Returns & refunds in the left navigation
What you decide thereApprove or reject the return, and mark it completeApprove or decline the payout

Which admin do I have?

Orders → Returns is on the new (v2) admin panel. On the classic admin panel there is no Returns screen: opening the Returns address sends you straight to Returns & refunds, and customer return requests are handled from Shipment → Return Requests (see Returns and cancellations).

The Returns screen (new admin)

Open Orders → Returns. The page opens with a returns. masthead and the line "Customer return requests: approve or reject each one, then follow it through pickup and refund." Beside the title is a View refunds link that jumps to the Returns & refunds screen. Below it, a Customer Return Requests list shows every return on your store. It is the same list that appears under Shipment → Return Requests, so an action taken in one place shows in the other.

What each column shows

ColumnWhat you see
(chevron)Opens the row's detail panel. Click it once for the item list, again for the timeline, a third time to close
OrderThe order number (for example #1042) with a View order link under it that opens that order's detail page. If the number is not available the link shows on its own; if the return has no order at all the cell shows —
CustomerThe customer's first and last name. — when the order was a guest checkout or no name is on file
Refund amountThe amount the return is expected to refund, in your store currency. — when no amount has been worked out yet
ReasonThe reason the customer chose, such as "Size too small", "Defective" or "Wrong item received"
StateRequested, Approved, Rejected, Picked up, In transit, Delivered back, Refund pending, Refunded, Cancelled, or Closed - no refund
Return AWBThe first characters of the return shipment's id, or — until a reverse pickup exists
RequestedThe date the customer filed the request
ActionsThe buttons described below

A return that finished on an order with no paid money on record shows the state Closed - no refund and a refund amount of zero, rather than Refunded.

Filter the list. Use Filter by status at the top right: All (the default), Requested, Approved, Rejected, Picked Up, In Transit, Delivered Back, Refund Pending, Refunded or Cancelled. Changing the filter returns you to the first page. The list shows 20 requests per page; the arrows under the table move between pages and the line between them shows the range, such as "1–20 of 47".

Review the request

Click the row's chevron to see the items being returned, with quantity and reason, plus the Customer note and any Merchant note. Click View order to check what was bought and paid.

Approve or reject

A row in Requested shows Approve and Reject; a row already Approved shows Reject only. Either opens a dialog titled Approve Return Request or Reject Return Request with an optional Merchant Note (optional) field. For a rejection, use the note to tell the customer why. Confirm with the green Approve or red Reject button, or Cancel to back out.

Follow it through

Click Timeline on the row to see every state change in order, or "No timeline events recorded yet." if none has been logged. The request advances to Picked up, In transit and Delivered back as the courier reports.

Complete the refund

For returns a customer filed from the Request a Return dialog on the order page, a Complete button appears once the row is Approved or Delivered back. It opens Complete Return Request with the same optional note and issues the refund. Other requests do not show Complete. How the return pickup and the refund proceed is covered in Returns and cancellations, and the refund itself appears on the Returns & refunds screen.

The confirm button reads Processing… while the action is saved, then the list reloads. If the action cannot be saved, the dialog stays open with the error message at the top.

Why don't I see my return requests?

Work through these in order:

  • Check the filter. The list opens on All, but if you picked a state earlier the page shows only that state. Set Filter by status back to All.
  • Check the admin version. Orders → Returns exists only on the new admin panel. On the classic admin panel, Returns takes you to Returns & refunds; use Shipment → Return Requests instead.
  • Check your role. The Returns item in the left navigation is shown to store admins. It is hidden for vendor sub-accounts and for team members who are staff only, so they will not see it.
  • Check the Returns & refunds screen for a different thing. A refund created from a cancellation has no return, so it never appears in Returns. Open Returns & refunds for those.
  • If you see "Return requests could not be loaded", use the retry button beside it. An empty list reads "No return requests found".

The refund queue

The Returns & refunds screen opens on a queue of requests, each showing the order, customer, requested amount, status, and reason. At the top you'll find:

  • Pending — requests waiting on your decision.
  • Approved today — how many you've processed today.
  • Total refunded — running total for the period shown.
  • Decline rate — the share of requests you've rejected.

You can filter by status (All, Pending, Approved, Declined, Completed), filter by reason, sort the list, and search the queue.

Find a refund request

  1. Open Returns & refunds in the left navigation.
  2. Type in the search box above the list (placeholder Search by order ID or customer…). The list updates as you type and returns to the first page.
  3. Optionally narrow it with the status tabs, reason, or method filters. Search and filters combine.
  4. To start over, clear the box, or use Clear filters on the "no matches" screen.

The search runs on the server across every refund request in your store, not just the page on screen, and it matches:

You typeIt matches
Part or all of an order number (for example 1042)Requests for orders whose number contains it
Part or all of the order IDRequests for that order
Part of a customer's first name or last nameRequests from customers whose first or last name contains it
A customer's full email addressRequests from the customer with exactly that email

Why does my search find nothing?

  • Partial email does not match. Email is matched exactly, so type the full address as the customer registered it (for example priya@example.com, not priya@).
  • Phone numbers are not searchable here. Search by order number, name, or email instead.
  • A full name in one go may not match. First name and last name are checked separately, so type just the first name or just the last name rather than both.
  • Filters are still on. A status tab, reason, or method filter narrows the results too. Choose Clear filters to rule that out.

The three tiles on the new admin Returns & refunds screen

On the new (v2) admin panel the summary strip has three tiles. Each states its own scope in the caption underneath:

TileCaptionWhat it counts
Pendingawaiting reviewRequests still waiting on your decision
Processedcompleted refundsRefunds that reached Completed. Requests you declined are not counted here
Total refundedall timeThe running refunded amount, not limited to the period you are filtering

Why is Processed lower than the number of requests I have handled?

Processed counts only refunds that finished (Completed). A request you declined, or one still Approved or Processing, does not add to it. Use the status tabs to see those requests.

Where the customer asked for the money

When the customer filed the return themselves (see Requesting a return), the refund detail shows Customer requested refund to with either Original payment method or Store credit. It appears in the classic refund dialog and in the newer skin's refund drawer. The line is left out when the request carries no choice, such as a refund you created yourself or one made automatically. It records the customer's request; use it when you decide how to settle the refund.

When the customer has already chosen a destination, the refund's own method line is hidden in that detail view, so the same question is not shown twice: Preferred Method in the classic dialog and Refund method in the newer skin's drawer. Those lines still appear for refunds with no customer choice.

Tip

Pending rows expose inline Approve and Decline actions directly in the table, so you don't always need to open the detail view to act on a request.

Acting on several requests at once (newer dashboard skin)

On the newer dashboard skin, pending rows also have a checkbox. Tick more than one and a bulk action bar appears at the bottom of the screen with three actions: Export (downloads just the selected requests), Decline, and Approve — letting you clear out a batch of pending requests in one pass instead of working through them one at a time. Only pending rows can be selected; approved, declined, and completed requests don't show a checkbox.

Refund intelligence (newer dashboard skin)

Above the queue, an advisory panel compares your refund rate against a category-average benchmark, and breaks down your most common refund reason and what share of requests it makes up. This is informational only — it doesn't change how requests are processed — and is meant to help you spot whether refunds are trending unusually high before it becomes a bigger problem.

Refund risk signals (newer dashboard skin)

A separate, collapsible panel surfaces advisory warnings worth a second look, such as a specific customer who has filed several refund requests recently, or your refund rate running above the category average. Each signal has Review and Hide actions. Like the intelligence panel above, these are advisory nudges — nothing is blocked or auto-actioned based on them.

The refund approval workflow

Every refund request follows the same status path:

Pending → Approved → Processing → Completed
   ↓
Rejected

Request arrives as Pending

The request shows the requested amount, the items involved, and the reason the customer or the order record gave.

You review it

Open the request from the queue (or use the inline actions on a pending row) to see the full detail: order, customer, items, and reason.

Approve or decline

Approve to authorize the refund — you can adjust the amount down first if only a partial refund is warranted, and you can add notes. Decline to reject the request; add a reason so the record explains why.

The platform processes the payment reversal

Once approved, BillionBiz instructs the payment gateway to return the money to the customer's original payment method — the same card, UPI account, wallet, or bank account they used to pay. This typically reaches the customer within 5–7 business days depending on their bank.

Status settles to Completed

The refund moves to Completed once the payment gateway confirms the reversal. If the gateway call fails, the refund is marked Failed and can be retried from Approved again.

Partial refunds

You are not required to refund the full requested amount. When approving a request, you can lower the approved amount below what the customer requested — for example, to deduct a restocking fee or because only some of the items were returned. The approved amount can never exceed the requested amount, and BillionBiz records your reason alongside the adjustment so the customer sees a clear breakdown of original versus approved amount.

Start a partial refund from an order

When starting a refund from an order, select the purchased lines you want to refund. Bundle components use their allocated net price after coupon discounts. The amount follows your selection, and you can enter a lower amount for a partial refund. You cannot submit more than the maximum shown. The platform also checks earlier refunds, returns, and payments; if these reduce the remaining amount, the drawer shows the reason so you can review it and lower the request.

Open the order

Go to Orders and open the paid order. Select Initiate Refund (Issue refund in the newer admin skin).

Choose the purchased lines

Tick the items to refund, or use Select all. Each bundle component uses its own purchased line and net amount, including its share of the bundle saving and coupon discount. Untick the other items. Reducing the selection lowers the maximum and reduces an amount that is above that limit. Clearing every item leaves no amount available to submit on an order with item lines.

Review or lower the amount

Check Maximum refundable. Full uses the current selection's maximum; Items uses the selected lines' net total within that maximum. Shipping uses the shipping charge within the same maximum; it does not add another allowance to a selected line. Custom lets you type a lower amount. The amount must be positive, within the displayed maximum, and have no more than two decimal places.

Choose a reason and submit

Choose the reason, add optional notes, and submit the refund. If the server refuses it, review the reason shown, check earlier refunds and returns, and lower the amount if necessary. A successful request enters the refund approval workflow above.

The maximum shown is based on the selected lines' purchased net amounts, bounded by the order's net amount. It is not a live statement of all earlier refund and return history. The server checks the remaining balance again, including pending requests and payments already received. On a partially paid order, you cannot refund money that has not been received.

Why can't I refund more on this line?

Admin refunds and customer returns use one shared balance for the order and its purchased lines. Earlier refunds and return reservations reduce what is left, even when they started through a different screen. Refunding another item, changing the request route, or entering the regular pre-bundle price cannot increase a selected line's entitlement.

Reason shownWhat to check
Refund exceeds selected lines remaining net amount (REFUND_EXCEEDS_LINE_REFUNDABLE)Lower the request to the remaining amount in the message. Review that line's bundle saving, coupon share, earlier refunds, and return requests. An unused balance on another line cannot fund this selection.
Refund item must identify a purchased line and a positive quantity or Refund quantity exceeds purchased quantity (REFUND_INVALID_LINE)Reload the order and select its actual purchased lines again. Quantities must be positive and cannot exceed what was bought. Two purchases of the same product are separate lines.
Refund exceeds paid money remaining after earlier refunds and returnsReview earlier requests and the payments received. Lower the request to the money still available; the displayed selection maximum can be higher.
Earlier return refund amount is not recorded; reconcile it before issuing another refundAsk support to reconcile the earlier return record before retrying. Do not create another request to bypass the missing history.

If a selected purchased line's identifier is unavailable, submission is blocked. Reload the order before retrying; if it persists, ask support to check the order record.

Inventory restoration on refund

When a refund reaches Completed, the platform automatically adds the refunded item quantities back into your stock — you don't need to make a manual stock adjustment. This runs per line item, so a partial refund only restores the items that were actually part of that refund. If the stock update itself fails for some reason, the refund still completes; the discrepancy is caught by your normal inventory reconciliation rather than blocking the customer's money from moving.

Refund status tracking

Every refund carries its own status independent of the order it belongs to, so you can track it even after the order itself shows Cancelled or Returned. The order's payment record also updates to show a partial refund or full refund state once money has moved.

When a refund shows Failed

A Failed refund means Razorpay rejected the reversal — no money moved, and the customer has not been paid back. The reason is written into the refund's notes and into the Auto-Refund Failed notification in your admin notifications.

Retry the same refund rather than creating a second one: open it in the refund queue and approve it again. A Failed refund is allowed to go back to Approved, and re-approving reuses the same refund record, so there is no risk of the customer being paid twice.

Common reasons, and what to do about each:

Reason shownWhat it meansFix
The payment was captured on a Razorpay account this store no longer has credentials forThe order was paid through a different Razorpay account than the one currently connected — usually because the Razorpay keys under Plugins → Razorpay were changed, rotated, or disconnected after the order was placed.Re-connect Razorpay with the same key pair that was live when the order was paid — see Connecting Razorpay — then re-approve the refund. Your Razorpay dashboard shows which account holds the payment.
Your account does not have enough balance to carry out the refund operationYour Razorpay balance is lower than the refund amount.Add funds in the Razorpay dashboard (or wait for new captures to settle), then re-approve.
The payment has been fully refunded alreadyThe money was already returned — usually refunded directly in the Razorpay dashboard.No action needed on the money; re-approve to bring BillionBiz's record in line.
Could not verify which Razorpay account holds this paymentRazorpay was unreachable when the refund was attempted. Nothing was sent.Transient — re-approve the refund.

Note

BillionBiz always confirms which Razorpay account actually holds a payment before reversing it, so a refund is never sent from the wrong account. That check is why a mismatched or disconnected key surfaces as a clear Failed reason instead of a silent failure.

Credit notes

The moment a refund reaches Completed, BillionBiz automatically generates a credit note — no action needed from you. A credit note also gets generated the same way when a paid, invoiced order is cancelled — the cancellation cascade refunds the payment and issues a full credit note in one step, covered in Cancelling an order. And you can trigger one directly, without a refund, from an order's Invoice ▾ → Cancel & reissue menu — see Cancelling and reissuing an invoice — for correcting an invoice on its own, such as a data-entry mistake. Whichever path creates it, a credit note is:

  • Immutable — once created, nothing about it (amount, GST split, or number) is ever edited.
  • Sequentially numbered, using the same financial-year-scoped numbering as your invoices, with a CN marker so it's clearly distinguishable from an invoice number.
  • Emailed automatically to the customer with the credit-note PDF attached.

On the order detail screen, a refund-triggered credit note's number appears on the Refund node of the order timeline once it's been generated — see The order timeline — and any credit note (refund- or cancellation-triggered) also shows on the Invoice & GST card. On the customer's own side, once it's ready, a credit note tied to a refund shows on their order page under that refund with its own Download link — see Payment & invoice.

A cancellation-only credit note (no separate refund request) may not show on the customer's order page yet

The customer order page's credit-note line is driven by a refund record. When cancelling an order triggers the refund-and-credit-note cascade together (the common case — see above), the customer sees both. But the standalone Invoice ▾ → Cancel & reissue action creates a credit note with no refund record attached at all — if you use it on an order that otherwise stays as-is, the customer won't see a credit-note line on their own order page, even though the credit note exists and was emailed to them. Point the customer to the email if they ask where their credit note is in this case.

No in-app download for your own team yet

The admin order screens show the credit note's number, but there's no download button for the PDF on the admin side yet — if you need a copy for customer service, forward the original notification email, or ask the customer to download it from their own order page.

Payment-method filter, evidence photos, and refresh now match on both skins

The newer dashboard skin's refund queue has a payment method filter alongside reason and sort, a manual refresh button next to the filters, and the refund detail drawer shows any customer-submitted evidence photos when the request has them — the same extras the classic screen has always had. The approval workflow itself — approve, decline, partial amounts, and status tracking — has always worked the same on both.

Refunds created at the POS counter

Returns taken at a Point of Sale counter follow their own flow on the counter screen, and the server quotes the refund amount rather than letting the cashier type it. A cashier's refund limit is ₹0: a cashier's refund above zero, and any whole-bill void, needs the owner's approval, by Owner PIN or Ask owner remotely; an owner signed in with the admin sign-in is not asked. The owner reviews requests at /settings/pos/approvals. See Returns & Exchanges.

An item the cashier added by scanning an unknown barcode can be returned once at the counter, up to the quantity sold; a second return of the same line is refused. See Returns & Exchanges.

Late terminal cancellation after a paid bill

Screen: as the owner, open /orders/pos-history, select Counter when offered, then Open on the original bill. Review Settlement needs owner review and its reason. A terminal may honour a cancellation after the bill has finished; this does not automatically rewrite the bill's money or perform a second refund. Refunds against the flagged terminal receipt are blocked while its settlement needs review.

  1. Keep the bill and terminal payment references. Ask the owner to check the actual terminal settlement before any further collection or refund.
  2. If you visit /pos-payments, the owner can read Payment exceptions, use Open bill on an entry, Next page or First page, and Retry if the list fails to load. These controls read records; they do not resolve an exception or send money.
  3. Reopen the original bill to check its current state. Do not switch refund methods or create another return merely to bypass the settlement warning.

Payment settings are unavailable

The same /pos-payments page also shows Feature unavailable and This feature is not connected yet. No changes can be saved here. with a disabled control. Treat it as unavailable settings, not a settlement-resolution or refund action. The exceptions list is owner-only and needs a connected admin sign-in; a cashier PIN does not open it.

Why can't I refund a receipt that still looks paid? A later honoured terminal cancellation can leave the original capture recorded while blocking another gateway refund. Read the owner's warning and retain the original references; neither a pending refund nor the unavailable settings control proves money was returned.

Next steps