Ask a finance team how it knows a vendor bill is right and the usual answer is that purchasing confirmed it. That is a two-way check at best: the bill agrees with what someone remembers ordering. The three-way match adds the piece that matters most, evidence that the goods or services actually arrived, and it does so before the payment rather than after.
What is a three-way match?
Three documents are compared line by line before a bill is approved for payment:
- The purchase order: what the company authorised, at what price, from which vendor.
- The goods receipt: what the warehouse or the requester confirms was physically received, and in what quantity.
- The vendor bill: what the supplier is asking to be paid for.
If the bill agrees with the order on price and with the receipt on quantity, it can proceed. If it does not, the difference is held and investigated. A two-way match, order against bill, is common for services where there is no physical receipt; even then, a confirmation from the requester that the service was delivered plays the part of the receipt.
What tolerances are reasonable?
Exact agreement on every line is rarely practical: rounding, freight, small currency differences and agreed price adjustments all create noise. A tolerance is the difference the company accepts without investigation. There is no standard figure. It should reflect the value of typical purchases and the company’s materiality, and it should be:
- Written in the purchasing policy, separately for quantity and for price.
- Small enough that repeated differences cannot add up to something material over a year.
- Approved by finance, not set by the purchasing team whose bills it applies to.
- Reviewed: a monthly list of bills accepted within tolerance shows whether one vendor is consistently using the full allowance.
How does Odoo support it?
Odoo links the three documents natively. A vendor bill can be created from the purchase order, and each bill line keeps a reference to its order line. The product’s bill control setting decides what can be billed: on ordered quantities, the bill can be raised as soon as the order is confirmed; on received quantities, only what has been validated on a receipt can be billed. For stocked goods we set received quantities as the default, which turns the receipt into a hard condition rather than a reminder.
Depending on the version, the Purchase settings also include a three-way matching option that marks each bill according to whether it should be paid, based on the order and the receipts. Price tolerances are not a standard setting, so where a client needs one we enforce the rule through the approval workflow or a small, documented customisation, and confirm the behaviour on the client’s version during testing.
What about partial deliveries, returns and price changes?
- Partial deliveries: with billing on received quantities, the vendor can only be billed for what arrived; the balance stays open on the order until the rest is received or the line is closed.
- Returns: a return to the vendor reduces the received quantity, so goods already billed need a vendor credit note, and the return is not closed until that credit note is matched.
- Over-deliveries: goods received above the ordered quantity are approved as a change to the order, or returned, before they are billed.
- Price variance: a bill above the order price is either corrected by the vendor or approved as an order change by someone with authority; it is not quietly accepted by the clerk entering the bill.
- Services and expenses without a receipt: a requester confirmation, recorded against the order, takes the place of the receipt.
Where inventory is valued automatically, the match also reaches the balance sheet. The receipt values the stock at the order price, and a bill at a different price creates a difference that has to be treated according to the costing method. Leaving those differences unreviewed is how inventory valuation drifts away from what was actually paid.
A bill without a receipt is a request for payment. A bill with one is evidence.
How do you test the control?
In an MFT internal audit review we take the bills paid in a period and check, for a risk-based selection, that each one traces to an approved order and a validated receipt, and that differences outside tolerance were approved by someone with authority. We also look for the workarounds: bills recorded without an order, orders created after the bill date, and receipts validated by the person who approved the order. Each is a place where the control was bypassed, and each is visible in the ledger.