← Back to all posts Manufacturing & shop floor

Manufacturing accounting in Odoo: work in progress, job costing and product cost that reconcile on your balance sheet

From estimate to job costing: how to post material, machine hours and overhead surcharges per production step to work in progress (WIP) in Odoo, settle it against a standard cost and reveal the volume and budget variance. In this video (10 min) we walk through the entire posting flow, from work order to a reconciling trial balance - plus the terminology (applied-overhead account, cost type, cost centre, cost object) and where standard Odoo stops.

Also in: Nederlands Deutsch

Short answer: standard Odoo posts inventory movements and product cost neatly, but genuine manufacturing accounting - where material, machine hours and surcharges are posted to work in progress (WIP) per production step and settled cleanly against a standard cost when completed - calls for a well-designed posting flow on top of the standard. In the video below (10 minutes) we show how we approach that: from cost elements and journals, via the postings per work order, to a trial balance that runs clean and a variance posting that makes the job costing per order visible. Factory accounting, production accounting and cost accounting are other names for the same principle.

Manufacturing accounting in Odoo - demo of the posting flow

Why post work in progress?

Anyone who produces has money “in transit” at every moment: paper that has already come off the roll but is not yet a brochure, material consumed in step one while step two has yet to begin. If you do not post that, your balance sheet only reconciles at moments when nothing happens to be in production - and your result arises at random moments instead of at completion.

Manufacturing accounting solves that with a fixed principle: consumption is debited to a work in progress account during production, and credited to the corresponding settlement account when the order is completed. Between those two accounts the balance should be zero - unless something is genuinely in production. That outstanding balance is your work in progress. It is the same control idea as a suspense account: a balance that does not clear points to work still running (or to an error). This is also called the matching principle: costs and revenues land in the period they belong to, not at the moment the invoice happens to come in.

The terminology: cost type, cost centre, cost object

Anyone who has ever struggled through a cost-accounting textbook recognises the thread of manufacturing accounting: costs flow through the administration in three steps.

  • Cost type - what kind of costs they are: paper, material, machine hours, subcontracted work, labour. In the general ledger these are your cost accounts.
  • Cost centre - where the costs arise: the printing press, the enveloping machine, a department. Each machine or work centre gets its own machine-hour rate, built up from depreciation, maintenance, space and utilisation.
  • Cost object - for what the costs are incurred: the manufacturing order, and thereby ultimately the product or the customer. The cost object is where the estimate and job costing come together.

The bridge between cost centre and cost object is the applied-overhead account. At each operation a predetermined rate (the machine-hour rate or a surcharge percentage) is credited to the applied-overhead account and debited to work in progress: that way the order is already allocated its share of the indirect costs. At the end of the period the actual costs are set against it. If a balance remains on the applied-overhead account, that is the absorption variance, and you split it into two parts:

  • the budget variance - were the actual costs higher or lower than budgeted?
  • the volume variance - did you run more or fewer hours than the normal capacity the rate is calculated on? If you run below your normal capacity, part of your fixed costs remains “uncovered”.

That is exactly the information a production company steers on: not just whether an order made a loss, but why - purchased too expensively (budget) or ran too little (volume).

Continental vs. Anglo-Saxon. The posting flow in the video follows the continental (European) tradition: first all costs by cost type in the general ledger, then allocated on via cost centres to the cost object. Standard Odoo leans by default more towards the Anglo-Saxon method (costs directly to the product cost), supplemented with analytic postings. For genuine manufacturing accounting on a standard cost you set up the continental flow explicitly - that is what this approach adds.

In the setup we show in the video, everything revolves around cost elements: per cost type (paper, machine hours, surcharges) you record which accounts are debited and credited, in which journal. You then link those cost elements to the operation in two places:

  • Product categories (Inventory): all paper types fall into the category “paper”, for example, and that category refers to the posting flow for work in progress paper.
  • Work centres (Manufacturing): the printing press and the enveloping machine each have their own cost element (their own cost centre), so that machine costs per operation land on the right account.

The surcharge cost element is special: there you define a markup percentage on a base - in the demo 10% on paper consumption, as coverage for indirect costs. That surcharge is calculated automatically and posted to the applied-overhead account the moment the relevant step is completed. No manual journal entries, no forgotten markups.

One detail determines when a posting happens: in the bill of materials you record per component in which operation it is consumed (the “consumed in operation” column). The paper is consumed in the printing step - so that is where the work in progress posting arises, not only at the end.

The posting flow, step by step

In the video we follow a manufacturing order of 1,000 units through two operations (printing and enveloping) - a print-shop example, but the principle is the same for any production floor:

  1. Work order “printing” completed - three postings arise immediately: work in progress paper to paper (the material value), the automatic 10% surcharge to the applied-overhead account, and work in progress production to applied-overhead production (the machine costs at the machine-hour rate). Everything is immediately visible in the trial balance.
  2. Work order “enveloping” completed - same principle for the second step: material, semi-finished product and production costs posted alongside.
  3. Complete the manufacturing order (“produce all”) - the finished product is posted to inventory at the standard cost (the estimate), and the difference with the actual production costs goes to a variance account. In the demo a negative difference: production was more expensive than the calculation - the job costing in a single posting, per order.
  4. Deliver and invoice - the delivery is validated, the invoice confirmed, and the revenue appears in the balance sheet.

The proof is in the trial balance at the end: each work in progress account cancels out against its settlement account (debit 50, credit 50), and what remains is the result - built up from revenue, cost at standard cost and the efficiency variance. If an order is still running, you see exactly for what amount. That is how the general ledger becomes a mirror of the factory: what happens on the floor is in the figures at that same moment.

Analysing: from trial balance to job costing per customer

The same figures can also be viewed from a production perspective: Manufacturing → Reporting → Cost analysis shows what is in the accounting, but with drill-down to the underlying manufacturing orders. With that a job costing per manufacturing order can be built, and even per customer - handy if you want to know which orders or customers you actually earn on. The estimate is already in the standard cost; the difference is your job costing, without a separate time administration alongside your accounting.

Honest about the status and about standard Odoo

Two honesties belong here.

About standard Odoo. Odoo works by default with a central WIP account per manufacturing order and posts the product cost when the order is completed. That is fine for many companies. If you want fine-grained work in progress per operation step, with separate applied-overhead accounts per cost type and an explicit variance analysis on a standard cost, that is not a standard button. Splitting cost by cost type and cost centre is in standard Odoo mainly a reporting and analytical question, not a general-ledger question - the approach in the video deliberately shifts part of that into the general ledger, because some companies (and accountants) simply want to see it in the posting itself.

About this demo. What the video shows is a first version of this setup, built as a demonstration of the principle. Labour costs and subcontracted work are not yet in the demo (both can be set up with standard Odoo means - for subcontracting see also subcontracting while retaining traceability), and edge cases such as cancelling or interrupting a manufacturing order still need finishing. The definitive setup - which cost elements, which surcharges, which chart of accounts - we determine per company during the implementation, fit-gap first. That is how customisation on the accounting should arise too: first prove the principle, then build for production.

Frequently asked questions

What is manufacturing accounting? The administrative side of producing: material consumption, machine hours and surcharges are posted to work in progress during production and settled to finished-goods inventory when completed. Your balance sheet shows at any moment what is in production. Factory accounting, production accounting and cost accounting are other names for the same thing.

What is the difference between an estimate and job costing? An estimate is the cost calculated in advance (which you quote with and use as the standard cost); job costing is what the order actually cost. The difference between the two - the budget and volume variance - lands automatically on a variance account in this posting flow, per order.

What is an applied-overhead account and a volume variance? The applied-overhead account absorbs the pre-allocated indirect costs (via surcharge or machine-hour rate). The balance that remains is the absorption variance, to be split into a budget variance (actual costs vs. budgeted) and a volume variance (hours run vs. normal capacity).

Does Odoo post work in progress per production step by default? By default Odoo posts inventory movements and product cost when the order is completed, with a central WIP account per order. Fine-grained work in progress per operation step with surcharges and applied-overhead accounts is set up with an additional module, as in the video.

How does a standard cost work in Odoo production? Finished product is posted to inventory at the standard cost; the difference with the actual production costs goes to a variance account. That way you see per period and per order whether your calculation holds.

Can I have surcharges posted automatically? Yes - per cost element you define a percentage on a base (for example 10% on material consumption as coverage). The posting happens automatically when the step is completed.

Can I analyse the production result per order or per customer? Yes, via manufacturing cost analysis, with drill-down to the underlying manufacturing orders - the basis for a job costing per order and per customer.

Why do the work in progress accounts cancel out against each other? Every debit during production is credited to the settlement account when completed. Zero balance means: nothing left in production. An outstanding balance is your work in progress - the built-in control of this posting flow.


Want to know what manufacturing accounting would look like for your production? Book a free Odoo scan - then we walk through your production steps, cost centres and calculation and are honest about what works out of the box and where setup or customisation is needed.


Read more: Job costing: from estimate to actual product cost · Odoo for production companies · Can Odoo run your production floor? · Subcontracting while retaining traceability · Software for construction companies · Software for field service installers · What does an Odoo implementation cost? · The TARGET method

Frequently asked questions

What is manufacturing accounting?

The administrative side of producing: material consumption, machine hours and overhead surcharges are posted to work in progress (WIP) during production, and settled to finished-goods inventory when the order is completed. The general ledger becomes a mirror of the factory: your balance sheet shows at any moment what is in production, and the result only arises at the right moment. Other names for the same field are factory accounting, production accounting and cost accounting.

What is the difference between an estimate and job costing?

An estimate is the cost calculated in advance (the calculation you quote with); job costing is what the order actually cost afterwards. In manufacturing accounting you work with a standard cost (fixed transfer price) based on the estimate, and the difference with the actual costs - the budget and volume variance - is shown directly per order by the job costing. That way you know whether your calculation holds without separate timesheets alongside your accounting.

Does Odoo post work in progress per production step by default?

Standard Odoo posts inventory movements and product cost when the order is completed and works with a central WIP account per manufacturing order. Fine-grained work in progress per operation step, with surcharges and separate applied-overhead accounts per cost type, is not a standard posting but is set up with an additional module that links cost elements to product categories and work centres - exactly what the video demonstrates. Splitting cost by cost type or cost centre is in standard Odoo mainly a reporting and analytical question, not a general-ledger question.

What is an applied-overhead account and a volume variance?

An applied-overhead account absorbs the pre-calculated (allocated) indirect costs: at each operation a surcharge or machine-hour rate is credited to the applied-overhead account, while the actual costs are set against it. If a balance remains, that is the absorption variance, to be split into a budget variance (were the actual costs higher or lower than budgeted?) and a volume variance (did you run more or fewer hours than the normal capacity the rate is based on?).

How does a standard cost work in Odoo production?

The finished product is posted to inventory at a predetermined standard cost (fixed transfer price). The difference between the actual production costs and that standard cost goes to a variance account: negative if production was more expensive than calculated, positive if it was cheaper. That way you see per period and per order directly whether your calculation holds.

Can I have surcharges (overhead markups) posted automatically?

Yes. Per cost element you define a surcharge percentage on a base - for example a 10% markup on material consumption as coverage for indirect costs. When the relevant operation is completed, the surcharge is calculated automatically and posted to the applied-overhead account, without manual journal entries.

Can I analyse the production result per order or per customer?

Yes. Besides the trial balance in Accounting, Odoo's manufacturing cost analysis offers the same figures from a production perspective, with drill-down to the underlying manufacturing orders. With that you build job costings and reporting per manufacturing order and even per customer.

Why do the work in progress accounts cancel out against each other?

Every debit of work in progress during production is credited to the corresponding settlement account when the order is completed. Once everything is completed, the balance per account pair is zero; an outstanding balance means something is genuinely still in production. That is the built-in control of this posting flow - the same idea as a suspense account.

Recognize this from your own setup?

A 30-min scan turns hunches into a concrete view, what stays standard Odoo, what becomes custom, what doesn’t need code at all.

Get in touch ← Back to blog