How Odoo Models Inventory#
Odoo Inventory is built on a double-entry stock ledger - every stock move has a source location and a destination location. Nothing disappears; it moves from one location to another. This means:
- Selling a product moves it from the warehouse output location to the customer location
- Receiving a purchase moves it from the vendor location to the input/stock location
- Internal transfers move between locations within the warehouse
- Scrap moves product to a dedicated scrap location (not deleted)
Understanding locations and moves is the foundation for understanding everything else in Odoo Inventory.
Warehouse Structure#
A warehouse in Odoo is a logical container with a set of standard locations:
| Location type | Default name | Purpose |
|---|---|---|
| Stock | WH/Stock | Main storage area |
| Input | WH/Input | Goods receipt before quality check |
| Quality Control | WH/Quality Control | Optional intermediate step |
| Output | WH/Output | Staging before shipment |
| Packing Zone | WH/Packing Zone | Optional packing step |
The reception and delivery flows (1-step, 2-step, 3-step) control which of these locations are used. Change the flow in the warehouse settings:
- 1-step receipt: Vendor → Stock (direct)
- 2-step receipt: Vendor → Input → Stock (requires an internal transfer after receipt)
- 3-step receipt: Vendor → Input → Quality Control → Stock
Use 2-step or 3-step when you need a quality inspection, putaway confirmation, or approval step before stock is available.
Routes#
A route is a named set of rules that tells Odoo how to generate stock moves for a product. Routes are assigned at the product level, the product category level, or the warehouse level.
Built-in routes:
- Buy: when demand is triggered, create a request for quotation (RFQ) from the vendor
- Manufacture: when demand is triggered, create a manufacturing order
- Resupply Warehouse X from Y: for multi-warehouse setups, creates an inter-warehouse transfer
Pull Rules#
A pull rule says: "when stock is needed at location B, create a move from location A to B." Demand triggers the rule (e.g., a sale order or a reorder rule).
Push Rules#
A push rule says: "when stock arrives at location A, automatically create a transfer to location B." This is how 2-step receipt works - arrival at Input triggers a push rule creating a transfer to Stock.
Reordering Rules#
Reordering rules automate procurement when stock falls below a minimum quantity.
Go to Inventory → Configuration → Reordering Rules and create a rule:
- Product: the product to replenish
- Location: the stock location to replenish
- Route: how to replenish (Buy or Manufacture)
- Minimum Quantity: trigger replenishment when on-hand + incoming drops below this
- Maximum Quantity: target quantity after replenishment
- Quantity Multiple: round up to this multiple when ordering
The MRP scheduler (run manually or via the daily cron) checks all reordering rules and creates RFQs or manufacturing orders as needed. Run it from Inventory → Operations → Run Scheduler.
Lot and Serial Number Tracking#
Enable lot/serial tracking per product in the product form under Inventory → Tracking:
- No Tracking: no lot/serial required
- By Lot: one lot number covers multiple units (useful for batches)
- By Unique Serial Number: one serial per unit (for high-value or warranty-tracked items)
Once tracking is enabled, every stock move for that product requires a lot or serial number. Receipts, deliveries, and manufacturing orders all enforce this.
Putaway Rules#
Putaway rules assign incoming products to specific sub-locations automatically. Instead of all products going to WH/Stock, putaway routes products to specific aisles, shelves, or refrigerated zones.
Configure under Inventory → Configuration → Putaway Rules:
- Location: the parent location (e.g., WH/Stock)
- Product / Category: match incoming products
- Store to: the specific sub-location to assign
Common Configuration Mistakes#
1. Running the scheduler without reordering rules#
The scheduler only creates procurement orders if reordering rules exist. If no rules are configured, the scheduler run is silent with no output. Check that rules are set up for each product that should auto-replenish.
2. Wrong route on a product#
If a product's route is set to "Buy" but no vendor pricelist exists, the procurement order is created as an RFQ with no vendor and no price. Always configure at least one vendor on the product's Purchase tab before enabling the Buy route.
3. Negative stock from immediate transfers#
If backorder is disabled on a delivery and you confirm it with more quantity than available, Odoo creates a negative stock entry. Enable the Negative Stock setting intentionally only if your workflow requires it; otherwise Odoo will refuse to confirm deliveries with insufficient stock.
4. Multi-step flow with no pull rule for internal transfer#
After switching a warehouse from 1-step to 2-step receipt, Odoo should create the necessary pull rules automatically. If you see no internal transfer triggered after a receipt, check that the pull rules exist in Inventory → Configuration → Routes → (your warehouse's receipt route).
5. Product category route overrides product route#
If a product has no route set and its product category has a route, the category route is used. If both are set, the product-level route takes precedence. Check both levels when troubleshooting unexpected procurement behavior.
ERPeek can inspect route configuration, reordering rules, and operation types across your Odoo instance, including custom warehouse setups. See the contact page for details.

