AgentSkillsCN

Refund Radar

退款雷达

SKILL.md

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

  1. Parses bank/card statement exports (CSV or pasted text)
  2. Detects recurring subscription charges
  3. Flags unexpected, duplicate, and fee-like transactions
  4. Generates an interactive HTML audit report
  5. Creates ready-to-send refund request templates
  6. 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

bash
# 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

bash
# 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

PathPurpose
~/.refund_radar/state.jsonLearned preferences and merchant history
~/.refund_radar/reports/YYYY-MM.htmlInteractive audit report
~/.refund_radar/reports/YYYY-MM.jsonRaw 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

code
$ 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.