Finance operations & AP automation
Turning a stack of invoice PDFs into a three-way match a clerk still signs off on
OCR and LLM extraction across forty-plus supplier invoice formats, confidence-scored and matched against purchase orders and goods-received notes, with a review queue for anything the match cannot clear on its own.
- Invoice processing time
- days → hours
- Touchless invoices, no manual keying
- zero → a clear majority
- Three-way match exceptions correctly flagged
- a marked improvement
- Sector
- Enterprise finance operations
- Volume
- ~3,000 invoices/month, 40+ supplier formats
- Engagement
- Discovery sprint, then delivery pod
- Duration
- 5 months to production
Stack
- Azure Document Intelligence
- Claude
- GPT-4 class models
- pgvector
- FastAPI
- PostgreSQL
- React
- Airflow
Practices involved
Discuss a similar problemThe situation
Supplier invoices arrived as native PDFs, scanned images, and the occasional email body, in whatever layout that supplier's own system produced. The accounts payable team kept up by keying each one into the ERP by hand and matching it against the purchase order and goods-received note themselves. It worked, and it also meant payment cycles were paced by data entry rather than by terms, so early-payment discounts were routinely missed and month-end was always a scramble.
The constraint
This was never going to be a single-template extraction problem — forty-plus suppliers meant forty-plus layouts, and no two used the same field names or line-item structure. More importantly, a wrong extraction here has a direct financial consequence: an overpaid invoice, a duplicate payment, a misread tax figure. The team could not accept a system that produced a plausible-looking number with no way to tell how confident it was, and the ERP itself was not up for replacement — whatever we built had to sit in front of it, not instead of it.
What we built
Extraction with a confidence score attached to every field
Invoice number, date, line items, tax breakdown and totals are extracted against a fixed schema, and each field carries a confidence score and, where possible, a pointer back to where on the page it came from. Nothing posts to the ERP on a low-confidence field without a human looking at it first.
Matching that expects the master data to be messy
Fuzzy matching against purchase orders, goods-received notes and the vendor master, with a configurable tolerance band for price and quantity variance. A mismatch is reported as a specific discrepancy — this line is 4% over the PO price — rather than a generic match-failed flag an AP clerk has to re-investigate from scratch.
A review queue built for volume, not for edge cases only
Every invoice below the confidence threshold, and every match exception, lands in a queue an AP clerk works from, correcting fields inline. Corrections are logged and reviewed periodically to see which suppliers or fields are driving the most manual touches, which turned out to be a small, fixable list.
Posting as the last step, not the first
Only invoices that clear both extraction confidence and the match tolerance post to the ERP automatically. Everything else waits for a person, by design — the goal was fewer manual touches, not fewer human decisions on the ones that actually need one.
What changed
Processing time per invoice fell from days to hours, and a clear majority now move through untouched by a keyboard. The bigger shift was qualitative: the team could finally see, invoice by invoice, why something was flagged, instead of re-deriving it from scratch each time.
What we would do differently
We underestimated how much of the early match failures were not extraction errors at all — the same supplier was entered three different ways in the vendor master, so nothing matched cleanly no matter how accurate the extraction was. A vendor master-data cleanup should have run before the matching logic was tuned, not after the team started, reasonably, blaming the new system for old data problems.
Outcomes
- Invoice processing time
- days → hours
- Touchless invoices, no manual keying
- zero → a clear majority
- Three-way match exceptions correctly flagged
- a marked improvement
Client identity withheld under a mutual NDA. Figures are illustrative — rounded and directional, meant to show the shape of the change rather than an audited result. We will walk through the real numbers, and how they were measured, under NDA on a call.
More work
Other engagements.
Case studiesCutting stockouts across 240 stores with a forecast the buyers trust
A hierarchical demand forecast, a promo-aware feature store and a replenishment workflow the category team can override — because a model nobody overrides is a model nobody uses.
Read the case studyShipping firmware to 6,000 imaging consoles without a truck roll
A signed, resumable, rollback-safe update channel for regulated ultrasound hardware sitting on hospital networks that block almost everything.
Read the case studyA reproducible pipeline for a diagnostics lab that had outgrown its scripts
Genomic and assay data moving from instruments to reportable results, with provenance for every derived value and a turnaround clock the lab director can see.
Read the case studyNext step
Tell us what you're trying to ship.
Send the brief, the RFP, or three messy sentences about the problem. You get a written point of view from an architect within two working days — not a sales deck.