POS refunds and returns
Goal
Refund sold lines (with receipt), process a blind/no-receipt return, or exchange — and restock or write off inventory.
Who it is for
Cashiers with pos.retail.return.create. Blind returns need pos.retail.return.no_receipt. Exchanges need pos.retail.exchange.create. Managers review lists with pos.view.
Preconditions
- Open session on the terminal for register refunds.
- Original completed sale for receipt-based refund.
- Customer attached when refunding to store credit (especially blind returns).
- Active refund reason codes if the tenant configured any (note/approval flags apply).
Steps — on the register
- Open Frontline → returns sheet.
- Recall the receipt (or start a no-receipt return when permitted).
- Select lines; set condition
sellable/damagedand restock decisionrestock/write_off. - Choose refund method: original tender path (often cash) or store credit.
- Provide reason code / note when required → confirm.
- APIs:
POST /v1/pos/sales/{id}/refund,POST /v1/pos/returns/blind, exchange endpoint for swap carts.
Steps — staff list
- Point of Sale → POS Returns & Refunds to review refunds (
GET /v1/pos/refunds).
Result
PosReturn / PosRefund records; cash refund or store-credit liability; stock restocked or written off; session refunds_total updated. Do not void gift-card/store-credit sales — refund them instead.
Hard stops
- Missing
reason_code/ note when catalogue requires them. - Store credit without customer.
- Insufficient permission for blind return or exchange.
- Attempting to void a stored-value payment sale (
void_unsupported_stored_value).