Demo · synthetic data · Document operations
12 vendor PDFs in,checked rows out.
Demo. Every document here is fake and was made by us. The results come from one real run of claude-haiku-4-5-20251001 on Oct 12, 2026, saved and shown as they came back. Nothing on this page calls a model.
Inbox (demo)
Demo · synthetic data
| File | Vendor | Received | Status | Score |
|---|---|---|---|---|
| Quillfeather Supply Co. | Oct 1, 9:05 AM CT | Auto-approved | 100 | |
| Larkmoor Parts Ltd. | Oct 2, 10:40 AM CT | Auto-approved | 100 | |
| Brindlewick Freight | Oct 2, 4:20 PM CT | Auto-approved | 100 | |
| Quillfeather Supply Co. | Oct 5, 10:10 AM CT | Needs review | 40 | |
| Larkmoor Parts Ltd. | Oct 5, 2:30 PM CT | Needs review | 80 | |
| Quillfeather Supply Co. | Oct 6, 8:55 AM CT | Needs review | 40 | |
| Brindlewick Freight | Oct 6, 1:15 PM CT | Needs review | 85 | |
| Wrenfield Services | Oct 7, 11:00 AM CT | Needs review | 75 | |
| Larkmoor Parts Ltd. | Oct 7, 3:45 PM CT | Needs review | 85 | |
| Brindlewick Freight (fictional) | Oct 8, 10:25 AM CT | Auto-approved | 100 | |
| Unread | Oct 8, 2:50 PM CT | Extraction failed | n/a | |
| Larkmoor Parts Ltd. | Oct 9, 9:05 AM CT | Needs review | 40 |
Document detail (demo)
Demo · synthetic data
Supplies invoice
01-quillfeather-qs-1001.pdf
What was read
| Field | Value | Snippet the model quoted |
|---|---|---|
| Vendor | Quillfeather Supply Co. | Quillfeather Supply Co. (fictional) |
| Invoice number | QS-1001 | Invoice no. QS-1001 |
| Invoice date | 2026-09-14 | Invoice date: Sep 14, 2026 |
| Due date | 2026-10-14 | Due date: Oct 14, 2026 |
| PO number | PO-2026-0141 | PO: PO-2026-0141 |
| Subtotal | 304.30 | Subtotal $304.30 |
| Tax | 24.34 | Tax (8%) $24.34 |
| Total | 328.64 | Total due $328.64 |
| Line items | 3 | Nitrile gloves, case of 100 4 48.50 194.00 |
Checks
- passThe document is an invoice. Read as an invoice.
- passRequired fields present. Vendor, invoice number, date, total and line items found.
- passLine items add up to the subtotal. Lines add up to $304.30.
- passSubtotal plus tax equals the total. $304.30 + $24.34 tax = $328.64.
- passNot a duplicate of an earlier invoice. No earlier invoice with this vendor and number.
- passVendor is on the vendor list. On the vendor list (5010 Supplies).
- passPO number matches an open purchase order. PO-2026-0141 is an open PO.
- passTax rate between 0% and 12%. Tax rate 8.0%.
- passDue date after the invoice date, within 120 days. Due 30 days after the invoice date.
- passInvoice date is not in the future. Dated on or before the run.
- passEach value appears in the snippet the model quoted. Every value appears in the snippet the model quoted (a check of the model's own snippet, not the PDF text).
Score 100 of 100
Our arithmetic, not the model's opinion of itself: start at 100, take off each warning's points, and cap at 40 if any check fails. 90 or more with no fail is approved without a person; anything lower waits for review.
- 100 start
- = 100
Review queue (demo)
Demo · synthetic data
- Fail: Lines add up to $313.80, but the subtotal says $331.80.
- Warning: Tax rate 15.0% is outside 0% to 12%.
- Fail: Invoice QS-1001 from this vendor was already received.
- Warning: No PO number on the invoice.
- Warning: Wrenfield Services is not on the vendor list.
- Warning: Due date is 15 days before the invoice date.
- The model could not read the page.
- Fail: The model read this as a statement, not an invoice. Nothing is posted from it.
Rows (demo)
Demo · synthetic data
| Date | Vendor | Invoice no. | PO | Account | Description | Qty | Unit price | Amount | Tax | Currency | Source file | Doc status |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-09-14 | Quillfeather Supply Co. | QS-1001 | PO-2026-0141 | 5010 Supplies | Nitrile gloves, case of 100 | 4 | 48.50 | 194.00 | 15.52 | USD | 01-quillfeather-qs-1001.pdf | Auto-approved |
| 2026-09-14 | Quillfeather Supply Co. | QS-1001 | PO-2026-0141 | 5010 Supplies | Shop towels, pack of 25 | 6 | 12.25 | 73.50 | 5.88 | USD | 01-quillfeather-qs-1001.pdf | Auto-approved |
| 2026-09-14 | Quillfeather Supply Co. | QS-1001 | PO-2026-0141 | 5010 Supplies | Zip ties, 11 in, bag of 500 | 2 | 18.40 | 36.80 | 2.94 | USD | 01-quillfeather-qs-1001.pdf | Auto-approved |
| 2026-09-16 | Larkmoor Parts Ltd. | LP-2207 | PO-2026-0152 | 5020 Repair parts | Capacitor, 45/5 MFD | 3 | 21.90 | 65.70 | 4.11 | USD | 02-larkmoor-lp-2207.pdf | Auto-approved |
| 2026-09-16 | Larkmoor Parts Ltd. | LP-2207 | PO-2026-0152 | 5020 Repair parts | Contactor, 2-pole 30A | 2 | 34.75 | 69.50 | 4.34 | USD | 02-larkmoor-lp-2207.pdf | Auto-approved |
| 2026-09-18 | Brindlewick Freight | BF-5530 | PO-2026-0163 | 5300 Freight in | LTL freight, Demo City to warehouse | 1 | 286.00 | 286.00 | 0.00 | USD | 03-brindlewick-bf-5530.pdf | Auto-approved |
| 2026-09-18 | Brindlewick Freight | BF-5530 | PO-2026-0163 | 5300 Freight in | Liftgate delivery | 1 | 65.00 | 65.00 | 0.00 | USD | 03-brindlewick-bf-5530.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 1 (dock A) | 1 | 42.50 | 42.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 2 (dock B) | 2 | 49.75 | 99.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 3 (dock C) | 3 | 57.00 | 171.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 4 (dock D) | 1 | 64.25 | 64.25 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 5 (dock E) | 2 | 71.50 | 143.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 6 (dock F) | 3 | 42.50 | 127.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 7 (dock A) | 1 | 49.75 | 49.75 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 8 (dock B) | 2 | 57.00 | 114.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 9 (dock C) | 3 | 64.25 | 192.75 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 10 (dock D) | 1 | 71.50 | 71.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 11 (dock E) | 2 | 42.50 | 85.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 12 (dock F) | 3 | 49.75 | 149.25 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 13 (dock A) | 1 | 57.00 | 57.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 14 (dock B) | 2 | 64.25 | 128.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 15 (dock C) | 3 | 71.50 | 214.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 16 (dock D) | 1 | 42.50 | 42.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 17 (dock E) | 2 | 49.75 | 99.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 18 (dock F) | 3 | 57.00 | 171.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 19 (dock A) | 1 | 64.25 | 64.25 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 20 (dock B) | 2 | 71.50 | 143.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 21 (dock C) | 3 | 42.50 | 127.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 22 (dock D) | 1 | 49.75 | 49.75 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 23 (dock E) | 2 | 57.00 | 114.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 24 (dock F) | 3 | 64.25 | 192.75 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 25 (dock A) | 1 | 71.50 | 71.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 26 (dock B) | 2 | 42.50 | 85.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 27 (dock C) | 3 | 49.75 | 149.25 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 28 (dock D) | 1 | 57.00 | 57.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 29 (dock E) | 2 | 64.25 | 128.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 30 (dock F) | 3 | 71.50 | 214.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 31 (dock A) | 1 | 42.50 | 42.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 32 (dock B) | 2 | 49.75 | 99.50 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 33 (dock C) | 3 | 57.00 | 171.00 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
| 2026-10-01 | Brindlewick Freight (fictional) | BF-5550 | PO-2026-0185 | 5300 Freight in | Pallet move, stop 34 (dock D) | 1 | 64.25 | 64.25 | 0.00 | USD | 10-brindlewick-bf-5550.pdf | Auto-approved |
Dashboard (demo)
Demo · synthetic data
Documents
12
Auto-approved by the checks
4
Reviewed on this page
0
Waiting for review
8
Rows exported
41
Value approved
$4,620.54
Model cost for the whole run
$0.0711 (29,874 input, 8,245 output tokens)
Checks that did not pass
How many documents did not pass each check (a fail or a warning). One document can trip more than one.
- Due date after the invoice date, within 120 days: 1
- Line items add up to the subtotal: 1
- Not a duplicate of an earlier invoice: 1
- PO number matches an open purchase order: 1
- Tax rate between 0% and 12%: 1
- The document is an invoice: 1
- The page could be read: 1
- Vendor is on the vendor list: 1
Webhook (demo)
Demo · synthetic data
X-Demo-Signature
t=<unix seconds>,v1=<hex HMAC-SHA256 of `${t}.${body}` keyed with demo-key-not-secret>
demo-key-not-secret
Delivery log (simulated)
| Time | Document | Attempt | Result |
|---|---|---|---|
| Oct 12, 5:00 PM CT | 01-quillfeather-qs-1001.pdf | 1 | HTTP 500 failed · retry in 30s |
| Oct 12, 5:01 PM CT | 01-quillfeather-qs-1001.pdf | 2 | HTTP 200 delivered |
| Oct 12, 5:00 PM CT | 02-larkmoor-lp-2207.pdf | 1 | HTTP 200 delivered |
| Oct 12, 5:00 PM CT | 03-brindlewick-bf-5530.pdf | 1 | HTTP 200 delivered |
| Oct 12, 5:03 PM CT | 10-brindlewick-bf-5550.pdf | 1 | HTTP 200 delivered |
Payload for 01-quillfeather-qs-1001.pdf
X-Demo-Signature: t=1791842439,v1=40f224a1fdfc4dbe7fe8b2477154916a1cda1854b80059c2d8fd2f4f311420dc
{
"demo": true,
"event": "row.exported",
"doc": "01-quillfeather-qs-1001",
"rows": [
{
"date": "2026-09-14",
"vendor": "Quillfeather Supply Co.",
"invoiceNumber": "QS-1001",
"po": "PO-2026-0141",
"account": "5010 Supplies",
"description": "Nitrile gloves, case of 100",
"qty": 4,
"unitPrice": 48.5,
"amount": 194,
"tax": 15.52,
"currency": "USD",
"sourceFile": "01-quillfeather-qs-1001.pdf",
"docStatus": "auto_approved"
},
{
"date": "2026-09-14",
"vendor": "Quillfeather Supply Co.",
"invoiceNumber": "QS-1001",
"po": "PO-2026-0141",
"account": "5010 Supplies",
"description": "Shop towels, pack of 25",
"qty": 6,
"unitPrice": 12.25,
"amount": 73.5,
"tax": 5.88,
"currency": "USD",
"sourceFile": "01-quillfeather-qs-1001.pdf",
"docStatus": "auto_approved"
},
{
"date": "2026-09-14",
"vendor": "Quillfeather Supply Co.",
"invoiceNumber": "QS-1001",
"po": "PO-2026-0141",
"account": "5010 Supplies",
"description": "Zip ties, 11 in, bag of 500",
"qty": 2,
"unitPrice": 18.4,
"amount": 36.8,
"tax": 2.94,
"currency": "USD",
"sourceFile": "01-quillfeather-qs-1001.pdf",
"docStatus": "auto_approved"
}
],
"signature": {
"header": "X-Demo-Signature",
"scheme": "t=<unix seconds>,v1=<hex HMAC-SHA256 of `${t}.${body}` keyed with demo-key-not-secret>",
"key": "demo-key-not-secret"
}
}Audit log (demo)
Demo · synthetic data
01-quillfeather-qs-1001.pdf
- Received 01-quillfeather-qs-1001.pdf (1 page).
- Extracted by claude-haiku-4-5-20251001, prompt v1, 2336 in / 607 out tokens, $0.0054.
- PASS · The document is an invoice: Read as an invoice.
- PASS · Required fields present: Vendor, invoice number, date, total and line items found.
- PASS · Line items add up to the subtotal: Lines add up to $304.30.
- PASS · Subtotal plus tax equals the total: $304.30 + $24.34 tax = $328.64.
- PASS · Not a duplicate of an earlier invoice: No earlier invoice with this vendor and number.
- PASS · Vendor is on the vendor list: On the vendor list (5010 Supplies).
- PASS · PO number matches an open purchase order: PO-2026-0141 is an open PO.
- PASS · Tax rate between 0% and 12%: Tax rate 8.0%.
- PASS · Due date after the invoice date, within 120 days: Due 30 days after the invoice date.
- PASS · Invoice date is not in the future: Dated on or before the run.
- PASS · Each value appears in the snippet the model quoted: Every value appears in the snippet the model quoted (a check of the model's own snippet, not the PDF text).
- Routed to auto-approved with score 100.
- Exported 3 rows.
- Webhook attempt 1: HTTP 500, retry in 30s (simulated delivery).
- Webhook attempt 2: HTTP 200 (simulated delivery).
What this demo proves.
The problem
Bills arrive as PDFs in an inbox. Someone retypes them, and a wrong total or a bill paid twice shows up a month later, if at all.
What is built
A model reads each PDF into fixed fields and quotes where it found each one. Fixed rules check the math, the vendor, the PO and the dates. Our score, not the model's, decides: clean bills post, anything off waits for a person. Approved bills become rows, a signed webhook, and a log you can read.
Nothing that fails a check sends without your OK
A failed check, a low score or an unreadable page never posts. It waits in the review queue with the reason in plain words.
For your bills
A real setup swaps in your inbox, your vendor list and account codes, and your accounting system in place of the demo table. The checks and the review step stay.
What it is not
A product you can upload to. Visitors can't send files here, and no client uses this demo. The snippet check only compares each value with the snippet the model quoted, not with the PDF's own text.
- Next.js
- TypeScript
- Claude (Anthropic API)
- Zod
- React PDF
- Vitest
- Playwright
Sample documents generated by STWLTH, a trade name of MXLIS1040 LLC. Every vendor, address and number in them is fictional.
Want this for your bills.
Two or three sentences is plenty: the launch, the system, the thing still done by hand. You'll hear back from the founder, not a sequence.