All posts
Integrator13 min read

Odoo manufacturing: bill of materials, production orders, work centers, and routing for implementors

A complete walkthrough of Odoo MRP - from setting up a bill of materials through work center configuration, production order lifecycle, and the scrap/backorder flows that catch teams off-guard.

Odoo Manufacturing (MRP) connects inventory, purchasing, and planning into a single production workflow. When configured correctly, a sale order for a finished product triggers automatic procurement of components, schedules production, and updates inventory in real time. When configured incorrectly, you get ghost components, wrong cost allocations, and a finished goods quantity that doesn't match reality.

This guide covers the core MRP setup for Odoo 16/17 - BoMs, work centers, routings, and the production order lifecycle from draft to done.

Module setup#

Enable manufacturing in Settings → Technical → Manufacturing. This activates:

  • Manufacturing → Products → Bills of Materials
  • Manufacturing → Operations → Manufacturing Orders
  • Manufacturing → Configuration → Work Centers
  • Manufacturing → Configuration → Workcenter Routings (if Work Orders is enabled)

Enable Work Orders if you need step-by-step routing with time tracking per work center. Without it, production is a single step (draft → confirmed → done) with no intermediate work order tracking.

Bills of materials#

A BoM defines the components and quantities needed to produce one (or more) units of a finished product. Navigate to Manufacturing → Products → Bills of Materials → New.

BoM types#

TypeUse case
ManufactureStandard production: consume components, produce finished goods
KitBundle sold as one product but picked as individual components (no production order)
SubcontractingSend components to a vendor who returns the assembled product

For standard manufacturing, use Manufacture. Kits and subcontracting have different inventory and cost flows.

BoM header fields#

  • Product - the finished product this BoM produces.
  • Quantity - the batch size. A BoM with quantity 10 means: consume the listed components to produce 10 units. When creating a production order for 5 units, Odoo scales all component quantities by 0.5.
  • Company - for multi-company setups. Leave blank to share the BoM across companies.
  • Version - Odoo 16 introduced BoM versioning. The active version is used for new production orders; historical orders keep their original BoM snapshot.

BoM components tab#

Each line is a component with: product, quantity, unit of measure, and optionally a consumed in operation (if using routing). Key fields:

Apply on Variants: if the finished product has variants (e.g., color = Blue, Red), you can set components that only apply to specific variants. A blue variant might use a different pigment component than the red one.

Manual Consumption: marks a component as not consumed automatically when the production order is done. Used for consumables tracked separately (e.g., sandpaper, cleaning fluid) where you track usage manually.

Scrap %: adds a buffer to the required quantity. If a component has 5% scrap, a production order for 100 units will consume 105 units of that component.

BoM operations tab (routing)#

If Work Orders is enabled, the Operations tab defines the routing: the sequence of work center operations to produce the product.

Each operation line has:

  • Operation name - e.g., "Assembly", "Quality Check", "Packaging"
  • Work Center - where this operation runs
  • Duration Computation - Fixed duration or computed from the work center capacity and the number of units
  • Duration (minutes) - the default planned time for this operation

Operations determine the sequence of work orders on the production order. Components can be tied to specific operations - they are consumed when that operation is completed, not at the end of production.

Work centers#

Work centers represent physical locations or machines. Navigate to Manufacturing → Configuration → Work Centers → New.

Key work center fields#

FieldWhat it controls
Work Center TypeLine or Regular - Line groups work centers for capacity planning
Efficiency (%)Scales planned time. 80% efficiency means 10 min operation takes 12.5 min planned
OEE TargetOverall Equipment Effectiveness target - reported on the work center dashboard
CapacityUnits that can be processed in parallel on this work center
Time Before/After ProdSetup and cleanup time added to each work order on this work center
Working HoursCalendar defining when the work center is available (weekdays, shifts)
Analytic AccountCosts posted to this work center charge this analytic account

Costing: direct production costs (labor time, machine time) are valued based on the work center's hourly cost (Costs tab). If you use standard costing, set this accurately - it affects your finished goods cost valuation.

Production orders#

Navigate to Manufacturing → Operations → Manufacturing Orders → New or trigger automatically from a sale order (Make to Order route) or a reorder rule.

Production order lifecycle#

Draft → Confirmed → In Progress → Done
                 ↓
              Scrap / Backorder

Draft: editable. Set product, BoM, quantity, and scheduled date. Odoo populates components from the BoM scaled to the quantity.

Confirmed: components are reserved from inventory. If stock is insufficient, the Availability status shows "Waiting" and you need to either procure the missing components or force the production. Work orders are created from the routing (if Work Orders is enabled).

In Progress (Work Orders enabled): work orders must be completed in sequence. Each work order has a Play/Pause button for time tracking. When the last work order is marked Done, the production order moves to Done.

Done: Odoo posts the inventory movements - component consumption (negative moves) and finished goods production (positive move into the destination location).

Reserving components#

Click Check Availability on a confirmed production order to reserve available components. Unreserved components show in yellow on the Components tab. You can partially produce with unreserved components by enabling the setting Unlock Quantity (allows producing less than planned), or you can force the production which will generate a negative inventory for missing components.

Lot/serial tracking on components: if components are tracked by lot or serial, the Components tab shows a Detail column. Expand each line to assign specific lot numbers to consume. Odoo proposes FIFO or FEFO lots based on the removal strategy on the component's storage location.

Producing less than planned (backorder)#

If you produce only 8 of 10 planned units, click Produce and enter 8. Odoo prompts:

  • Create Backorder - a new production order is created for the remaining 2, linked to the original.
  • No Backorder - production is done at 8 units; the remaining 2 are abandoned.

The backorder inherits the component reservations from the original order proportionally.

Scrap during production#

If a component is damaged, click Scrap on the production order. Enter the scrapped product, quantity, and lot number. Odoo creates a scrap inventory move (component leaves inventory but is not consumed by production). The scrap does not reduce the planned finished goods - you may need to adjust components manually or consume extra from stock.

Finished goods split into by-products#

If production yields additional outputs alongside the main product (e.g., cutting a board produces offcuts), add by-products on the BoM By-Products tab. By-products are received into a designated location when the production order is done. Their accounting impact depends on cost allocation settings.

Cost accounting for manufactured products#

Odoo supports two costing methods:

Standard Cost: finished goods are valued at a fixed standard cost. Manufacturing variances (actual cost vs. standard) are posted to a variance account. Requires running periodic cost updates via Manufacturing → Reporting → Cost Analysis.

Average Cost (AVCO): finished goods are valued at the actual cost of components consumed plus work center costs. The cost updates with each production order.

FIFO: components are consumed at their original purchase cost in order. Finished goods carry the actual cost of the specific components used.

The costing method is set on the product category. Changing it after you have stock is a significant accounting event - Odoo posts revaluation entries.

Common implementation mistakes#

BoM quantity set to 1 always. Some implementors always set BoM quantity to 1 and adjust component quantities accordingly. This breaks the scrap % and efficiency calculations, which are designed for realistic batch sizes. Set the BoM quantity to your actual production batch size.

Not enabling Work Orders for complex manufacturing. If your shop floor has multiple steps on different machines, skipping Work Orders means you lose time tracking, machine scheduling, and per-operation cost capture. It is harder to add routing after go-live than to enable it from the start.

Forgetting to set working hours on work centers. Without working hours, capacity planning uses 24/7 availability. Your planned dates will be unrealistic.

Consuming components at production done, not at operations. If a component is consumed mid-process and you need accurate WIP accounting, tie the component to the specific operation. Otherwise, all consumption is posted when the production order closes, which misrepresents WIP during multi-day productions.

Not reconciling finished goods receipts. After validating a production order, check the finished goods location balance. If it doesn't match what you produced, there is a configuration error (wrong UoM, wrong location route, negative component issue). Catch these in staging with representative production scenarios.


For the inventory and location configuration that supports manufacturing, see the Odoo inventory operations guide. For purchase-side component procurement, see the purchase management guide.

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free