Returns and exchanges

Return items at the register or through the API, and refund them your way.

A return in Smooth POS is a sale with negative quantities. It's linked to the original sale line, so you always know what came back and from which sale. An exchange is simply a return and a new item on the same sale.

At the register

  1. Go to Register → Sale and log in, as in How to process a sale.
  2. Select Return Items in the top row and scan or search for the original receipt.
  3. Choose the items coming back.
  4. Go to payment and pay the refund out with the payment method you want, such as store credit.

For an exchange, return the original item and sell the replacement, then settle the difference.

Return reasons

Set up the reasons staff can choose from under Sales → Return Reasons. Through the API, use Create a return reason and List return reasons.

Returns without a receipt

Whether a staff member can return items without linking them to an original sale is set per staff member. Use Allow unlinked returns to turn it on and Deny unlinked returns to turn it off. Both change data even though they're GET requests.

Refund options

Refund toHow
Any payment methodA negative payment with that method.
Store creditA negative payment with your store credit method. The customer has to be on the sale, and the amount is added to their credit balance. See Gift cards and store credit.
A gift cardA negative gift card payment with the card's serial puts the value back on the card.

Returns through the API

To bring in a return from another system, Create a sale whose lines have a negative quantity and point at the original line with linked_sale_line_id:

{
  "store_id": 2,
  "customer_id": 2099268,
  "lines": [
    {
      "item_id": 5521,
      "quantity": -1,
      "item_price": 49.5,
      "linked_sale_line_id": 99120,
      "item_return_reason": "Wrong size",
      "item_return_mark_as_faulty": false
    }
  ],
  "payments": [
    {"payment_method_id": 7, "amount": -49.5}
  ]
}
  • Get the original line IDs from Get a sale.
  • Each original line keeps a running returned_quantity. Check it before you send a return, so you never return more than was sold.
  • item_return_reason is the reason text. Send "" on normal lines.
  • item_return_mark_as_faulty flags items that came back faulty.
  • The return fires sale_create like any other sale, and stock is updated for you. Don't adjust stock yourself as well, or it'll be counted twice.

Online orders

If the original sale had a fulfillment, also record the return against it with Return a fulfillment, using the return sale's ID and line IDs. See Online orders and fulfilment.

Example: Alert the buyer about faulty returns

Trigger: System Hook, sale_create.

  1. Script: Find faulty returns

    var sale = JSON.parse($.default);
    $.sale = sale;
    $.sale_id = sale.id;
    var faulty = sale.lines.filter(function (l) {
      return l.quantity < 0 && l.item_return_mark_as_faulty === true;
    });
    $.has_faulty = faulty.length > 0;
    $.faulty_list = faulty.map(function (l) {
      return "<li>" + l.barcode + " x " + Math.abs(l.quantity) + ": " + l.item_return_reason + "</li>";
    }).join("");
  2. If Condition: If anything came back faulty, Condition $.has_faulty === true.

  3. Email: Tell the buyers, nested under THEN: To your buying team, Template Custom, Subject Faulty returns on receipt {{ sale.receipt_number }}, Body <ul>{{ faulty_list }}</ul>.


Did this page help you?