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.
View Expense Report Audit Skill
The same invoice paid twice, a vendor set up twice, two vendors paid into one bank account, a vendor that shares an employee's account: find them in your own vendor master and payment history before an auditor does.

| Situation | Code | Level |
|---|---|---|
| Same invoice paid twice (normalizes INV-0778 / INV778 / inv 778) | duplicate_payment | high |
| Same vendor and amount within 7 days under different invoice numbers, or one invoice paid to two vendor records | possible_duplicate_payment | high |
| Two vendor records with one tax ID | duplicate_tax_id | high |
| Vendors paid into the same bank account | shared_bank_account | high |
| Vendor bank account, address or phone matches an employee (needs --employees) | vendor_matches_employee | high |
| Payment to a vendor marked inactive | paid_inactive_vendor | high |
| Payment to a payee not in the vendor master | paid_unknown_vendor | high |
| Near-identical vendor names (Inc./LLC/punctuation ignored) | similar_vendor_name | normal |
| Different vendors at one address / one phone (St vs Street, Ste vs Suite normalized) | shared_address / shared_phone | normal |
| Active vendor with no tax ID | missing_tax_id | normal |
| Payment within 5% under the approval limit (--threshold) | just_below_threshold | normal |
| PO box as the only address | po_box_only | info |
| Round thousands | round_amount | info |
| Paid on a weekend | weekend_payment | info |
examples/lakeside-dental/ is a fictional dental group: 10 vendors, 2 employees and 13 October payments with 18 planted findings (a vendor set up twice that got the same invoice paid twice, an invoice re-keyed with a leading zero, two vendors sharing a bank account, a vendor paid into an employee's account, payments just under the 5,000 limit, an inactive vendor still being paid and more). expected.json labels what an AP auditor would flag; the tests assert the tool reaches exactly that in any row order, that no full bank account or tax ID appears in any output, and that clean files exit 0.
Outputs in out/: findings.csv (priority order, high first), report.md, summary.json (including the total of possible duplicate payments). Exit 0 = no high findings; 1 = at least one high finding; 2 = an input problem (the message says which flag fixes it).

./run_tests.sh
python3 -m vendoraudit --vendors examples/lakeside-dental/vendors.csv --payments examples/lakeside-dental/payments.csv \
--employees examples/lakeside-dental/employees.csv --threshold 5000 --name "Lakeside Dental" --out out/Python 3.9+ (tested on 3.10 and 3.13), no dependencies.
Zip, 18 KB, v1.0, 15 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.
Find duplicate payments and duplicate vendors: same invoice paid twice, shared bank accounts and tax IDs, vendor-employee matches. Offline. $29.
Audit expense reports against your policy: duplicate and split charges, over-limit meals and hotels, missing receipts, mileage over the IRS rate. Offline. $19.
View Expense Report Audit SkillCheck 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 CheckerRent 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