Odoo Manufacturing Module Explained
What manufacturing means in Odoo
Manufacturing in Odoo is one idea repeated: consume some things, produce another thing.
You take components out of stock. You put a finished product into stock. Odoo records both moves and carries the cost across from one to the other.
Everything else — work centres, routings, subcontracting, quality checks — is detail layered on top of that single transaction.
The Bill of Materials
The BoM is the recipe. It says what goes into one unit of the finished product.
A simple BoM lists the finished product, the quantity it produces, and the components with their quantities.
The quantity trap
Here is the mistake that catches people, and it is worth understanding before you build anything.
The BoM header has a quantity — how many units this recipe produces. Usually one.
But if your product is measured in something other than pieces — grams, litres, metres — that header quantity must match. A product sold by weight where the BoM header says “1” but the real unit is 5 grams will produce component quantities that are wrong by a factor of five.
Check the BoM header quantity against the product’s unit of measure. Every time. It is a two-second check that prevents a whole category of confusing errors.
FIGURE 1: THE BOM QUANTITY TRAP
Header quantity matches the unit
- Product sold in 5 g units, header says 5
- Component quantities scale correctly
- Costs and stock come out right
Header left at 1 by default
- Product sold in 5 g units, header says 1
- Component quantities out by a factor of five
- No error message — just wrong numbers
BoM types
Manufacture this product. The normal case. You make it.
Kit. Not really manufacturing. A kit is exploded into its components at the point of sale or delivery — no manufacturing order is created. Use this for bundles you sell together but never actually assemble.
Subcontracting. Someone else makes it. Covered below.
Nested BoMs
A component can have its own BoM. Odoo handles the levels, either producing the sub-assembly separately or exploding it into the parent order.
Keep the nesting shallow. Deep BoM trees are hard to cost and harder to debug.
FIGURE 2: THREE BOM TYPES, THREE BEHAVIOURS
Manufacture
- You make it. A manufacturing order is created, components consumed, finished goods produced.
Kit
- Never actually assembled. Exploded into components at delivery. No manufacturing order.
Subcontracting
- An outside vendor makes it. Your components go out, finished goods come back.
Manufacturing orders
An MO is one instance of making something.
It can be created manually, generated by a reordering rule, or triggered by a sales order if the product is set to make-to-order.
The flow is: Draft → Confirmed → In Progress → Done.
When you mark it done, Odoo consumes the components from stock and produces the finished goods into stock. If you use automatic valuation, the accounting entries post at the same moment — component value out, finished goods value in.
Component consumption
Two approaches, and the choice matters.
Consume as planned. Odoo takes exactly what the BoM says. Fast, and fine when your process is consistent.
Record actual consumption. The operator enters what was really used. Slower, and necessary when there is real variation.
If your actual usage regularly differs from the BoM — waste, offcuts, natural variation — record actuals. Otherwise your stock will drift and your costs will be wrong.
Work centres and routings
If you only need to track that something was made, you can skip this section entirely. Many small manufacturers do, and are right to.
Work centres are where operations happen — a machine, a bench, a team. Each has a capacity and a cost per hour.
Routings define the sequence of operations and which work centre does each one.
With these set up, an MO becomes a series of work orders that operators start and stop. You get real time tracking and labour cost in your product cost.
When to use it: you have capacity constraints, you need to schedule, or labour is a significant part of your cost.
When to skip it: small operations where the job is done when it is done. Adding routings here creates data entry with no decision attached to it.
Subcontracting
Common in many industries, and Odoo handles it properly.
You send components to a vendor. They make the product. You receive the finished goods back.
Set the BoM type to subcontracting and name the vendor. Then raise a purchase order for the finished product. Odoo creates the material transfer out and the finished goods receipt in, and tracks your stock while it sits at the subcontractor.
Two things to get right:
Your components at the subcontractor are still your stock. They need to appear in your valuation, in a location that represents the subcontractor.
The cost of the finished product is your components plus the subcontractor’s charge. If either side is wrong, your finished goods are valued wrongly, and that flows into every margin report.
Costing
The cost of a manufactured product comes from three parts:
- Components — at their current valuation
- Operations — work centre cost multiplied by time, if you use routings
- Overheads — if you have configured them
Which costing method you chose in Inventory matters here. With average costing, component cost changes as you buy; with standard costing it is fixed and variances go to a price difference account.
A useful check: take one finished product and add up its component costs by hand. Compare with what Odoo says. If they disagree, either the BoM quantities or the component costs are wrong — and it is far better to find that on a test than in a margin report six months later.
FIGURE 3: A MANUFACTURING ORDER END TO END
BoM
- The recipe
MO Confirmed
- Components reserved
Produce
- Components consumed
Done
- Finished goods in stock
Quality checks
Enterprise only. Quality control points can be attached to receiving or to manufacturing operations.
A check can be a simple pass or fail, a measurement within a tolerance, or an instruction with a photo. Failures raise a quality alert.
Worth setting up if: you currently have inspection steps on paper, or you need to prove inspection happened.
Reports worth using
Manufacturing orders analysis. What was produced, when, and how long it took.
Component consumption. Planned versus actual. Consistent differences here tell you your BoMs need updating.
Work centre load. Where your capacity constraint actually is, if you use routings.
Product cost breakdown. What each finished product actually costs, and why.
What usually goes wrong
BoM header quantity wrong. Covered above, and it is the most common single error in manufacturing setups.
Components with no cost. A component priced at zero produces a finished product that looks free. Check every component has a real cost before going live.
BoMs that drift from reality. Written once during implementation, never updated as the process changed. Review them yearly.
Routings added because they were available. If nobody uses the timing data to make a decision, the operators are doing data entry for nothing.
Subcontractor stock not tracked. Components sitting at a vendor that do not appear in your valuation. Your balance sheet is understated and nobody notices until a stock count.
Getting started
- Set up components with correct costs and units of measure
- Build BoMs — check the header quantity against the product’s unit
- Test a simple manufacturing order end to end in a test database
- Verify the accounting entries and the finished product cost by hand
- Add work centres and routings only if you will use the data
- Add subcontracting flows separately, and test the stock at the vendor carefully
The verification step in point 4 is the one to insist on. Manufacturing errors are quiet — they do not throw an error message, they just produce a slightly wrong number that flows into everything downstream.
Setting up manufacturing in Odoo?
Get in touch. We check BoM structure and product costing against real production before anything goes live, because manufacturing errors are quiet ones.