Cost Price History Report
Product cost price history - see every cost change Odoo already records, with what the cost was before, what changed and who changed it
The video below shows Cost Price History Report running on a real Odoo 19 database. Want it driven against your own data, or a question answered first? Ask and we will set up a session.
What it does
Odoo already records this. It just never shows you.
Every time somebody changes a product's cost, Odoo writes down the product, the new cost, the date and the user. There is exactly one screen for that data in the whole system - a single-record form reached from a stock move - and no list, no filter and no menu. This is the missing report. It stores nothing new.
What it was, what it became, who changed it
Every cost change newest first: the previous cost, the new one, the difference in money and as a percentage, and the person who typed it. Filter to a month, to rises or to falls. Group by product, by month or by user.
"Previous" means the real previous cost
It is read from the product's whole history, not from the row above it on screen. If it were taken from what you can see, filtering to one month would report each change as a move from the last visible cost rather than the real one - and every figure on the page would be wrong in a way nothing on the page reveals.
Without the noise Odoo leaves in the data
Odoo writes a line the moment a product is created, reading "from None to 0.0". Left alone it puts a cost change on every product you own, dated the day it was created. Those are hidden by default, and so are valuation entries from stock moves, which are a different thing and would make the percentages meaningless.
A starting cost is not a rise from nothing
The earliest cost on record is shown as a change of zero rather than an infinite increase, so new and migrated products do not sit at the top of every "biggest increases" list.
What it does not do
It does not record anything. If Odoo did not already store a change, this cannot show it. Cost edits made before you upgraded are not there, and neither is anything Odoo chooses not to keep.
It does not cover FIFO products. Odoo skips them on purpose: with FIFO the cost is worked out from the stock layers rather than typed, so there is no "someone changed it" to record. Average-cost and standard-cost products are covered.
It does not show stock valuation entries. Those come from moves, not from somebody changing a price, and Odoo's own stock valuation report covers them. Mixing them in would make the percentages meaningless.
It needs Inventory with valuation. That is the module where Odoo keeps this data. Reading it needs the Inventory Manager right, which is Odoo's setting and not one this changes.
Screenshots

Requirements
- Odoo 19.0, Community or Enterprise.
- Odoo.sh or On-Premise only. Third-party apps cannot be installed on Odoo Online (SaaS) databases — check your hosting before buying.
- Module
mh_cost_price_history, version 19.0.1.0.7, licensed OPL-1.
Related apps
Inventory valuation for any period: opening stock, received, issued and closing value, per product.
Record the plots of land behind every lot of coffee, cocoa, soya, rubber, palm, cattle or wood, and check a shipment has the geolocation data an EU deforestation due diligence statement needs before it leaves
Age your inventory into buckets by how long it has sat unsold, with the capital tied up in each, per warehouse and category