Odoo 20 Inventory and Manufacturing: What Changes
Scrap with reasons, extra costs on bills of materials, consumption checks on every production order: Odoo 20's operations changes, explained for managers.
This is part 3 of our Odoo 20 series, for operations, warehouse and production managers, and for the finance people who rely on their numbers. Odoo 20 does not reinvent Inventory or Manufacturing. It makes a handful of targeted changes that affect how waste is tracked, how product cost is built, and how much the system checks your production team.
Inventory
Scrap becomes a stock movement with a reason
In Odoo 19, scrapping goods created a separate scrap document. In Odoo 20 that document is gone. A scrap is now an ordinary stock movement, marked as scrap, with two useful additions:
- Reason tags. Record why goods were thrown away: expired, damaged in transit, preparation waste, quality rejection, and so on.
- A "replenish" option. When scrapping, you can tell the system the goods should be restocked.
Why this matters: waste stops being a single cost line and becomes something you can analyse by reason, product and location. For a food business or a central kitchen, the difference between "we lost a lot of stock last month" and "most of it was expired dairy at two outlets" is the difference between a report and a decision.
Batch transfers are now standard
Grouping several transfers into one batch (for example, one picker collecting items for several orders in a single round) used to be a separate module. In Odoo 20 it is part of Inventory, including barcode scanning. There is nothing extra to install.
One name for "unit of measure"
Odoo 20 uses the same unit-of-measure field everywhere: on stock moves, purchase lines and bills of materials. Users won't notice. Custom reports, custom modules and integrations that read unit-of-measure data will, and they need to be updated (see part 7).
Inter-company stock is valued at the sending company's cost
When one company in your group delivers goods to another, Odoo 20 can now value the receipt at the receiving company from the original delivery at the sending company. This supports the inter-company resupply routes that come with Odoo. In plain terms, the receiving company books the goods at what they actually cost the sender, which helps keep group margins honest. (It handles the simple case: one originating delivery, same currency.) If inter-company flows are new to you, see our article on inter-company inventory transfers.
Manufacturing
Bills of materials can carry extra costs
A new extra cost line on a bill of materials lets you add per-unit costs that are not components, such as labour, energy or packaging. These costs flow into both:
- the BoM cost report, which shows what a product should cost, and
- the actual cost of each manufacturing order, which shows what it did cost.
For businesses that price from cost, such as central kitchens, food producers and contract manufacturers, this closes a common gap. Product cost no longer has to mean "ingredients only".
Consumption is checked on every production order
Odoo 19 let you mark a bill of materials as "flexible", which skipped the check on whether production used more or less material than planned. That option is gone. In Odoo 20:
- Every manufacturing order compares actual consumption with the plan.
- If they differ, the operator sees a warning they can confirm and then carry on.
- There is no longer a mode that silently allows differences, and none that blocks the order outright.
What this means for management: you get better visibility of over- and under-use, but production staff will see warnings that did not appear before. Brief them before go-live, and decide who reviews confirmed differences, so that "confirm" doesn't become a reflex.
Odoo 20 also adds new modules that connect manufacturing to IoT devices and to delivery.
Field Service moved onto Planning
Not strictly inventory, but relevant for companies that send technicians out with parts: Field Service was rebuilt on the Planning app, with maps and location features. If you use Field Service in Odoo 19, expect the move to look and work differently, and plan time for testing and user training.
What to check before upgrading
- Scrap reasons. Agree a short, useful list of reasons before go-live. Five good reasons beat thirty vague ones.
- Bills of materials. Decide which extra costs (labour, energy, packaging) you want to add, and who maintains them.
- Flexible BoMs. Find BoMs set to "flexible" in Odoo 19. Those production lines will start seeing consumption warnings.
- Inter-company flows. If your group moves stock between companies, test valuation on a copy of your database before go-live.
- Reports and integrations that read unit-of-measure or scrap data need updating.
Planning an operations-heavy Odoo upgrade? See our services or contact the Keyklik team.
The Odoo 20 series
- What's New for Your Business
- Point of Sale for Restaurants and Retail
- Inventory and Manufacturing (this article)
- Accounting and Purchasing
- HR and Attendance
- AI Agents and MCP
- Planning the Upgrade
Note (DYOR — Do Your Own Research): This article is based on our own comparison of the Odoo 19 and Odoo 20 source code, not on Odoo's official release notes. Stock valuation and product costing affect your financial statements, and inter-company pricing can have tax (transfer pricing) consequences. Verify against the official Odoo documentation, and consult your accountant, tax advisor and implementation partner before relying on these features.