Back to Lab LAB · 0011 Utility · CSV
0011 Cheatsheet APR 2026

Odoo inventory valuation cheatsheet

FIFO vs. weighted average — when each actually makes sense on the factory floor. A practical field guide for Odoo 17 / Community & Enterprise.

Pages
5 sections
Read time
~8 min
Odoo version
v17 · v16
Audience
Consultants · Ops managers
Section 01 of 05

Why valuation matters more than people think

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.

The core problem

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.

A quick illustration

Example · Steel coil purchases

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.

What Odoo supports

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
Important

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.

Section 02 of 05

First In, First Out (FIFO)

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.

How it works in Odoo

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.

When FIFO is the right call

FIFO
Perishable or time-sensitive materials
Food manufacturing, pharma, chemicals with shelf life. Physical flow actually matches FIFO — older stock leaves first.
FIFO
High price-volatility inputs
Steel, copper, plastics where purchase prices swing 15-30% quarterly. FIFO traces actual cost layers, preventing margin surprise.
FIFO
Lot / serial number tracking required
If you need full traceability from supplier batch to finished good, FIFO + Lot tracking is the natural combination in Odoo.
FIFO
Export / GAAP reporting requirements
Many export-oriented manufacturers must use FIFO for customs valuation or for GAAP-compliant statements when reporting to foreign partners.

FIFO pain points on the factory floor

Watch out

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.

Key Odoo behaviors under FIFO

  • 01Receipts create a new cost layer in the valuation queue at the vendor price on the PO line.
  • 02Delivery / consumption pops from the oldest layer. If the layer is partially consumed, the remainder stays in queue.
  • 03Vendor price difference (when bill differs from PO) creates a landed cost or a revaluation journal entry, not a change to the original layer.
  • 04Returns to vendor pop cost layers in reverse FIFO order — oldest first. Watch for rounding differences at the journal entry level.
  • 05Inventory adjustments create a new layer at the current average cost, not at the oldest layer cost. This is a frequent gotcha.
Section 03 of 05

Average Cost (AVCO)

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.

How Odoo calculates AVCO

Every time a receipt is validated, Odoo recalculates the average cost using:

# Odoo AVCO formula on each receipt
new_avg_cost = (
  (current_qty_on_hand × current_avg_cost)
  + (incoming_qty × incoming_unit_cost)
) / (current_qty_on_hand + incoming_qty)

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.

When AVCO is the right call

AVCO
Fungible bulk materials
Sand, gravel, grain, generic chemicals — material from different suppliers is physically indistinguishable. AVCO reflects economic reality better than FIFO here.
AVCO
Stable or slowly-moving prices
If your material costs are relatively stable (±5%), AVCO smooths reporting without materially distorting margins. Less accounting noise.
AVCO
High-volume, low-unit-value items
Nuts, bolts, packaging material — tracking individual cost layers for pennies-per-unit items is overhead without benefit. AVCO is operationally cleaner.
AVCO
Teams new to Odoo
AVCO produces fewer valuation surprises for operations teams who aren't yet fluent in Odoo's cost layer mechanics. Lower training overhead.

AVCO edge cases that catch people out

Negative stock + AVCO

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.

Revaluation entries

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.

AVCO vs. FIFO: which produces higher COGS in an inflationary environment?

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.

Section 04 of 05

Decision matrix

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.

Method selection matrix

Factor
FIFO
AVCO
Material has shelf life / expiry
✓ Strongly preferred
✗ Poor match
Lot / serial traceability required
✓ Natural fit
~ Works, less precise
Price volatility >10% per quarter
✓ More accurate margins
~ Smooths volatility
Bulk fungible materials (same grade)
~ Technically works
✓ Correct economic model
GAAP / export reporting required
✓ Common requirement
✓ Also acceptable
Team is new to Odoo ERP
✗ More complexity
✓ Easier to manage
Negative stock happens regularly
✗ Breaks cost layers
~ Survives but degrades
Many small POs per month (>50)
~ Watch table size
✓ Fewer layer records
Per-job / project cost tracking
✓ Layer costs visible
~ Blended cost only
Rising input prices, tax minimization
✗ Higher profit reported
~ Moderate effect

The hybrid approach

Odoo lets you set costing method per product category. In practice, most mid-size manufacturers end up with:

Recommended split

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.

Section 05 of 05

Setting it up in Odoo

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.

Enable the accounting settings

  • 01 Enable automated inventory valuation (Enterprise only — Community uses manual journal entries). Accounting → Settings → Automatic accounting for inventory
  • 02 Enable anglo-saxon accounting if your client reports under IFRS or US GAAP (this posts COGS at delivery, not at invoice). Accounting → Settings → Anglo-Saxon accounting
  • 03 Verify fiscal years and lock dates before any live stock movement. A misconfigured lock date causes valuation journal entries to post to a closed period. Accounting → Settings → Fiscal Years

Configure product categories

  • 04 Create dedicated product categories for each costing method — do not mix FIFO and AVCO products in the same category. Inventory → Configuration → Product Categories
  • 05 Set Costing Method on the category (not on the product itself — product-level override is not available in standard Odoo). Category → General Information → Costing Method
  • 06 Set Inventory Valuation to Automated (Enterprise) or Manual (Community). Category → General Information → Inventory Valuation
  • 07 Assign stock input / output / valuation accounts — these must match your chart of accounts. For manufacturers, typical mapping: Stock Valuation → Inventory Asset, Stock Input → Goods Received Not Invoiced (GRNI), Stock Output → COGS.

Validate with a test receipt

  • 08 Create a test product in your new category. Post a draft PO, receive it, and immediately check the generated journal entry — verify accounts, amounts, and that the valuation layer appears in Inventory → Reporting → Inventory Valuation.
  • 09 Then post a manufacturing order consuming that product. Verify the COGS journal entry hits at the correct cost layer (FIFO: oldest price; AVCO: current blended price).
  • 10 Run the Inventory Valuation report and reconcile the total against the trial balance. If these two numbers don't match, you have a configuration error — stop and investigate before going live. Inventory → Reporting → Inventory Valuation
Field note · from 200+ operator go-lives

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.