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
- Version and edition: Odoo 19, Community or Enterprise. Presets and refunds are part of the standard Point of Sale app.
- Apps: Point of Sale.
- Access rights: the Point of Sale settings and the Configuration menu need the Administrator role for Point of Sale.
- Cashier rights: if your cashiers log in as employees, those with Minimal rights see the +/- key greyed out and cannot use the Refund button. Give exchange staff Basic or Advanced rights.
- Certified registers: if your database uses a country fiscal certification module for the register, such as the Belgian, German or Swedish ones, that module changes how quantities can be edited. Test the method on a practice order first.
- Terms used: a refund order is the order Odoo creates when a cashier clicks Refund and picks items from a past receipt. A preset is a named order type, such as Dine in or Take out, that the cashier picks on each order. A preset can also apply a pricelist and a fiscal position, which is the rule that swaps taxes for a type of sale. Return mode is a preset option that makes every line on the order negative.
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.
- Open the Point of Sale app and go to Configuration > Settings. Select the register in the Point of Sale field at the top.
- In the Point of Sale section, tick Take out / Delivery / Members. The Available and Default fields appear.
- 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.
- Do the same for a preset called Exchange, again with Return mode unticked.
- Set Default to Sale, so every new order is tagged Sale unless the cashier changes it, and click Save.
- 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
- Start a new order on the register. Click the Preset button and choose Exchange.
- 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 +/-.
- Add the item the customer is taking. It is added at a positive quantity as usual.
- 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
- The returned item is priced today. A line entered by hand takes the current price from the order's pricelist, not the price on the customer's original receipt. If the item was bought on sale, correct the line with Price on the keypad. When Price Control is on in the Pricing section of the settings, only cashiers with manager rights can change prices.
- Odoo does not check the original sale. A negative line on an ordinary order is not linked to any past receipt, so Odoo does not confirm the item was bought there or has not already been returned. If you need that check, use the Refund button for the return, which only offers quantities still refundable on the chosen receipt, validate it, then sell the new item on a second order with the Exchange preset.
- Store credit instead of an exchange. If the customer is not ready to choose, a gift card can be added to a refund order, and Odoo sets its value to the refund amount. This needs Promotions, Coupons, Gift Card & Loyalty Program turned on in the settings and a gift card program set up.
Check that it worked
- Ring up a test exchange with the Exchange preset and validate it.
- 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.
- 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 →