A receipt is the worst possible input format. Crumpled paper, faded thermal print, foreign currency, a card terminal that rounded the gratuity, a hotel folio that bundled six different categories under one room number. Thatās why expense reporting takes hours. Not because the math is hard, because the data is ugly, and ugly data is what AI is genuinely good at cleaning up, if you give it the right four prompts in the right order.
The mistake most people make is asking AI to ādo the expense reportā in a single shot. Thatās the prompt that produces a slightly-wrong table you canāt actually file. The version that works runs in stages, and each stage has a specific job.
Stage 1: extract, donāt summarise
Before any totalling or categorising, get clean data out of the receipts. Use Expensify or Ramp for the auto-OCR if your company has them; otherwise photograph everything, drop the images into ChatGPT (which reads images natively on the paid tier) or Claude, and run:
āIām uploading [N] receipts from a business trip. For each one, extract the following fields into a single row of a CSV-style table. Use āunclearā if a field is illegible rather than guessing.
Columns: receipt_id (number them 1, 2, 3), date (YYYY-MM-DD), vendor, location (city/country), currency, subtotal, tax, tip, total, payment_method (last 4 digits if visible), category (your best guess: meals, lodging, transit, ground_transport, supplies, other).
Output the table only, no commentary. After the table, list any receipts where total fields donāt add up (subtotal + tax + tip ā total), and any where the date or vendor was unclear.ā
The āunclearā instruction is the load-bearing one. Without it, the model invents plausible values. With it, you get a list of receipts to manually verify, which is exactly the work you wanted help finding.
Stage 2: convert and reconcile
Now you have a table, but the currencies are mixed and the categories are guesses. Drop the table back in:
āHereās the extracted receipt table.
- Convert all foreign-currency amounts to [HOME CURRENCY] using the exchange rate on each transaction date. Show both the original amount and the converted amount, with the rate used.
- Re-check the categories against this policy list: [PASTE COMPANY EXPENSE CATEGORIES, EXACTLY AS THEY APPEAR IN YOUR FINANCE SYSTEM].
- Flag any line where the category is ambiguous (e.g. an airport meal could be āmealsā or ātransit-incidentalsā depending on policy).
- Flag any duplicate that looks like a charge thatās been reimbursed twice (same vendor, same day, same amount, different receipt ID).
Donāt change any totals or dates. Output the updated table with two new columns: amount_home and category_flag.ā
The duplicate check is the unsexy line that pays for itself the first time it catches a hotel folio that was also charged to the corporate card directly.
Stage 3: the policy sanity check finance teams love
Now run the table against your companyās expense policy. Your finance team has one. Find it, paste it.
āHereās the reconciled table. Hereās the company expense policy:
[PASTE FULL POLICY, OR THE PARAGRAPHS COVERING PER-DIEM CAPS, ALCOHOL RULES, CLIENT ENTERTAINMENT, AND MILEAGE]
For each line in the table, mark policy_status as ācompliantā, āover_capā, ārequires_approvalā, or āreviewā. Add a one-sentence reason for any non-compliant line. Donāt reject lines that are clearly business expenses just because theyāre at the upper end of a cap; flag them for review with a note.
Then summarise the report in three lines: total submitted, total compliant, total flagged for approval.ā
This is the stage your finance team didnāt know they wanted. An expense report that arrives pre-flagged against policy is the one that gets approved that day instead of bouncing back twice.
Stage 4: format for filing
Finally, the output. Your company probably uses Concur, Expensify, Ramp, or a spreadsheet template. Donāt ask AI to fill in the corporate tool, ask for the data in the exact shape that tool wants:
āOutput the final reconciled, policy-checked table as a CSV with these column headers in this order: [PASTE THE EXACT HEADERS YOUR TOOL EXPECTS]. Use ISO date format. Round amounts to 2 decimal places. Quote any free-text field that contains commas. Donāt include flagged-for-review lines in the main table; put them in a second table at the bottom labelled āPending reviewā.ā
Now the CSV pastes cleanly into whatever youāre filing into. No reformatting, no manual cleanup.
The OCR errors that trip up every shortcut
A few patterns to watch for, because they will cost you if you donāt:
- Decimal commas vs decimal points. A receipt from Germany reading ā12,50 EURā will be read by some models as 1,250 EUR. Always check totals on European receipts.
- The ā8ā / āBā mix-up on faded thermal print. Subtotals that donāt add up by a digit are usually this.
- Dates in DD/MM/YYYY vs MM/DD/YYYY. A 03/04 receipt from a US trip is March 4. From a UK trip, April 3. Always specify the tripās region in the prompt.
- Tip captured twice. If a card terminal printed the tip on the slip and the cardholder also wrote it in by hand, OCR sometimes reads both. Cross-check with your card statement.
The flagging instructions in the Stage 1 prompt catch most of these, but a 30-second human eyeball pass before you submit is non-negotiable. The model is helping you do the work, not replacing the audit trail.
A counterintuitive observation
The single highest-value prompt in this whole workflow isnāt the categorisation or the math. Itās the policy check in Stage 3. Most expense reports get held up not because totals are wrong but because somebody bought a $14 airport beer that the company doesnāt reimburse and nobody noticed until the second review. A policy-check prompt that flags it before you submit means the conversation with your exec happens upfront (āthe dinner was $214, policy caps unaccompanied dinners at $150, do you want to absorb it or claim it as client entertainment with a note?ā) instead of two weeks later when finance bounces the report.
What the tool stops doing for you
Two things, and they matter. AI is not signing your name. AI is not deciding which expenses get attributed to which client matter or cost centre when the receipts are ambiguous. Both of those still need a human who understands the trip. The promise is that the four hours you used to spend on transcription and reconciliation drop to maybe 30 minutes, and the part of expense work that requires actual judgement gets the attention it should have had all along.
The executive assistants who file expense reports in 30 minutes arenāt using one magic tool. Theyāre chaining four prompts and trusting the policy-check step to catch what humans miss when theyāre tired.