We start by counting layouts
The OCR and extraction papers, model cards and vendor release notes published through October cover most of the ground here, and read together they make model-based extraction look like the obvious default everywhere. That is not how we read them. We still maintain coordinate templates for supplier invoices on some document streams, and the reason is a number most finance teams have never counted.
The first measurement we take on any extraction job is the number of distinct layouts in the document population, how many pages each layout accounts for per month, and how often the issuer changes it. You can have two finance teams processing the same number of invoices each month, one receiving them from a handful of issuers and the other from hundreds. Both need the same field list. What changes with the issuer count is the cost of building the extraction, the effort of testing it, and the maintenance it needs afterwards.
The cost of zonal OCR and template extraction scales with layout count. Each layout needs its coordinate boxes mapped, anchor strings to relocate a region when the page shifts, and someone who owns the fix when the issuer redesigns the form. The cost of model-based extraction scales with pages processed, because tokens are billed per page, and one schema covers layouts nobody has seen yet. Where the layout count is small and stable, the template build is cheaper to run and easier to test, and that is what we recommend.
A paper posted to arXiv on 11 October 2025, "Hybrid OCR-LLM Framework for Enterprise-Scale Document Information Extraction Under Copy-heavy Task" by Zilong Wang and Xiaoyu Shen, tested 25 configurations across three extraction methods on identity documents in four formats. Their table-based extraction with PaddleOCR reached an F1 of 1.0 at 0.97 seconds per structured document, and 0.997 on image inputs, which they report as a 54 times improvement on the multimodal configurations they measured. We would want an F1 of 1.0 reproduced on a live document stream before treating it as a general result. The part of the paper we do use is the recommendation of format-aware routing, splitting a mixed document stream so that each format goes to the handler that suits it.
Where templates and zonal OCR still win
Zonal OCR holds up on fixed layouts that are machine printed and arrive in volume, such as bank statements, a council rates notice, a carrier consignment note or a superannuation contribution advice. The field sits in the same place on every page, so a coordinate box with an anchor string finds it reliably. The output is deterministic, which is what makes a golden file test suite work properly, because the same PDF produces byte-identical extraction on every run and any change in output traces back to a change in the code.
Templates also win when the data is already structured and no reading is required. A digitally generated PDF carries a text layer with character positions in it, and pdfplumber or PyMuPDF returns the words with their bounding boxes and no recognition step at all. Barcodes, QR codes, the MICR line on a cheque and the machine-readable zone on a passport are all designed for a decoder with a checksum built in. Sending those to a vision model costs tokens and introduces a class of transcription error that the decoder cannot make, so we decode them directly and we argue against any design that does not.
Unit cost is the other reason templates survive at volume, and it is the part of the case we weigh most heavily. A PaddleOCR or Tesseract pass with coordinate extraction runs on hardware you already own and carries no per-token charge, so a process handling tens of thousands of pages a month pays nothing per page beyond the compute it is already running. That arithmetic did not change in October.
Where a language model earns the extra cost
A model earns the extra cost when a field is defined by meaning and its position is unstable. Payment terms are the usual example. On one supplier's invoice they are a labelled header field, on another they sit inside a block of terms at the foot of the page, and on a third they appear only as "Net 30" beside the due date. Covering that with coordinate boxes means writing and maintaining a rule for every placement you encounter. A schema field described in words, such as the number of days the supplier allows for payment, is matched by meaning, so the same prompt handles all three placements and the ones nobody has seen yet.
Tables are the second case, because line items running across page breaks, nested headers, merged cells and columns that appear on some invoices and not others break coordinate extraction quickly. Ai2 released olmOCR 2 on 22 October 2025, a 7B vision language model built on Qwen2.5-VL, scoring 82.4 overall on olmOCR-Bench with 84.9 on tables and 83.7 on multi-column layouts. Datalab's Chandra reports 83.1 on the same benchmark, and its model card covers handwriting and form reconstruction including checkbox state. That model card carries no release date anywhere on it, so the score is public while the timing is not, and a benchmark figure with no date is hard to place.
Handwritten fields, ticked boxes and marked-up forms are the third case, and zonal OCR has never handled them well. Accuracy from these models varies with how they are configured, and that is the part of the month's coverage we think gets underplayed. DeepSeek-OCR is the clearest illustration. The paper, published on 21 October 2025, describes compressing page content into vision tokens, and measured about 97% decoding precision while text tokens stayed within ten times the vision token count, falling to roughly 60% at a twenty times ratio. Resolution, token budget and page-splitting choices belong in the configuration we test against, and we record them alongside the model version.
What we check before anything is posted
Nothing a model extracts should reach a system of record before Python checks have run over it, and we will not build it any other way. Constrained decoding against a JSON Schema guarantees that the returned object has the expected fields and types. Checking whether the values in those fields are correct takes arithmetic and lookups, written as ordinary Python and run before anything is posted.
For an Australian supplier invoice the rules we typically write include an ABN of eleven digits that passes the ABR weighted checksum, a GST amount equal to one eleventh of the total for a taxable supply, line item amounts that sum to the subtotal, subtotal plus GST equal to the invoice total to the cent, and an invoice date that is not in the future. Arithmetic like that cannot tell you that a correctly formed invoice came from a supplier who is not registered, or that it quotes a purchase order closed last quarter, so a second set of checks calls the systems that hold those records: ABN Lookup for registration status, the ERP for whether the purchase order exists, is open and has enough remaining balance, and the supplier master for whether the bank account on the document matches the account on file.
The olmOCR 2 training method is the one we would borrow from here. Ai2 trained the model with reinforcement learning where the reward came from binary unit tests generated off synthetic documents with known HTML source, sampling 28 completions per step and rewarding the ones that passed more tests. The same style of deterministic check is useful at inference time on your own documents. The invoice extraction evaluation paper posted on 17 October 2025 by Sai Yashwant and colleagues scores field-level precision, consistency check failures and exact match accuracy as three separate numbers, and the consistency failure rate is the one we would read first, because it tells you how often the model returned something internally contradictory.
Thresholds, review queues and pinned model versions
We ask the model for a confidence value on each field and store it against the extracted value. A single document-level score averages a high-certainty invoice number together with a low-certainty handwritten reference, which means the score cannot be used to decide whether the handwritten reference needs review. Thresholds are set field by field according to what a wrong value costs. A bank account number or a payment amount is set high enough that anything below it goes to a person, and a line item description can clear at a much lower value. The thresholds live in configuration so that they can be adjusted once you have a month of results to look at.
Every extraction resolves to one of three outcomes. An extraction that passes all rules and clears its thresholds posts straight through. Where a threshold is missed or a soft rule fails, the document holds in a review queue, and a person sees the page image with the extracted values highlighted in position and confirms or corrects each one. A hard rule failure, such as a purchase order that does not exist, sends the document to an exception queue with the failing rule named in the record. Corrections made in the review queue are stored against the source page, which builds a labelled set we use to measure drift over time.
Model versions get pinned, and changes go through a regression suite of fixed pages with expected output. Anthropic released Claude Haiku 4.5 on 15 October 2025 with coding performance similar to Claude Sonnet 4 at one-third the cost and more than twice the speed, and a release like that makes a mid-project model swap tempting on cost alone. We would not take it mid-project without running the suite first. UiPath's IXP release notes for October 2025 added taxonomy import and export, so the field schema can be held in source control and moved between environments as a versioned file. Both the model version and the exported taxonomy are recorded in the release notes for each deployment, and the regression suite runs against them before the change reaches production.
What a mid-project model swap actually costs is not readable off a pricing page once the regression suite, the field thresholds and the review queue labels are all tied to the version being replaced. Working the token saving out from published pricing takes a minute. Sizing the retesting takes a measured run on a live queue, and we do not quote a figure for retesting we have not measured.