Work / AI Agents / Invoice Intake Agent
Invoice Intake Agent Checks it. Asks a person when unsure.
Reads supplier invoices, checks them against purchase orders and receipts, and sends anything doubtful to a person. This page shows what it does and how it is built. Every real engagement is fitted to your documents, systems and rules.
| Invoice | Result | Why |
|---|---|---|
| INV-0042 | Matched | Maths, PO and receipt agree |
| INV-0043 | Needs a person | Bank account differs from the last one |
| INV-0044 | Needs a person | Billed more than the purchase order |
| INV-0045 | Matched | Maths, PO and receipt agree |
How one invoice travels through it.
A file goes in on the left. Every step saves what it found, so a person can see how any result came about.
Where an invoice can be, and where it can go next.
Only the arrows shown are allowed. Every move writes a line to the audit log. A correction sends an open invoice back through the checks.
Five parts, and one seam for the model.
A web app and an API for people, a worker for the slow jobs, a database, and a single interface to the language model, so it can be swapped or replaced by recorded answers in tests.
The parts that do the work.
Seven invoice checks
Line maths, totals, tax, dates, currency, supplier, bank account. A check that cannot be done is shown as "could not check", never as a pass.
Duplicates
Has this invoice, or this file, been received before. Caught before anyone approves it.
Three-way match
The invoice against the purchase order and the receipt, line by line, so over-billing shows up.
One exception per check
Each failed check becomes one exception with the real numbers in its explanation, and a next step for the reviewer.
Written down first, then enforced in code.
- It never pays anyone or moves money. It prepares, checks, explains and routes. People approve.
- The audit log is append-only. The database refuses updates, deletes and truncation.
- Bank details are stored encrypted and compared by keyed hash, so the plain number is never needed to compare.
- Uncertain means empty. If a value cannot be read with confidence, it is left blank and sent to a person.
- Money is whole cents, never decimals. No rounding surprises.
Plain parts, chosen to be swapped.
Python (FastAPI) API and worker · Next.js review screens · PostgreSQL · one interface to the language model
Where your data lives, and which model ever sees it, is your decision. We design to it.
Invoices, bank details and the audit log sit in your own PostgreSQL and file storage. The language model is behind a single interface, so it can be a hosted model in a region you choose, or one running on your own hardware so invoices never leave your network.
- In your own cloud account, in the region you name.
- On your own servers, with nothing in our hands.
- With a language model that runs on your hardware, so no data goes to an AI provider.
- With a hosted model in a region you approve, under the terms you choose.
Australia
The Privacy Act 1988 and the Australian Privacy Principles. Principle 8 covers sending personal information overseas: the sender stays accountable for how it is handled there. Some sectors and government work require data to stay onshore.
New Zealand
The Privacy Act 2020. Information privacy principle 12 limits disclosing personal information to a body outside New Zealand unless it is protected to a comparable standard or the person has agreed.
European Union
The GDPR. Moving personal data outside the EEA needs a legal basis for the transfer. Hosting and model endpoints inside the EU avoid the question.
United States
No single federal privacy law. State laws such as California’s CCPA, and sector rules such as HIPAA for health and GLBA for finance, decide what applies. Contracts often require US-only processing.
This is a summary to explain how we work, not legal advice. Your own counsel confirms what applies to you, and we build to what they decide. More on the privacy page.