Skip to content

Odoo Vendor Bill Matching Error — Purchase Order to Bill Discrepancies Fix

DeployMonkey Team · March 24, 2026 9 min read

Vendor Bill Matching Errors in Odoo

When validating vendor bills against purchase orders, you may encounter:

Warning: The bill amount ($5,200) differs from the purchase order amount ($5,000).

UserError: You cannot validate this bill. The quantities do not match the receipt.

Warning: This bill has discrepancies with the linked purchase order:
  - Product A: ordered 100, billed 105
  - Product B: ordered price $10.00, billed $10.50

Understanding 3-Way Matching

Odoo supports 3-way matching: Purchase Order → Receipt → Vendor Bill. All three must agree on quantities and prices. When they do not match, Odoo blocks or warns.

Fix 1: Quantity Mismatches

# Scenario: PO says 100 units, receipt shows 95, bill says 100

# Option 1: Bill only received quantity
# Edit the vendor bill line quantity to match the receipt (95)
# The remaining 5 units will be billed when received

# Option 2: Force match (if vendor shipped all but short receipt)
# Create a new receipt for the missing 5 units
# Then validate the bill for full 100

# Option 3: Accept the difference
# If your matching policy allows, create the bill for 100
# The difference will be flagged but can be approved by a manager

Fix 2: Price Discrepancies

# Scenario: PO price $10.00, vendor bills $10.50

# Option 1: Accept vendor price
# Edit the bill line to match vendor's price ($10.50)
# The difference is posted to a price difference account
# Configure: Accounting > Configuration > Settings > Price Difference Account

# Option 2: Negotiate with vendor
# Create a credit note for the difference
# Or modify the PO to match before validating

# Configure price difference account:
# Product Category > Accounting tab > Price Difference Account
# Set to an expense account like "Price Variance"

Fix 3: Bill Not Linked to Purchase Order

# If a vendor bill was created manually (not from PO):

# Link it to the PO:
# 1. Open the draft vendor bill
# 2. Click "Add a line" or use the Purchase Order field
# 3. Select the purchase order to link
# 4. Odoo will populate lines from the PO

# Or create the bill from the PO directly:
# Purchase > Orders > select PO > "Create Bill" button
# This ensures automatic matching

Fix 4: Control Policy Settings

# Odoo offers two billing control policies:

# 1. "Ordered quantities" — bill based on PO quantities
# Purchase > Configuration > Settings > Bill Control > Ordered quantities
# Bills can be created for the full PO quantity immediately

# 2. "Received quantities" — bill only what was received
# Purchase > Configuration > Settings > Bill Control > Received quantities
# Bills are limited to received quantities

# If you're getting matching errors, check which policy is active
# and ensure it matches your business process

Fix 5: Duplicate Vendor Bills

# Odoo warns if a bill with the same vendor reference exists
# Warning: A bill with reference 'INV-2026-001' already exists

# Check for duplicates:
sudo -u postgres psql -d mydb -c "
  SELECT id, name, ref, partner_id, amount_total, state
  FROM account_move
  WHERE move_type = 'in_invoice'
  AND ref = 'INV-2026-001'
  AND partner_id = VENDOR_ID;
"

# If duplicate: delete the draft or use a different reference
# If not duplicate: the vendor used the same invoice number (different bill)

Fix 6: Multi-Step Reception Matching

# With multi-step reception (input -> quality -> stock):
# The bill matches against the FINAL receipt, not intermediate steps

# Check receipt status:
# Inventory > Operations > Receipts
# Ensure the receipt is in "Done" state
# Partially received orders = partial bill allowed

# Verify received quantities:
sudo -u postgres psql -d mydb -c "
  SELECT pol.product_id, pt.name,
    pol.product_qty as ordered,
    pol.qty_received as received,
    pol.qty_invoiced as invoiced
  FROM purchase_order_line pol
  JOIN product_template pt ON pol.product_id = pt.id
  WHERE pol.order_id = PO_ID;
"

Prevention

DeployMonkey's AI agent configures purchase matching policies during setup and monitors vendor bill discrepancies. Automatic price variance detection and quantity reconciliation reduce manual matching effort.