Turn a pile of supplier invoices, bills and receipts (PDFs, scans, phone photos) into a checked spreadsheet: one row per document, one row per line item, and a short list of the ones a human should look at.
Setting up the n8n version? Open setup-page/index.html (in this download). It fills the workflow settings in your browser, then Test it checks your n8n for free and can read one sample, with a plain fix for any failure. About 15 minutes (an estimate). Something stopped working? on the same page reruns the check later.
Two ways to run it, same checks in both:
| Claude skill | n8n workflow | |
|---|---|---|
| Good for | Monthly batches you hand to Claude ("here are October's bills") | Hands-off: an upload form, a webhook, or Gmail attachments, straight into Google Sheets |
| Reads the documents | Claude (in your Claude account) | OpenAI, with your own API key |
| Output | invoices.xlsx, invoices.csv, line_items.csv, review.md |
Invoices and Line items tabs in your Google Sheet, a review email, a JSON reply |
| Folder | skills/invoice-receipt-extractor/ |
n8n/ |
What gets checked (both versions)
- Quantity x unit price = line amount, and the lines add up to the subtotal.
- Subtotal - discount + shipping + tax = the printed total. When the supplier's own total is wrong, you see the exact difference.
- Tax lines add up to the tax total (CGST + SGST, multiple VAT rates). Prices that already include VAT are handled.
- Dates:
10/09/2026is read using the other date on the same document (a due date of10/23/2026proves month-first). If nothing proves the order, the document goes to review instead of being guessed. - Amount formats:
1,234.50,1.234,56 €,₹1,07,280.00,(12.00). - Currency is a real ISO code; the tax ID looks like a GSTIN, EU/UK VAT number, EIN or ABN (a warning only).
- Duplicates: same supplier + invoice number (or supplier + date + total when there's no number) within the batch, and against your existing ledger or sheet. A re-sent PDF or a scan of a bill you already have is caught.
- Anything the reader wasn't sure about goes to review.
Every document ends up ok or review with the reasons in plain words. Nothing is silently "corrected".
What you need
- For the Claude skill: a Claude plan with code execution (claude.ai), or Claude Code, or the Claude API.
- For the n8n workflow: n8n (Cloud or self-hosted), your own OpenAI API key, a Google account, and optional SMTP email.
5-minute setup
This is the Claude skill on claude.ai. The n8n version takes about 15 minutes; follow n8n/SETUP.md.
- In claude.ai, open Settings, then Capabilities, and turn on code execution.
- Open Customize, then Skills. Click the plus button and choose Upload a skill.
- Pick
claude-ai-uploads/invoice-receipt-extractor.zipfrom this download. - Start a new chat. Drop in the files from the
samplesfolder. - Ask: "Extract these invoices into a spreadsheet and tell me which ones need checking."
- You get a spreadsheet and a review list. The sample with the wrong total and the re-sent copy should be on the review list.
Using Claude Code instead? Copy the skills folder into ~/.claude/skills/, or install it as a plugin (see below).
Setup: Claude skill
Claude Code
unzip oarsman-invoice-receipt-extractor-v1.0.3.zip
cp -r oarsman-invoice-receipt-extractor/skills/* ~/.claude/skills/
or as a plugin: claude plugin marketplace add ./oarsman-invoice-receipt-extractor then claude plugin install oarsman-invoice-receipt-extractor@oarsman-invoice-receipt-extractor.
claude.ai (code execution on: Settings > Capabilities): Customize > Skills > + > Upload a skill, and upload claude-ai-uploads/invoice-receipt-extractor.zip.
Claude API: upload the skill folder with the Skills API and use it with the code-execution tool. The scripts use only the standard library plus openpyxl/pdfplumber, which the sandbox already has.
Then drop your files in a chat and ask: "Extract these invoices into a spreadsheet and tell me which ones need checking." To catch bills you already entered, also attach last month's invoices.csv and say so.
Quick start: n8n
See n8n/SETUP.md. About 15 minutes: make the sheet, import the JSON, fill in one settings node, connect OpenAI, Google Sheets and SMTP, publish.
Try it on the samples first
samples/ has 8 made-up documents: US, German and Indian GST invoices, one with a wrong printed total, one re-sent copy, one scanned copy, a UK café receipt (VAT included) and a crumpled fuel receipt photo. Ask Claude to run the skill on that folder, or run the tests:
cd oarsman-invoice-receipt-extractor
python3 tests/run_tests.py
You should see 34/34 checks passed. python3 tests/robustness_tests.py should show 2/2 (needs pypdf). Our own run, and the n8n run, are written up in TESTS.md.
AI disclosure and limits
- Reading is done by an AI model (Claude, or OpenAI in n8n). Models misread things, especially blurry photos and handwriting. The checks catch most arithmetic misreads, but not, for example, a wrong supplier name or a misread line description. Look at the review list, and spot-check new suppliers.
- Our tests use synthetic documents we generated, so they prove the scripts, the checks and the workflow wiring. They don't measure how well a model reads your real invoices.
- It is data entry, not accounting or tax advice. It doesn't post anything to your accounting software.
- Multi-page invoices work when the model is given the whole PDF (both versions do this), but our samples are one page each.
- Real-world test (v1.0.1, see
tests/REAL-WORLD-QA.md): on a public sample invoice, a rotated copy, a password-protected copy, a scanned copy and a 22-page non-invoice PDF, the no-AI scripts never marked a wrong document as ok. Every one went to review or was reported as unreadable. The quick draft (prefill.py) missed the tax line and the line items on the real invoice; the AI reader has to fill those in. Rotated pages give a poor draft. - Not tested: reading accuracy of a real AI model on real invoices, photos or handwriting. That needs a paid API, so it is not measured yet.
- Password-protected PDFs cannot be read. You will be asked for an unlocked copy.
What's in the folder
skills/invoice-receipt-extractor/ SKILL.md, scripts/ (doctext, prefill, validate, numparse), assets/schema.json, references/fields.md
n8n/ invoice-receipt-extractor.workflow.json, SETUP.md, sheet-template/, canvas.png (what it looks like after import)
claude-ai-uploads/ the skill as a single zip for claude.ai
samples/ 8 synthetic documents, ground_truth/, reference_reads/
tests/ run_tests.py (skill), n8n/ (workflow test harness and results)
expected/ the files our test run produced
dev/ validate_core.js (the n8n validator, shared with the tests), build_workflow.py
Built by Oarsman AI's AI agents and checked against the test report in TESTS.md. Support is self-serve: this README, n8n/SETUP.md and TROUBLESHOOTING.md. There is no call, chat or email support. Fixes ship as new versions at the same download link.