For a trading or retail company, Odoo 20 changes four things that matter: inventory valuation now lives in Accounting, the warehouse and Barcode apps gained tools for reordering, returns, lots and packages, Point of Sale can take several currencies and closes sessions with a single sales entry, and the access rights system behind every custom module was rebuilt. Odoo 19 stays supported until September 2028, so there is time. New implementations should start on Odoo 20. Companies already on 19 can plan the move for a quiet month, after testing, and companies on 17 or older should plan it now.
Everything below comes from Odoo’s own Odoo 20 release notes, the Odoo documentation for version 20 and, for the technical changes, the Odoo 20 source code.
Support dates for Odoo 18, 19 and 20
| Version | Released | End of standard support |
|---|---|---|
| Odoo 18 | October 2024 | September 2027 (planned) |
| Odoo 19 | September 2025 | September 2028 (planned) |
| Odoo 20 | September 2026 | September 2029 (planned) |
Standard support covers three years and includes security updates. Odoo 17 left standard support in September 2026: from then on it gets extended support only, for an extra fee, on Odoo.sh or your own servers, and no more security updates. On Odoo Online, a database on a major version must be upgraded every two years.
Accounting and inventory valuation
In Odoo 19 the valuation settings came with the stock_account module. In Odoo 20 they sit in Accounting → Configuration → Settings, and valuation is part of Accounting itself. We wrote a short guide on where the valuation settings are in Odoo 20. Other changes a finance team will notice:
- Cost corrections flow back. When a product’s cost changes after it was delivered, for example through a landed cost or a bill at a different price, Odoo 20 updates the delivery’s value retroactively, and the cost of goods sold too under perpetual valuation.
- Valuation Adjustments. Cost adjustments and their effect on stock value are listed in a new menu, visible in debug mode. Under perpetual valuation the journal entries are created automatically.
- Accruals from the closing report. Under perpetual valuation, Bills To Receive, Billed Not Received, Invoices To Be Issued and Invoiced Not Delivered can be booked from the inventory valuation closing report.
- Parent accounts. Account groups are replaced by parent accounts for structuring the chart of accounts, and account codes become optional.
- Payment statuses renamed. In Process becomes Paid, and Paid becomes Reconciled. Entries that touch a bank account must now come from bank transactions.
- Tax included or excluded. Sales orders, purchase orders and invoices can switch between prices with and without tax.
Warehouse and the Barcode app
| New in Odoo 20 | Why a trader cares |
|---|---|
| Suggested minimum and maximum on reordering rules, from demand history, days of coverage and order frequency | Replenishment levels for hundreds of items without setting each one by hand |
| One Order button in the replenishment screen, ordering the maximum minus the forecast | Fewer clicks for the buyer and one rule to explain |
| Landed costs on individual products of a transfer | Freight and customs for one item in a mixed container |
| Routes between companies, deliveries from another company’s warehouse, cost carried across | Groups with a trading company and a retail company |
| Stock at a past date to the minute, and a stock aging report | Month-end checks and slow-moving stock reviews |
| A simpler returns flow, without the old return wizard | Customer returns at the counter and in the warehouse |
| Vendor reference on receipts, HS codes and packagings per variant | Receiving staff find the order; customs codes are right per variant |
| ZPL labels for locations, and network ZPL printers | Shelf labels and product labels printed from Odoo |
The network printers are new in Odoo 20: Inventory has a Manage Printers menu for ZPL printers addressed by IP. Our guide to printing Zebra labels from Odoo 20 covers the setup. The Barcode app adds a choice on backorders, suggested batches when one vendor has several receipts due, lot and serial numbers generated in bulk, manual entry of a lot when the label cannot be scanned, packages pre-encoded with the vendor’s contents, and light users who can open the Barcode app only.
Point of Sale
- Several currencies at checkout in the same point of sale.
- End of session. Closing a session creates one global sale, which removes the miscellaneous entries, and payment entries can be posted at a set time without closing the session.
- Simplified stock. Point of Sale can run without the Inventory app, with one on-hand quantity per product.
- Printers. Several printers per point of sale, label printers over a USB proxy, and receipt paper size set in developer mode.
- Daily work. A warning when a cashier picks an expired product, products snoozed for a while, order search by invoice or receipt number, and simplified receipts that show totals and taxes only.
Sales and purchase
Sales gets price rules per packaging type, pricelist rules for set periods or days of the week, margins you can edit on the order line, numbered order lines, a sales dashboard above the quotations list, and order lines with a description and no product unless the Mandatory Product setting is on. Purchase gets a default Incoterm per vendor, an expected arrival date you can change while keeping the vendor’s original date, the cost per product unit shown beside the cost per purchase unit, and a vendor quality rate from quality checks.
Kuwait and the GCC in Odoo 20
- Kuwait payroll. The release notes list a new base payroll localization for Kuwait: regular pay, social insurance, end-of-service and provisions, and leave setup. Odoo’s payroll documentation has no Kuwait page yet, so test it against your own payroll, PIFSS for Kuwaiti staff and the bank salary file, before relying on it.
- Kuwait accounting. State names and codes follow ISO 3166-2. Kuwait has no VAT, so nothing changes on Kuwaiti tax.
- Saudi Arabia. ZATCA submission moved into the Send wizard, with batch sending from the list, invoice and transaction types set on the invoice, and the Saudi Central Bank added as an exchange rate source.
- UAE and Oman. A new UAE chart of accounts with 6-digit codes, the FTA audit file from the general ledger, and payroll changes; Oman gets a base payroll localization with WPS files.
Under the hood: custom modules need work
The biggest technical change is security. Odoo 19 had access rights (ir.model.access) and record rules (ir.rule). Odoo 20 replaces both with one model, ir.access, where an access line can carry a domain. Standard modules now ship security/ir.access.csv instead of ir.model.access.csv. Tracking values are no longer stored by default, Odoo’s own screens use Material Symbols icons, and push notifications no longer go through Firebase. A custom module with its own access rights will not install on Odoo 20 until they are rewritten, so list your modules early. Our Odoo 20 upgrade checklist goes through the steps.
When to move to Odoo 20
| Your situation | What we suggest |
|---|---|
| Starting a new implementation | Start on Odoo 20 |
| On Odoo 19 with few custom modules | Request a test upgrade now and move in a quiet month |
| On Odoo 19 with many custom modules | Port the modules first; Odoo 19 is supported until September 2028 |
| On Odoo 17 or older | Plan the upgrade now; you can go straight to Odoo 20 |
We upgrade Odoo databases for companies in Kuwait and the Gulf: a test upgrade on a copy of your data, custom modules ported or replaced by new standard features, reconciliation of balances and stock, then one cut-over. See our Odoo migration and upgrade service.
What to do next
- Write down your Odoo version, hosting (Odoo Online, Odoo.sh or your own server) and the custom modules installed.
- Mark which of the Odoo 20 changes above would replace a custom module or a manual step in your company.
- Book a consultation to plan the test upgrade and the cut-over date.
