Skip to content
All Skills

Subscription Audit & Cancellation Guide

Scans bank CSV exports for recurring charges, identifies all subscriptions with amounts and frequencies, calculates annual cost, and provides cancellation links via Brave Search. Prerequisites: python3, brave-search MCP.

Finance & Budgeting|v1|Updated 5/18/2026
MCP get_skill({ skillId: "subscription-audit-cancellation-guide-b015007e" })

Use this skill with your agent

Create a free account and connect via MCP

Get Started Free
# Subscription Audit & Cancellation Guide

Find every recurring charge in your bank statements, calculate the true annual cost, and get one-click cancellation links.

## When to Use

- "What subscriptions am I paying for?"
- "How much do I spend on subscriptions per year?"
- "Help me cancel unused subscriptions"

## Requirements

- **python3** with pandas
- **Brave Search MCP** for finding cancellation pages
- Bank/credit card CSV export (at least 2 months of data)

## Workflow

### Step 1 — Detect Recurring Charges

```bash
python3 << 'PYEOF'
import pandas as pd
from collections import Counter

df = pd.read_csv("{BANK_CSV_FILE}")

# Normalize description column
desc_col = next((c for c in df.columns if c.lower().strip() in ['description', 'memo', 'name', 'payee']), df.columns[2])
amount_col = next((c for c in df.columns if c.lower().strip() in ['amount', 'debit']), df.columns[-2])

df['desc_clean'] = df[desc_col].astype(str).str.lower().str.strip()
df['amount'] = pd.to_numeric(df[amount_col], errors='coerce').abs()

# Find charges that appear multiple times with similar amounts
recurring = df.groupby('desc_clean').agg(
    count=('amount', 'count'),
    avg_amount=('amount', 'mean'),
    total=('amount', 'sum')
).query('count >= 2 and avg_amount < 200')  # Subscriptions are usually under $200

recurring = recurring.sort_values('total', ascending=False)
recurring['annual_est'] = recurring['avg_amount'] * 12

print("=== DETECTED RECURRING CHARGES ===")
for desc, row in recurring.iterrows():
    print(f"  {desc}: ${row['avg_amount']:.2f}/mo x {row['count']} charges = ${row['total']:.2f} (est. ${row['annual_est']:.2f}/yr)")

print(f"\nTotal recurring: ${recurring['avg_amount'].sum():.2f}/month = ${recurring['annual_est'].sum():.2f}/year")
PYEOF
```

### Step 2 — Build Subscription Inventory

Present findings and ask user to confirm/classify each:
- ✅ **Keep** — actively using
- 🤔 **Review** — might not need
- 🗑️ **Cancel** — not using / forgot about

### Step 3 — Find Cancellation Links

For each subscription marked for cancellation:

```
brave_web_search: "how to cancel {SERVICE_NAME} subscription"
brave_web_search: "{SERVICE_NAME} cancel account URL"
```

### Step 4 — Generate Audit Report

```markdown
# Subscription Audit — {DATE}

## Summary
| | Monthly | Annual |
|---|---------|--------|
| 💰 Total subscriptions | ${X}/mo | ${Y}/yr |
| ✅ Keeping | ${X}/mo | ${Y}/yr |
| 🗑️ Cancelling | ${X}/mo | ${Y}/yr |
| 💵 **Annual savings** | | **${SAVINGS}/yr** |

## All Subscriptions
| Service | Amount | Frequency | Status | Action |
|---------|--------|-----------|--------|--------|
| Netflix | $15.49 | Monthly | ✅ Keep | |
| Hulu | $17.99 | Monthly | 🗑️ Cancel | [Cancel here](URL) |
| Adobe CC | $54.99 | Monthly | 🤔 Review | Consider switching to Figma |

## Cancellation Checklist
- [ ] Hulu — [Cancel link](URL) — saves $17.99/mo
- [ ] {Service} — [Cancel link](URL) — saves ${X}/mo
```

### Step 5 — Save Report

```bash
mkdir -p outputs/finance
cat > "outputs/finance/subscription-audit-{DATE}.md" << 'EOF'
{REPORT}
EOF
```

## Important Rules

- Pattern-match recurring charges conservatively — confirm with user before labeling something a subscription
- Include cancellation links only from official sources
- Note if cancellation requires calling (not just a URL)
- Warn about annual prepaid subscriptions and cancellation deadlines

## Example Prompts

- "Find all my subscriptions from my bank statement" (provide CSV)
- "How much am I spending on subscriptions per year?"
- "Help me cancel Netflix and Hulu"
#finance#subscriptions#audit#brave-searchpython3brave-search