Skip to content
Finance & Accounting Built by us

Finance Audit & Invoice Extractor

Turns vendor invoices, receipts and statements into validated, approved accounting entries — with a confidence score and an audit trail on every field.

The review screen. Source document on the left, extracted fields on the right, confidence on every field — low-confidence fields are focused first, not buried in a form.

Who it's for

Built for a specific kind of business

Accounting and BPO firms, in-house finance teams, and bookkeeping practices where somebody is currently retyping numbers off PDFs into an accounting system. It starts paying for itself somewhere around 500 documents a month, and the case gets stronger the more vendors — and therefore the more layouts — you deal with.

Business type
Accounting firm, BPO, bookkeeping practice, in-house AP team
Volume
500+ documents/month
Document mix
Vendor invoices, receipts, credit notes, bank and card statements
Runs today on
Manual data entry, or template OCR that breaks on new vendors
Decision maker
Finance lead, operations manager, or practice owner

The problem

What this actually costs you today

In the words operators use, not the words software vendors use.

  • Staff retype invoice data into the accounting system all day

    It is the most expensive kind of cheap work — slow, error-prone, deeply boring, and done by people who could be doing reconciliation and exception handling instead. Throughput is capped by headcount, so volume growth means hiring.

  • Template OCR breaks the moment a vendor changes their layout

    Rule-based extraction works beautifully on the vendors you configured it for. Every new vendor is a configuration project, and every redesign of an existing vendor's invoice is a silent failure that surfaces as bad data downstream.

  • Errors surface at audit, months after they were introduced

    A transposed digit in a tax amount is invisible in a spreadsheet and expensive in an audit. Without field-level provenance, finding where a wrong number came from means going back to paper.

  • There is no record of who changed what

    When extracted data is corrected by hand, the correction usually overwrites the original with no trace. That is fine until a client, an auditor or a regulator asks how a figure was arrived at.

  • Nobody trusts a system that cannot say when it is unsure

    An extraction engine that returns the same confident-looking JSON whether it read the number correctly or hallucinated it is worse than manual entry, because it removes the human check without removing the error.

What it does

Grouped by who uses it

Feature lists organised by technical module tell you nothing about whether the software fits your team. These are grouped by the person who lives in them.

Document ingestion

Operations

Documents arrive the way they already arrive at your firm. The system meets them there rather than asking clients to change habits.

  • Drag-and-drop and bulk upload from the browser
  • Dedicated intake mailbox — clients forward invoices, attachments are picked up automatically
  • Watched folder or SFTP drop for scanner and back-office workflows
  • REST API for programmatic submission from your own systems
  • Multi-page PDFs split into individual documents where a scan batch contains several
  • Native handling of PDF, scanned image, and phone-camera photos of receipts

Extraction

System

A two-stage pipeline — deterministic text and layout extraction first, then a language model that reads that layout into a strict schema. Neither stage alone is reliable enough on its own.

  • Text-layer extraction where the PDF has one; OCR only where it does not
  • Layout-aware parsing that preserves table structure and reading order
  • Schema-constrained LLM extraction — header fields and line items in one pass
  • Line-item extraction with quantity, unit price, tax and total per row
  • Currency, date-format and locale normalisation
  • Handles multi-page invoices and continuation tables as one document

Confidence scoring and review queue

Reviewer

The core of the product. Every field carries a confidence score, and the queue is ordered so human attention lands where it changes the outcome.

  • Per-field confidence, not one score for the whole document
  • Automatic straight-through processing above a configurable threshold
  • Review queue sorted by risk — low confidence and high value first
  • Side-by-side review with the source region highlighted on the document
  • Keyboard-first correction, because reviewers do this hundreds of times a day
  • Every correction recorded as a training signal, not just an overwrite

Validation and duplicate detection

System

Arithmetic and business rules that catch the errors a language model cannot catch about itself.

  • Line items must sum to subtotal; subtotal plus tax must equal total
  • Tax rate sanity checks against the jurisdiction on the document
  • Date plausibility — invoice date not in the future, due date after invoice date
  • Vendor matching against your existing master data
  • Duplicate detection on vendor, invoice number, amount and date
  • Purchase-order and goods-receipt matching where those exist
  • Configurable rules per client, because every client's tolerances differ

Vendor and format learning

System

Accuracy improves with use rather than with configuration projects.

  • Vendor fingerprinting from layout and issuer details
  • Corrected examples retrieved as few-shot context for the next document from the same vendor
  • Per-vendor field hints built from accepted extractions
  • New vendors work on first sight, then get more accurate
  • No template to author, and nothing to reconfigure when a layout changes

Approval workflow and audit trail

Approver

What turns an extraction tool into something a finance function can actually sign off on.

  • Configurable approval chains with value thresholds
  • Segregation of duties — the reviewer cannot be the approver above a set amount
  • Immutable, append-only audit log of every field's value history
  • Original document retained and hash-linked to every derived record
  • Full export of the audit trail for an external auditor
  • Reason codes on rejections, so recurring problems are measurable

Accounting integration

Operations

Extraction that stops at JSON has moved the manual work rather than removed it.

  • Xero and QuickBooks Online push, with account and tax-code mapping
  • CSV and Excel export in your ERP's import format
  • Webhook on approval, so downstream systems react in real time
  • Idempotent posting — a retried push never creates a duplicate bill
  • Sync status per document, with clear failure states

Multi-tenant client separation

Admin

Built for BPOs and practices from the start, rather than retrofitted.

  • Hard data separation per client, enforced at the query layer
  • Per-client rules, mappings, thresholds and approval chains
  • Staff assigned to specific clients, with no cross-client visibility
  • Per-client throughput and accuracy reporting you can share with them
  • Read-only client login, so clients can watch their own queue

Throughput and accuracy analytics

Owner

The numbers you need to price the service and prove it is working.

  • Straight-through processing rate, overall and by vendor
  • Field-level accuracy measured against reviewer corrections
  • Average handling time per document, per reviewer
  • Cost per document, including model spend
  • Volume and backlog trends, with SLA breach warnings

Live demo

Run a document through it

The same pipeline described above, rate-limited and storing nothing. Pick a sample or upload your own invoice and watch the fields come back with confidence scores.

Pick a sample, or upload your own

Nothing is stored

Drop a PDF or image here, or

PDF, PNG, JPEG or WebP · up to 5 MB · 5 documents per hour

Extraction results will appear here.

The uploaded file is held in memory for the length of the request and never written to disk. Confidence is computed from how well each value is grounded in the page, not from the model's own assurance.

Demo running on the same pipeline, rate limited. Book a call to run a full sample of your own documents.

Screenshots

The actual interface

Every screenshot uses generated demo data. No real customer, student or member record appears anywhere on this site.

  • Per-field confidence. The two flagged fields are the only ones a reviewer needs to look at — the rest cleared the threshold and are already posted.

  • A validation failure. The model read every field with high confidence and the arithmetic still does not close — which is exactly the class of error confidence scoring alone will not catch.

  • Field history. Original extraction, reviewer correction, approver sign-off — with timestamps and identities. This is the screen that gets shown to an auditor.

  • Straight-through rate climbing as the vendor corpus grows. The step change in week three is a single high-volume vendor crossing the auto-approve threshold.

  • Client separation as a BPO operator sees it. Rules, mappings and staff assignments are per client; the data never shares a query.

Roles & permissions

Who can do what

Publishing this table is unusual. It is also the fastest way to show that the system was designed for a real deployment rather than for a demo.

Segregation of duties is enforced by the system, not by policy. Above a configurable value threshold, the identity that reviewed a document is blocked from approving it.

Capabilities by role. Each row is a capability; each column is a role.
Capability Admin Tenant-wide Reviewer Assigned clients Approver Assigned clients Client Own documents Auditor Read-only, all history
Upload documents Admin: Full Reviewer: Edit Approver: Edit Client: Own Auditor:
View extracted data Admin: Full Reviewer: Edit Approver: Edit Client: Own Auditor: View
Correct extracted fields Admin: Full Reviewer: Edit Approver: Edit Client: Auditor:
Approve a document Admin: Approve Reviewer: Approver: Approve Client: Auditor:
Approve above threshold Admin: Reviewer: Approver: Approve Client: Auditor:
Reject and return for rework Admin: Full Reviewer: Edit Approver: Edit Client: Auditor:
Configure validation rules Admin: Full Reviewer: Approver: View Client: Auditor: View
Configure approval chains Admin: Full Reviewer: Approver: Client: Auditor: View
Accounting integration mapping Admin: Full Reviewer: Approver: View Client: Auditor: View
Push to accounting system Admin: Full Reviewer: Approver: Edit Client: Auditor:
View audit trail Admin: View Reviewer: View Approver: View Client: Own Auditor: Full
Export audit trail Admin: Full Reviewer: Approver: Client: Own Auditor: Full
Manage clients and staff assignment Admin: Full Reviewer: Approver: Client: Auditor:
Delete a document Admin: Approve Reviewer: Approver: Client: Auditor:
  • Full Full access
  • Edit Create and edit
  • View View only
  • Own Own records only
  • Approve Requires approval
  • No access
  • Enforced server-side, not by hiding UI

Technical architecture

How it is built

Skip this section if you are not technical — nothing later depends on it.

A Python extraction service behind a .NET application layer. The split is deliberate: the document pipeline lives where the ML tooling is, and the workflow, permissions and accounting integration live where transactional correctness and long-term maintainability matter more.

  1. Intake

    • Upload & bulk importBrowser, drag and drop
    • Mailbox watcherIMAP / Graph, attachments
    • SFTP / folder dropScanner workflows
    • REST APIKeyed, rate limited
  2. Extraction pipeline

    • Text or OCROCR only when no text layer
    • Layout parseTables + reading order preserved
    • Exemplar retrievalNearest accepted, same tenant
    • Schema-constrained LLMHeader + line items, typed output
  3. Trust layer

    • Grounding checkValue must map to a page region
    • Arithmetic validationSums, tax, dates — model-independent
    • Duplicate detectionVendor + number + amount + date
    • Confidence scoringComposite, per field
  4. Workflow

    • Review queueRanked by risk, keyboard-first
    • Approval chainThresholds + segregation of duties
    • Audit trailAppend-only field history
  5. Output & storage

    • Xero / QuickBooksIdempotent posting
    • Webhooks & exportSigned, retried
    • PostgreSQL + pgvectorWorkflow data + layout embeddings
    • Object storageEncrypted originals, hash-linked
Three independent checks stand between the model and your ledger: a strict output schema, grounding of every value to a region of the page, and arithmetic validation that knows nothing about the model.
Stack, layer by layer
  • Extraction service Python 3.12, FastAPI, Celery workers

    The OCR, layout and model-calling ecosystem is Python. Fighting that gains nothing.

  • Application and workflow ASP.NET Core 8 (C#)

    Approval chains, permissions and accounting posting are transactional business logic, and this is where that is cheapest to keep correct over years.

  • Database PostgreSQL 16 with pgvector

    Relational workflow data and vendor-layout embeddings in one store, with one backup and one restore procedure.

  • Document storage S3-compatible object storage, server-side encrypted

    Originals must be retained, immutable and hash-verifiable. Object storage with versioning is the right primitive.

  • Language model Frontier LLM via API, schema-constrained output

    Vendor-layout generalisation is the whole problem. No template engine solves the long tail.

  • OCR PaddleOCR / Tesseract, applied only when there is no text layer

    Most PDFs already carry text. Running OCR on them adds cost and introduces errors that were not there.

  • Queue Redis + Celery, with a dead-letter queue

    Document processing is bursty. Backpressure and retry need to be explicit and inspectable.

  • Review UI React 19 + TypeScript, PDF.js viewer with region highlighting

    Reviewers spend their whole day here. Keyboard-first, sub-100ms interactions, source highlighting.

Data model highlights
  • Document as the immutable root — original file hash, source, tenant, received timestamp
  • ExtractionRun per attempt, so re-extraction with a newer prompt or model never destroys the previous result
  • FieldValue rows carrying value, confidence, bounding box, extraction run and supersession pointer
  • FieldHistory as an append-only log — every value a field has ever held, with actor and reason
  • ValidationResult per rule per run, retained even when it passes
  • VendorProfile with a layout embedding and a set of accepted exemplars for few-shot retrieval
  • ApprovalChain and ApprovalStep, evaluated against document value and tenant policy
  • PostingAttempt with an idempotency key, so a retried accounting push cannot duplicate a bill
Integrations
  • Xero and QuickBooks Online
  • Generic CSV/Excel export mapped to your ERP's import format
  • Outbound webhooks on extraction complete, approved, and posted
  • IMAP/Graph mailbox intake
  • SFTP and watched-folder intake
  • REST API with API-key authentication and per-key rate limits
Deployment topology

Containerised, deployable to your cloud account or ours. For firms with data-residency obligations the whole stack — including the model endpoint, via a regional provider — can be pinned to a single jurisdiction. Documents can be configured to be purged after a retention window while the extracted data and audit trail are retained.

Notable engineering decisions

The trade-offs we made, and why

This is the section that separates a system somebody built from a system somebody screenshotted.

Why LLM extraction rather than template OCR

Template-based extraction is genuinely better than a language model on the vendors it has been configured for. It is faster, cheaper, deterministic, and it never invents anything. If you process documents from eleven vendors and that list never changes, do not buy this — buy a template engine and be happier.

The problem is the long tail. Real accounts-payable document mixes have hundreds of issuers, a steady trickle of new ones, and layouts that change without notice. Each new vendor is a configuration task, and — worse — a layout change on an existing vendor is a silent failure: the template still matches something, it just matches the wrong region. The failure mode of template OCR is confidently wrong data with no signal attached.

Language models generalise across layouts they have never seen, which is precisely the capability the long tail needs. Their failure mode, though, is also confidently wrong data — so the engineering problem is not “use a model”, it is “make the model’s uncertainty legible and make its arithmetic checkable”.

That is what the rest of the pipeline is for, and it is where most of the code is.

Making hallucination risk structural rather than hopeful

Prompting a model to “be accurate” is not a control. Three mechanisms do the actual work:

Schema constraints. Extraction requests a strict output schema — typed fields, required keys, enumerated currencies. Anything that does not conform is rejected and retried rather than parsed leniently. This eliminates a whole class of downstream failure where a malformed date or a stray currency symbol propagates into the ledger.

Grounding to source regions. Every extracted value must be locatable in the document’s text-and-layout representation. A field the model returns that cannot be tied back to a region on the page is not treated as an extraction — it is treated as a guess, scored low, and routed to review. This is the single most useful signal in the system, because it catches the specific failure where a model fills in a plausible value for a field that is simply absent from the document.

Independent arithmetic validation. Sums, tax rates and date ordering are checked by ordinary code that has no knowledge of what the model thought. A document where every field scored high confidence but the line items do not sum to the stated total is more suspicious than one with a couple of low-confidence fields — and the queue ranks it accordingly.

Confidence, in other words, is not the model’s self-reported certainty. It is a composite of how well the value is grounded in the page, whether the field is one this vendor usually has, and whether the document’s internal arithmetic closes.

Vendor learning through retrieval, not fine-tuning

The obvious way to improve accuracy on a client’s specific vendors is to fine-tune. We deliberately do not, for three reasons: it couples accuracy improvements to a training cycle measured in days, it makes per-tenant data separation much harder to guarantee, and it makes any given extraction impossible to explain after the fact.

Instead, every accepted extraction becomes a retrievable exemplar. A new document is fingerprinted by layout and issuer, the nearest accepted exemplars from that tenant are retrieved, and they are supplied as few-shot context. The effect on the second and subsequent documents from a vendor is substantial, it takes effect immediately rather than after a training run, and the tenant boundary is a WHERE clause rather than a promise about a model’s weights.

It also degrades gracefully. A vendor seen for the first time gets zero-shot extraction — which works, just with lower confidence and more review — rather than failing outright the way an unconfigured template would.

PII, residency, and what we do not keep

Invoices carry bank details, addresses, and sometimes personal names. The handling rules are boring on purpose:

  • Originals are encrypted at rest and hash-linked to every record derived from them.
  • Documents can be configured to purge after a retention window while the extracted data and the audit trail remain, so a firm can meet a “delete the source after 90 days” obligation without losing its books.
  • The public demo on this site stores nothing at all. The uploaded file exists in memory for the duration of the request and is never written to disk or to a log.
  • Where a client has a residency obligation, the whole stack including the model endpoint can be pinned to one jurisdiction — this constrains which models are available, and we say so before it becomes a surprise.

The number that actually matters

Not accuracy. Straight-through processing rate — the proportion of documents that clear every threshold and every validation rule without a human touching them.

Accuracy is easy to quote and hard to interpret, because it depends entirely on the document mix it was measured against. Straight-through rate is the number that converts directly into cost per document and headcount, and it is the number that goes up over the first few weeks of a deployment as the vendor corpus fills in. It is the primary metric on the analytics dashboard for that reason, and it is what we measure on a sample of your real documents during discovery, before either side has committed to anything.

Demo access and customisation

See it running

There is a live extraction demo on this page and on the homepage. It runs on the same pipeline, rate-limited, with no storage — uploaded files are held in memory for the duration of the request and never written to disk.

Deploy as-is, or fit it to your process

As-is
4–6 weeks
Customised
10–16 weeks

The extraction pipeline is the part that transfers unchanged. What is always bespoke is the validation rule set, the accounting mapping, and the approval chain — because those encode your firm's actual controls, and getting them wrong is worse than not automating at all.

FAQ

Invoice Extraction — questions we get asked

  • How accurate is it?

    On clean, text-layer PDFs from vendors the system has seen before, header fields extract reliably enough to run straight-through above a confidence threshold; line items are harder and phone photos of crumpled receipts are harder still. We do not publish a single accuracy number, because a number quoted without the document mix it was measured on is marketing rather than information. What we do instead is run a sample of your real documents during discovery and give you the measured rate on your own corpus before you commit.

  • What stops the model from inventing a number that is not on the document?

    Three things, in layers. The model is constrained to a strict output schema, so it cannot return a shape we did not ask for. Every extracted field must be traceable to a region of the source document, and fields that cannot be located score low. Finally, arithmetic validation runs independently of the model — line items must sum to the subtotal and the totals must close. A hallucinated figure that survives all three is rare, and it lands in the review queue rather than in your ledger.

  • Do you train a model on our documents?

    No. Your documents are not used to train any model. Corrections improve accuracy through retrieval — accepted examples from your own tenant are supplied as context for future documents from the same vendor — and that context never leaves your tenant.

  • What does it cost to run per document?

    Model spend per document is small — typically a fraction of a cent to a few cents depending on page count and whether OCR is needed — and it is metered per tenant so you can see it. The economics only work if straight-through processing is high, which is why the analytics track it as the primary metric rather than as a vanity number.

  • Can it run entirely inside our infrastructure?

    The pipeline, storage and application can. The language model is the exception — that requires either an API provider or self-hosted open-weight models, which trade some extraction quality for full control. We will tell you honestly which side of that trade your document mix falls on.

  • What happens to documents that fail extraction entirely?

    They land in an exception queue with the failure reason attached, and a reviewer keys them manually inside the same interface — with the same audit trail as an automated extraction. There is no path where a document silently disappears.

Book a walkthrough of Invoice Extraction.

We will show you the working system, tell you honestly what would need changing for your operation, and give you a range before you commit to anything.

30 minutes · We reply within one business day.

WhatsApp Book a call