Expense Report Audit Skill

Approving expense reports by eye misses the same charge in two reports, a client dinner two people both claimed, and a meal split into two charges to stay under the limit. This checks every line against your policy and writes neutral questions for the approver.

Expense Report Audit Skill cover

What it catches

SituationCodeLevel
Same person, date, merchant and amount (also across reports)duplicate_expensehigh
Two people claimed the same chargeclaimed_by_two_peoplehigh
Over the policy limit (meals per person per day using attendees, lodging per night, per-line caps)over_limithigh
Several charges at one merchant on one day, each under the limit, together over itsplit_chargehigh
Mileage claimed above miles x the rate for that date (2026 IRS: 72.5 cents to Jun 30, 76 cents from Jul 1)mileage_over_ratehigh
No receipt over the threshold (default 75)missing_receiptnormal
Restricted words (alcohol, gift card, minibar...)restricted_itemnormal
Group meal with no business purposemissing_purposenormal
Submitted more than 60 days after the expenselate_submissioninfo
Weekend spend (not travel)weekend_expenseinfo
Whole-dollar meal or ride amountsround_amountinfo

Proven on a labeled example

examples/ridgeline-october/ is a fictional software company's October: 19 expense lines from 4 people with 15 planted findings (toner bought once and claimed in two reports, a client dinner claimed by two employees, a dinner split into two charges, a hotel night over the cap, mileage above the IRS rate, a gift card, a bar tab, an August car rental submitted in October and more). expected.json labels what a careful approver would question; the tests assert the tool reaches exactly that in any row order, that the mileage rate follows the expense date, that your policy file overrides the defaults, and that a clean report exits 0.

What you get

Outputs in out/: findings.csv (priority order), employees.csv (lines, total and findings per person), report.md, summary.json. Exit 0 = no high findings; 1 = at least one; 2 = an input problem (the message says which flag fixes it).

Real Expense Report Audit Skill report and passing tests from the labeled example

Quick start

./run_tests.sh
python3 -m expaudit --expenses examples/ridgeline-october/expenses.csv --name "Ridgeline Software" --out out/
python3 -m expaudit --expenses x.csv --show-policy > policy.json   # edit limits, then pass --policy policy.json

Inputs

  • Expense lines CSV: employee, date, amount, plus merchant, category, receipt (Y/N or a URL), miles, business purpose, submitted date and attendees when you have them (Expensify, Ramp, Brex, Concur, Zoho Expense or QuickBooks exports; map odd headers with --map merchant="Vendor Name").
  • Optional policy JSON: per-category limits, category names, receipt threshold, mileage rates, restricted words, late-submission days. --show-policy prints the defaults to start from.

Use it from your agent

  • Claude Code plugin: this folder is a plugin (.claude-plugin/plugin.json). Try it with claude --plugin-dir ./expense-report-audit-skill, or add the folder to your own plugin marketplace.
  • Skill only: copy skills/expense-audit/ into ~/.claude/skills/ (or your agent's skills folder) and keep this folder where the agent can run python3 -m expaudit.
  • No agent: the CLI works on its own; --help lists every flag.

Honest limits

  • It audits lines against the policy you give it; it doesn't read receipt images or check them against the line.
  • Lodging is checked per line (one line per night). Meals use the attendees column for per-person limits.
  • Mileage defaults are the 2026 IRS business rates; change them in the policy for other years or countries.
  • Findings are questions, not decisions. A weekend dinner on a trip is normal; the approver decides.
  • It never rejects, approves or edits reports. Not tax, legal or HR advice.

Requirements

Python 3.9+ (tested on 3.10 and 3.13), no dependencies.

Format and license

Zip, 16 KB, v1.0, 13 files. Use and modify it for yourself and for clients you serve; no resale or redistribution of the kit itself. Full terms in LICENSE.txt.

FAQ

Expensify / Ramp / Concur exports?
Yes, any CSV export.
Does it read receipt images?
No; it checks whether a receipt is attached.
Is it an HR tool?
No; it writes neutral questions for the approver and never accuses anyone.
How do I get the files?
Right after payment, Stripe’s confirmation page shows your download link.
Refunds?
Email hello@youraitools.co within 14 days if it doesn’t work and we can’t fix it.
Can I pay with crypto?
Yes. Pay the same price in USDC or USDT on Base, Ethereum, Arbitrum, Optimism, Polygon or Solana from the "Pay with crypto" button, with no account or KYC. We check the payment on-chain and show your download links as soon as it confirms.

Get Expense Report Audit Skill

Audit expense reports against your policy: duplicate and split charges, over-limit meals and hotels, missing receipts, mileage over the IRS rate. Offline. $19.

Save with a bundle

Pairs well with

Download$12

QuickBooks Online Journal Entry Import Checker

Check a journal entry CSV before importing it into QuickBooks Online: unbalanced entries, rejected account names, A/R and A/P lines with no name. $12.

View QuickBooks Online Journal Entry Import Checker
Download$29

Rent Roll Analysis Skill

Rent roll analysis in one command: occupancy, loss-to-lease, delinquency, lease expirations and the data errors that break underwriting. $29, offline.

View Rent Roll Analysis Skill
Download$29

CAM Reconciliation Skill

CAM reconciliation for every tenant: pro-rata shares, gross-up, caps, admin fee, base-year stops, statements that foot. $29 once, offline.

View CAM Reconciliation Skill

Related