How Executive Assistants Are Using AI to Finally Tame Expense Reports

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.

  1. 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.
  2. Re-check the categories against this policy list: [PASTE COMPANY EXPENSE CATEGORIES, EXACTLY AS THEY APPEAR IN YOUR FINANCE SYSTEM].
  3. Flag any line where the category is ambiguous (e.g. an airport meal could be ā€˜meals’ or ā€˜transit-incidentals’ depending on policy).
  4. 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.