FIFO vs. weighted average — when each actually makes sense on the factory floor. A practical field guide for Odoo 17 / Community & Enterprise.
Inventory valuation isn't just an accounting checkbox — it directly shapes your COGS, gross margin, and the accuracy of every financial report your ops team touches. Choosing the wrong method in Odoo is a one-way door that's painful to reverse mid-year.
When you buy the same raw material at different prices across multiple purchase orders, you have to decide: which price do you use when that material leaves your warehouse?
Odoo gives you two primary methods: FIFO (First In, First Out) and Average Cost (weighted moving average). Both are IFRS and GAAP compliant. Both are available in Odoo's inventory module. But they produce meaningfully different numbers — and different operational behaviors.
You buy steel coil three times: 100 kg at ৳80/kg in January, 100 kg at ৳95/kg in February, and 100 kg at ৳110/kg in March. You then consume 150 kg in production in April. Which cost hits your COGS?
Under FIFO: 100 kg at ৳80 + 50 kg at ৳95 = ৳12,750 COGS. The remaining stock still holds the February and March costs.
Under Weighted Average: blended cost = (8,000 + 9,500 + 11,000) / 300 = ৳95/kg. So 150 kg × ৳95 = ৳14,250 COGS. Simpler math, different bottom line.
| Method | Odoo availability | Valuation mode |
|---|---|---|
| FIFO | Community + Enterprise | Manual or Automated (Enterprise) |
| Average Cost (AVCO) | Community + Enterprise | Manual or Automated (Enterprise) |
| Standard Price | Community + Enterprise | Manual only |
| LIFO | Not available | Not IFRS-compliant |
Changing the costing method on an active product in Odoo requires careful planning — it can trigger journal entry reversals and affect open manufacturing orders. Always change at the start of a fiscal period with zero stock if possible.
FIFO matches the physical flow most manufacturers actually use — older stock gets consumed first. It produces the most accurate per-unit cost tracking but demands more from your Odoo configuration.
Odoo maintains a queue of inventory lots with their original purchase costs. When you validate a delivery or post a manufacturing consumption, Odoo pulls from the oldest layers first. Each layer is a purchase order line with its own unit cost.
In Enterprise with automated accounting, each stock move generates a journal entry in real time. In Community (manual), you run a periodic valuation report and post manually.
Negative stock kills FIFO. If Odoo allows stock to go negative (common in Community without strict validation), the cost layer queue breaks — Odoo can't pull from a layer that doesn't exist yet. The cost gets assigned as $0 or revalued after the receipt, creating phantom journal entries.
Also: FIFO with many small purchase orders creates a long cost layer list. Reports can become slow and valuation exports grow large. For high-transaction environments, monitor the stock.valuation.layer table size.
Weighted average blends all purchase prices into a single running cost per unit. It's simpler to manage day-to-day and produces smoother margins — at the cost of per-batch cost precision.
Every time a receipt is validated, Odoo recalculates the average cost using:
This new average cost then applies to all existing stock — Odoo revalues the entire on-hand quantity. Under automated accounting, this triggers a journal entry for the revaluation difference.
Unlike FIFO, AVCO tolerates negative stock better — but the resulting average cost becomes meaningless (mathematically undefined). When stock goes negative and then a receipt arrives, Odoo uses the receipt cost as the new AVCO. This often inflates or deflates the average depending on timing.
Each receipt under AVCO potentially posts a revaluation journal entry for the difference between the old AVCO and the new AVCO applied to existing stock. In high-receipt-frequency environments, this creates a large volume of small journal entries. Consider your accountant's bandwidth.
When prices are rising: FIFO produces lower COGS (older, cheaper layers consumed first) → higher gross profit → higher tax. AVCO blends, landing somewhere in between.
When prices are falling: FIFO produces higher COGS → lower profit. Neither method is universally "better" — it depends on your margin management goals and tax planning strategy.
Use this reference during your Week 1 discovery call. Run through each dimension with your client and score them. The method with more ticks wins — but always verify against their accountant's requirements.
Odoo lets you set costing method per product category. In practice, most mid-size manufacturers end up with:
FIFO for strategic raw materials (metals, chemicals, key imported components) where price visibility matters. FIFO
AVCO for generic consumables, packaging, and low-value MRO items where cost-layer overhead isn't worth the granularity. AVCO
Standard Price for finished goods if you want to isolate production variances from material cost variances.
A step-by-step guide to configuring inventory valuation in Odoo 17. Do this before any stock is received — changing mid-flight requires a full revaluation exercise with your accountant.
The single most common valuation misconfiguration I see: the Stock Input account is set to an expense account instead of a liability/GRNI account. This causes double-booking of COGS — once on receipt, once on vendor bill. Always use a clearing (GRNI) account for Stock Input, never an expense account directly.