This is the working thing, not a description of it. It reads the PDF, pulls out vendor, invoice number, date, PO reference, line items and totals, checks the arithmetic against a purchase-order table, and splits the result in two: bills that can post without anyone reading them, and the ones that can't, each with a reason you can act on in seconds.
A demo that only handles tidy input proves nothing. Half of these documents carry a deliberate
defect, and each vendor writes its invoices differently, because that variance is the
problem. The same field appears as Invoice Number, INV #,
Document No. and Our reference. Dates arrive as 07/28/2026,
03-AUG-2026, 2026-08-04 and 06/08/2026.
| Cascade Paper Supply | Clean. Posts untouched. |
| Nolan Freight Systems | Clean, but abbreviated labels and a day-month date. |
| Brightline Electrical | No PO reference anywhere. Flagged for review, not blocked. |
| Kestrel Industrial | Two pages, 14 line items, and a stated total $180 above what its own lines foot to. |
| Pinnacle Software | UK vendor, billed 50% over its authorised PO, and a day-first date correctly read as day-first. |
| Cascade (re-send) | Duplicate of an invoice already received, with a later date and a "second notice" line. |
A field that cannot be read is empty with a stated reason, never a plausible-looking value. A wrong number posted confidently into the ledger costs far more than a flagged one.
Purchase orders allow a small variance, 2% or $25, whichever is greater. Blocking a $14 overage on a $1,400 PO is how an exception queue turns into something nobody reads. Cascade is $14.29 over its PO and posts anyway; Pinnacle is $4,500 over and does not.
06/08/2026 is genuinely ambiguous between US and day-first conventions, but flagging
every nn/nn/yyyy date fires on roughly half of all US invoices and trains you to ignore
the list. The date is only questioned when the document carries evidence of non-US origin: VAT
registration, a UK postcode, Ltd, a non-dollar currency.
Scanned image PDFs need OCR, and are reported as unreadable rather than guessed at. Line-level GL coding is per-client and not attempted here. This page writes nothing anywhere; a real engagement writes into QuickBooks or your ERP, and the PO table comes from your system rather than the four rows below.