refund-radar
A local-first, privacy-first bank statement auditor that detects recurring charges, flags suspicious transactions, and drafts ready-to-send refund requests.
What This Skill Does
- Parses bank/card statement exports (CSV or pasted text)
- Detects recurring subscription charges
- Flags unexpected, duplicate, and fee-like transactions
- Generates an interactive HTML audit report
- Creates ready-to-send refund request templates
- Learns from your decisions to improve future scans
Trigger Phrases
- "Scan my bank statement for refunds"
- "Analyze my credit card transactions"
- "Find recurring charges in my statement"
- "Check for duplicate or suspicious charges"
- "Help me dispute a charge"
- "Generate a refund request"
How To Use
Step 1: Get Your Statement
Export transactions from your bank as CSV, or copy-paste them as text.
Step 2: Analyze
# From CSV file
python -m refund_radar analyze --csv ~/Downloads/statement.csv --month 2026-01
# From pasted text (stdin)
python -m refund_radar analyze --stdin --month 2026-01 --default-currency CHF
Step 3: Review Flags
The tool will:
- Show recurring subscriptions with estimated next charge
- Flag unexpected charges (new merchants, spikes, duplicates)
- Ask clarifying questions in batches of 5-10
Step 4: Get Your Report
Output files are saved to:
~/.refund_radar/reports/YYYY-MM.html(interactive report)~/.refund_radar/reports/YYYY-MM.json(raw data)
Step 5: Send Refund Requests
Copy refund templates directly from the HTML report. Templates are pre-filled with:
- Merchant name and date
- Charge amount
- Dispute reason
- Your preferred tone (concise, firm, friendly)
CLI Reference
# Analyze a statement
python -m refund_radar analyze --csv path/to/file.csv --month 2026-01
# Analyze from stdin
python -m refund_radar analyze --stdin --month 2026-01 --default-currency CHF
# Mark a merchant as expected (wont flag in future)
python -m refund_radar mark-expected --merchant "AMZN Mktp"
# Mark a merchant as known recurring
python -m refund_radar mark-recurring --merchant "Spotify"
# List expected merchants
python -m refund_radar expected
# Reset all learned state
python -m refund_radar reset-state
# Export month data as JSON
python -m refund_radar export --month 2026-01 --out out.json
Files Written
| Path | Purpose |
|---|---|
~/.refund_radar/state.json |
Learned preferences and merchant history |
~/.refund_radar/reports/YYYY-MM.html |
Interactive audit report |
~/.refund_radar/reports/YYYY-MM.json |
Raw analysis data |
Privacy Note
- No network calls. Everything runs locally.
- No external APIs. No Plaid, no cloud services.
- Your data stays on your machine. Reports are local HTML files.
- Privacy toggle in reports. Blur merchant names with one click.
Detection Logic
Recurring Charges
- Same merchant >= 2 times in 90 days
- Similar amounts (within 5% or 2.00)
- Consistent cadence (weekly, monthly, yearly)
- Known subscription keywords (Netflix, Spotify, etc.)
Unexpected Charges
- New merchant: First time seeing this merchant AND amount > 30
- Amount spike: > 1.8x your baseline for this merchant
- Duplicate: Same merchant + amount within 2 days
- Fee-like: Contains FEE, COMMISSION, ATM, OVERDRAFT keywords
- Currency anomaly: Unusual currency or DCC indicator
Example Flow
$ python -m refund_radar analyze --csv bank.csv --month 2026-01
Parsed 47 transactions for 2026-01
RECURRING CHARGES (5)
Netflix $15.99/mo next: ~Feb 15
Spotify $11.99/mo next: ~Feb 03
iCloud $2.99/mo next: ~Feb 01
ChatGPT Plus $20.00/mo next: ~Feb 20
Gym Membership $49.00/mo next: ~Feb 10
FLAGGED (3)
[HIGH] DUPLICATE: Amazon $29.99 on Jan 12 and Jan 12
[MED] AMOUNT SPIKE: Uber $87.50 (baseline: $25)
[LOW] FEE: ATM Withdrawal Fee $3.50
Report saved: ~/.refund_radar/reports/2026-01.html
Improving Over Time
The tool remembers:
- Merchants you mark as expected
- Recurring subscriptions you confirm
- Your merchant aliases (e.g., "AMZN" = "Amazon")
This means fewer false positives on future runs.