Home / Help Center / pos-app-wholesale / wholesale / Returns (RMA)
↩️ wholesale

Returns (RMA)

Returns (RMA) tracks customer-initiated return requests through a Requested → Approved → Received → Completed pipeline (with Rejected as an alternate outcome). Once an RMA reaches Approved, Received or Completed, you can issue a credit note directly from its detail panel, which creates a linked WholesaleCreditNote record and opens a printable credit note.

📍 Menu path: Wholesale → Returns (RMA)
👤 Who uses it: All roles with the Billing feature enabled

Overview

Every RMA gets an auto-generated number (RMA-YYYYMMDD-#### with a random 4-digit suffix) and starts in REQUESTED status; only REQUESTED or REJECTED RMAs can be deleted, enforced by the backend as well as hidden/shown by the UI.

The New RMA form captures customer, an optional free-text Order ID, reason, condition on receipt and a total refund amount — it does not include any way to add return line items, so RMAs created through this page always have an empty items list.

Customer selection is a dropdown of Wholesale Customers (GET /wholesale/customers), but only the businessName text is stored on the RMA as customerName — no customer ID link is saved, even though the schema has a wholesaleCustomerId column.

Status buttons only ever allow moving forward one step at a time (REQUESTED→APPROVED/REJECTED, APPROVED→RECEIVED/REJECTED, RECEIVED→COMPLETED); there is no way to move an RMA backward from this screen.

"Issue Credit Note" calls POST /wholesale/rma/:id/credit-note, which the backend only allows once per RMA and only when the RMA is APPROVED, RECEIVED or COMPLETED — the resulting credit note copies the RMA's items and totalRefund exactly as-is (as totalAmount) and cannot be edited from this flow.

Before You Start

Step-by-Step Guide

1 Log a new return request

  1. Open Wholesale → Returns (RMA) and click "+ New RMA".
  2. Select the Customer from the dropdown (required).
  3. Optionally enter the original Order ID, pick a Reason and Condition on Receipt, and enter a Total Refund Amount.
  4. Add any Notes, then click "Create RMA" — it is created in REQUESTED status with an auto-generated RMA number.

2 Approve or reject a return

  1. Open a REQUESTED RMA from the table (click the row) or use the inline action buttons.
  2. Click APPROVED to accept the return, or REJECTED to decline it.

3 Receive goods and complete the return

  1. Once an RMA is APPROVED, click RECEIVED after the returned goods physically arrive.
  2. Click COMPLETED once the return has been fully processed on your side.

4 Issue a credit note for a return

  1. Open the RMA's detail panel (click its row) once it is APPROVED, RECEIVED or COMPLETED.
  2. Click "Issue Credit Note" — a WholesaleCreditNote record is created for the RMA's customer and refund amount, and a printable credit note opens automatically in a new window.
  3. Use "Print [Credit Note Number]" in the detail panel afterward to reprint it during the same visit to the page.
💡 The system blocks issuing a second credit note for the same RMA — but the "Issue Credit Note" button will reappear if you reload the page or reopen the RMA later, since the page has no way to know a credit note already exists until you try again and get an error.

5 Delete a mistaken RMA

  1. Only RMAs still in REQUESTED or REJECTED status show a delete button.
  2. Click the trash icon and confirm — the RMA is permanently removed.

Every Field & Button, Explained

Field / ButtonWhat it does
RMA NumberAuto-generated as RMA-YYYYMMDD-#### (date of creation plus a random 4-digit suffix, not a sequential counter).
Customer Name *Required. Chosen from a dropdown of Wholesale Customers; only the business name text is saved on the RMA, not a customer ID link.
Order ID (optional)Free-text/numeric field for the original wholesale order this return relates to. Not validated against real orders — any number is accepted.
ReasonOne of: Defective / Damaged, Wrong Item Delivered, Excess Quantity, Quality Issue, Customer Cancelled, Other.
Condition on ReceiptOne of: Resaleable, Damaged, Quarantine / Hold. Set at creation, and can also be updated when advancing status (the backend accepts it on the status-update call, though the UI does not currently expose an input for changing it during status updates).
Total Refund Amount (₹)Manually entered refund amount; this is the amount that gets copied to totalAmount on the credit note if one is issued.
NotesFree-text notes shown in the table row detail and detail panel.
StatusREQUESTED → APPROVED/REJECTED → RECEIVED → COMPLETED. Forward-only from this screen; REJECTED and COMPLETED have no further action buttons.
Return Items (detail panel)Would list productName/quantity/unit for each returned line item — always empty for RMAs created via this page's New RMA form, since it has no line-item entry UI.
Issue Credit NoteVisible only when status is APPROVED, RECEIVED or COMPLETED and no credit note has been issued yet in the current page session. Creates a WholesaleCreditNote copying the RMA's customer, items and refund total.

Tips & Best Practices

Troubleshooting & FAQ

The Return Items list in the detail panel is always empty.
The New RMA creation form only captures customer, order ID, reason, condition, refund amount and notes — there is no field to add return line items, so every RMA created here has items: [] by design. The items array exists in the schema (and is copied through to credit notes) but can currently only be populated by calling the API directly.
I picked a customer from the dropdown, but the RMA doesn't seem linked to that customer record.
Correct — selecting a customer only copies its business name into the customerName text field on the RMA. The wholesaleCustomerId column exists in the schema but the create form does not send it, so there is no real foreign-key link back to the Wholesale Customer record.
I can't delete an RMA even though I made a mistake creating it.
Deletion is only allowed while the RMA is REQUESTED or REJECTED, both client-side (no delete button shown otherwise) and server-side (deleteRMA rejects any other status). Once an RMA is APPROVED, RECEIVED or COMPLETED it is permanent — reject or otherwise resolve it via status instead.
I tried to issue a credit note again and got an error even though the button was showing.
The button's visibility only depends on this browser session remembering that a credit note was already issued (via local component state) — it does not check the server. If you reload the page or come back later, "Issue Credit Note" reappears regardless of history, but the backend still rejects a second credit note for the same RMA with "Credit note already issued for this RMA."
Where can I see a list of all credit notes that have been issued?
There is no credit note list view on this page (or elsewhere in the 4 wholesale pages documented here). GET /wholesale/credit-notes exists on the backend and can list them, but the RMA page only ever shows/prints the credit note it just created in the current session — after that you can only reprint it if cnByRMA still has it in memory.
Can I edit the refund amount or items on the credit note before printing it?
No — createCreditNoteFromRMA copies the RMA's items and totalRefund (as totalAmount) exactly as they are on the RMA at the moment you click Issue Credit Note. Correct the RMA's Total Refund Amount before issuing the credit note if it is wrong; there is no separate credit note edit step.