How to Create a Multi-Level Bill of Materials in Odoo

Most real products are built from sub-assemblies. How to model that as a multi-level BOM in Odoo.

Most real manufactured products are not built from raw components in one step. They are built from sub-assemblies, which are themselves built from components. Modelling that correctly in Odoo means a multi-level bill of materials. This piece explains how.

What a multi-level BOM is

A single-level BOM lists a product's immediate components directly. A multi-level BOM reflects that some of those components are themselves manufactured items with their own BOMs. The finished product sits at the top, sub-assemblies sit in the middle, and raw components sit at the bottom, forming a tree. Odoo supports this natively and explodes the structure recursively when production is planned.

The principle: each sub-assembly is its own product

The key to building a multi-level BOM in Odoo is understanding that you do not build one giant nested BOM. Instead, each sub-assembly is itself a product, and each sub-assembly has its own bill of materials. The multi-level structure emerges naturally because a component line on one BOM points to a product that has a BOM of its own.

How to build it

Create the products at every level. Before any BOM, the products have to exist: the finished product, every sub-assembly, and every raw component. A sub-assembly is a real product in Odoo, not just a label on a list.

Build the lowest-level BOMs first. Start at the bottom. For each sub-assembly, create a bill of materials that lists the raw components it is made from. Work upward.

Build the finished product's BOM. Create the BOM for the finished product, and on it, list the sub-assemblies as components, alongside any raw components used directly at the top level. Because each sub-assembly is a product with its own BOM, Odoo now knows the full structure.

Let Odoo explode it. When a manufacturing order for the finished product is planned, Odoo explodes the multi-level structure: it knows the finished product needs its sub-assemblies, and that each sub-assembly needs its components, down to the raw materials.

Manufactured sub-assemblies versus the alternative

An important decision for each sub-assembly: is it manufactured as a distinct step, or not? If a sub-assembly is genuinely built, stocked, and consumed as an intermediate item, it is a normal manufactured product with its own BOM, and producing the finished product can involve a separate manufacturing order for it. If the grouping is really just a convenient way to organise components and the sub-assembly is never stocked as such, a kit BOM may be the better tool. Decide based on whether the intermediate item is a real, distinct stage of production.

Why the multi-level structure is worth the effort

Modelling the real multi-level structure, rather than flattening everything into one list, gives real benefits. A change to a sub-assembly's BOM flows automatically into every product that uses it. The cost rolls up correctly through the levels. Planning can see the requirement at every level. And the BOM reflects how the product is genuinely built, which makes production tracking meaningful. A flattened BOM loses all of this.

The accuracy point

As with any BOM work in Odoo, the multi-level structure is only useful if it is accurate. Each level's BOM must match what is genuinely built. Time spent verifying the BOMs against reality is what makes the multi-level structure trustworthy for planning and costing.

The takeaway

A multi-level bill of materials in Odoo is built by making each sub-assembly its own product with its own BOM, then listing sub-assemblies as components on the BOMs above them. Build from the lowest level up, decide for each sub-assembly whether it is a real manufactured stage or a kit, and Odoo explodes the full structure when production is planned. For how we approach Odoo for manufacturers, see our manufacturing work.

All posts

Got a Topic Worth Posting?

Suggest a Topic

If a question keeps coming up in your operations, it might be worth its own post.