Skip to content
TAQNIX
Odoo ModulesWordPress PluginsWordPress ThemesShopify ThemesApp TemplatesScripts & UtilitiesBlogSell on TAQNIX

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.
The bills to review, a bill with its differences, and the approval with a reason.
The bills to review, a bill with its differences, and the approval with a reason.
Tip: It does not change how you create a bill. It watches it.

What you get

FeatureWhat it does
Match on each lineOrdered, 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 riskThe money that is not covered: the extra quantity at the bill price plus the price difference.
TolerancesA percentage of quantity and a percentage of price that a bill may exceed without being flagged (2% on the price by default).
Blocks the postingA bill that needs a review cannot be posted; the message tells which lines and why.
Approval with a reasonAn 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 billsBills already posted for the same order line count; credit notes lower the billed quantity.
Vendors that must matchFor some vendors a line that is not on a purchase order is flagged too.
Bills to review and differencesA list of the bills to review, and a list or pivot of the differences by vendor and product.
ServicesA service is matched with the quantity ordered, as nothing is received.
ArabicEverything is translated and works right to left.

Requirements

ItemDetails
Odoo19.0 (Community or Enterprise)
Apps neededPurchase, Inventory and Accounting (purchase_stock), installed with Odoo
LicenseOPL-1 (Odoo Proprietary License v1.0)

Install

  1. Unzip the package. Inside is taqnix_three_way_match.zip; unzip it to get the folder taqnix_three_way_match.
  2. Copy the folder into one of the addons_path folders of your Odoo server and restart Odoo.
  3. Log in as an administrator, activate Developer mode, open Apps and press Update Apps List.
  4. 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.
The settings in Vendor Bills.
The settings in Vendor Bills.

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.
A bill that bills 100 cable kits when 80 were received, at 8.40 instead of 8.00.
A bill that bills 100 cable kits when 80 were received, at 8.40 instead of 8.00.
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.
The vendor bills with their match.
The vendor bills with their match.

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.
The approver writes why the bill is accepted.
The approver writes why the bill is accepted.
An approved bill keeps the reason.
An approved bill keeps the reason.

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.
The bills to review, with the amount at risk.
The bills to review, with the amount at risk.
The lines in difference.
The lines in difference.

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

WhoCan
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 managersAre approvers.

Arabic and right to left

The bills to review in an Arabic interface.
The bills to review in an Arabic interface.

Limits

LimitDetail
Vendor bills onlyCustomer invoices and credit notes are not checked.
Same unit of measureThe quantities are compared as they are: the bill and the order must use the same unit.
Same currencyThe price is compared only when the bill and the order are in the same currency.
Receipts decideFor 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 currencyThe 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

ProblemWhat to do
... does not match the purchase order and the receiptsReceive the goods, correct the bill, or ask an approver to accept the difference.
The bill is not checked at allThe 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 disappearedA quantity or a price of the bill changed after the approval: accept the difference again.
I cannot see Accept the differenceYou are not an approver: ask for the group Three-way match: approver.
I want to post the bill anywayAn 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.