All posts
Integrator9 min read

Odoo Inventory configuration: warehouses, routes, reordering rules, and push/pull flows

Odoo Inventory uses a route-based model where stock moves are generated by pull and push rules attached to product routes. This guide covers warehouse structure, how routes connect operations, setting up reordering rules for automatic replenishment, and the configuration decisions that most affect real-world performance.

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 typeDefault namePurpose
StockWH/StockMain storage area
InputWH/InputGoods receipt before quality check
Quality ControlWH/Quality ControlOptional intermediate step
OutputWH/OutputStaging before shipment
Packing ZoneWH/Packing ZoneOptional 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 InventoryTracking:

  • 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.

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free