Skip to Content

How to Set Up a Multi-Level BOM with Variants in Odoo MRP

May 21, 2026 by
How to Set Up a Multi-Level BOM with Variants in Odoo MRP

By the end of this tutorial, you'll be able to build a multi-level Bill of Materials in Odoo that uses product variants, so a single BOM covers multiple finished-good configurations without requiring separate BOMs for each SKU. Prerequisites: you need at least one product with variants configured and the Manufacturing module installed. Budget about 30 to 45 minutes to follow along fully.

Phase 1: Enable the Right Settings

Before you touch a BOM, confirm that the features you'll need are actually turned on. Two settings are critical here, and both live in the Manufacturing configuration screen.

  1. Go to Manufacturing → Configuration → Settings.
  2. Under the Products section, confirm that Variants is enabled. If it isn't, toggle it on and save. (This setting is shared with the Sales and Inventory apps, so enabling it here enables it everywhere.)
  3. While still on that screen, enable Bill of Materials Components if it isn't already active. This is what lets you apply BOM line conditions based on variant attributes.
  4. Click Save.

If you're also planning to use routings and work centers for this product (recommended for any assembled item with multiple operations), confirm that Work Orders is enabled in the same Settings screen under the Operations section.

Phase 2: Set Up Your Product and Its Variants

A multi-level BOM with variants only makes sense if your finished product is already configured with the right attribute structure. This phase walks through that setup before you ever open a BOM form.

Configure the Parent (Finished) Product

  1. Go to Manufacturing → Products → Products and open (or create) the finished product. For this tutorial, we'll use a configurable electric motor as the example: the "EcoMotor 3000", which comes in two voltages (110V and 220V) and two frame sizes (Standard and Heavy Duty).
  2. On the product form, click the Attributes & Variants tab.
  3. Add the first attribute: click Add a line, select or create the attribute Voltage, and add values 110V and 220V.
  4. Add the second attribute: click Add a line again, select Frame Size, and add values Standard and Heavy Duty.
  5. Save the product. Odoo will generate four variant combinations automatically (110V / Standard, 110V / Heavy Duty, 220V / Standard, 220V / Heavy Duty).

Configure the Subassembly (Component) Product

A multi-level BOM requires at least one component that is itself manufactured. In this example, the motor winding kit is a subassembly that varies by voltage.

  1. Create or open the component product: Winding Kit.
  2. On its Attributes & Variants tab, add the Voltage attribute with the same two values (110V and 220V). You want the attribute names and values to match the parent product exactly, this is what lets Odoo link the right variant of the subassembly to the right variant of the finished good.
  3. Set the product type to Storable Product on the General Information tab so Odoo tracks inventory for it.
  4. Save.

Phase 3: Build the Top-Level BOM

This is the BOM for the finished EcoMotor 3000. It will include both fixed components (parts that go into every variant) and conditional components (parts that differ by attribute).

  1. Go to Manufacturing → Products → Bills of Materials and click New.
  2. In the Product field, select EcoMotor 3000. Leave the Product Variant field blank for now, a blank variant field means this BOM applies to all variants of the product.
  3. Set BOM Type to Manufacture This Product.
  4. Set Quantity to 1.

Add Fixed Components

  1. In the Components tab, click Add a line and select Motor Housing, quantity 1. This part is the same across all variants, so leave the Apply on Variants column blank.
  2. Add Bearing Set, quantity 2. Again, leave the variant condition blank.
  3. Add Mounting Bolts, quantity 8. No variant condition.

Add Conditional Components

This is where variant-specific logic comes in. The winding kit differs by voltage, and the frame reinforcement plate is only needed for the Heavy Duty frame size.

  1. Click Add a line and select Winding Kit (110V), quantity 1.
  2. In the Apply on Variants column on that line, click to open the condition selector and choose Voltage: 110V. This tells Odoo to include this component only when producing the 110V variant.
  3. Click Add a line again and select Winding Kit (220V), quantity 1. Set the condition to Voltage: 220V.
  4. Add Frame Reinforcement Plate, quantity 1. Set the condition to Frame Size: Heavy Duty. This component will be pulled only for the Heavy Duty frame variants.
One BOM, four variants covered. Odoo resolves which components apply at the moment you create a manufacturing order, based on the variant you select. You don't maintain four separate BOMs or manually track which part list is current.

Phase 4: Build the Subassembly BOM

The Winding Kit is a manufactured subassembly, so it needs its own BOM. This is the second level in the multi-level structure.

  1. Go back to Bills of Materials and click New.
  2. Select Winding Kit as the product. Leave the variant field blank so this BOM covers both voltage variants.
  3. Set BOM Type to Manufacture This Product.
  4. In the Components tab, add the parts that are common to both voltages: Coil Core (quantity 1) and Insulation Sleeve (quantity 2). Leave their variant conditions blank.
  5. Now add the voltage-specific wire gauges. Add Copper Wire 14AWG, quantity 50 meters, with condition Voltage: 110V. Add Copper Wire 12AWG, quantity 50 meters, with condition Voltage: 220V.
  6. Save the BOM.

Odoo links the two levels automatically. When you create a manufacturing order for the EcoMotor 3000 (110V / Standard), Odoo knows to explode the Winding Kit BOM using the 110V conditions at both levels.

Phase 5: Verify the Structure Before Production

Before sending anything to the shop floor, confirm the BOM explodes correctly. This is a step many teams skip and then wonder why components are wrong.

  1. Open the top-level EcoMotor 3000 BOM.
  2. Click the Structure & Cost button (the tree icon in the top-right of the BOM form). This opens the BOM explosion view.
  3. In the Variant filter at the top of the explosion view, select 110V / Standard and review which components appear. You should see: Motor Housing, Bearing Set (×2), Mounting Bolts (×8), Winding Kit 110V (×1), and the Winding Kit's sub-components resolved to 110V wire. The Frame Reinforcement Plate should not appear.
  4. Change the variant to 220V / Heavy Duty and re-check. This time, Winding Kit 220V, 12AWG wire, and Frame Reinforcement Plate should all appear. Winding Kit 110V and 14AWG wire should not.

If something looks off, go back to the BOM component line and check the Apply on Variants condition. A blank condition means "always include", if a part appears in every variant when it shouldn't, that's almost always the cause.

Phase 6: Create a Manufacturing Order and Confirm

With the BOM verified, run a quick manufacturing order to confirm the end-to-end flow before you commit to production volumes.

  1. Go to Manufacturing → Operations → Manufacturing Orders and click New.
  2. Select EcoMotor 3000 in the Product field. Odoo will prompt you to choose a variant. Select 110V / Standard.
  3. Set Quantity to 1 and confirm the Bill of Materials field has auto-populated with the correct BOM.
  4. Click Confirm. Odoo will generate the manufacturing order and, if Work Orders are enabled, a set of work orders based on the routing attached to the BOM.
  5. Check the Components tab of the manufacturing order. Confirm only the 110V-specific components appear, not the 220V winding kit or the Heavy Duty plate.

If the subassembly (Winding Kit) is not in stock, Odoo will flag it as a demand signal. Depending on your replenishment settings, it will either propose a purchase order (if bought) or a child manufacturing order (if manufactured). That child MO will carry the correct 110V component list from the subassembly BOM.

A Few Things Worth Knowing

Phantom BOMs for Subassemblies You Don't Stock

If you'd rather not generate a separate manufacturing order for the winding kit and instead pull its raw components directly into the parent MO, change the Winding Kit's BOM type to Phantom. Odoo will explode its components into the parent order automatically. This is useful for subassemblies that are always assembled in-line rather than kitted separately.

Costing Rolls Up Through the Structure

If you're using Odoo's costing module with standard cost or average cost, the multi-level structure matters for cost rollups. Odoo calculates the cost of the finished good by summing component costs at every level. Run Manufacturing → Reporting → Cost Analysis after setup to spot any components missing a unit cost before production starts.

Variant Conditions and Forecasting

The variant-conditional component lines also feed Odoo's replenishment and forecasting logic. When you run a forecast for EcoMotor 3000 (220V / Heavy Duty), Odoo factors in the frame reinforcement plate demand correctly. This is the integration story in practice: the same BOM configuration that drives shop floor picking also drives inventory replenishment, procurement, and costing, all from a single setup.

Your implementation partner can extend this further, configuring reorder rules per variant, setting up automated MO generation from sales orders, or linking the BOM to a customer-facing product configurator in Odoo's e-commerce module. The BOM structure you built here is the foundation all of that sits on.

Is Odoo What You Need? 

Our team will help you discover if Odoo is the right fit, and get you a tailored demonstration of Odoo for your use case.





Keep Learning About Odoo

Your Dynamic Snippet will be displayed here... This message is displayed because you did not provide enough options to retrieve its content.
Archive