GuideOdoo InventoryMarch 13, 2026

Inter-Warehouse Transfers in Odoo 19:
Replenishment Rules & Transit Locations

INTRODUCTION

Your Warehouses Are Talking, but Nobody Is Listening

Multi-warehouse operations in Odoo look simple on paper. You have a central distribution center, two regional warehouses, and products that need to flow between them. The reality: most Odoo implementations handle inter-warehouse transfers with manual stock transfer requests—someone in Warehouse B notices they're low on SKU-4021, sends a Slack message to the warehouse manager at HQ, and a transfer gets created by hand three hours later.

The business impact compounds daily. Manual transfers create stockouts at branch warehouses while surplus sits idle at the distribution center. Lead times aren't tracked, so replenishment arrives late. Transit stock is invisible—it left Warehouse A but hasn't arrived at Warehouse B, and nobody knows where it is. Finance can't value the inventory accurately because goods-in-transit don't appear on any balance sheet location.

Odoo 19's inventory module has every tool you need to automate this: inter-warehouse routes, replenishment rules with min/max triggers, transit locations for goods-in-motion, configurable lead times, and two-step transfer workflows. This guide walks you through the complete setup—from route configuration to valuation impact—so your warehouses replenish themselves without a single Slack message.

01

Configuring Inter-Warehouse Routes in Odoo 19

Before any automated transfer can happen, Odoo needs to know which warehouse can supply which. This is defined through routes and rules—the backbone of Odoo's logistics engine. A route is a named path that tells the system: "When Warehouse B needs stock, pull it from Warehouse A."

Step 1: Enable Multi-Warehouse and Resupply Routes

Navigate to Inventory → Configuration → Settings and enable Multi-Step Routes under the Warehouse section. Then open each warehouse record and configure its resupply source:

Settings — Warehouse B Configuration
# Inventory > Configuration > Warehouses > Warehouse B
#
# Under the "Resupply" tab:
#   Resupply From: [x] Warehouse A (Main Distribution Center)
#
# This auto-generates a route named:
#   "Warehouse A > Warehouse B: Supply Product"
#
# The route contains a pull rule:
#   Source Location: WH-A/Stock
#   Destination:    WH-B/Stock
#   Operation Type: Internal Transfer

Step 2: Verify the Auto-Generated Route and Rules

Once you check the resupply box, Odoo creates the route and its pull rules automatically. Verify them under Inventory → Configuration → Routes:

FieldValueWhy It Matters
Route NameWarehouse A → Warehouse BApplied to products or product categories that flow between these warehouses
Supply Rule ActionPull FromDemand at WH-B triggers a transfer from WH-A (demand-driven, not push)
Source LocationWH-A/StockThe physical location where goods are picked
Destination LocationWH-B/Stock or Inter-Warehouse TransitDirect delivery vs. transit staging (covered in section 03)
Operation TypeInternal TransferNo purchase order or sales order created—purely internal logistics

Step 3: Apply the Route to Products or Categories

Python — Assign route via code (batch update)
# Programmatically assign the resupply route
# to all products in a category
route = self.env['stock.route'].search([
    ('name', 'ilike', 'Warehouse A'),
    ('name', 'ilike', 'Warehouse B'),
], limit=1)

products = self.env['product.product'].search([
    ('categ_id.name', '=', 'Finished Goods'),
])

for product in products:
    product.route_ids = [(4, route.id)]
    # (4, id) = add to many2many without removing existing routes
Route Scope Tip

Apply resupply routes at the product category level, not individual products. When you add a new SKU to the "Finished Goods" category, it automatically inherits the inter-warehouse route. Per-product routes are only useful for exceptions—items that follow a different supply path than their category.

02

Replenishment Rules: Min/Max Triggers That Automate Inter-Warehouse Transfers

Routes define how stock flows. Replenishment rules define when. Without replenishment rules, the inter-warehouse route only triggers when a sales order or manufacturing order creates explicit demand at the destination warehouse. For proactive stock positioning, you need reordering rules with min/max thresholds.

Creating Reordering Rules for Inter-Warehouse Replenishment

Navigate to Inventory → Operations → Replenishment and create rules for each product-warehouse combination:

ParameterExample ValueExplanation
ProductSKU-4021 (Widget Pro)The product being replenished
WarehouseWarehouse BThe destination warehouse that triggers the replenishment
LocationWH-B/StockSpecific location within the warehouse to monitor
RouteWarehouse A → Warehouse BThe inter-warehouse supply route (not "Buy" or "Manufacture")
Min Quantity50When on-hand drops below 50, trigger replenishment
Max Quantity200Order enough to bring on-hand up to 200 units
Quantity Multiple25Round up transfer quantity to nearest 25 (pallet layer optimization)

How the Scheduler Evaluates Replenishment

Odoo's replenishment scheduler (stock.procurement.group) runs as a cron job, by default once per day. When it evaluates Warehouse B's stock for SKU-4021:

Logic — Replenishment calculation
# Simplified replenishment logic:
#
# on_hand  = current stock at WH-B/Stock
# incoming = confirmed transfers already en route to WH-B
# outgoing = confirmed demand (SO, MO) leaving WH-B
#
# forecast = on_hand + incoming - outgoing
#
# if forecast <= min_qty:
#     needed = max_qty - forecast
#     needed = ceil(needed / qty_multiple) * qty_multiple
#     create_transfer(WH-A -> WH-B, quantity=needed)
#
# Example:
#   on_hand  = 35
#   incoming = 0
#   outgoing = 10
#   forecast = 25   (below min of 50)
#   needed   = 200 - 25 = 175
#   rounded  = 175 (already multiple of 25)
#   Result:  Transfer of 175 units from WH-A to WH-B

Manual vs. Automatic Replenishment Triggers

You have two options for when replenishment runs:

  • Automatic (cron-based) — The scheduler runs daily (configurable) and evaluates all reordering rules. Best for steady-demand products where overnight replenishment is acceptable.
  • Manual trigger — Click "Order Once" on the replenishment view to run the rule immediately. Useful for urgent restocking or seasonal spikes where you can't wait for the cron cycle.
  • MTO (Make-to-Order) — Skip min/max entirely. Every confirmed sales order at WH-B immediately triggers a pull from WH-A. Best for high-value or slow-moving items where you don't want buffer stock.
Scheduler Frequency Matters

The default daily cron schedule means stockouts can persist for up to 24 hours before a replenishment transfer is created. For fast-moving inventory, change the scheduler to run every 4 hours via Settings → Technical → Scheduled Actions → "Procurement: Run Scheduler". For real-time replenishment on critical SKUs, use MTO routes instead of min/max rules.

03

Transit Locations and Lead Time Planning for Inter-Warehouse Moves

When stock moves between warehouses, it doesn't teleport. There's a physical transit period—hours, days, sometimes weeks for international transfers. Without a transit location, Odoo deducts stock from Warehouse A and immediately adds it to Warehouse B. Your inventory reports show stock at the destination before it physically arrives, your warehouse team tries to pick products that aren't on the shelf yet, and sales orders get committed against phantom inventory.

How Transit Locations Work

Odoo uses a special location type called "Transit Location" (type: transit) to represent goods in motion. When configured, an inter-warehouse transfer becomes a two-move sequence:

MoveFromToTriggered By
Move 1 (Dispatch)WH-A/StockInter-Warehouse TransitSource warehouse confirms shipment
Move 2 (Receipt)Inter-Warehouse TransitWH-B/StockDestination warehouse confirms receipt

During transit, the stock is visible under the transit location. It's not counted in WH-A's on-hand (already dispatched) and not yet counted in WH-B's on-hand (not received). This gives you accurate real-time inventory per warehouse and a clear view of goods in motion.

Configuring Lead Times on Inter-Warehouse Routes

Configuration — Route rule lead times
# Inventory > Configuration > Routes
# Open: "Warehouse A > Warehouse B: Supply Product"
# Edit the rule(s):
#
# Rule: Pull From WH-A/Stock to WH-B/Stock
#   Delay (days):          2     # Transit time between warehouses
#   Partner Address:       WH-B  # Destination partner for shipping docs
#
# The delay is factored into the replenishment scheduler:
#   If WH-B needs stock by March 20,
#   the transfer is created on March 18 (2-day lead time).
#
# For the reordering rule, also set:
#   Lead Time (Days): 2
#   Security Lead Time: 1  (buffer for delays)
#
# Total planning horizon = Lead Time + Security Lead Time = 3 days

The lead time configuration ensures the scheduler creates transfers early enough for stock to arrive before the min threshold is breached. Without lead times, the scheduler creates the transfer on the day stock hits the minimum—by the time it arrives, you've already had a stockout.

Inventory Valuation During Transit

Transit locations have a direct impact on your accounting. When you use automated (perpetual) inventory valuation, Odoo generates journal entries for each stock move:

  • Move 1 (WH-A → Transit): Debit "Goods in Transit" account, Credit WH-A's "Stock Valuation" account.
  • Move 2 (Transit → WH-B): Debit WH-B's "Stock Valuation" account, Credit "Goods in Transit" account.
  • The "Goods in Transit" balance at any point shows the total value of inventory in motion—visible on your balance sheet, auditable, and reconcilable.
Valuation Account Setup

Each transit location needs a dedicated stock valuation account in your chart of accounts (e.g., account 1430 "Inventory in Transit"). If you skip this, Odoo posts transit moves to the default stock valuation account, making it impossible to distinguish between stock on shelves and stock on trucks. Your auditors will ask about this.

04

Two-Step vs. One-Step Inter-Warehouse Transfers: When to Use Each

Odoo supports two approaches for inter-warehouse transfers, and choosing the wrong one creates operational friction that compounds with every shipment.

One-Step Transfer (Direct)

A single stock move from WH-A/Stock directly to WH-B/Stock. No transit location, no intermediate confirmation. The transfer is marked done once the source warehouse ships.

  • Best for: Same-building transfers, same-city warehouses with same-day delivery, low-value goods where transit tracking isn't worth the overhead.
  • Risk: Stock appears at the destination immediately on paper, even if it takes hours or days to physically arrive. Creates phantom inventory at the destination.

Two-Step Transfer (Via Transit)

Two stock moves with a transit location in between. The source warehouse confirms dispatch (Move 1), and the destination warehouse confirms receipt (Move 2). Stock sits in the transit location between confirmations.

  • Best for: Multi-city or international transfers, high-value goods, operations where receiving inspection is required, any scenario where transit time exceeds a few hours.
  • Advantage: Accurate per-warehouse inventory, transit visibility, proper valuation journal entries, and receiving confirmation workflow.

Configuration Comparison

Configuration — One-Step vs Two-Step setup
# ── ONE-STEP (Direct Transfer) ──────────────────
# Inventory > Configuration > Warehouses > Warehouse B
# Resupply From: Warehouse A
#
# Route rule generated:
#   Source:      WH-A/Stock
#   Destination: WH-B/Stock  (direct, no transit)
#   Operation:   Internal Transfer
#   Moves:       1

# ── TWO-STEP (Via Transit) ──────────────────────
# Same resupply configuration, but additionally:
# 1. Check "Use Transit Location" on the warehouse
#    or company settings
# 2. The auto-generated route now creates TWO rules:
#
#   Rule 1 (Dispatch):
#     Source:      WH-A/Stock
#     Destination: Inter-Company Transit
#     Operation:   Delivery Orders (WH-A)
#
#   Rule 2 (Receipt):
#     Source:      Inter-Company Transit
#     Destination: WH-B/Stock
#     Operation:   Receipts (WH-B)
#     Moves:       2 (independent confirmation)
Decision Framework

Use this rule of thumb: if the truck takes longer than your order fulfillment SLA, use two-step. A 4-hour same-city transfer with a 24-hour fulfillment SLA? One-step is fine. A 2-day cross-country transfer with next-day fulfillment? Two-step is mandatory, or you'll promise customers stock that's still on a truck.

05

3 Inter-Warehouse Transfer Mistakes That Create Inventory Nightmares

1

Replenishment Route Set to "Buy" Instead of the Inter-Warehouse Route

The warehouse manager creates reordering rules for Warehouse B, but the Preferred Route field defaults to "Buy" instead of the inter-warehouse supply route. The scheduler runs, and instead of pulling stock from Warehouse A, it creates a purchase order to your external supplier. You now have duplicate procurement: new stock arriving from the vendor while existing stock sits idle at your distribution center. Nobody notices until the month-end stock valuation shows double the expected inventory at WH-B.

Our Fix

Always explicitly set the Route field on every reordering rule. Never rely on the default. For inter-warehouse products, the route must be "Warehouse A → Warehouse B" (or your equivalent). Create a saved filter in the replenishment view to flag rules where Route is empty or set to "Buy" for products that have inter-warehouse routes assigned.

2

No Transit Location Configured on Cross-City Warehouse Transfers

You set up a resupply route from your Chicago warehouse to your Miami warehouse using one-step direct transfer. The transfer is confirmed in Chicago, and Odoo immediately shows the stock as available in Miami. Your Miami sales team commits it to a customer order. Two days later, when the truck arrives, the team picks the order—except now they discover there's a shortage because 30% of the shipment was damaged in transit. The inventory discrepancy cascades into backorders, customer complaints, and a manual stock adjustment that your accountant has to reconcile.

Our Fix

Any inter-warehouse transfer with transit time exceeding 4 hours must use a two-step workflow with a transit location. Configure the receiving warehouse to require a receipt confirmation before stock enters the available pool. Add a quality check step on the receipt operation for shipments above a value threshold. This ensures Miami only counts stock it has physically inspected and received.

3

Circular Replenishment Rules Between Warehouses

During setup, someone configures Warehouse A to resupply from Warehouse B and Warehouse B to resupply from Warehouse A. Both warehouses have min/max reordering rules for the same products. When stock at WH-A drops below the minimum, it pulls from WH-B. This drops WH-B's stock below its minimum, so it pulls from WH-A. The scheduler enters an infinite loop, creating hundreds of back-and-forth transfer orders until someone notices the operation queue is clogged.

Our Fix

Design your resupply topology as a directed acyclic graph (DAG)—a tree structure where stock flows in one direction. Typically: Central DC → Regional Warehouses → Local Hubs. If bidirectional transfers are genuinely needed (rare), use manual transfers only for the reverse direction and never set reordering rules on both sides for the same product.

BUSINESS ROI

What Automated Inter-Warehouse Replenishment Saves Your Business

Automating inter-warehouse transfers isn't a warehouse efficiency project. It's a revenue protection strategy:

40-60%Fewer Branch Stockouts

Min/max reordering rules catch low stock before it hits zero. Lead time planning ensures transfers arrive before the threshold is breached, not after.

15-20 hrs/weekSaved on Manual Coordination

No more Slack messages, spreadsheet checks, or manual transfer creation. The scheduler handles demand detection, quantity calculation, and transfer creation automatically.

100%Transit Inventory Visibility

Transit locations give finance a real-time "Goods in Transit" balance. Warehouse managers see exactly what's on the truck. No more phantom inventory or missing stock.

For a company with 3 warehouses and 500 active SKUs, branch stockouts typically cost 3-5% of monthly revenue in lost sales and emergency freight. A properly configured replenishment system eliminates the manual bottleneck and recovers that revenue. The setup takes 2-4 days. The payback period is usually under 30 days.

SEO NOTES

Optimization Metadata

Meta Desc

Complete guide to inter-warehouse transfers in Odoo 19. Configure resupply routes, min/max replenishment rules, transit locations, lead times, and two-step transfer workflows.

H2 Keywords

1. "Configuring Inter-Warehouse Routes in Odoo 19"
2. "Replenishment Rules: Min/Max Triggers That Automate Inter-Warehouse Transfers"
3. "Transit Locations and Lead Time Planning for Inter-Warehouse Moves"
4. "Two-Step vs. One-Step Inter-Warehouse Transfers: When to Use Each"
5. "3 Inter-Warehouse Transfer Mistakes That Create Inventory Nightmares"

Your Warehouses Should Replenish Themselves

Manual inter-warehouse transfers are a symptom of a system that isn't configured to handle multi-location logistics. Every Slack message asking "can you send us more of SKU-4021?" is a signal that your replenishment rules are missing, your routes aren't set up, or your transit locations aren't configured. The tools exist in Odoo 19—they just need to be wired together correctly.

If your warehouse team is still creating inter-warehouse transfers by hand, let's automate it. We configure resupply routes, replenishment rules, transit locations, and lead time planning so your inventory flows where it's needed—before anyone has to ask. The implementation takes 2-4 days and eliminates the coordination overhead permanently.

Book a Free Inventory Audit