We have been working with Odoo v19 inventory valuation and have encountered a significant accounting compliance concern that has not been clearly resolved through Support. I am posting here to determine whether there is a standard configuration, workaround, or upcoming improvement.
Issue Summary
Under GAAP, inventory and Cost of Goods Sold must be recognized in the correct period, even if vendor bills are received after month-end.
However, in Odoo v19:
- Inventory valuation and COGS are only posted when the vendor bill is created
- If the bill is received in a later month, the valuation is posted in that later period
- This causes misstated inventory and COGS in the prior month, which is not GAAP-compliant
Open Questions
- What is the recommended GAAP-compliant workflow when vendor bills arrive after month-end?
- Is there a way to recognize inventory and COGS at delivery/receipt, and then clear interim accounts when the bill arrives?
-
Does the Periodic (At Closing) setting resolve this, and if so:
- How does COGS get recognized at the time of sale?
- Are additional end-of-month processes required?
- Is this behavior a known limitation in v19 with planned enhancements?
Why this matters
We are a Global Odoo Partner based in the United States, and the majority of our mutual customers in the Americas follow GAAP accounting standards. If inventory valuation is only triggered by vendor bills, many users will face incorrect financial statements at period close.
Support Outcome
Support described how v19 currently works but did not confirm:
- Whether it is GAAP-compliant
- Whether a workaround exists
- Whether improvements are planned
The support ticket was closed without a solution, so we are seeking clarification here.








Hey Lee,
I am just as concerned as you and our clients are outraged about this. Doesn't matter how Odoo is trying to explain this away and trying to justify this change in Inventory valuation as to be compliant, it is not and we cannot upgrade our current Odoo clients to v19, because of this. I doubt if Odoo actually understands Anglo Saxon as it seems they want everything to be Periodic.
Here is what I have found as the only possible hack to make it work like v18..
You could potentially with a hack get the purchase side to work. For that, you need to enable (make visible) the GL account on Locations, for ALL locations. Then you need to specify the GL account for each location you have as the Stock Valuation account (DT account). You then need to specify the Stock Valuation account on the Category as the GRNI (goods receipt not invoiced), although it is called Stock Valuation here. (might need to rename it for avoiding confusion)
This will enable you to get Odoo to automatically do the GL entry when you receive the Goods in Stock (as required by IFRS and GAAP) by DT stock valuation and CT GRNI
When you do the Vendor bill (as this is just the liability as per IFRS and GAAP) It will DT GRNI and CT Ap Control.
The Issue now remaining is to figure out how to do the same on the Sales Side. When I sell something and deliver it, but invoice it later - Still working on that but probably less of an issue unless you have a client that creates 1 invoice for a month of shipments, usually the beginning of the next month. Yes, COGS is recorded at invoice level as it should because expense and revenue should be in the same period. However, inventory will now in v19 also only be updated on sales invoice, not when you actually ship the goods (don't have ownership anymore)
And then the big issue... Lot based costing. Under v19, there is no way to account the Cost of Sale based on the cost of the Lot. It is always just taking average cost. You cant have this as it is not reflective of the true net Realizable value (NRV) of your stock if you track by lots. It is fine if all your lots are the same cost, by 99% of the time they are not. Our clients that do serial and lot tracking absolutely requires this!
At Lease FIFO costing is working...
I have also logged a ticket, yet to hear back. This is a timebomb. Wait until our competitors in the market get hold of this info. We might as well not sell v19 into Inventory sites in New Zealand.
Sorry, mate! Just as disappointed as you and there seems to be a lack of understanding or acknowledgement of the Issue at Odoo.
Hi Awie, I'd love to know specifically what leads you to conclude Odoo 19 is not compliant.
I have personally discussed the approach with former Auditors and CPA's from Deloitte, KPMG and PWC.
Both IRFS and GAAP discuss the need for period based matching of assets / liabilities / revenues / expenses [which includes accruals for expected amounts if Invoices / Bills are not available], but neither specify how often the general ledger needs to be updated, just that it needs to be done by month end.
A compliance audit is always based on "closed" books (adjusted / reclassed / corrected balance sheets and income statements) and never on mid month reports.
An auditor's job is to issue a formal opinion on whether a company's financial statements "present fairly, in all material respects," its financial position "for a specific period".
It is common practice to post accruals, depreciation, amortization, corrections and reclasses at month end - so the month end inventory update here is no different (to account for uninvoiced sales and unbilled purchases).
The Inventory Stock report updates in real-time the value and quantities of all tracked inventory based on receipts, deliveries, scrap, inventory adjustments and re-valuations.
Each month, the closing process which includes accruals and finally the GENERATE ENTRY feature will update the balance sheet to match the month end Stock report value.
Perhaps the part I have failed to explain well is that the closing entry is only the first part of the month end process.
After generating the inventory variation credit, Odoo helps generate four (or five if the Manufacturing App is installed) accrual entries to account for the differences between what was received/delivered and what was billed/invoiced.
These accrual entries for bills not received, goods billed not received, invoices to be issued, goods invoiced not delivered (and work in progress for Manufacturing) clear the inventory variation credit posted by the closing entry, which is designed to ensure your balance sheet is matched 100% with the value from the Inventory Stock report.
It is THESE entries that have detailed information about every purchase order line and sale order line with the product, quantity delivered/received, quantity invoiced/billed, and unit price.
I updated my answer in an attempt to clarify how this works. Happy to model specific scenarios with similar worked examples if you feel that would be useful.
We've all been trained to believe that the only way to achieve an accurate inventory valuation is to have a journal entry for every single receipt. For years, that's what 'perpetual inventory' has meant to us.
Does GAAP or IFRS require our G/L to be real-time? No. It requires it to be accurate for the period. The assumption we've all been holding onto is that 'goods changing hands' is the only auditable event. The new Odoo design challenges this. It suggests that the billing/invoicing event is the stronger, more financially relevant event to trigger the posting, as long as we have a way to account for when we don't complete billing and/or invoicing in the same period.
I think this is the biggest challenge we have in educating people. We have to shift the mindset from viewing the inventory general ledger account as a real-time stock quantity report to seeing it as a current asset account 100% managed by the finance team. We still track all inventory quantities and costs in real time operationally, but just hold the financial posting to when the superior, auditable "source of truth" that confirms the actual cost and creates the actual payable/liability or receivable/asset is available.
Our new audit trail comes from the accrual entries. They are granular, detailed, and designed specifically to tie out the G/L to our operational reality. The reconciliation is no longer trying to match a million tiny stock moves to the G/L. The system guarantees we match 100%, and it gives us the detailed accrual reports as the full, line-by-line proof.
P.S - a potentially overlooked but signifant benefit of this new design is the ability to unlock and back date warehouse receipts, delivery orders and inventory adjustments.
Hey Ray,
Can you please elaborate on this? I think this is probably the missing element as I cant see it being discussed in any video or documentation. So, I'd be really interested to know where I can find this?
Mate, happy to change and adopt. But we can face our customers running Perpetual Inventory on a granular basis if we take away that functionality. So, maybe there Audit reports are the answer?
I'm also particularly interested in How V19 will deal with lots for the same product but different costs? In V18, the cost associated with the lot was used in the COGS, but it seems in V19 it is just using average cost to do COGS?
Hi Awie
I have worked through an example at https://www.odoo.com/forum/help-1/how-can-i-access-the-details-of-the-inventory-variation-posted-at-month-end-in-odoo-19-290771
Hope this helps, please let me know if you still have questions or concerns.
help !
Something really weird with v19.

We have a product, purchase price = 100. We sell 5 pieces at $300 each. Valuation = perpetual, and costing = average.
The delivery is done, but no invoice (yet).
When we create the accrual for invoices to be sent, odoo creates this entry:
where the value of the COGS is equal to the value of the revenue. But should it not be instead the value of the goods delivered ? in the example above, it should be 500.
And when we look at the balance sheet:
The interim account is not zeroed ...
Am i missing something ?
Can you report this to our Support Team via odoo.com/help