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.50Understanding 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 managerFix 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 matchingFix 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 processFix 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.