AI Agents for Missing
and Duplicate Invoices
Accounts payable is built around documents that arrive. The expensive failures are the ones that never did.
- An invoice driven workflow cannot see a missing invoice, because the trigger for every step is a document that does not exist.
- An open purchase order file is four populations at once, and an accrual built over the whole file is wrong by whatever the administrative residue happens to be.
- Received and not invoiced is the only one of those four that is a real unrecorded liability.
- Exact matching on vendor and invoice number catches the duplicates that were never going to be paid twice, and misses the rekeyed and second vendor record cases that were.
- Bank details and the vendor document are stronger duplicate signals than the internal invoice number, which is the field a rekey changes first.
AI agents for missing and duplicate invoices work from the open purchase orders and the goods receipt history rather than from the invoice queue, because that is the only side of the transaction that is present when an invoice never arrived. ChatFin separates the real unrecorded liability from the administrative residue before it accrues or chases anything.
The same inversion applies to duplicates. Nearly every system checks vendor number and invoice number for an exact match, which is the weakest available signal and the one a rekey changes first. ChatFin matches on the vendor document, the amount, the date and the bank details, which is where the duplicates that actually clear are visible.
Every accounts payable process is blind to what did not arrive
Accounts payable is built around documents that show up. Invoices arrive, they get processed, and the measures of success all count throughput. ChatFin finds the expensive failures sit in the opposite place: the invoice that never came, for goods that were received, in a period that has already closed.
| Situation | What accounts payable sees | What is actually true |
|---|---|---|
| Goods received, no invoice | Nothing at all | A real liability, unrecorded |
| Invoice sent to the wrong address | Nothing at all | The vendor thinks you are late |
| Invoice in a personal inbox | Nothing at all | It will surface after close |
| Vendor stopped invoicing | Nothing at all | Reads as a saving until it does not |
| Order fulfilled, never closed | An open PO | Which may or may not be a liability |
Four of those five rows are literally invisible to an invoice driven workflow, because the trigger for every step is a document that does not exist. ChatFin works from the open purchase orders and the receipt history instead, which is the only side of the transaction that is actually present.
ChatFin reads open orders and goods receipts rather than the invoice queue, so a missing invoice becomes a finding instead of a silence.
Reading an open purchase order file honestly
Every open purchase order file contains three populations that look identical and mean completely different things. Treating them as one list is why the file is usually ignored.
ChatFin separates those four before proposing anything, because an accrual built over the whole file is wrong by whatever the residue happens to be, and a chase list built over the whole file annoys vendors who owe you nothing.
ChatFin splits the open order file into received and not invoiced, ordered and not received, and administrative residue, then accrues and chases only the first.
Duplicates survive because the obvious check is the weakest one
Nearly every finance system checks vendor number and invoice number for an exact match. That check catches the duplicate that was never going to be paid twice anyway, and misses the ones that were.
| Duplicate type | Why the exact check misses it | How it is caught |
|---|---|---|
| Same invoice, second vendor record | Different vendor number | Match on bank details |
| Invoice number with a suffix added | Not an exact match | Match on amount and date |
| Statement paid alongside the invoice | Different document type | Classify before matching |
| Credit note applied as a payment | Opposite sign | Match on the offset invoice |
| Rekeyed after a rejection | New internal number | Match on the vendor document |
Every row is a payment that clears and never returns unless somebody notices. ChatFin matches on the vendor document, the amount, the date and the bank details rather than on the internal invoice number, which is the field most likely to have been changed.
ChatFin matches duplicates on bank details and the vendor document rather than the internal invoice number, which is the field a rekey changes first.
Where this underperforms
Three, and the first is common.
Deeper in missing and duplicate invoices
The use cases this hub covers.
Worked on this page
Vendor follow up for missing invoices · Missing invoice detection from open POs · Duplicate invoice detection
Covered as sections here
Open order populations · Received not invoiced · Bank detail matching · Rekeyed invoices
Questions AP managers ask first
How can software find an invoice that was never sent?
By reading the other side of the transaction. If goods were received against an open purchase order and no invoice has been matched to that receipt, there is a liability regardless of whether any document arrived. ChatFin reports that population and separates it from orders that were never received and from orders that were completed but never closed.
Why does duplicate checking miss so much?
Because the standard check is an exact match on vendor number and invoice number, and every duplicate that actually clears has broken one of those two fields. A second vendor record changes the vendor number, a rekey after a rejection changes the invoice number. ChatFin matches on bank details, amount, date and the vendor document instead.
Is the open purchase order file worth reading at all?
Only once it is split. Most open order files are dominated by orders that were fulfilled and never closed, which is why finance teams stop reading them. ChatFin separates that residue from received and not invoiced, and only the second group becomes an accrual or a vendor chase.
Read the side of the transaction that exists.
ChatFin works from open orders and goods receipts, so an invoice that never arrived becomes a reported finding rather than a silence in the queue.
It splits the open order file before accruing or chasing, and matches duplicates on bank details rather than on the invoice number.
Bring your open purchase order file. The split takes an hour.
Book a demoAll images are served from the Pexels content network. No third party product screenshots, vendor logos or licensed media are used on this page.
Bring your open purchase order file.
We will split it through ChatFin into received and not invoiced, ordered and not received, and residue, and show you which of it is a real liability.