Flectic
Odoo AppsOdoo

Odoo Inventory Valuation: AVCO vs FIFO and the accounting impact

Odoo inventory valuation is two independent settings: a costing method (Standard Cost, AVCO, or FIFO) that sets unit cost and COGS, and an accounting method (Periodic or Perpetual) that sets when stock value hits the general ledger. Odoo 19 posts Perpetual at invoice level—not per stock move—and reconciles gaps with one closing entry. This guide covers methods, Continental vs Anglo-Saxon COGS timing, landed costs, AVCO/FIFO returns, misconfigs, and how to choose.

14 min readUpdated Aug 3, 202617 sources cited

TL;DR — Key takeaways

  • Inventory valuation in Odoo is governed by two independent settings that teams constantly conflate, and separating them is the single most useful framing for configuring the system correctly.
  • Odoo supports three costing methods, configured in Accounting settings and optionally overridden on a product category: Standard Cost (a fixed unit cost you update manually), Average Cost (AVCO, the weighted average of all units on hand), and FIFO (first in, first out).
  • A persistent source of confusion is LIFO.
  • Where costing answers what a unit is worth, the accounting method answers when that worth hits the ledger.
01The Core Concept

What inventory valuation means in Odoo

Inventory valuation in Odoo is governed by two independent settings that teams constantly conflate, and separating them is the single most useful framing for configuring the system correctly. The costing method decides what each unit of stock is worth; the accounting method decides when that worth reaches your general ledger. Choosing AVCO or FIFO changes your cost of goods sold and your balance-sheet inventory value; choosing Periodic or Perpetual changes the timing and the volume of the journal entries that sit behind those numbers.

A second split runs between the two applications that own valuation. The Inventory application maintains the real-time value of physical stock as goods are received and delivered; the Accounting application updates the financial books only when invoices and bills are posted, and then again at closing. Odoo's own valuation cheat sheet is explicit that it is not practical for accountants to post a journal entry for every inventory movement, so the accounting side reconciles to the inventory side through a closing entry rather than move by move. This is exactly why your Inventory > Reporting > Stock value and your Accounting > Review > Inventory Valuation value can differ in the short term, and why the closing process exists to bring them together.

In Odoo 19, valuation lives on stock moves rather than the older valuation-layer tables: each receipt, delivery, return, or adjustment carries quantity, unit cost, and total value. That redesign is what makes Perpetual post at bill/invoice time and still keep warehouse value live. This guide is the finance and valuation angle. For the warehouse operations that valuation sits on top of — receipts, transfers, deliveries, routes, and putaway — see the Odoo Inventory module guide; for the broader finance application — general ledger, bank reconciliation, and tax reporting — see the Odoo Accounting guide. The rest of this page covers the three costing methods, why LIFO is not one of them, Periodic vs Perpetual and the Odoo 19 redesign, Continental and Anglo-Saxon COGS timing, journal accounts, landed costs, returns under AVCO and FIFO, reporting and closing, common misconfigs, and how to choose.

02Costing Methods

The three costing methods: Standard, AVCO, FIFO

Odoo supports three costing methods, configured in Accounting settings and optionally overridden on a product category: Standard Cost (a fixed unit cost you update manually), Average Cost (AVCO, the weighted average of all units on hand), and FIFO (first in, first out). The same physical sequence of receipts and deliveries produces three different inventory values and three different costs of goods sold, and walking through one example makes the trade-offs concrete.

Take a product that starts with zero stock. You receive 8 units at $10, receive 4 more at $16, deliver 10 units to a customer, and finally receive 2 units at $6. Under Standard Cost fixed at $10, every receipt and delivery is valued at $10 regardless of what you actually paid, so the delivered batch costs 10 x $10 = $100 and you finish holding 4 units worth $40. The gap between the $10 standard and the real purchase prices does not sit in the stock value; it flows through a separate price-difference account, which is how Standard Cost keeps the on-hand value stable.

Under AVCO, the unit cost re-averages on every receipt only — deliveries do not change the moving average. The first two receipts total $144 across 12 units, so the average becomes $12; delivering 10 units removes 10 x $12 = $120, leaving $24 across 2 units; the final $6 receipt re-averages to $9 across 4 units, ending at $36. Formula: new MAP = ((current MAP x qty on hand) + (receipt price x receipt qty)) / (qty on hand + receipt qty). Under FIFO, the 10 delivered units are costed against the oldest layers first — 8 at $10 and 2 at $16, totalling $112 — leaving the 2 newest $16 units on the books at $32, which becomes $44 after the final $6 receipt. FIFO keeps each remaining inbound layer's own cost until it is fully consumed.

The ordering matters more than the arithmetic. In a rising-price run, FIFO assigns the oldest, cheapest costs to cost of goods sold, so gross profit is highest and remaining inventory reflects newer, higher costs; AVCO smooths swings into a moving average; Standard Cost decouples stock value from market price and pushes variance into a price-difference account. Which behaviour you want depends on whether you manage stable-cost manufactured goods, volatile-cost distributed goods, or import-heavy landed-cost goods — a decision we return to at the end of this guide.

The same receipt and delivery sequence valued three ways, with COGS on the delivery. Method behaviour per the Odoo 19 valuation cheat sheet; numbers are illustrative.
StepStandard Cost ($10 fixed)AVCO (weighted average)FIFO (oldest first)
Receive 8 @ $10$80 (8 x $10)$80 (avg $10)$80 (8 @ $10)
Receive 4 @ $16$120 (12 x $10)$144 (avg $12)$144 (8@10 + 4@16)
Deliver 10 — COGSCOGS $100; stock $20COGS $120; stock $24COGS $112; stock $32 (2@16)
Receive 2 @ $6$40 (4 x $10)$36 (avg $9)$44 (2@16 + 2@6)
Ending inventory value$40$36$44
COGS behaviourUses fixed standard; bill vs standard hits price differenceUses current MAP; receipts re-average; exits use MAPConsumes oldest layers first; remaining layers keep own cost
03The LIFO Question

Why LIFO is a removal strategy, not a costing method

A persistent source of confusion is LIFO. Odoo does support LIFO, but as a removal strategy, not a costing method. Removal strategies — which include LIFO and FEFO — decide which physical batch is picked first from a location; they do not change how the picked units are valued. You can configure a product to be picked last-in-first-out while still valuing it at average cost, and the Odoo valuation cheat sheet spells this distinction out directly.

The reason LIFO is not a costing option is regulatory. IFRS, through IAS 2, requires inventories to be measured using FIFO or weighted average cost, and LIFO is not permitted; US GAAP is the exception, permitting LIFO alongside FIFO and weighted average cost. Because Odoo ships a single global product, it builds the IFRS-compliant behaviour into the valuation engine and leaves LIFO to the physical-picking layer. If your business reports under US GAAP and elects LIFO for tax, that is a tax-led accounting choice handled outside Odoo's standard costing methods — and under the US LIFO conformity rule, electing LIFO for tax generally requires LIFO in the financial statements as well.

The practical consequence is that teams arriving expecting a LIFO costing toggle will not find one. If matching the most recent costs to COGS is the goal, the closest Odoo-native options are FIFO combined with disciplined landed-cost capture, or a Standard Cost that you re-set to current replacement cost on a cadence. Neither reproduces LIFO accounting, and that is by design rather than an omission.

04Accounting Methods

Periodic vs Perpetual, and the Odoo 19 redesign

Where costing answers what a unit is worth, the accounting method answers when that worth hits the ledger. Odoo offers two, set under Accounting > Configuration > Settings in the Inventory Valuation section: Periodic (at closing) and Perpetual (at invoicing). Periodic posts vendor bills as expenses and updates stock valuation only when you run the closing entry; Perpetual posts vendor bills as stock assets and recognises cost of goods sold when the goods are sold (customer invoice posted).

Odoo 19 fundamentally changed how Perpetual works, and this is the single most important thing to unlearn if you have read older tutorials. Before Odoo 19, Perpetual posted a real-time journal entry at every stock movement, which produced a flood of journal items and hurt performance, general-ledger clarity, and auditability. Since Odoo 19, Perpetual touches the stock valuation account at the invoice level, and a single closing entry reconciles the gaps — bills not yet received, invoices not yet issued, prepaid expenses, and deferred revenue. Valuation layers are gone; values live on stock moves. Partner write-ups of the redesign stress fewer journal entries, a cleaner general ledger, and faster performance — and that migration must rebalance legacy interim accounts before go-live.

The older "Automatic Accounting" / automated valuation toggle is gone. In Odoo 19 you configure Inventory Valuation (Periodic or Perpetual) in Accounting settings, optionally override per product category, and use Accounting > Review for Inventory Valuation, Bills to Receive, Billed Not Received, Invoices to Issue, and Invoiced Not Delivered. The cheat sheet frames configuration as a four-cell matrix of Continental vs Anglo-Saxon philosophy crossed with Periodic vs Perpetual timing. Odoo 19 supports all four with automated closing and accrual handling. For most SMEs the closing runs once a year; larger companies run it monthly, configurable as Manual, Daily, or Monthly under the same settings.

05Accounting Philosophy

Continental vs Anglo-Saxon: when cost of goods sold is recognised

Underneath the Periodic and Perpetual choice is a deeper accounting philosophy that determines when cost of goods sold is recognised, and it tracks geography. In Continental accounting — the model used across much of continental Europe, including France, Belgium, and Germany — the cost of purchased goods is recorded as an expense when the vendor bill is posted, typically on receipt, regardless of whether those goods have been sold. Inventory becomes a period-end adjustment rather than a real-time asset on the balance sheet.

In Anglo-Saxon accounting — the model used in the United States, the United Kingdom, Canada, and Australia, and by most trading companies in the Gulf — purchases increase an inventory asset account, and cost of goods sold is recognised only when the customer invoice is posted, that is, when the goods are sold. This is the matching principle applied to inventory: expense follows revenue rather than purchase, so the income statement reflects the cost of what was actually sold in the period.

Odoo maps these philosophies to its timing methods. Periodic is the natural fit for Continental practice and is described in the documentation as the best practice in Europe; Perpetual is the natural fit for Anglo-Saxon practice and is described as the best practice in Anglo-Saxon countries such as the USA and India. The mapping is a default rather than a constraint — Odoo's own note is that companies may choose a different combination based on their needs — but staying on the default for your jurisdiction keeps the general ledger aligned with what auditors and tax authorities expect. Multi-company groups with both European and US entities should set philosophy and timing per company, not once for the whole database.

06The Accounts

The journal entries and accounts behind valuation

The accounting impact lands on a small set of accounts that you configure once and then let the engine populate. The Stock Valuation account holds the inventory value as a current asset on the balance sheet. The Stock Variation account is the buffer that records the difference between posted inventory value and the real-time stock value recorded in the Inventory app, and it clears through the closing entry (or as bills and invoices catch up under Perpetual). An Expense or Cost of Goods Sold account recognises cost, and an Inventory Loss account on the Inventory Loss location captures shrinkage and adjustments separately from normal variation.

Odoo 19 removed the separate Stock Interim (Received) input and Stock Interim (Delivered) output accounts that older Perpetual setups used on every warehouse move. Those interims are replaced by Stock Variation as the unified buffer. On a typical Anglo-Saxon Perpetual path: validate a receipt and Inventory shows value immediately while Accounting shows the same amount under Stock Variation until you post the vendor bill (Debit Stock Valuation, Credit Payable). Validate a delivery and Inventory drops the value; posting the customer invoice then Debits COGS and Credits Stock Valuation alongside the revenue/receivable lines. Until bill and invoice are posted, Accounting > Review > Bills to Receive or Invoices to Issue flags the open gap — no GL flood of move-level entries.

Under Continental Periodic, the same vendor bill Debits Expense and Credits Payable — goods are expensed on purchase — and stock value is sorted out at closing when variation moves into the Stock account. A customer invoice under Continental posts stock variation and income rather than the Anglo-Saxon COGS/Stock pair. The closing entry reconciles the two worlds: it moves the period's stock variation into Stock under Continental practice, or realises remaining variation as COGS under Anglo-Saxon practice, and aligns accounting inventory with Inventory's real-time value. Two refinements matter in practice. With Perpetual plus Standard Cost, a Price Difference account on the product category captures the spread between standard price and actual billed price. For manufacturers, a Cost of Production location account isolates production-related variation — under Anglo-Saxon Perpetual, finished goods and component valuation update when a manufacturing order is validated, with Cost of Production as the counterpart.

Where each transaction posts under Odoo 19 defaults. Behaviour per the Odoo 19 valuation cheat sheet and partner migration guides (no stock interim input/output accounts).
TransactionContinental (Periodic default)Anglo-Saxon (Perpetual default)
Receipt validated (no bill yet)Inventory value up; Stock Variation buffers until closingInventory value up; Stock Variation / Review shows Bills to Receive; no GL until bill
Vendor bill (purchase)Debit Expense, Credit Payable — goods expensed on purchaseDebit Stock Valuation, Credit Payable — goods capitalised as an asset
Delivery validated (no invoice yet)Variation tracks outbound value until closingInventory value down; Invoices to Issue open; no COGS journal yet
Customer invoice (sale)Debit Expense (stock variation), Credit Income; Debit ReceivableDebit COGS, Credit Stock; Debit Receivable, Credit Income
Inventory adjustment / lossStock account via Inventory Loss location / variation at closingValuation updates with Inventory Loss counterpart when configured
Period closing entryMoves variation into the Stock accountRealises remaining variation as COGS and clears the buffer
07Landed Costs

Landed costs and the true cost of goods

Vendor-invoice cost is rarely the true cost of goods. Freight, insurance, customs duties, and handling fees all belong in inventory valuation, and Odoo's Landed Costs feature allocates them to the products on a receipt so that cost of goods sold and stock value reflect what the goods actually cost to bring in. It is enabled under Inventory > Configuration > Settings in the Valuation section, after which you nominate a Default Journal for the landed-cost entries.

Landed costs are modelled as Service products flagged Is a Landed Cost on the Purchase tab, each carrying a Default Split Method that decides how the charge is spread across the receipt. Equal divides it evenly across products, By Quantity spreads it per unit, By Current Cost weights it toward the more expensive items, and By Weight or By Volume spread it by the relevant physical measure. You add the landed-cost line to the vendor bill, generate the landed-cost record, link it to the validated transfer, compute, and validate — Odoo then posts a journal entry that re-values the affected stock. Under AVCO that re-value feeds the moving average; under FIFO it adjusts the layers tied to the receipt.

One hard constraint shapes the decision. Landed costs can only be applied to products in a category whose costing method is AVCO or FIFO; Standard Cost categories cannot absorb landed-cost adjustments, because a fixed cost has no mechanism to recompute. For import-heavy distributors this is a strong reason to choose AVCO or FIFO over Standard Cost regardless of other preferences, since capturing true landed cost is what makes gross margin on imported goods trustworthy in the first place. Apply landed costs promptly after the related receipt: late allocation leaves early deliveries costing vendor price only and distorts COGS until the adjustment lands.

08Edge Cases

Returns under AVCO and FIFO: where valuation diverges from the vendor price

Returns are where controllers first notice that warehouse value and commercial price are not the same number — especially under AVCO. Odoo's official average-price documentation is explicit: products returned to suppliers are commercially credited at the original purchase price on the credit note, but internal inventory valuation treats the return as stock leaving at the current average cost. If you bought at $10, later receipts pushed MAP to $12, and you return a unit, Inventory drops by $12 while the vendor credit may still be $10. The gap sits in Stock Variation until later bills, invoices, or the closing entry clear it. That is standard AVCO behaviour, not a misposting.

Worked shape of a vendor return under AVCO (illustrative, same logic as partner Odoo 19 scenarios): on-hand MAP is $57.62 after mixed receipts; you reverse-transfer 20 units and post a credit note at the original $60 purchase price. Inventory reduces by 20 x $57.62 = $1,152.40; the credit note hits Payable and Stock at $1,200. The roughly $47.60 difference is Stock Variation — vendor commercial price versus inventory cost. Customer returns reverse the path: reverse the delivery, issue a credit note, and Odoo restores stock and reverses COGS using the cost that was on the original outbound move (not necessarily today's MAP).

FIFO returns are layer-sensitive. Standard Odoo FIFO consumption takes from the oldest remaining layers when stock leaves, including some return paths — which can disagree with auditors who expect a purchase return to reverse the original receipt layer. Community OCA modules such as stock_account_fifo_return_origin exist specifically to force purchase returns onto the origin receipt's valuation when standard FIFO outbound logic is not acceptable for audit. If FIFO layer integrity on returns is a hard requirement, test return scenarios on a copy of production before go-live and decide whether standard behaviour or an audited OCA approach fits your auditors.

Never change a product's category costing method while meaningful stock is on hand without an accountant-led plan. Switching Standard ↔ AVCO ↔ FIFO with stock re-values residual quantity under the new method and can scramble historical COGS comparisons. Prefer emptying or counting stock, closing the period, and switching at period start. Category-level account maps (valuation journal, stock valuation account, price difference, expense/COGS) must be complete before the first Perpetual adjustment — a missing Inventory Valuation Journal is a common reason inventory adjustments fail validation.

Return and cost-edge behaviour under Odoo costing methods (illustrative; confirm on your Odoo 19 database).
EventAVCOFIFOStandard Cost
Vendor return (credit note)Stock leaves at current MAP; credit note at PO price; difference → variationLayer/outbound rules apply; origin-layer reverse may need OCA if audit requires itStock leaves at standard; bill/credit vs standard → price difference
Customer returnRestores stock / reverses COGS from original outbound cost pathRestores layers per original sale/return linkage when trackedRestores at standard unit cost
New receipt after returnsMAP re-averages on the receipt onlyNew layer added at receipt costValue stays at standard
Change category costing with stockRevalues residual qty — do not do casuallyRevalues residual layers — plan with accountantRevalues residual qty to new standard logic
09Reporting & Closing

Reading the reports and running the closing

Two reports carry the valuation story. In the Inventory application, Reporting > Stock shows real-time quantities and values per product, location, company, and lot, and you can restate the view as of a past date. Clicking a product's Unit Cost traces how the current value was derived — especially useful under AVCO, where each receipt re-averages the cost — and clicking Total Value shows the incoming moves that still have remaining quantity, with FIFO retaining each layer's individual value while AVCO and Standard Cost show the current average. In FIFO or AVCO you can also Adjust Valuation on remaining quantity from a previous incoming move when a layer needs a controlled correction.

In the Accounting application, Review > Inventory Valuation is where finance sees the gap — the older Inventory-app "Stock Valuation" report many Odoo 18 users bookmarked is not the same screen after the Odoo 19 redesign. The Review report opens with an Initial Balance, shows Stock Variation as the difference between posted accounting value and the Inventory application's real-time value, and projects an Ending Stock that takes effect once the closing entry is posted. Generating the entry produces a draft Stock Closing transaction you review and post, after which the Stock Valuation and Stock Variation accounts update in the general ledger.

When deliveries and invoices are out of step, accrual views close the loop. Odoo surfaces Bill To Receive, Invoices To Be Issued, Billed Not Received, and Invoiced Not Delivered under Accounting > Review; creating accrual entries recognises revenue and expense in the correct period. Under Anglo-Saxon Perpetual these entries also pull value out of the buffer Variation account and allocate it where it belongs, such as Goods Received Not Invoiced. The Inventory Loss and Cost of Production accounts keep adjustments and production variation out of the main stock-variation flow so controllers can explain residual variation without drowning in noise.

10Misconfigs

Common misconfigurations that break valuation

Most valuation tickets are configuration mistakes, not costing-math bugs. First: mixing Continental chart expectations with Anglo-Saxon Perpetual (or the reverse) without redesigning the chart of accounts — COGS never appears when you expect it, or expenses double-count purchases. Align philosophy, Periodic/Perpetual, and account maps per company before the first real bill.

Second: incomplete product-category account maps. Perpetual categories need Stock Valuation, Stock Variation (or the equivalent buffer fields Odoo 19 exposes), Expense/COGS, Inventory Valuation Journal, and — for Standard Cost — Price Difference. Missing journal configuration is a frequent cause of failed inventory adjustments. Third: enabling landed costs after months of Standard Cost history, or applying freight only to some receipts — margins on early lots stay understated forever unless you revalue carefully.

Fourth: Odoo 18 → 19 upgrades with non-zero Stock Interim (Received) or Stock Interim (Delivered) balances. Those interims no longer drive the new flow; official guidance is to rebalance residual interim balances into the stock valuation account (Odoo ships a Stock Valuation rebalance interim Accounts server action) on a test database first, with an accountant review. Fifth: treating LIFO removal strategy as LIFO costing, or flipping category costing mid-period with stock on hand. Sixth: expecting Inventory Reporting > Stock and Accounting Review > Inventory Valuation to match every day without closing or without posting bills and invoices — under Odoo 19 that temporary gap is by design.

11Choosing

How to choose the right method

Choosing well means deciding the costing method, the accounting method, and whether landed costs apply — ideally once, at setup, because changing costing method mid-stream re-values your stock and is not a casual toggle. For costing, Standard Cost suits manufacturers with stable, known input costs who want predictable unit economics and are set up to maintain the standard; AVCO suits distributors whose purchase prices move and who want cost of goods sold and inventory smoothed without manual upkeep; FIFO suits businesses whose physical flow matches oldest-first and who want recent costs reflected in inventory, and AVCO or FIFO is required if you need landed costs.

For the accounting method, default to your jurisdiction's philosophy: Periodic for Continental European entities where purchase-as-expense is the norm, Perpetual for Anglo-Saxon entities that capitalise stock and recognise COGS on sale. Set the Periodic Valuation closing cadence — Manual, Daily, or Monthly — to match how often finance needs the books to match the warehouse, and remember that under Odoo 19 Perpetual you typically set closing to Manual and let the single closing entry reconcile residuals at period end while bills and invoices drive day-to-day valuation posts.

Three cautions round out the decision. First, if you operate across Continental and Anglo-Saxon entities, plan the configuration per company rather than database-wide. Second, if you are upgrading to Odoo 19 on Anglo-Saxon Perpetual, legacy stock input and output accounts are no longer used and any non-zero balances must be rebalanced into the stock valuation account — review the server action on a test database with an accountant first. Third, if landed costs matter to your margins, commit to AVCO or FIFO from day one and script return/credit-note tests so finance knows how MAP vs PO price gaps will look. The fastest way to lock these choices against your actual chart of accounts and reporting cadence is an ERP Readiness Call, and our AI-accelerated delivery model is designed to deliver up to 3x faster than a traditional rollout.

FAQ

Frequently asked questions

What is the difference between a costing method and an accounting method in Odoo?

The costing method (Standard Cost, AVCO, or FIFO) decides what each unit of stock is worth; the accounting method (Periodic or Perpetual) decides when that worth reaches the general ledger. Costing changes your cost of goods sold and inventory value; accounting changes the timing and volume of the journal entries behind them. The two are configured independently, in Accounting settings and optionally per product category.

Does Odoo support LIFO inventory valuation?

Not as a costing method. Odoo supports LIFO as a removal strategy that controls which physical batch is picked first, but valuation still uses Standard Cost, AVCO, or FIFO. The reason is regulatory: IFRS (IAS 2) does not permit LIFO for inventory measurement, so Odoo keeps the valuation engine IFRS-compliant. Only US GAAP permits LIFO, and that is a tax-led accounting choice handled outside Odoo's standard costing options.

What changed with inventory valuation in Odoo 19?

Before Odoo 19, Perpetual valuation posted a journal entry on every stock movement, creating large numbers of journal items and hurting performance and ledger clarity. Odoo 19 moved Perpetual to touch the stock valuation account at the invoice/bill level, dropped separate stock interim input/output accounts in favour of Stock Variation, stores value on stock moves instead of valuation layers, and reconciles residuals through a single closing entry plus Review accruals (bills to receive, invoices to issue, and related views). The result is fewer journal entries, a cleaner general ledger, and faster performance.

Which costing method should I choose: Standard, AVCO, or FIFO?

Standard Cost fits manufacturers with stable input costs; AVCO fits distributors with moving purchase prices who want automatic smoothing; FIFO fits businesses whose oldest-first physical flow matches the cost flow, and anyone who needs landed costs, since landed costs require AVCO or FIFO. The choice should be made at setup, because changing it re-values existing stock.

What is the difference between Periodic and Perpetual valuation in Odoo?

Periodic (at closing) posts vendor bills as expenses and updates stock valuation only when you run the closing entry — the Continental European default. Perpetual (at invoicing) posts vendor bills as stock assets and recognises cost of goods sold when goods are sold — the Anglo-Saxon default. In Odoo 19, both reconcile through the closing entry rather than per-move journal entries, and Inventory still tracks stock value in real time either way.

How do landed costs affect inventory valuation in Odoo?

Landed costs add freight, insurance, customs duties, and fees to the cost of the goods on a receipt, so cost of goods sold and stock value reflect true cost rather than vendor-invoice cost. They are configured as Service products with a split method (Equal, By Quantity, By Current Cost, By Weight, or By Volume) and can only be applied to product categories set to AVCO or FIFO.

Why do my inventory value and accounting value differ in Odoo?

Because the Inventory application tracks stock value in real time while the Accounting application updates on invoices, bills, and the closing entry. The difference is the Stock Variation shown on Accounting > Review > Inventory Valuation, and it is cleared by posting bills/invoices and, when needed, generating and posting the stock closing entry so the books line up with the warehouse.

How does Odoo value vendor returns under AVCO?

Commercially, the vendor credit note uses the original purchase price. Internally, Odoo reduces inventory at the current average (MAP) as if stock left the warehouse at that cost. Any gap between PO price and MAP posts through Stock Variation and clears as later accounting events or the closing entry run. This is documented Odoo average-cost behaviour, not an error — controllers should expect temporary mismatches after returns when prices have moved.

Can I change the costing method on a product category that already has stock?

You can, but you should not do it casually. Changing Standard, AVCO, or FIFO on a category with on-hand quantity re-values residual stock under the new method and can break period comparability for COGS and inventory. Prefer zeroing or counting stock, closing the period, and switching at period start with accountant approval. Always test on a copy of the database first.

Where is the Stock Valuation report after upgrading to Odoo 19?

Day-to-day quantity and value analysis stays under Inventory > Reporting > Stock. Financial reconciliation moved to Accounting > Review > Inventory Valuation (plus Bills to Receive, Invoices to Issue, and related accrual views). The Odoo 18 automated valuation / interim-account model is gone; if you cannot find the old Stock Valuation menu, use the Review inventory valuation report and the Inventory stock report together.

Sources & methodology

17 cited

Every pricing figure and statistic on this page is traced to a primary or vendor source with a verification date. Where partner pages are cited, their platform bias is disclosed in-line.

  1. 01
    Odoo supports three costing methods configured in accounting's settings and optionally the product's category: Standard Cost (fixed, manual), Average Cost (weighted average of all units), and FIFO (first in, first out). The cheat sheet's worked tables show each method producing different unit costs and inventory values from the same sequence.odoo.com · verified Odoo 19 official Valuation cheat sheet — costing methods section
  2. 02
    Removal strategies support LIFO and FEFO but only impact which product is picked first, not the valuation method; you can pick using LIFO while valuing at average cost, as LIFO is not allowed by IFRS.odoo.com · verified Odoo 19 Valuation cheat sheet — note under costing methods
  3. 03
    Before Odoo 19, the Perpetual accounting method posted real-time entries at each stock movement, creating many journal items and hurting performance, GL clarity, and auditability; Odoo 19 moved Perpetual to impact the stock valuation account at the invoice level with a single closing entry reconciling bills-to-receive, invoices-to-issue, prepaid expenses, and deferred revenue.odoo.com · verified Odoo 19 Valuation cheat sheet — Changes in Odoo 19 section with Odoo 18 vs 19 comparison table
  4. 04
    Periodic posts vendor bills as expenses and updates stock valuation in the closing entry by reducing expenses (best practice in Europe); Perpetual posts vendor bills as assets (stock valuation) and reports expenses when goods are sold as COGS (best practice in Anglo-Saxon countries like the USA and India).odoo.com · verified Odoo 19 Valuation cheat sheet — Accounting Methods section
  5. 05
    Continental accounting records the cost of goods as an expense when the vendor bill is posted regardless of when goods are sold; Anglo-Saxon accounting recognises COGS as an expense when the customer invoice is posted. Costing is set under Accounting > Configuration > Settings > Inventory Valuation as Perpetual (at invoicing) or Periodic (at closing), with closing cadence Manual, Daily, or Monthly, and Inventory Cost Method of Standard Price, FIFO, or AVCO, all overridable per product category.odoo.com · verified Odoo 19 Accounting inventory valuation configuration documentation
  6. 06
    The Stock Valuation account records inventory as a current asset; the Stock Variation account buffers the difference between posted value and real-time stock value and clears at closing; with Perpetual plus Standard Cost a Price Difference account captures the spread between standard and billed price; a Cost of Production location account isolates production variation under Anglo-Saxon Perpetual when a manufacturing order is validated.odoo.com · verified Odoo 19 Accounting inventory valuation — Valuation account, Variation account, Inventory Loss, and Cost of Production sections
  7. 07
    On upgrading to Odoo 19 with Anglo-Saxon Perpetual, stock input/output accounts are no longer used and any non-zero balances must be transferred to the stock valuation account via journal entry; a server action (Stock Valuation rebalance interim Accounts) identifies and applies the change, recommended after upgrading on a test database.odoo.com · verified Odoo 19 Accounting inventory valuation — Upgrade process for Anglo-Saxon Perpetual section
  8. 08
    Landed costs allocate additional costs (shipment, insurance, customs duties, taxes, fees) to product valuation; enabled under Inventory > Configuration > Settings > Valuation; modelled as Service products flagged Is a Landed Cost with a Default Split Method (Equal, By Quantity, By Current Cost, By Weight, By Volume); applicable only to product categories with AVCO or FIFO costing.odoo.com · verified Odoo 19 Landed costs documentation
  9. 09
    Under AVCO, products returned to suppliers use the original purchase price on the commercial credit, but internal cost valuation reduces inventory at the current average unit cost; Odoo treats vendor returns as stock exiting at the average, so PO price and MAP can diverge into stock variation.odoo.com · verified Odoo 19 Average price on returned goods documentation
  10. 10
    Odoo 19 eliminates valuation layers, stores valuation on stock movements, posts Perpetual valuation when bills/invoices are confirmed rather than on warehouse moves, introduces Accounting > Review > Inventory Valuation with initial balance / stock variation / ending stock, and requires careful interim-account rebalancing on migration from Odoo 18.erpgap.com · verified ERPGap Odoo 19 new stock valuation guide (Nov 2025)
  11. 11
    Odoo 19 replaces Stock Interim (Received) and Stock Interim (Delivered) with a unified Stock Variation account; configuration moves from Automatic Accounting to Inventory Valuation (Periodic/Perpetual); Accounting Review adds Inventory Valuation, Bills to Receive, Billed Not Received, Invoices to Issue, and Invoiced Not Delivered reports for open gaps.techvaria.com · verified Techvaria Odoo 18 vs Odoo 19 stock valuation and interim accounts (Mar 2026)
  12. 12
    Partner Odoo 19 AVCO walkthroughs document vendor returns where inventory leaves at current MAP while the vendor credit uses original purchase price, with the difference sitting in Stock Variation; customer returns reverse delivery and COGS; AVCO recalculates only on incoming receipts via new MAP = ((current MAP × qty) + (purchase price × incoming qty)) / total qty.surekhatech.com · verified Surekha Tech Inventory Valuation in Odoo 19 Explained (Jun 2026) — return and MAP scenarios
  13. 13
    A taxpayer electing LIFO for tax purposes must generally use LIFO in its financial statements (the LIFO conformity rule), under Treas. Reg. 1.472-2(e); LIFO is permitted under US GAAP, in contrast to IFRS which prohibits it.irs.gov · verified IRS Practice Unit — LIFO Conformity
  14. 14
    IAS 2 requires FIFO or weighted-average cost for interchangeable inventories and prohibits LIFO; US GAAP still allows LIFO while IFRS does not, because LIFO is judged not to faithfully represent inventory flow patterns.kpmg.com · verified KPMG inventory accounting IFRS vs US GAAP (2026)
  15. 15
    Continental accounting (used in France, Belgium, Germany) expenses purchases immediately and treats inventory as a period-end adjustment; Anglo-Saxon accounting (US, UK, Canada, Australia) capitalises purchases as inventory and recognises COGS only when goods are sold — the matching principle applied to inventory.technaureus.com · verified Continental vs Anglo-Saxon accounting explainer corroborating the timing-of-COGS distinction used in Odoo's documentation
  16. 16
    OCA community modules such as stock_account_fifo_return_origin are maintained because standard FIFO purchase-return valuation (outbound FIFO rather than origin-receipt layer) can draw audit challenges; practitioners propose returning at the origin receipt SVL for FIFO products.x.com · verified X/Twitter — Quartile Odoo (Feb 2026) on OCA stock_account_fifo_return_origin for FIFO purchase returns
  17. 17
    Practitioners and partners flag Odoo 19 stock valuation redesign (no complex interim journal flood; Periodic vs Perpetual framing) as a major accounting change requiring re-training and careful migration.x.com · verified X/Twitter — Mustufa Rahi (Mar 2026) Odoo 18 vs 19 stock valuation & interim accounts

Related services & solutions

Get inventory valuation right the first time

Flectic implements Odoo finance and inventory end to end. Book an ERP Readiness Call and we will map your costing method, accounting model, landed-cost needs, return scenarios, and chart of accounts against your jurisdiction — then deliver through an AI-accelerated model designed to deliver up to 3x faster than a traditional rollout.

Book an ERP Readiness Call
Response within one business day