| name | expense-report |
| description | Scan a folder of receipts (PDFs, images, screenshots) and produce a categorized expense spreadsheet plus a dashboard summarizing the period. Use this whenever the user says 'process my receipts,' 'expense report,' 'categorize these expenses,' 'tax prep,' 'monthly/quarterly expenses,' 'bookkeeping,' or points you at a folder of receipts. The skill works on whatever's in the folder ā no setup required ā but improves over time as it learns the user's category structure. Often paired with a scheduled task that runs weekly or monthly. |
Expense Report
You scan a folder of receipts and produce two things: a categorized spreadsheet of every line item, and an HTML dashboard summarizing the period. The user drops receipts in a folder throughout the month; you handle the rest.
Before you start
Identify the folder of receipts. The user may point at:
- A dedicated
receipts/ or expenses/ folder
- A
Downloads/receipts/ folder
- A specific date-range subfolder
- A cloud-synced folder (Drive, Dropbox)
Check if expense-config.md exists. If yes, read it ā it should define:
- The user's expense categories (e.g., Software / SaaS, Travel, Meals, Marketing, Contractors, Office, Other)
- Personal vs business split rules (if mixed)
- Default currency
- Tax-relevant categories (deductible, reimbursable)
- Anything to auto-exclude (personal Amazon receipts, recurring subscriptions already tracked elsewhere)
If no config exists, run a one-time setup based on a sample of receipts:
- Scan 10ā20 receipts to understand the user's spending shape
- Propose a category list
- Confirm with the user
- Save to
expense-config.md
Process the receipts
For each receipt file:
- Extract ā vendor name, date, total amount, tax (if shown), payment method (if shown), individual line items if itemized
- Categorize ā assign to one of the user's categories. If a vendor has been categorized before (e.g., AWS = Software), use the prior categorization for consistency.
- Flag ā receipts that are unclear (image too dark, partially cropped, unclear total) get flagged for user review rather than guessed
- Detect duplicates ā same vendor + same amount + within 3 days = likely duplicate. Flag, don't auto-merge.
If a receipt has multiple categories (e.g., a Costco run with both office supplies and personal items), either split into multiple line items or flag for the user to review.
Output 1: The spreadsheet
Save as expenses-YYYY-MM.xlsx (or .csv if Excel isn't available). Columns:
| Date | Vendor | Description | Category | Subcategory | Amount | Tax | Total | Payment method | Receipt file | Notes |
Sorted by date descending. Include a totals row at the bottom and subtotals by category in a second sheet.
Also include a "Flagged for review" sheet with anything you couldn't confidently categorize.
Output 2: The dashboard
Save as expense-dashboard-YYYY-MM.html. Interactive HTML dashboard with:
- Headline strip ā total spend, vs prior period, count of receipts, average receipt size
- Spend by category ā donut or bar chart, with totals and percentages
- Spend over time ā line or bar chart showing daily/weekly spend in the period
- Top vendors ā table, ranked by total spend, with count of receipts
- Trends ā any category trending up or down vs prior period, with your read on why if obvious
- Tax-relevant subtotals ā total of categories marked deductible/reimbursable
- Flagged items ā anything that needs the user's eyes
Output 3: A short chat summary
In the chat reply, print:
š Expense report ā [month/period]
Total spend: $X,XXX across [N] receipts
Biggest category: [Category] at $XXX ([%])
Notable: [one specific observation ā "you tripled software spend this month," "5 meal receipts over $200 in 3 days," etc.]
Tax-relevant: $X,XXX deductible
Flagged for review: [N] items
Spreadsheet: [path]
Dashboard: [path]
Running on a schedule
After the first manual run, suggest scheduling:
"Want me to run this every Sunday and roll up the week, then send you a Slack summary? At the end of the month, I'll produce the full report."
If yes, set up a recurring task. The weekly version is short (just the chat summary + spreadsheet update). The monthly version is the full dashboard + report.
Edge cases
- Receipts in non-English languages ā translate vendor and item descriptions but keep totals in original currency, then convert.
- Receipts that are actually invoices ā distinguish: a receipt = paid, an invoice = owed. Don't lump unpaid invoices into the expense report.
- Crypto / unusual payment methods ā extract what you can but flag.
- Tips on restaurant receipts ā include in the total, note tip separately if shown.
- Subscription receipts (Stripe, etc.) ā categorize as recurring software unless context suggests otherwise.
- Sales tax handling ā separate sales tax in its own column. Some jurisdictions need it reported separately for accounting.
Why this works the way it does
Most bookkeeping software requires manual entry or fragile OCR pipelines. By dropping receipts in a folder and having a skill that re-processes the whole folder every run, you get a system that's idempotent and self-correcting: if a categorization is wrong, re-run after editing expense-config.md and it'll re-categorize cleanly. The user owns the data (it's just files in a folder) and the dashboard is regenerable on demand.
Rules
- Don't guess when unsure. Flag for review. A flagged item is recoverable; a wrongly categorized expense compounds.
- Use consistent vendor naming. "Amazon," "amazon.com," and "AMZN Mktp US" should all be normalized to "Amazon." Maintain a vendor-name map in
expense-config.md and grow it over time.
- Don't reprocess from scratch every run unless asked. Cache extracted data so re-runs are fast.
- Surface anomalies in the dashboard. A 5x jump in a category, an unusually large single receipt, a new vendor ā these deserve a callout.
- Don't moralize. This is an accounting tool, not a financial advisor. If the user spent $4K on meals last month, report it; don't comment.