Automated Three-Way Match in Odoo#
Three-way match validates that the vendor invoice matches both the purchase order and the goods receipt before payment is authorized. Odoo enforces this automatically - flagging discrepancies and requiring resolution before an invoice can be posted.
The Three Documents#
- Purchase Order (PO): what was authorized to buy (product, quantity, price)
- Goods Receipt: what was actually delivered (quantity received)
- Vendor Invoice (Bill): what the vendor claims is owed (price, quantity)
Match criteria: Invoice quantity ≤ Receipt quantity AND Invoice price = PO price (within tolerance)
How Odoo Enforces Three-Way Match#
When creating a vendor bill from a PO:
Purchase → [PO] → Create Bill:
- Odoo pre-fills bill lines from the PO
- Quantity: from the receipt (what was actually received - not what was ordered)
- Price: from the PO
If the vendor's invoice shows a different price or quantity:
- AP clerk compares vendor's PDF invoice to the Odoo pre-filled bill
- Discrepancy found → flag for resolution
Price Tolerance Configuration#
Purchase → Configuration → Settings → Purchase Price Difference:
- Tolerance: 2% (allow minor price variations without blocking)
- Above 2% difference: warning displayed, approval required before posting
Quantity Discrepancy Handling#
Scenario: PO for 100 units. Receipt for 80 units. Vendor bills for 100 units.
Odoo allows the bill to be created for max 80 units (received quantity). The remaining 20 units:
- Option 1: Create a backorder receipt (expecting remaining 20 units)
- Option 2: Post a partial bill for 80 units; wait for the remaining 20 to arrive before the next bill
Automated Bill-from-PO Creation#
For high-volume procurement, automate bill creation:
Purchase → Configuration → Settings → Bill Control: on receipts
With this setting: when a receipt is validated, Odoo automatically creates a draft vendor bill for the received quantity at the PO price - AP team only validates (no data entry).
AP clerk workflow:
- Open the auto-created draft bill
- Compare to vendor's PDF invoice (price and quantity)
- If match: post the bill → payment scheduled
- If discrepancy: contact vendor or hold pending resolution
Audit Trail#
Purchase → [PO] → Bills button: all bills linked to this PO
- Which receipts are billed
- Billing status per PO line (billed, partially billed, not yet billed)
- Price and quantity variances logged in the chatter

