How to Process an Exchange in Odoo 19 Point of Sale · Calibre Consulting

Process an exchange on one receipt in Odoo 19 Point of Sale.

Odoo 19 blocks new items on a refund order. Ring up exchanges on one receipt instead, and tag them so exchanges and refunds stay separate.

This guide shows how to process an exchange in Odoo 19 Point of Sale, where a customer brings an item back and leaves with a different one, and how to keep exchanges separate from refunds in your records. The short answer: Odoo 19 does not let you add a new item to an order started with the Refund button, so ring the exchange up on an ordinary order instead, with the returned item entered at a negative quantity next to the new item. To label it, create an Exchange preset that the cashier selects on the order.

It is written for shop owners and store managers whose returns policy is exchange only, or exchange first. The steps were verified on Odoo 19.

Before you start

Why a refund order no longer takes new items

In standard Odoo 18, a cashier could add a new item to an order that held refunded lines and take payment for the difference. Odoo 19 marks the order created by the Refund button as a refund. While an order carries that mark, adding any item at a positive quantity shows the message "Ensure you validate the refund before taking another order." The register also refuses keypad edits on that order, apart from deleting. The only items Odoo allows on a refund order are gift cards and eWallet top-ups, so a refund can be turned into store credit.

The mark comes from the Refund button, not from the quantities on the order. An ordinary order can still hold a negative line and a positive line together, which is what makes an exchange on one receipt possible.

Set up an Exchange preset

This step is optional. It gives every exchange a label you can find later.

  1. Open the Point of Sale app and go to Configuration > Settings. Select the register in the Point of Sale field at the top.
  2. In the Point of Sale section, tick Take out / Delivery / Members. The Available and Default fields appear.
  3. In Available, type Sale and choose Create and edit.... In the form, leave Return mode unticked and leave Pricelist and Fiscal Position empty, so the register's defaults apply. Save it.
  4. Do the same for a preset called Exchange, again with Return mode unticked.
  5. Set Default to Sale, so every new order is tagged Sale unless the cashier changes it, and click Save.
  6. Go to Dashboard and open the register with Continue Selling or Open Register, so it loads the new setting. A Preset button showing the current preset name now appears on the register screen.

Leave Return mode off on the Exchange preset. Return mode turns every line negative, including the item the customer is taking.

Ring up an exchange

  1. Start a new order on the register. Click the Preset button and choose Exchange.
  2. Add the item the customer is returning. With its line selected, press +/- on the keypad. The quantity changes to -1. For several units, type the number first, then press +/-.
  3. Add the item the customer is taking. It is added at a positive quantity as usual.
  4. Click Payment. If both items cost the same, the total is zero and you can click Validate without choosing a payment method. If the new item costs more, take the difference. If it costs less, the total is negative: select the payment method used to give the difference back, then validate.

Odoo records the returned item coming back into stock on a separate return transfer from the new item going out.

Points to watch

Check that it worked

  1. Ring up a test exchange with the Exchange preset and validate it.
  2. In the Point of Sale app, go to Configuration > Presets and open Exchange. An Order(s) button at the top counts the orders tagged with it. Click it to list them.
  3. Open the test order. On the Products tab you should see the returned item at a negative quantity and the new item at a positive one, and on the Extra Info tab the Preset field should show Exchange.

Exchanges are now the orders tagged Exchange. Returns processed with the Refund button carry the default Sale tag unless the cashier changes it, so the Exchange tag separates the two in your records.

Odoo 20 and later

The Odoo 20 source keeps the same rule: an order created with the Refund button still refuses items at a positive quantity, with the same message. The steps above were verified on Odoo 19 only.

Steps verified on Odoo 19. Menus and labels can differ on other versions.

Common questions

Why can't I add a new item to a refund in Odoo 19 POS?

Odoo 19 marks an order created with the Refund button as a refund, and blocks any item at a positive quantity on it with the message "Ensure you validate the refund before taking another order." Gift cards and eWallet top-ups are the only items allowed.

How do I do an exchange on one receipt in Odoo 19 POS?

Start an ordinary order, add the returned item and press +/- to make its quantity negative, then add the new item and take payment for any difference. A zero total can be validated without a payment method.

How can I tell exchanges from refunds in Odoo 19 POS?

Turn on Take out / Delivery / Members in the Point of Sale settings and create an Exchange preset with Return mode off. Cashiers pick it on exchange orders, and the preset's Order(s) button lists every order tagged with it.

Should the Exchange preset use Return mode in Odoo 19?

No. Return mode makes every line on the order negative, including the item the customer is taking, so it only suits pure returns.

Talk to the team.

If you are setting this up, or Odoo is not behaving the way this guide describes, book a 30-minute call. We will look at your configuration and tell you what it needs. Calgary studio, in-house team, no offshore handoffs.

Book the call →