All posts
Integrator8 min read

Odoo inventory valuation: FIFO, AVCO, and standard price compared for manufacturing and distribution

Inventory valuation method determines how stock moves hit your balance sheet and COGS. Getting it wrong during go-live means a painful restatement. Here is a practical comparison of all three Odoo methods and how to migrate between them safely.

Inventory valuation is one of the decisions that feels reversible until you have six months of transactions posted. Switching methods mid-year requires restating every journal entry that touched that product category. Understanding what each method does - and which configuration in Odoo implements it correctly - is work you do at project kickoff, not after go-live.

What valuation controls#

Odoo's inventory valuation method determines:

  1. The cost posted to inventory (balance sheet asset) when stock moves in.
  2. The COGS posted when stock moves out (sold, consumed in manufacturing).
  3. The journal entries generated for each stock move.

The method is set per product category: Inventory → Configuration → Product Categories → Costing Method.

Standard price#

Standard price assigns a fixed cost to every unit regardless of what you actually paid for it. You set the cost manually on the product. Odoo posts all receipts at that fixed cost. Variances between the standard cost and the actual purchase price go to a "price difference" account.

When to use:

  • Manufacturing environments where standard costing aligns with budgeting.
  • Products whose market price is stable and known in advance.
  • Companies that want predictable COGS for management reporting.

Journal entry on receipt (PO at $12, standard cost $10):

Stock Valuation      DR 100  (10 units × $10 standard)
Price Difference     DR  20  (variance)
  Goods Received         CR 120

Configuration in Odoo:

Product Category → Costing Method: Standard Price.

Update the standard cost on the product: Inventory → Products → [Product] → Cost field.

Watch out: Changing the standard cost after transactions have posted does not restate historical entries. The new cost applies to future moves only.

Average cost (AVCO)#

AVCO recalculates the cost per unit every time you receive stock. The formula: new average = (existing stock value + incoming stock value) / (existing qty + incoming qty).

When to use:

  • Distribution businesses with many small purchases at varying prices.
  • Products where FIFO tracking is impractical (liquids, powders, commodities).
  • Companies that want COGS to smooth out price fluctuations over time.

Example:

  • On hand: 50 units at average $10 = $500 in stock.
  • Receive 50 units at $14 = $700 incoming.
  • New average: ($500 + $700) / (50 + 50) = $12 per unit.
  • Next sale will post COGS at $12 per unit.

Journal entry on sale (50 units at average $12):

COGS                 DR 600
  Stock Valuation        CR 600

Configuration in Odoo:

Product Category → Costing Method: Average Cost (AVCO).

AVCO is computed automatically. No per-receipt manual entry required.

First In, First Out (FIFO)#

FIFO matches each outgoing unit to the oldest incoming lot's cost. The oldest stock is depleted first, regardless of physical movement. This is the most accurate reflection of actual cost flow in most distribution scenarios.

When to use:

  • Perishable goods (legal requirement in many jurisdictions).
  • Products with significant price volatility where COGS should reflect actual purchase cost.
  • Companies with strict lot/serial number traceability requirements.

Example:

  • Lot 1: 50 units at $10 (received March 1).
  • Lot 2: 50 units at $14 (received March 15).
  • Sale of 60 units on March 20: COGS = (50 × $10) + (10 × $14) = $640.

Journal entry on sale:

COGS                 DR 640
  Stock Valuation        CR 640

Configuration in Odoo:

Product Category → Costing Method: First In First Out (FIFO).

Odoo maintains a cost queue per product and dequeues oldest costs on each outgoing move.

Important: FIFO does not require lot tracking to be enabled. Odoo tracks the cost queue internally even for products without lot numbers.

Automated vs. manual valuation#

In addition to the costing method, each product category has a Inventory Valuation setting:

SettingEffect
ManualNo journal entries generated. Stock moves update quantity only.
AutomatedJournal entries generated for every stock move. Stock valuation hits the balance sheet in real time.

Automated valuation is required for companies that want real-time inventory on the balance sheet. Manual is used for companies that post inventory adjustments via their ERP system monthly.

To use Automated, the product category needs accounting accounts configured:

  • Stock Valuation Account (balance sheet asset)
  • Stock Input Account (clearing)
  • Stock Output Account (clearing)

Migrating between methods#

Odoo allows changing the costing method on a product category, but the behavior is not intuitive:

  1. The change applies to future moves only.
  2. Existing on-hand stock is revalued to the new method at the current average or standard cost at the time of change.
  3. A journal entry is posted for the revaluation difference.

Safe migration procedure:

  1. Run inventory to zero before changing the method (receive all pending POs, ship all pending transfers).
  2. Change the costing method on the product category.
  3. Receive new stock. The new method applies from this point.

Migrating with stock on hand is possible but creates a valuation adjustment entry that your accounting team must review and sign off on.

Quick decision guide#

ScenarioRecommended method
Manufactured goods with budgeted costsStandard Price
Distribution of commodities at market priceAVCO
Perishable goods, lot tracking, regulatory complianceFIFO
Stable pricing, simple accountingStandard Price
Price fluctuations, need accurate COGSFIFO

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free