Why three-way matching breaks on real invoices

Why three-way matching breaks on real invoices

Date

Category

Insights

On paper, three-way matching is simple. The purchase order says 240 litres of syrup at a certain price. The goods receipt says 240 litres arrived. The invoice says 240 litres at that same price. Three documents agree, so you pay.

Then the real invoice arrives: "48 × Syrup 5 L can". Same goods. Same money. Not a single field that matches the order. A rigid matcher flags it as a discrepancy, and someone in purchasing opens three documents to do the arithmetic in their head. Now multiply that by a few hundred lines a month.

Over the past year we built purchase order matching for companies in wholesale, steel, food production, hospitality and care. Every check in it started with a real invoice that a simpler check got wrong. This is what those invoices taught us.


Nobody agrees on the unit

The most common reason an invoice line doesn't look like its order line is that the two documents count in different units.

  • Packs on the invoice, pieces on the order. "5 × hand soap x12" against an order for 60 pieces.

  • Packs on the order, pieces on the invoice. 12 gloves at €2.00 each against one "12 pack" ordered at €24.00.

  • The pack size is only in the description. The syrup above: the unit says litre on both documents, but one counts cans of 5 litres.

  • Tonnes against kilos. €475 per tonne on the invoice, €0.475 per kg on the order.

  • Per plate against per kg. Steel ordered by weight and invoiced per plate. The printed net weight of each plate is the bridge.

  • A lost prefix. Both documents say kg, but one price is €426.10 and the other €0.4261.

Across the roughly 1,300 invoices Cashfeed linked to an order in the last 90 days, 13% of the linked lines needed a conversion like this. One in six invoices had at least one.

The trap is converting too eagerly. Raisins at €52.85 a pack against €3.53 a piece gives a ratio of 14.97. That is not a pack size. The quantities settle it: 360 pieces ordered, 24 packs invoiced, so a pack holds 15. And some cases have to be refused, even when the money agrees: 1 kg at €160 against 20 kg at €8 is not "a pack of 20". It is a different product, or a price problem, and a person should look at it.

So a conversion is only accepted when the money confirms it. And a conversion never changes the money: whether the invoice is above or below the order is checked separately, on the amounts.


One order line is not one invoice line

The second surprise is how often the lines don't line up one to one.

  • Several invoice lines on one order line. Split billing (4 + 4 against 8), or a charge followed by a credit for the unused part. This happened on 17% of the invoices with an order.

  • A mixed batch. 17 steel plates, each at a slightly different price per kg, against one order line at an average price. Judged plate by plate, every line is wrong. Judged as a group, they land on 2,506 of the 2,500 kg ordered and exactly the ordered amount.

  • One invoice line over several order lines. 46.2 metres of timber on one line, against order lines of 5.4, 33, 5.4 and 2.4 metres. Or sizes printed on the line itself: "6'6: 5 | 6'9: 5", against one order line per size.

The last kind is rare, about 1% of invoices. But when it happens, a matcher that only thinks line by line gets every line wrong. We only split a line when the open order lines add up exactly. 850 units against open lines of 1,350 and 650 is left for a person.


A partial delivery is not an error

A bulk order called off in parts produces an invoice that is "under" the order, every single time. In our data, 12% of the invoices with an order contained a partial delivery.

A matcher that treats that as a mismatch sends purchasing an alarm for normal business. Worse, people learn to ignore the alarm, including the time it matters.

So a partial delivery gets its own label, and the rest of the order line stays open for the next invoice. The opposite matters just as much: an order line that has been invoiced in full has to drop out. Otherwise the next order for the same item gets matched against the old one.


The order number is rarely where you expect it

Before you can match lines, you need the right order. Suppliers are creative:

  • "PO 48 217" with spaces, or "PO26011637-Jan Peeters" with the buyer's name glued on.

  • The order number printed only in the first words of a line description.

  • A reference under "External No." on invoices printed from an ERP, or under a bare "Reference".

  • Your own VAT number in the "Your reference" field. We found dozens of invoices, at more than ten companies, where that number would otherwise have been read as the order number.

  • The supplier's own sales order number instead of yours.

When no usable order number is printed, we fall back to the supplier's open orders, but only when the description, quantity and price all agree. If two open orders fit equally well, nothing is matched. Guessing between two orders is how goods get paid for twice.


Prices need a tolerance, and a reason

Prices on an invoice rarely match the order to the cent. A rounding difference, a discount percentage on the order line, a price list that changed between order and delivery. A useful matcher applies the order's discount before it compares, allows a small tolerance you can set yourself, and explains the gap when it can. An invoice that prints prices including VAT against an order without VAT is not a price drop. It is the same price, and the match should say so.


The third leg: what actually arrived

Three-way matching adds the goods receipt, and with it three different situations that all look like "quantity doesn't match":

  • The goods haven't been received yet.

  • More was invoiced than received.

  • The receipt was already used up by an earlier invoice.

Confusing the last one with the first tells a customer that goods they signed for are still missing. Goods returned after invoicing are a fourth case: they stay flagged until the credit note arrives.


What we learned building it

A missed match is far less harmful than a wrong match. A missed match costs someone a minute. A wrong one closes an order line that is still open, or keeps one open forever. When in doubt, the matcher leaves it to a person.

Let AI read, let code decide. The model reads the invoice and proposes which order line each line belongs to. Code checks every proposal against the order, the quantities and the money, and computes the verdict. An answer that points to an order the invoice never mentions is thrown out.

A mismatch should say why. Of the lines in our data that didn't match, almost three in ten were not problems at all: partial deliveries, goods not yet received, or a lower price than ordered. Each gets its own label, so the real discrepancies stand out.

Every check needs a real invoice behind it. Before we change the matcher, we replay the change against real matches to make sure it breaks nothing that already worked. Invoices are endlessly inventive, and the only defence is to keep the examples.


Where Cashfeed fits

Cashfeed syncs your purchase orders from Exact Online, Business Central, Odoo or AFAS, or you create them in Cashfeed. Goods receipts come along from Exact Online, Business Central and Odoo. Every invoice line is linked to its order line, converted where the units differ, and judged with a reason you can read.

You decide per connection what an incomplete match does: hold the booking until someone looks, or book it and show the difference. Either way, purchasing only gets the invoices that actually need them.

“The hard part of matching is not finding the order. It is knowing when two documents that look different say the same thing, and when two that look the same don't.”

Jonathan Callewaert

,

CTO

Other articles

Other articles

Product

From rule-based accounting to AI: what actually changed

Insights

Who is Cashfeed for? Use cases by company size, integration and budget

Insights

Peppol is not the full invoice

Product

From rule-based accounting to AI: what actually changed

Insights

Who is Cashfeed for? Use cases by company size, integration and budget

Product

From rule-based accounting to AI: what actually changed

Insights

Who is Cashfeed for? Use cases by company size, integration and budget

Get started today

A month of invoices,

paid in seconds

Cashfeed pulls invoices from your inbox, matches them to the right ledger, and helps you pay them, saving your team hours of work instantly.

A month of invoices, paid in seconds

EN

Request AI Summary

© 2026 Cashfeed BV. All rights reserved.

Cashfeed BV is a company registered in Belgium (Dok-Noord 4D bus 101), VAT number BE 1020118217.

Payment services for the Cashfeed Business Account are provided by Swan, an electronic money institution authorized to provide payment services under French law, approved by the ACPR under number 17328.

Get started today

A month of invoices,

paid in seconds

Cashfeed pulls invoices from your inbox, matches them to the right ledger, and helps you pay them, saving your team hours of work instantly.

A month of invoices, paid in seconds

EN

Request AI Summary

© 2026 Cashfeed BV. All rights reserved.

Cashfeed BV is a company registered in Belgium (Dok-Noord 4D bus 101), VAT number BE 1020118217.

Payment services for the Cashfeed Business Account are provided by Swan, an electronic money institution authorized to provide payment services under French law, approved by the ACPR under number 17328.

Get started today

A month of invoices,

paid in seconds

Cashfeed pulls invoices from your inbox, matches them to the right ledger, and helps you pay them, saving your team hours of work instantly.

A month of invoices, paid in seconds

EN

Request AI Summary

© 2026 Cashfeed BV. All rights reserved.

Cashfeed BV is a company registered in Belgium (Dok-Noord 4D bus 101), VAT number BE 1020118217.

Payment services for the Cashfeed Business Account are provided by Swan, an electronic money institution authorized to provide payment services under French law, approved by the ACPR under number 17328.