Odoo 19 Returns

Odoo Returns with Discounts and Multiple Units of Measure: Refunds That Match the Sale

Star Bit Solutions8 min read

When the original sale carried a discount or was sold by the pack, a careless credit note refunds more than the customer paid. Here is how to make Odoo 19 credit the price actually charged, with worked examples and a test plan.

A returned parcel flowing into a credit note that carries a proportional discount, beside unit, pack and box tiles
Scroll

Key takeaways

  • Refunds go wrong when credit notes are priced from the list price instead of the original sale, its discount and its packing unit.
  • The Sales Discount bridge copies the original discount onto the credit note and shares it proportionally on partial returns.
  • The Multi-UoM bridge lets returns be entered in packs, with the configured ratio and pack price, and refuses lines that break the ratio.
  • Test full, partial, unidentified and pack returns on a staging copy, and compare every credit note with the original invoice.

Odoo returns with discounts are where refunds quietly go wrong. A customer bought four units with 40.00 off, or two packs of six at the pack price, and brings half of it back. If the credit note is priced from the product's list price instead of the original sale, you refund more than the customer ever paid, and nobody notices until the margins drift.

Our earlier guide to sales returns, exchanges and refunds in Odoo 19 covered the overall workflow. This one goes deeper on two cases that often lead to refund errors: discounted lines, and goods sold in packing units rather than single units. It explains why they go wrong, how our free returns modules handle them, and how to test the setup before go-live.

The SBS returns modules are built and tested on Odoo 19 Community. If you run Odoo Enterprise, we design returns around its standard Sales, Inventory and Accounting apps, and try any module on a staging copy before production.

Why Refunds Go Wrong after a Discount or a Pack Sale

Standard Odoo 19 handles a return after invoicing in two steps: the warehouse reverses the delivery, then finance creates a credit note from the invoice. Odoo's credit note documentation describes a Reverse option that prefills the credit note with the exact details of the original invoice. Used carefully, that keeps the price right. The trouble starts in the gaps around it.

The Credit Is Built from the Current Price, Not the Sale

A credit note created from scratch, or by a tool that only knows the product and the quantity, takes the product's current sales price. Any discount the customer received disappears, and so does any price change since the sale.

The Discount Was Agreed in Money

Customers negotiate in money, not percentages: "take 40 off". Odoo's discount column takes a percentage, so a fixed discount is converted by hand at the sale, and converted again, or forgotten, at the refund.

Only Part of the Line Comes Back

A fixed discount covers the whole line. When half the goods come back, half the discount should come back with them, neither all of it nor none of it.

Goods Sold by the Pack Come Back as Units

If a customer bought two packs of six, the return should say two packs and credit the pack price. Converting to twelve units by hand invites quantity errors, and pricing those units at the unit list price over-refunds whenever the pack was cheaper per unit.

The SBS Modules Involved, and What Each Does

Several free modules work together here, each with one job. All of them appear in our tour of free Odoo 19 Community modules.

ModuleIts job in a returnSettings
SBS Auto ReturnHolds the return, exchange and refund on one record; nothing posts until a manager finalizes itUser and Manager roles
SBS Sales Discount AmountAdds a Disc. Amount column beside Disc.%, kept in step both waysOdoo's Discounts setting
SBS Multi UoMSells one product by the unit, pack, box or carton, with a price for each packaging unitUnits of Measure and Packagings
Sales Discount IntegrationCopies the original discount onto the credit note, proportionally on partial returnsNone
Multi-UoM IntegrationLets return lines use the packing units, ratios and prices the sale usedNone

The bridge modules have no menus and nothing to configure. With their code in your addons path or Odoo.sh repository, Odoo installs each bridge automatically when the second of its parent modules is installed, and removes it if either parent is uninstalled. If both parents were already installed, install the bridge once from Apps.

How Odoo Returns with Discounts Are Credited

SBS Sales Discount Amount lets a salesperson type the discount in money in a Disc. Amount column, while Odoo's own percentage field keeps taxes and totals standard. It remembers which figure was typed and holds it steady when the quantity or price changes, refuses a discount larger than the line, and carries the discount through to the invoice.

When a return is finalized in SBS Auto Return, the Sales Discount bridge copies the discount from the source line onto the credit line. A fixed discount stays marked as fixed, and when only part of the quantity comes back, the discount is shared in the same proportion. It works for returns raised against an invoice and for unidentified returns typed in by hand.

Worked Example: Half a Discounted Line Comes Back

DocumentQuantityUnit priceFixed discountNet
Original invoice4250.0040.00960.00
Credit note with the bridge2250.0020.00480.00
Credit note without it2250.00None500.00

Half the goods came back, so half the discount came back with them. Without the bridge, the customer is refunded 20.00 more than they paid for those two units, and the loss repeats on every discounted return.

Have a question about this guide? Ask the engineers who wrote it.

Returning Goods Sold by the Box, Carton or Pack

SBS Multi UoM adds a Multiple UoMs tab to the product, where each packing unit has a ratio to the base unit of measure (UoM) and its own price. Stock stays in base units, and the ratio and price in force when a sales line is written are stored on that line, so later price changes never alter documents you have already issued.

The Multi-UoM bridge makes return lines read the same table. The dropdown offers only the packing units configured on that product, the stock quantity follows the configured ratio, and the credit uses the configured pack price. A return line carries both a pack quantity and a base quantity, and saving is refused if they disagree, with the message "The base quantity does not match the configured Multi UoM ratio."

Worked Example: Two Packs Come Back

Take a printer cartridge with a unit list price of 5.00, sold in a Pack of 6 at 27.00 and a Box of 12 at 54.00. A customer returns two packs:

  • With the bridge: the line reads 2 Packs of 6, puts 12 units back into stock and credits 2 × 27.00 = 54.00.
  • Without it: someone converts to 12 units by hand and the credit is priced from the unit list price, 12 × 5.00 = 60.00, which refunds 6.00 more than the customer paid.

The same arithmetic applies to boxes: one Box of 12 is credited at 54.00 rather than 60.00. The gap on each return is small, which is exactly why it goes unnoticed.

Tip: The Multi-UoM bridge reads pack ratios and prices from the product's Multiple UoMs table. If you have changed a pack price since the sale, compare the credit line with the original invoice before the manager finalizes the return.

From Sale to Credit Note, Step by Step

Here is the discount case end to end, as a team would run it with SBS Auto Return:

  1. Turn on Odoo's Discounts setting and install SBS Auto Return and SBS Sales Discount Amount; the bridge installs itself.
  2. Sell 4 units at 250.00 and type 40 in Disc. Amount; Odoo works out the percentage and the line nets 960.00.
  3. Deliver and invoice as usual; the discount carries across to the invoice.
  4. When the customer brings back 2 units with the paperwork, create an Identified Delivery Return and pick the original order and delivery, so each line is checked against what actually shipped.
  5. Check which way the money goes, then allocate the refund across cash and bank journals, or leave part of it on the customer's account as credit.
  6. Confirm the return. It moves to Waiting for Final Approval, and nothing has been posted yet.
  7. A user with the SBS Auto Return Manager role finalizes it, and the transfer, the credit note for 480.00 with its 20.00 fixed discount and the payment are created at that moment.

If a single line carries both a packing unit and a discount, test that combination on a staging copy before relying on it, because each bridge is documented on its own.

Testing Tips before You Go Live

Run these cases on a staging copy with real products and prices, and compare every credit note with the original invoice:

  • A full return of a line with a fixed discount: the credit should equal the invoice line.
  • A partial return of the same line: the discount should be shared in proportion.
  • A partial return of a line with a percentage discount.
  • An unidentified return typed in by hand, with a discount on the line.
  • A return of two packs: 12 base units back into stock, credited at the pack price.
  • A return line whose pack and base quantities disagree: saving should be refused.
  • A return after a pack price change, checked against the original invoice.
  • An exchange where the replacement goods cost more, so the direction flips to Collect From Customer.

Check the controls around the numbers as well. The SBS Auto Return Manager role should belong to people who do not staff the returns counter, and the Waiting for Approval list deserves a daily review.

How Star Bit Solutions Can Help

We wrote the SBS returns, discount and packaging modules, and we implement Odoo Enterprise and Community through OdooStar. On Enterprise, we design your returns flow around the standard apps. On Community, we install SBS Auto Return with the discount and packaging bridges, configure your packing units and run the test cases above with your own data.

Tell us how your returns work today through the contact page, call +971 55 973 4524 or message us on WhatsApp, and an engineer will map the setup with you.

Star Bit Solutions logo
Written by the Star Bit Solutions team

Star Bit Solutions is a software company in Ajman, UAE, founded in 2014. We implement and customize Odoo Enterprise and Odoo Community, and build StarBiz (AI-driven ERP), StarHub (life super app), StarBot (conversational AI), StarLearn (adaptive learning) and StarSense (AI and IoT platform). About us

OdooStar by Star Bit Solutions

Refunds That Match the Sale.

We set up SBS Auto Return with the discount and packaging bridges on Odoo 19, then test your own return cases before go-live.

Not Sure Which Solution Fits?

Tell us about your business and we will recommend the right starting point, free of charge.