Odoo Inventory Management: A Practical Guide
The module that punishes bad setup
Inventory is the Odoo module where early decisions matter most.
Get sales pricing wrong and you fix it in an afternoon. Get your unit of measure or your valuation method wrong and you will be living with it, because both become very hard to change once you have transaction history.
So this article spends more time on setup than on daily use. That is deliberate.
Everything is a location
The first idea to understand: in Odoo, stock does not simply exist. It is always in a location, and it only moves between locations.
Your warehouse is a location. So is a shelf inside it. So is your customer. So is your vendor. So is a virtual place called Inventory Adjustment.
Every stock movement is a transfer from one location to another:
- Receiving goods = vendor location → your stock
- Delivering goods = your stock → customer location
- A stock count correction = your stock → inventory adjustment location
This is why Odoo’s stock figures always balance. Nothing is created or destroyed; it only moves. If your numbers look wrong, something moved somewhere you did not expect, and you can trace it.
FIGURE 1: EVERY STOCK CHANGE IS A MOVE BETWEEN LOCATIONS
Vendor
- Receiving
Your Stock
- On hand
Customer
- Delivery
Setting up your locations
Design this before you enter a single product.
Keep it as flat as you can. A structure with six levels looks thorough and becomes a burden. Every extra level is extra work on every transaction.
Model what you actually manage. If your team never picks by shelf, do not create shelf locations. You will just get a lot of “where is this item” questions with no useful answer.
Separate stock that behaves differently. Goods you own and goods you hold for a customer should be in different locations, because they are valued differently and one of them is not yours.
A workable structure for most small warehouses is simply: Stock, Input if you inspect before putting away, and Output if you stage before shipping. That is often enough.
Units of measure
Decide this before you import products, and get it right.
Every product has a unit of measure. Pieces, kilograms, metres, litres, boxes. This is the unit that all your stock, costs and reports are expressed in.
Odoo also supports a purchase unit different from the stock unit — buy in boxes, hold in pieces — with a conversion factor.
The reason this matters so much: changing the base unit of measure on a product that already has stock moves and order lines is blocked by Odoo, and getting around it means clearing transaction history. That is a serious operation on a live system.
Spend the time on this at the start.
FIGURE 2: THE FOUR SETUP DECISIONS THAT ARE EXPENSIVE TO REVERSE
Location structure
- Keep it flat. Model only what your team actually manages.
Units of measure
- Blocked by Odoo once a product has stock moves or order lines.
Costing method
- Standard, average or FIFO. Decide with your accountant.
Valuation posting
- Manual or automatic. Automatic means bad stock data becomes bad accounts instantly.
Valuation
Two decisions here, and both have accounting consequences.
Costing method
Standard price. You set a fixed cost per product. Simple and predictable. Differences from actual purchase price go to a price difference account.
Average cost (AVCO). The cost updates as a weighted average each time you buy. Reflects reality well, and is the most common choice.
FIFO. First in, first out. Each unit keeps the cost it came in at. Most accurate, and needed in some industries and jurisdictions.
Inventory valuation
Manual. Stock moves do not create accounting entries. Your accountant posts inventory adjustments periodically.
Automatic. Every stock move posts an accounting entry immediately. Your balance sheet inventory value always matches your stock on hand.
Automatic is usually the right answer if you are serious about accounting, but it means every stock move has an accounting consequence — so bad stock data becomes bad financial data instantly. There is no buffer.
Talk to your accountant about both choices before deciding. This is not a technical decision.
Daily operations
Receiving
The purchase order creates the receipt. The warehouse validates it with actual quantities.
Count before validating. This is the habit that everything downstream depends on. Validating the ordered quantity without counting turns your entire three-way match control into theatre.
Delivering
The sales order creates the delivery. The team picks and validates.
If you can only send part of it, enter what you are sending. Odoo asks whether to keep a backorder for the rest.
Internal transfers
Moving stock between your own locations. Also used for stock going out to a subcontractor and coming back.
Inventory adjustments
Physical counts. Enter what you actually counted, and Odoo posts the difference.
Two approaches: count everything once a year, or cycle count — count a small group of items every week on rotation. Cycle counting is far better. It finds problems while they are small and does not require shutting the warehouse.
Reordering rules
A rule on a product says: keep at least this much, and when it drops below, order up to this level.
Three things to get right:
Minimum. Must cover demand during the vendor’s lead time, plus a buffer. A minimum that ignores lead time guarantees stockouts.
Maximum. Too high and you have cash sitting on a shelf. Too low and you are ordering constantly.
Review them. Demand changes. Rules do not update themselves. Look at them a few times a year.
Tracking
If you need to know exactly which unit went to which customer, enable tracking per product.
By lot. A batch of items shares a lot number. Standard for food, chemicals and pharmaceuticals, usually with an expiry date.
By serial number. Every single unit has its own number. For equipment, electronics and anything with a warranty.
Only enable this where you need it. Tracking adds a step to every single transaction. On products that do not need it, you are taxing your warehouse team for no benefit.
Reports worth using
Stock on hand. Quantity and value, by location. Your starting point.
Stock moves history. Every movement of an item. This is your audit trail — when a number looks wrong, this report tells you why.
Inventory valuation. The value of your stock, and how it changed. Should agree with your balance sheet.
Forecasted inventory. Current stock plus incoming, minus committed outgoing. What you will actually have available.
What usually goes wrong
Wrong unit of measure at setup. The most expensive mistake in the module, because fixing it means clearing history.
Locations too detailed. A structure nobody maintains, producing stock figures that are technically precise and practically useless.
Validating without counting. Everything depends on this and it is a human habit, not a setting.
Negative stock. Odoo can allow it, and sometimes it is legitimate. Persistent negative stock is a sign that goods are physically moving before anyone records it.
Tracking enabled everywhere. Slows every transaction and produces resentment. Enable it only where it earns its place.
Getting started
- Design locations — keep them flat
- Fix units of measure before importing products
- Choose costing method and valuation with your accountant
- Import products and opening stock
- Add reordering rules for fast movers only
- Enable tracking only where genuinely required
Then test in a test database: receive short, deliver partially, transfer internally, and run an adjustment. Check the accounting entries after each one. If those four work correctly, your setup is sound.
Setting up inventory in Odoo?
Get in touch. Units of measure and valuation are the two decisions worth getting right first, and they are where we start.