Customer Returns
Customer returns (RMA) let you authorize, track, and receive goods back from customers — with line items, barcode-assisted receiving, and automatic credit-memo generation.
A customer return — sometimes called an RMA (return merchandise authorization) — is
the formal record of a customer sending goods back. Each return is numbered automatically
(e.g. CRA-0001), linked to the customer and optionally to the original
sales order, and walked through a status lifecycle from
Draft to Completed. As items arrive back in the warehouse the receiving workflow
creates new inventory units and updates the return's progress. When the return is approved,
a credit memo can be generated in one click.
RMA numbers follow the pattern
CRA-XXXXand are assigned automatically on creation. You can also type your own number before saving if your process requires it.
Creating a return #
Open Sales → Customer Returns → New Return and fill in:
- Customer — required; the dropdown is searchable. Selecting a customer filters the Sales Order picker to only that customer's orders.
- Sales Order — optional link to the originating order. Leaving it blank is fine for over-the-counter or informal returns.
- Status — starts at Draft and can be moved manually at any time. Status also advances automatically as items are received (see Status lifecycle).
- Reason — Defective, Wrong Item, Damaged in Transit, No Longer Needed, or Other. Optional but useful for reporting.
- Notes — free-form text for internal context.
- Total Amount — read-only on the form; it is recalculated from line items every time a line is added, updated, or removed.
- Custom fields — any extra attributes your account has defined for returns appear at the bottom of the form.
Status lifecycle #
A return moves through five statuses:
- Draft — just created; still being set up, no items received yet.
- Submitted — the customer has been authorized to ship the goods back.
- Received — at least one line item has some quantity received.
- Completed — every line item is fully received. The system sets this automatically once the last item is received; you can also set it manually.
- Cancelled — closed without receiving. Cancelled and Completed returns block further receiving.
Draft and Submitted are set by hand; Received and Completed advance automatically as you log receipts on the receiving page.
Return line items #
The Items tab on the return lists what the customer is expected to send back. Each line records:
- Product — which product is being returned.
- Quantity — how many the customer is expected to return.
- Quantity Received — how many have actually arrived. This is updated by the receiving workflow, not by hand.
- Unit Price — the credit value per unit in dollars (stored as cents internally; see the API note below).
- Notes — line-level comments.
The return's Total Amount is the sum of unit_price × quantity across all lines and
updates automatically whenever a line changes.
Receiving items back into inventory #
Opening a return that is not yet Completed or Cancelled reveals a Receive Items button in the header. The dedicated Receive page offers a barcode-scan-first interface:
- Scan a barcode — scan the Product barcode (or type it) to auto-select the matching line. The field clears immediately so you can keep scanning.
- Enter a quantity — the quantity field is pre-filled with the remaining-to-receive amount for that line; edit it if you're only receiving a partial shipment.
- Confirm — the system creates new Units (status In Stock) in your
default location, posts a Return In movement against them, increments
quantity_receivedon the line, and refreshes the return's status.
The page shows a running count of received vs. total lines and a recent-receipts feed so you can verify what just came in without scrolling the full table.
You can receive the same line in multiple sessions. Each partial receive adds to
quantity_receiveduntil it reaches the fullquantity, at which point the line is considered fully received.
Credit memos #
Once a return is Received (some items back) or Completed (all items back) you can
issue a credit memo from the return's view
page. The credit memo's amount reflects only the value of items received so far
(unit price × quantity_received), so issuing one against a partially-received return
credits just the received portion — for a Completed return that equals the full total.
The memo is created with status Issued. A return can have at most one credit memo;
after it has been generated, the credit memo appears on the return page with a link.
Over the API, POST /customer-returns/{id}/credit-memo issues the memo for the
received amount (returns 422 if nothing has been received yet, or if a memo already
exists).
The return list #
Sales → Customer Returns shows every return with its RMA #, Customer, linked SO #, Status badge, Reason, and Total. Search by RMA number or customer name, sort by RMA #, Customer, Status, or Total, and use the Trashed filter to view soft-deleted records.
Doing it from the API #
# List returns for a specific customer
curl "https://your-domain.com/api/v1/customer-returns?customer_id=<id>" \
-H "Authorization: Bearer $TOKEN"
# Create a return
curl -X POST "https://your-domain.com/api/v1/customer-returns" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"customer_id": "<customer-id>",
"sales_order_id": "<so-id>",
"reason": "defective",
"status": "submitted",
"notes": "Customer reported faulty power switch."
}'
# Add a line item (unit_price in cents)
curl -X POST "https://your-domain.com/api/v1/customer-return-items" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"customer_return_id": "<return-id>",
"product_id": "<product-id>",
"quantity": 2,
"unit_price": 4999
}'
Money fields are integers in cents —
unit_price: 4999means $49.99, and thetotal_amounton the return is likewise in cents. Filter the list withcustomer_idand/orstatusquery parameters; results are paginated at 50 per page.