Costing a Finished Product in Odoo 20: Where Every Dollar Lands

Ask a manufacturer what a finished product cost to make and you usually get a number assembled by hand: materials from the last purchase invoice, a guess at labour, overhead spread by feel. Odoo builds that number as a by-product of production itself. Every manufacturing order (MO) collects the cost of what was actually consumed and the time actually worked, and the finished product enters stock carrying that cost as its inventory value. Odoo 20 makes the number visible earlier — while the order is still running — and adds a place to record the extra costs that used to live in spreadsheets. This article traces where every dollar lands, component by component, and separates what is new in 20 from the costing machinery Odoo has had for years.

The five places cost comes from

A finished product's cost in Odoo is not one field typed in by someone. It is a sum built from the bill of materials (BoM), the work orders, and the MO itself:

  1. Components consumed — the raw materials and sub-assemblies actually used, valued at their inventory cost.
  2. Work center time — the machine and workstation cost of each operation, from the work center's cost per hour multiplied by time.
  3. Employee time — the labour cost of the people who ran the operation, where operations are costed on actual tracked time and real employee costs.
  4. Extra costs — order-specific costs that are neither material nor time, registered directly for the MO.
  5. Subcontracting fees — where some or all production happens outside, the subcontractor's charge, plus the components you supplied.

Against that total, any by-products take their agreed share of the cost out before the main product's unit cost is struck. The sections below walk each line.

1. Components: quantity consumed, valued at inventory cost

Material cost is not the BoM's shopping list at list price; it is the quantity actually recorded as consumed on the MO, valued the way your inventory values that component. That valuation follows the costing method set on the component's product category — Standard Price (a fixed cost maintained on the product form), Average Cost (AVCO) (a weighted average recomputed as receipts arrive), or FIFO (the real price of the oldest stock layer first). The same BoM can therefore produce different material costs in two companies that value stock differently, and both can be correct under their own accounting policy.

The BoM Overview report shows how Odoo thinks about this before you produce anything. Its Total Cost column combines the component price, labour, and other factors for one unit. Costs shown in grey are read directly from the component's product record — its Cost field — while costs in regular text are computed by the report. The overview only computes a cost when it has something to compute from: a sub-BoM to expand for a manufactured component, or a work center rate from operations. A purchased component with no BoM simply shows its standard cost, greyed out.

New in Odoo 20: the flexible consumption setting on BoMs has been removed — every MO now uses flexible consumption by default, with or without a BoM. Operators can record consuming more or less than planned, and it is the actual consumed quantity that lands in the finished product's cost. That is honest costing, but it means sloppy consumption recording now flows straight into product cost with no setting to hide behind.

2 and 3. Operations: work center rates and employee costs

Labour and machine cost enter through the BoM's operations. Each operation names a work center and carries two costing choices documented in the 20.0 BoM documentation:

  • Cost based on: Actual time — tracked time and real employee costs — or Theoretical time — the estimated time and costs. Actual costing tells you what this run really cost; theoretical costing tells you what it should have cost and stays stable when a run goes badly.
  • Duration Computation: Fixed, where operators record and can modify time and a default duration is set, or Computed, where the time tracker estimates duration from a set number of previous work orders for that operation.

The work center itself carries a cost per hour. Multiply the operation's duration by that rate and you have the work center cost for the operation — the machine time, power, and overhead the rate is meant to represent. Where the operation is costed on actual time, the employee side uses the real cost of the employees who tracked time on the work order.

4. Extra costs — new in Odoo 20

Every shop has costs that belong to one order and nowhere else: a courier fee to rush a component in, a one-off tooling charge, a calibration visit. Before Odoo 20 these tended to be absorbed into overhead or forgotten, quietly understating the order's cost. The Odoo 20 release notes add the fix on the BoM side: you can now register extra costs for a manufacturing order using the dedicated field on the bill of materials form. The cost is attached to production deliberately, where the people who know about it work, instead of being journaled later by someone in accounting who has to guess which order it belonged to.

5. Subcontracting: their fee plus your components

When a subcontractor makes the product, the finished cost has two parents: the subcontractor's charge and the value of the components you sent them. Odoo 20 tightens both sides in the MO overview. The cost of subcontracted product replenishments in the overview now takes component costs into account, so the overview no longer understates a subcontracted product by showing only the fee. And if a subcontracted product is received with no purchase order linked, the subcontractor cost is now assigned at reception based on the vendor pricelist.

By-products take their share out first

If the BoM produces a by-product — offcuts, a co-product, a residual with value — the BoM lets you set a Cost Share percentage for it: the percentage of the final production cost attributed to the by-product, divided by the quantity produced. The by-product cost shares on a BoM must total 100 or less. That share is carved out of the total before the main product's unit cost is calculated, so a valuable by-product lowers the main product's cost instead of being treated as free waste or, worse, ignored.

Where it all lands: the MO cost, then stock valuation

All of it accumulates on the manufacturing order. The headline change in Odoo 20 is timing: the MO Cost field on the MO overview now shows the provisional cost while the order is in progress and the real cost once the order is complete. Previously, useful cost visibility effectively arrived at the end; now a planner watching an order overrun its materials or time can see the cost moving while there is still time to intervene, and finance gets a work-in-progress figure that is more than a guess.

When the MO is closed, the total is divided by the quantity actually produced to give the finished product's unit cost, and that unit cost becomes the value at which the finished units enter stock. From there it flows onward like any inventory value: it is the cost relieved when the product is delivered and sold, under the finished product category's own costing method. Get the MO wrong and every downstream number — stock value, margin on the invoice, cost of goods sold — inherits the error.

The table below is an illustrative example for one unit of a finished product, showing how the pieces combine. The figures are round numbers chosen for arithmetic clarity, not data from any real company:

Cost componentWhere it comes fromExample (per unit)
Components consumedActual quantities on the MO, at each component's inventory cost (Standard, AVCO, or FIFO)$120.00
Work center timeOperation duration × work center cost per hour$30.00
Employee labourTracked time × real employee cost (actual-time costing), or theoretical time and cost$22.00
Extra costsOrder-specific costs registered via the BoM's extra-cost field (new in Odoo 20)$8.00
Subcontracting feeSubcontractor charge (PO, or vendor pricelist at reception if no PO is linked)$0.00
Total MO costSum of the above for the order$180.00
Less: by-product cost shareBy-product's Cost Share % of total production cost−$18.00 (10%)
Finished product costTotal less by-product share, divided by quantity produced$162.00 per unit

Read the table as a diagnostic map. Material dominating the total points at purchasing and scrap. Work center and labour lines growing between the provisional and real MO cost point at routing times and rates. Extra costs appearing on every order point at a rate that should be raised. The number is only trustworthy if the inputs are: component costs maintained, work center rates reviewed, time actually tracked, and consumption recorded as it happens. Odoo 20 does not make costing automatic — it makes it visible early enough to act on, which for most shops is the part that was missing.

Further reading

Leave a Comment