Three-Way Match for Odoo 19 Community documentation
A guide to three-way match: the tolerances, checking a bill, accepting a difference, the lists, vendors that must match and the access rights.
Documents version 1.0.0Updated Oct 24, 2026
Start here
In plain words: The vendor bills 100 chairs, you received 80 and the order says 8.00 a chair, not 8.40. Three-Way Match compares every vendor bill line with the purchase order and the goods received, flags the differences in money, and blocks the posting of a bill that does not match until an approver accepts the difference with a reason. You pay what you ordered and received.
Tip: It does not change how you create a bill. It watches it.
What you get
| Feature | What it does |
|---|---|
| Match on each line | Ordered, received and billed to date, the order price and the bill price, side by side on the bill; a badge says Matches, More than received, Price above the order or Qty and price. |
| Amount at risk | The money that is not covered: the extra quantity at the bill price plus the price difference. |
| Tolerances | A percentage of quantity and a percentage of price that a bill may exceed without being flagged (2% on the price by default). |
| Blocks the posting | A bill that needs a review cannot be posted; the message tells which lines and why. |
| Approval with a reason | An approver accepts the difference, writes why, and it stays on the bill; the approval is void as soon as a quantity or a price of the bill changes. |
| Several bills | Bills already posted for the same order line count; credit notes lower the billed quantity. |
| Vendors that must match | For some vendors a line that is not on a purchase order is flagged too. |
| Bills to review and differences | A list of the bills to review, and a list or pivot of the differences by vendor and product. |
| Services | A service is matched with the quantity ordered, as nothing is received. |
| Arabic | Everything is translated and works right to left. |
Requirements
| Item | Details |
|---|---|
| Odoo | 19.0 (Community or Enterprise) |
| Apps needed | Purchase, Inventory and Accounting (purchase_stock), installed with Odoo |
| License | OPL-1 (Odoo Proprietary License v1.0) |
Install
- Unzip the package. Inside is
taqnix_three_way_match.zip; unzip it to get the foldertaqnix_three_way_match. - Copy the folder into one of the
addons_pathfolders of your Odoo server and restart Odoo. - Log in as an administrator, activate Developer mode, open Apps and press Update Apps List.
- Remove the “Apps” filter, search Three-Way Match and press Install.
# or from the command line ./odoo-bin -c odoo.conf -d YOUR_DATABASE -i taqnix_three_way_match --stop-after-init
Set the tolerances
In plain words: Accounting → Configuration → Settings → Vendor Bills. Tick Block the bills that do not match (it is ticked by default) and set the tolerance: the percentage of quantity and the percentage of price that a bill may exceed without being flagged. A bill is never flagged for a quantity below what was received or a price below the order.
Check a bill
In plain words: Create the vendor bill as usual, from the purchase order (Create Bill) or by typing it with the purchase document selected. On the bill lines, the columns Ordered, Received and the badge Match show how each line compares. If something does not match, a yellow banner on top of the bill lists the differences.
In plain words: The column Billed to date (to be shown from the column menu) counts the posted bills of the same order line, plus this one. The Bills list has a Match column and the filters Match: to review and Match: approved.
Accept a difference
In plain words: Press Confirm on a bill that does not match and Odoo refuses, with the list of the differences. An approver presses Accept the difference, writes the reason and confirms: the bill can now be posted, and the banner says who accepted it, when and why. If somebody changes a quantity or a price afterwards, the approval is void and the bill goes back to To review. Withdraw the approval brings it back by hand.
Bills to review and differences
In plain words: Accounting → Vendors → Bills to review lists the draft bills that do not match, with the amount at risk and a total. Differences lists the lines in difference; group them by vendor or product, or switch to the pivot to see the money at risk by vendor.
Vendors that must match
In plain words: On the vendor's form, in the Purchase section, tick Bills must match an order. A line of this vendor's bills that is not on a purchase order is then flagged Not on an order, with its whole amount at risk. Leave it unticked for rent, utilities and other bills without an order.
Who can do what
| Who | Can |
|---|---|
| Accounting users (Billing) | Create the bills and see the match; they cannot post a bill that needs a review. |
| Approvers (group Three-way match: approver) | Accept a difference and withdraw an approval; tick Bills must match an order on a vendor. |
| Purchase administrators and Accounting managers | Are approvers. |
Arabic and right to left
Limits
| Limit | Detail |
|---|---|
| Vendor bills only | Customer invoices and credit notes are not checked. |
| Same unit of measure | The quantities are compared as they are: the bill and the order must use the same unit. |
| Same currency | The price is compared only when the bill and the order are in the same currency. |
| Receipts decide | For goods, the quantity received is the one of the purchase order line; a service is matched with the quantity ordered. |
| Amount at risk in the bill currency | The totals add the amounts as they are, whatever the currency. |
For developers
In plain words: Skip this chapter if you only use the module.
bill = env['account.move'].browse(42)
bill.tx_match_state # 'ok', 'review', 'approved' or 'na'
bill.tx_match_excess # the amount at risk, in the currency of the bill
for line in bill.invoice_line_ids:
print(line.product_id.name, line.tx_match_ordered, line.tx_match_received, line.tx_match_billed, line.tx_match_status)
bill.with_context(taqnix_skip_match=True).action_post() # post without the check (an integration, for instance)Troubleshooting
| Problem | What to do |
|---|---|
| ... does not match the purchase order and the receipts | Receive the goods, correct the bill, or ask an approver to accept the difference. |
| The bill is not checked at all | The lines must be linked to a purchase order line (use Create Bill on the order or select the purchase document on the bill); a bill without any order line is Not checked. |
| The approval disappeared | A quantity or a price of the bill changed after the approval: accept the difference again. |
| I cannot see Accept the difference | You are not an approver: ask for the group Three-way match: approver. |
| I want to post the bill anyway | An approver accepts it, or untick Block the bills that do not match in the settings. |
Updating and removing
Replace the folder with the new version, restart Odoo and run -u taqnix_three_way_match. The bills, the approvals and the settings are kept.
Support
Installation help and bug fixes are included for 6 months, with lifetime updates. Contact us through the marketplace page where you bought the module or write to support@taqnix.com with your Odoo version and a screenshot.