Skip to content

Fix Odoo Purchase Order Stuck: Cannot Confirm, Cancel, or Receive

DeployMonkey Team · March 23, 2026 10 min read

The Stuck Purchase Order Problem

Purchase orders in Odoo follow a strict workflow: Draft → Sent → Purchase Order (confirmed) → Done. When a PO gets stuck at any stage — the Confirm button is grayed out, Cancel does nothing, or receipts cannot be validated — procurement grinds to a halt.

Stuck in Draft: Cannot Confirm

Cause 1: Missing Required Fields

# Error when clicking Confirm Order:
# "The following fields are invalid: ..."
# Or the Confirm button is simply grayed out

# Fix: Check these required fields:
# - Vendor (partner_id) — must be set
# - Order Lines — at least one line required
# - Each line needs: Product, Quantity, Unit Price
# - Fiscal Position — may be required by localization

# Check in developer mode (debug=1):
# Hover over grayed-out button to see conditions

Cause 2: Approval Workflow Blocking

If purchase approval is enabled, orders above a threshold require manager approval.

# Check approval settings:
# Purchase → Configuration → Settings
# "Purchase Order Approval" section
# Minimum Amount: orders above this need approval

# Fix:
# Option 1: Get the approver to approve the PO
# Purchase → Orders → To Approve → Select PO → Approve

# Option 2: Increase or disable the approval threshold
# Settings → Purchase → Purchase Order Approval → uncheck

# Option 3: Check user has approval rights
# The user needs 'Purchase / Manager' group to approve

Cause 3: Budget Exceeded

If the budgeting module is installed, exceeding the budget blocks purchase confirmation.

# Error: "Budget exceeded for ..."
# Fix: Increase the budget or get budget manager approval
# Accounting → Configuration → Budgets → edit the relevant budget

Stuck in Confirmed State: Cannot Receive

Cause 4: No Receipt Created

# After confirming a PO, Odoo auto-creates a receipt (stock.picking)
# If no receipt appears:

# Fix 1: Check if product is storable
# Services and consumables (in some configs) don't create receipts
# Product → Product Type must be "Storable Product"

# Fix 2: Check warehouse/picking type
# Inventory → Configuration → Warehouses
# Verify "Receipt" operation type exists and is active

# Fix 3: Force receipt creation
# In Odoo shell:
po = env['purchase.order'].browse(PO_ID)
po.sudo()._create_picking()

Cause 5: Receipt Stuck in Waiting

# Receipt shows "Waiting Another Operation" or "Waiting Availability"

# Cause: Multi-step receipt configured (e.g., Input → Quality → Stock)
# The current step is waiting for a previous step to complete

# Fix: Process the earlier step first
# Inventory → Operations → check for pending operations
# Or switch to 1-step receipt:
# Inventory → Configuration → Warehouses → Incoming Shipments: 1 step

Cannot Cancel Purchase Order

Cause 6: PO Already Has Receipts or Bills

# Error: "Unable to cancel purchase order: some receptions have already been processed"

# Fix: Cancel related documents first:
# 1. Cancel or return related receipts
#    Inventory → find receipt → Return → Validate return
# 2. Cancel or delete related vendor bills
#    Accounting → Vendor Bills → find bill → Cancel
# 3. Then cancel the PO

# Nuclear option (admin only, use carefully):
# Odoo shell:
po = env['purchase.order'].browse(PO_ID)
po.sudo().button_cancel()

Cause 7: PO is Locked

# The PO shows a lock icon and "Locked" status
# This happens after the PO is fully received and billed

# Fix: Unlock the PO first
# Click "Unlock" button on the PO form
# Then you can modify or cancel it

# If Unlock button is not visible:
# User needs 'Purchase / Manager' group

Cannot Receive Partial Quantities

Cause 8: Demand vs Done Mismatch

# You want to receive 5 out of 10 ordered items

# Fix: In the receipt (stock.picking):
# 1. Open the receipt
# 2. In the "Done" column, enter the quantity actually received (5)
# 3. Click Validate
# 4. Odoo asks: "Create backorder for remaining 5?"
# 5. Click "Create Backorder" → a new receipt is created for the remaining 5

# If the Done column is not editable:
# Check Settings → Inventory → Operations
# Ensure "Detailed Operations" or manual reservation is enabled

PO Quantities Do Not Match Invoice

Cause 9: Billing Policy Mismatch

# Invoice shows different quantities than PO

# Check billing policy:
# Purchase → Configuration → Settings
# Bill Control: "Ordered quantities" vs "Received quantities"

# "Ordered quantities" — bills for what was ordered
# "Received quantities" — bills only for what was actually received

# Per-product override:
# Product → Purchase tab → Control Policy

Diagnosing Stuck POs

# 1. Check PO state:
psql -d mydb -c "SELECT id, name, state FROM purchase_order WHERE name = 'PO00123';"
# States: draft, sent, purchase, done, cancel

# 2. Check related pickings:
psql -d mydb -c "
    SELECT sp.name, sp.state FROM stock_picking sp
    JOIN purchase_order po ON sp.origin = po.name
    WHERE po.name = 'PO00123';
"

# 3. Check related invoices:
psql -d mydb -c "
    SELECT am.name, am.state FROM account_move am
    JOIN purchase_order_line pol ON pol.order_id = (
        SELECT id FROM purchase_order WHERE name = 'PO00123'
    )
    JOIN account_move_line aml ON aml.purchase_line_id = pol.id
    JOIN account_move am2 ON am2.id = aml.move_id
    LIMIT 5;
"

# 4. Force reset (LAST RESORT — backup first):
# Odoo shell:
po = env['purchase.order'].browse(PO_ID)
po.sudo().write({'state': 'draft'})
env.cr.commit()