Turn a stack of invoice PDFs and receipt photos into one clean spreadsheet — vendor, date, line items, tax, total — with a reconciliation column that proves nothing was misread, so the hour of retyping becomes ten minutes of checking.
Tier: Core · Hands-on time: ~30 minutes · Tools: ChatGPT, Claude, Google Sheets
Manual invoice entry is the purest form of office drudgery: high volume, zero judgment, and one transposed digit away from a payment dispute. Models read documents well enough to do the typing — but "well enough" is not "always right", which is why this recipe's centrepiece is a reconciliation column that makes every extraction self-auditing.
And when not to:
Batch the documents and define your columns (5 minutes). Decide the exact columns once: file name, vendor, invoice/receipt no., date, currency, subtotal, tax, total, category, line items. Work in batches of five to ten documents — small enough to check, large enough to be worth it. Blank out or crop anything the sheet doesn't need, especially bank account details.
Extract with a strict schema and an uncertainty rule. Upload the batch to ChatGPT or Claude with this prompt:
Extract data from each attached invoice/receipt into ONE table with
EXACTLY these columns:
file name | vendor | doc number | date (YYYY-MM-DD) | currency |
subtotal | tax | total | line items (item: amount; ...)
Rules:
- Copy values EXACTLY as printed. Do not round, convert currencies,
or normalise vendor names.
- If a field is missing or unreadable, write UNCLEAR — never guess.
A wrong number is far worse than a blank.
- One row per document. Dates reformatted to YYYY-MM-DD only when
the printed date is unambiguous; otherwise UNCLEAR.
- After the table, list any document where the printed total does
not equal subtotal + tax, or where line items do not sum to the
subtotal, with the amounts you read.
Output the table as tab-separated values so I can paste it into
Google Sheets.
A good output ends like this:
acme-0312.pdf Acme Supplies Ltd INV-88213 2026-03-12 USD
412.50 33.00 445.50 toner: 180.00; paper A4 x10: 232.50
Checks:
- officehub-receipt.jpg: line items sum to 96.00 but printed
subtotal reads 99.00 — possible misread of item 2, flagging.
- parkfee.jpg: date UNCLEAR (print faded).
Paste into Sheets and add the reconciliation column (5 minutes). Paste the TSV into Google Sheets. Add one column: =IF(ROUND(F2+G2,2)=ROUND(H2,2),"OK","MISMATCH") — subtotal plus tax must equal total. Add a second if you extracted line items: their sum versus subtotal. These formulas are the proof layer: the model read three numbers per document that must be arithmetically consistent, so a misread almost always surfaces as a MISMATCH.
Check every MISMATCH and UNCLEAR against the source (8 minutes). Open only the flagged documents — that is the whole time saving. A MISMATCH means either the model misread a digit (fix the cell) or the document itself is wrong (flag it to the vendor or finance — you just caught a real error, which happens more often than you'd expect). Spot-check two unflagged rows too; consistency checks catch most errors, not all.
Standardise and hand off. One last pass in the chat if needed: "Here is my vendor column — map each to this master vendor list, exact matches only, UNCLEAR otherwise." Then the sheet is ready for the tracker, the expense claim, or an import. Keep the source files attached or linked — an extraction without its source is an assertion, not a record.
doc number detection (=COUNTIF(C:C,C2)>1) catches the same invoice extracted twice — a paste-twice error no model will notice for you.Invoices carry bank account details, tax IDs, and addresses. Use your organisation's approved AI tenant, crop or redact bank details before upload where you can, and never use extracted banking data to change payment details — verified change-of-bank processes exist precisely because invoice fraud does.
Save the step-2 prompt with your exact column list as a reusable snippet. The value compounds when every batch, every month, lands in an identical schema — that is what makes the sheet importable, pivotable, and trusted.