A bill of materials (BoM) is the blueprint behind a product: the components and quantities needed to produce or repair it, and often the operations and instructions for doing the work. In Odoo 20, a BoM is far more than a parts list. The BoM type decides whether a product is manufactured, bundled from stock, or sent to a subcontractor; by-product lines decide what else comes out of a production run besides the main product; and variant settings decide how one product with many variants avoids needing a separate recipe for each. This article walks through all three, plus the BoM improvements that arrived with Odoo 20.
Anatomy of a BoM
A BoM is created for a product — optionally for one specific Product Variant — and states the Quantity of finished units a single run of the BoM produces, so a recipe can be written for a batch of ten instead of one. A Reference field differentiates similar BoMs for the same product (a computer builder, for example, might tag an alternate build 2080Ti when a GPU shortage forces a substitute). The Components tab lists each component product and its quantity; an optional Consumed in Operation column ties a component to the operation that uses it, which feeds manufacturing readiness — the BoM's Miscellaneous tab can set readiness to require all components, or only those for the first operation, before work starts. When the Work Orders feature is enabled, an Operations tab defines the production steps that become work orders. Odoo 20 also lets you register extra costs for a manufacturing order through a dedicated field on the BoM form, and view and manage a BoM's components and sub-assemblies directly from the form.
The three BoM types
Every BoM has a type, and the type changes how demand is fulfilled:
| BoM type | How demand is fulfilled | Manufacturing order? | Stock behaviour | Typical use |
|---|---|---|---|---|
| Manufacture this product | Produced in-house, following the BoM's operations at work centers | Yes — an MO consumes the components and runs any defined work orders | Components leave stock; the finished product (and any by-products) enter stock | Anything you build yourself, from furniture to electronics |
| Kit | Assembled from existing stock at picking time; there is no production step | No MO for the kit itself | The kit holds no stock of its own; component quantities are deducted when the kit is delivered | Bundles and sets sold as one line: gift packs, starter kits, spare-part sets |
| Subcontracting | The work is performed by an external partner | Yes — a subcontracting MO drives the flow | Components are shipped to the subcontractor; the finished product is received back into stock | Outsourced steps such as coating, filling, or specialist assembly |
Manufacture this product
The standard type. Confirming demand creates an MO that reserves the components, runs the operations as work orders, and receives the finished product into stock when production closes. Use it whenever the product is genuinely transformed in-house.
Kits
A kit is a set of unassembled items sold or delivered together. The kit product needs no special configuration beyond its kit BoM listing the components and their quantities. On a quotation or sales order the kit appears as a single line item, but on the delivery order each component is listed and picked individually — the warehouse never “makes” the kit, it just gathers the parts. Because the kit itself carries no stock, its availability is derived from its components. Kits also serve as building blocks inside manufacturing: a kit used as a component of a manufactured product explodes into its own components in the parent BoM, which keeps complex, multi-level BoMs readable instead of forcing every screw and bracket onto the top-level recipe.
Subcontracting
With the subcontracting type, the BoM lists the components you supply to an external partner, who performs the production and returns the finished product. The MO tracks what was sent out and what came back, keeping outsourced work inside the same inventory and costing system as in-house production. In Odoo 20, subcontracting MOs also expose the component status and MO overview, so missing components can be spotted and ordered directly.
By-products: the second output of a run
A by-product is a residual product created during production in addition to the BoM's main product — offcuts that become a sellable smaller item, a co-product from a refining step, or reclaimed material returned to stock. Unlike the primary product, a BoM can have more than one by-product. To use them, first enable the By-Products feature in the Manufacturing settings; a By-products tab then appears on the BoM. Each line specifies the by-product, its quantity and unit, and optionally the Produced in Operation — the operation at which the by-product comes out, which matters when a run has several stages.
By-products also carry costing. The Cost Share percentage on a by-product line assigns it that share of the total production cost, divided by the quantity produced; the cost shares of all by-products together must total 100 or less, with the remainder landing on the main product. That keeps co-product inventory valued realistically instead of free. A small Odoo 20 fix helps on the floor: mandatory barcode scans no longer prevent editing by-products, so a mis-keyed by-product quantity can be corrected without abandoning the scan flow.
One BoM, many variants
Products with attributes — size, colour, material — can explode into dozens of variants, and maintaining a full BoM per variant is a recipe for drift. Odoo offers two approaches, and they can be mixed:
- One BoM per variant. Set the BoM's Product Variant field to a single variant. Best when a variant is built genuinely differently — a different process, not just a different part.
- One master BoM with variant-specific lines. Leave the BoM's variant field blank and use the Apply on Variants column on component lines to restrict a component to the variants that use it. A line with the column left blank is used in all variants, so shared parts are written once and variant-only parts are tagged.
The same mechanism applies beyond components: operations can carry Apply on Variants so a step runs only for the variants that need it, and by-products can be variant-specific as well. When an MO is confirmed for a given variant, Odoo assembles the effective recipe from the shared lines plus the lines tagged for that variant — one maintained BoM, correct output per variant.
Multi-level BoMs and sub-assemblies
A component can itself be a manufactured product with its own BoM. Such a sub-assembly turns a flat recipe into a multi-level BoM: confirming an MO for the top product generates replenishment for the sub-assemblies, each produced under its own MO with its own operations. In Odoo 20, sub-assemblies can be viewed and managed directly from the parent BoM form, which makes auditing a deep structure considerably less painful than opening every nested BoM by hand.
What is new for BoMs in Odoo 20
- BoM comparison. BoMs can be compared based on the product quantities they use — the BoM lines view opens in a pivot that lines several BoMs up side by side, making alternate builds easy to evaluate.
- Simpler component replacement. The Used In smart button on a product form now displays the BoM component lines that use it, and the same action is available from BoM list and form views — so swapping a discontinued component across every affected BoM starts from the component, not from a search through recipes.
- Clearer BoM overview. In the BoM overview forecast, the former Status and Availability columns have been merged, removing a confusing duplication.
- Flexible consumption by default. The flexible consumption setting on BoMs has been removed; all MOs now use flexible consumption regardless of whether a BoM is selected, so operators can record real-world consumption that differs from the recipe without an admin first relaxing a setting.
- Extra costs on the BoM form. Extra costs for an MO can be registered through the dedicated field on the BoM form, keeping overhead attached to the recipe that causes it.
Practical tips
- Reach for a kit when nothing is transformed: if staff only gather parts, a manufacturing BoM adds work orders nobody needs.
- Set cost shares on by-products at creation time; retroactively revaluing co-product stock is far more painful than splitting the cost up front.
- Prefer one master BoM with Apply on Variants until a variant truly diverges in process — then give that variant its own BoM.
- When a component is discontinued, start from its Used In lines and replace it everywhere in one pass, instead of discovering stale BoMs one MO at a time.
The BoM is where manufacturing intent becomes system behaviour. Getting the type, by-products, and variant strategy right in Odoo 20 means MOs, deliveries, and costs all follow from a single, maintainable recipe.
Further reading
- Odoo 20 Release Notes — the Manufacturing section: BoM comparison, component replacement, flexible consumption, and extra costs.
- Bill of materials — Odoo documentation — BoM setup, components, operations, variants, and by-products in detail.
- Manufacturing orders and work orders — Odoo 20.0 documentation — how BoMs turn into MOs and work orders at production time.
