Skip to content

Fix Odoo Delivery Order Stuck: Cannot Validate, Waiting Availability, and Transfer Errors

DeployMonkey Team · March 23, 2026 10 min read

The Stuck Delivery Problem

Delivery orders (outgoing transfers) in Odoo get stuck for many reasons — insufficient stock, reservation failures, multi-step routing confusion, or data inconsistencies. When deliveries cannot be validated, shipments are delayed and customers are impacted.

Common Stuck States

  • Draft: Transfer created but not confirmed
  • Waiting Another Operation: Depends on a previous step (pick, pack)
  • Waiting Availability: Not enough stock reserved
  • Ready: Stock reserved but cannot validate

Stuck in "Waiting Availability"

Cause 1: Insufficient Stock

# The product is out of stock or already reserved for another order

# Check available stock:
# Inventory → Products → select product → On Hand / Forecasted buttons

# Fix Option 1: Receive stock first
# Process incoming receipts to get products into inventory

# Fix Option 2: Check reservations
# Inventory → Products → select product → Forecasted button
# Shows all reserved quantities and expected receipts

# Fix Option 3: Unreserve from another order
# Find the blocking order:
SELECT sm.reference, sm.product_qty, sm.state
FROM stock_move sm
JOIN product_product pp ON sm.product_id = pp.id
WHERE pp.id = PRODUCT_ID AND sm.state = 'assigned'
ORDER BY sm.create_date;

# Unreserve if the other order has lower priority:
# Open the other transfer → Click "Unreserve"

Cause 2: Wrong Location

# Stock exists but in a different warehouse or location

# Fix: Check stock per location:
# Inventory → Reporting → Inventory Report
# Filter by product → see which locations have stock

# Common issue: stock is in "Input" location after receipt
# but delivery expects it in "Stock" location
# Process the internal transfer from Input to Stock first

Cause 3: Product Tracking (Lot/Serial)

# Product requires lot/serial numbers but none are assigned

# Error: "You need to supply a Lot/Serial Number for product X"

# Fix:
# 1. Open the delivery order
# 2. Click on the product line → Detailed Operations
# 3. Assign lot/serial numbers to each unit
# 4. Or: create the lot first:
#    Inventory → Products → Lots/Serial Numbers → Create

Stuck in "Waiting Another Operation"

# Multi-step delivery: Pick → Pack → Ship
# The current step waits for the previous step to complete

# Fix:
# 1. Check warehouse routing:
#    Inventory → Configuration → Warehouses → Delivery Steps
#    1 step (Ship only) / 2 steps (Pick + Ship) / 3 steps (Pick + Pack + Ship)

# 2. Find the preceding operation:
#    Open the stuck delivery → "Source Document" field
#    Or: Inventory → Operations → Transfers → search by source document

# 3. Process the preceding operation first
#    Pick order → Check Availability → Validate
#    Then the delivery becomes "Ready"

# Shortcut: Switch to 1-step delivery
# Inventory → Configuration → Warehouses → Delivery: 1 step
# WARNING: This doesn't fix existing stuck orders

Stuck in "Ready" But Cannot Validate

Cause 4: Quantities Not Set

# Reserved quantity shown but "Done" column is zero

# Fix:
# In the delivery order, for each line:
# 1. Set the "Done" (Quantity) column to the shipped quantity
# 2. Or click the "Set quantities" button (if available)
# 3. Then click "Validate"

# If shipping partial quantities:
# Set Done to the actual shipped amount → Validate
# Odoo will ask to create a backorder for the remainder

Cause 5: Required Fields Missing

# Custom fields or carrier integration requires additional data

# Common missing fields:
# - Shipping weight
# - Carrier tracking number
# - Delivery date
# - Shipping label

# Fix: Fill in all required fields before validating
# Check the error message for which field is missing

Cannot Cancel Delivery Order

# Error: "You cannot cancel a stock move that has been set to 'Done'"

# Once a transfer is validated (Done), it cannot be canceled directly

# Fix: Create a return/reverse transfer
# 1. Open the Done delivery order
# 2. Click "Return" button
# 3. Select quantities to return
# 4. Validate the return → creates a reverse stock move

# For unreserving (before validation):
# Open the delivery → Click "Unreserve" → sets back to Waiting

Inventory Discrepancy After Stuck Orders

# Stock quantities don't match after fixing stuck orders

# Fix: Reconcile inventory
# 1. Run inventory adjustment:
#    Inventory → Operations → Physical Inventory → Start
#    Count actual quantities and apply

# 2. Check for stuck stock moves:
SELECT reference, product_qty, state, create_date
FROM stock_move
WHERE state IN ('confirmed', 'assigned', 'waiting')
    AND create_date < NOW() - INTERVAL '30 days'
ORDER BY create_date;

# 3. Cancel old stuck moves (careful!):
# These are moves that will never be processed
# Odoo shell:
moves = env['stock.move'].search([
    ('state', 'in', ['confirmed', 'assigned', 'waiting']),
    ('create_date', '<', '2026-01-01'),
])
for m in moves:
    print(f'{m.reference}: {m.product_id.name} qty={m.product_qty}')
# moves._action_cancel()  # Cancel them

Force-Fixing Stuck Transfers

# LAST RESORT — backup the database first!

# Force a transfer to Done:
picking = env['stock.picking'].browse(PICKING_ID)
for move in picking.move_ids:
    move.quantity = move.product_uom_qty  # Set done qty
picking.button_validate()
env.cr.commit()

# Force cancel a transfer:
picking = env['stock.picking'].browse(PICKING_ID)
picking.action_cancel()
env.cr.commit()

# Reset to Draft:
picking.action_back_to_draft()  # If available in your version
env.cr.commit()