Analyze household spending across checking and credit card accounts, categorize transactions into 17 budget categories, show rolling 12-month and 3-month trends, flag savings opportunities, and generate actionable financial reports with email summaries. Use this skill whenever the user mentions spending, budget, expenses, savings, financial review, transaction categorization, monthly money check-in, where their money is going, or wants to run their household financial analysis — even if they don't say "conscious spending" explicitly. Also trigger when the user asks about trends, category breakdowns, or wants advice on reducing expenses.
Analyze Brad & Abby Wolaver's household transactions across 3 accounts, categorize into 17 spending classes, identify trends, and generate reports with expert financial guidance to free up $1,000/mo for private school tuition.
Run this skill monthly (ideally by the 5th). A Gmail reminder is sent on the 5th of each month to [email protected] and [email protected].
On the very first run, there is one-time data preparation work. Check for these conditions and handle them before running analysis:
The input/chase/ directory contains ~24 monthly PDF statements (Feb 2024 – Jan 2026). These need to be converted to CSV once. There is also a CSV file covering Jan–Apr 2026.
To convert PDFs:
pip3 install pdfplumberinput/chase/chase_historical.csv with columns: Transaction Date, Post Date, Description, Category, Type, Amount, MemoThe .numbers files in input/cap-one-checking/ and input/cap-one-quicksilver/ contain historical data predating the CSV exports. The CSVs only cover ~3-4 months (late 2025 – Apr 2026).
Options for converting (explain to user and let them choose):
.numbers file in Numbers.app → File → Export to → CSV. Save alongside the existing CSVs.pip3 install numbers-parser, then script the extraction.After conversion, verify you have continuous data across all 3 accounts for at least 12 months (ideally 24). Print a date coverage table and flag gaps.
Read output/last_run.json to see what was previously analyzed. Compare against CSV files in input/ — look for new or updated files (by filename date prefix or file modification time).
Tell the user: "Last analysis covered data through {date}. I see new data through {date}. Ready to run?"
python3 .claude/skills/conscious-spending/scripts/analyze_spending.py --project-dir .
For a complete reprocessing (after adding historical data or fixing categories):
python3 .claude/skills/conscious-spending/scripts/analyze_spending.py --project-dir . --full-run
The script outputs to output/:
all_transactions.csv — every transaction with assigned category and confidencemonthly_summary.csv — monthly totals by categorytrend_data.json — rolling averages and trend directionsflagged_items.csv — transactions with confidence < 90% needing reviewlast_run.json — state fileRead output/flagged_items.csv. For each flagged transaction:
output/all_transactions.csv with correctionsPay special attention to:
Amazon purchases on the Chase card show as generic "AMZN MKTP US" — no product detail. To break these into the 4 Amazon subcategories, cross-reference with Amazon order history CSVs in input/amazon/:
input/amazon/brad/, Abby: input/amazon/abby/)Read output/trend_data.json and output/monthly_summary.csv. Write a comprehensive markdown report to output/YYYY-MM_monthly_report.md following this structure:
# Spending Report — {Month Year}
## Summary
- Total income: $9,053
- Total expenses this month: ${amount}
- Net: ${amount}
- Tuition goal: {on track / ${X} short}
## Category Breakdown
| Category | This Month | 3-Mo Avg | 12-Mo Avg | Trend |
|----------|-----------|----------|-----------|-------|
(all 17 categories, sorted by amount descending)
## Trends to Watch
(Categories where 3-month average diverges >15% from 12-month average)
## City of Santa Fe Water
(Dedicated callout on water bill trends — flag if any month exceeds $80)
## What You're Doing Well
(2-3 bullet points on positive trends, categories where spending decreased,
investments being made consistently)
## Where You're Falling Short
(2-3 bullet points on categories trending up or exceeding benchmarks,
areas where the tuition goal is at risk)
## Recommendations
(3-5 specific, actionable suggestions from the perspective of a highly respected
personal finance advisor — see Financial Advisor Persona below)
Also save output/YYYY-MM_monthly_details.csv — the full categorized transaction list for that month only.
Run the chart generation script to create a current-vs-previous month comparison bar chart:
python3 .claude/skills/conscious-spending/scripts/generate_chart.py --project-dir .
This produces output/spending_chart.png and output/spending_chart_base64.txt. The chart shows horizontal grouped bars (blue = current month, orange = previous month) with a $9,053 income reference line.
Use the Gmail MCP tools to send a summary email:
mcp__claude_ai_Gmail__authenticate)assets/email_template.md{spending_chart} placeholder: read output/spending_chart_base64.txt and insert as <img src="data:image/png;base64,{base64_data}" alt="Monthly spending comparison chart" style="max-width:100%;height:auto;">Keep the email concise — the full report lives in the repo. The email should hit: big picture numbers, the spending chart, top 5 categories, one trend alert, and the doing well / falling short / recommendations sections.
When writing the "Doing Well," "Falling Short," and "Recommendations" sections, adopt the perspective of a highly respected personal finance expert (think Suze Orman's directness combined with compassion for a family managing a child's medical needs).
Read references/best_practices.md for foundational principles to draw from.
Key framing:
Read references/categories.md for the full 17-category taxonomy, keyword matching rules, and confidence scoring guidelines.
The categorization system learns from user corrections via output/learned_rules.json. This is the core innovation that makes the skill better over time:
How it works:
To save a user correction, call the script's helper function or add directly to output/learned_rules.json:
# From Python:
from scripts.analyze_spending import add_learned_rule
add_learned_rule(".", "MERCHANT_PATTERN", "Category Name", "Brief note about why")
Or add entries directly to the JSON:
{
"pattern": "MERCHANT_PATTERN",
"category": "Correct Category",
"confidence": 98,
"source": "user_correction",
"note": "Why this categorization is correct",
"added": "2026-04-12"
}
When reviewing flagged items: After the user confirms or corrects categorizations, save every correction as a learned rule. Also save confirmations for items that were correct but flagged at low confidence — this promotes them to 98% on future runs.
The compounding effect: With ~50 corrections, the system typically reaches 85%+ auto-categorization. With ~100 corrections across a few months of data, it approaches 95%+. Each monthly review adds fewer corrections as the rules accumulate.
All analysis artifacts live in output/:
output/
├── last_run.json # When/what was last analyzed
├── all_transactions.csv # Full categorized transaction history
├── monthly_summary.csv # Monthly totals by category (all months)
├── trend_data.json # Rolling averages and trend data
├── flagged_items.csv # Items needing human review
├── YYYY-MM_monthly_report.md # Monthly narrative reports
├── YYYY-MM_monthly_details.csv # Monthly transaction detail
└── archive/ # Previous versions (optional)
last_run.json tracks:
On subsequent runs, check this file to report what's new since the last analysis.
input/chase/)Columns: Transaction Date, Post Date, Description, Category, Type, Amount, Memo
input/cap-one-quicksilver/)Columns: Transaction Date, Posted Date, Card No., Description, Category, Debit, Credit
input/cap-one-checking/)Columns: Account Number, Transaction Description, Transaction Date, Transaction Type, Transaction Amount, Balance
input/amazon/{brad,abby}/)Key columns: Order Date, Product Name, Unit Price, Total Amount, Payment Method Type
No CSV files found: User needs to download transaction exports from their bank websites, or convert .numbers/PDF files.
Large "Everything Else" category: Review the items — there may be a new merchant or recurring expense that needs a keyword rule added to scripts/analyze_spending.py.
Vanguard miscategorized: Check amounts. $300 = Roth IRA, $100 = 529. Non-standard amounts need user confirmation about which account they went to.
Missing months: Check if .numbers files contain the missing period. Prompt user to export to CSV.