Subscription Audit and Cancellation Assistant
Find every recurring charge across your accounts, cancel the dead ones, and verify the following month that the charge actually stopped.
The average household is carrying somewhere between eight and fifteen recurring charges, and can name maybe six of them. The other nine are a free trial that converted in March, a streaming service kept alive for one show that ended two seasons ago, a $9.99 app store subscription renewing against an Apple ID nobody checks, a gym membership at a location that closed, and a SaaS tool a freelancer signed up for during one project in 2024. None of them are individually large enough to trigger a second look on a statement. Collectively they are a meaningful percentage of discretionary income leaving the account every month for nothing.
Built for Solo Founders, Side Hustlers, Weekend Builders.
The subscription and billing management software market was valued at $6.5B in 2024 and is projected to reach $16.96B by 2033, a 11.25% CAGR (Straits Research). Consumer-side management is the fastest-moving slice.
Suggested stack: Next.js 15 (App Router) on Vercel, Plaid (or Teller / TrueLayer in Europe), Supabase (Postgres + Auth), A deterministic recurrence detector, Claude Haiku 4.5 for descriptor resolution and script generation, A maintained merchant cancellation registry. Weekend scope: about 12 hours.
The Problem
The average household is carrying somewhere between eight and fifteen recurring charges, and can name maybe six of them. The other nine are a free trial that converted in March, a…
The Solution
A subscription auditor that separates the two jobs most competitors blur together: finding recurring charges, and doing something about them.
Market Research
The subscription and billing management software market was valued at $6.5B in 2024 and is projected to reach $16.96B by 2033, a 11.25% CAGR (Straits Research). Consumer-side…
Competitive Landscape
Rocket Money (formerly Truebill) — The category leader, with 3M+ users and genuinely strong detection through bank API integration. Bill negotiation is handled partly by a human…
Business Model
Free ($0) — Connect up to 2 accounts, full recurring-charge detection, annual cost totals, and renewal reminders. No cancellation tooling.
Recommended Tech Stack
Next.js 15 (App Router) on Vercel — Dashboard, connection flow, and cancellation views. Background jobs for the nightly transaction sync and the verification sweep.
AI Prompts to Build This
Copy these build prompts into Claude, Cursor, or your AI coding tool. Create a free account to unlock the full research behind them.
1. Project Setup
Build the weekend MVP of "Recur": upload bank statement exports, see every recurring charge in one ranked list, and track each cancellation until the charge really stops. It reads files you upload and connects to nothing. Stack: Next.js (App Router), TypeScript, Tailwind, Supabase (Postgres, Row Level Security, Auth with email magic link), the Anthropic API for two narrow jobs (naming an unknown merchant and writing a call script). Detection is plain code and never uses the model. Deploy on Vercel. Tables (Row Level Security on, each user reads only their own rows; merchants is a shared reference table): - imports(id, user_id, filename, row_count, created_at) - transactions(id, user_id, import_id, external_id, posted_at, amount_cents, raw_descriptor, normalized_descriptor, merchant_id) external_id is unique per user - merchants(id, normalized_descriptor, display_name, category, cancel_url, requires_phone, cancel_phone, notes, typical_days_to_stop) normalized_descriptor is unique - recurring_charges(id, user_id, merchant_id, cadence, amount_cents, confidence, first_seen, last_charged, next_expected, price_changes jsonb, status) cadence is weekly, monthly, quarterly, annual or irregular; status is active, cancelling, cancelled or unverified - cancellations(id, recurring_charge_id, user_id, method, initiated_at, script, verified_at, outcome) Screens: /login, /import, /charges (ranked list), /charges/[id], /cancel/[id], /savings. Env vars (names only): NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY (server only), ANTHROPIC_API_KEY. Do not build: billing, plans or a household tier, Plaid or any bank connection, a household view, email delivery, a chargeback guide, a 24-month retention job. Done when: npm run dev starts, you can sign in, and the five tables exist with Row Level Security on.
2. Core Feature
Build the one feature that proves Recur: a detector that is right and explainable, and a cancellation that is only called done after the statement agrees. 1. Import a CSV with columns date, description, amount. Treat charges as negative amounts. Skip a row already imported (same date, description and amount). 2. Normalize each descriptor: strip trailing ids, store numbers, dates and city or state suffixes, uppercase, collapse spaces and remove processor prefixes such as SQ*, TST*, PAYPAL * and APLPAY. Save normalized_descriptor and link it to a merchant when one exists. 3. Group by normalized descriptor. Drop groups with fewer than 3 charges, except an annual cadence, which may be shown with 2 charges a year apart (360 to 370 days) as a possible recurring charge with confidence capped at 0.7. 4. Score each group in code. Cadence from the median day gap (28 to 31 monthly, 6 to 8 weekly, 88 to 95 quarterly, 360 to 370 annual) with a gap spread under 3 days strong and over 7 weak. Amount steadiness from the coefficient of variation: under 0.02 fixed, up to 0.25 usage-like, above that not a recurring charge. More cycles raise confidence, saturating at 6. Blend into confidence from 0 to 1. 5. Classify: 0.8 or more is shown by default, 0.5 to 0.8 is shown under "possible" and needs the user to confirm, under 0.5 is not shown. Never show rent, mortgage, insurance, loan or utility charges as cancellable; list them in a separate "recurring, not cancellable here" section. 6. Flag any step of more than 3 percent between charges as a price change, compute annual cost from cadence and amount, and set next_expected to the last charge plus the median gap. Rank by annual cost, boosting charges with a price rise in the last 6 months and annual ones. Never rank by confidence. 7. For an unknown merchant, ask the Anthropic API for JSON { display_name, category, confidence, is_likely_subscription } and say "not sure" under 0.6 confidence rather than guessing. Cache the result in merchants. Let the user correct it. 8. Cancel: for a merchant with a cancel_url, link to it and show what the flow will ask. For a phone merchant, have the model write a script of at most 6 sentences that states intent, declines one retention offer and asks for a written confirmation with a reference number, with no threats and no legal citations. 9. On starting a cancellation, set status cancelling. Mark it cancelled and add its annual cost to confirmed savings only when a later import covers the next expected date plus 3 days and shows no new charge. If a charge appears, alert the user on the page. Rules: never mark anything cancelled on the user's word alone. No shaming about spending. Empty state: with no imports, show the CSV columns and a sample file. Done when: the detector tests pass on fixtures (a monthly fixed charge detected, a utility excluded, two charges not shown, an annual one shown as possible), a merchant resolves once and is cached, and a cancellation stays unverified until a later import confirms no new charge.3. Landing Page
Build a one-page landing site for Recur, a finder and canceller for forgotten recurring charges. Hero: "You're paying for nine things you can't name." Sub: "Upload your statements, see every recurring charge in one list and cancel the dead ones. We check the next statement to make sure the charge really stopped." One button: Join the waitlist. Sections: a statement scroll where forgotten charges highlight and an annual total climbs, a split of what most apps do and what this does (find, then cancel, then verify), three cryptic descriptors resolving to product names on hover, a privacy block placed early (you upload files, nothing is connected, delete everything in one click), and an FAQ on which files work, what happens to your data and why some cancellations need a phone call. Waitlist: store the email in a waitlist table in Supabase. No other service. Style: Geist, an off-white background, deep ink type, one green accent used only for confirmed savings. A matter-of-fact voice with no shaming. Done when: the page renders on a phone and a submitted email appears in the waitlist table.
4. Branding Package
Use a design or image tool for this one. A coding agent cannot draw a logo. Brand for Recur: a wordmark and an icon that suggest a circular arrow that is cut open and closed with a check. Colors: off-white, deep ink and one green used only for confirmed savings. Type: Geist, with tabular numbers for amounts. Deliverables: wordmark, icon, four status chips (active, cancelling, cancelled, unverified) that differ by shape as well as color, a savings total card, and one launch graphic. Done when: each deliverable is saved in one folder and the status chips are distinguishable without color.