ClearSubscription

The problem

Almost no subscription feels like a mistake when you sign up. It turns into one quietly, months later, when it renews and you'd forgotten you were still paying.

The evidence was never hidden—the receipt hit your inbox the day you were first charged. It just sat there under thousands of other emails. By the time your bank warns you about the renewal, you've got about two days to care.

ClearSubscription helps you see those charges while there's still time to do something about them.

What it does

ClearSubscription reads billing receipts already in your Gmail and gives you a clear list of what is actually charging you. It does not decide for you.

The flow:

  1. Sign in with Google—identity only at this point, with no access to your mail.
  2. When ready to scan, grant a separate, read-only Gmail permission. The account still works without it.
  3. The app sorts likely billing mail using headers alone, then pulls a small, tightly capped set of billing-focused excerpts. Your whole inbox is never read.
  4. GPT-5.6 turns each email into a structured record: vendor, amount, currency, billing cadence, payment and renewal dates, confidence, and the exact evidence snippet behind each result.
  5. The dashboard places every proposed record next to its evidence. Nothing becomes confirmed until you say so.
  6. Confirmed items appear in a 14-day renewal calendar that is honest about gaps, unknowns, and unconfirmed records.

There is also a Try Demo mode that runs the full review-and-calendar experience on clearly fictional data—no Google account or Gmail connection needed.

Privacy and product decisions

I did not want to build another app that swallows your inbox and asks you to trust it.

  • Gmail access is read-only and requested only when you choose to scan.
  • Tokens are encrypted in an HTTP-only cookie that browser JavaScript cannot access.
  • Triage starts with metadata, and deterministic rules filter obvious promotional mail before any model call.
  • GPT-5.6 sees only a sender, subject, date, and short billing-focused excerpt—not a complete inbox.

The decision I care about most is simple: AI proposes; you confirm.

Predictions and confirmations are separate states in the data, and the user's answer always wins. If an email does not state a price, the amount stays blank rather than becoming a confident-looking guess. Every extracted field points back to its evidence snippet. Totals are labelled as estimates, and currencies are never silently converted to make a number look neat.

How I used Codex and GPT-5.6

I built the full product with Codex on GPT-5.6:

  • Next.js App Router pages for landing, connect, scan, dashboard, subscription details, and the renewal calendar
  • Gmail OAuth and scan routes
  • Zod validation schemas
  • Vitest test suite

GPT-5.6 is also the extraction engine. Each shortlisted email is processed individually through the OpenAI Responses API, using structured output validated by Zod. Uncertain fields are intentionally nullable, and malformed model output is discarded rather than repaired into something plausible-looking.

Codex accelerated implementation and testing, but the key product decisions were mine: where consent begins, separating predictions from confirmations, requiring evidence for every claim, and limiting what the model can see.

For example, an early scan implementation fetched the 30 newest emails without a date filter and downloaded full message bodies before filtering. I caught that and specified the fix: a 25-month window, metadata-only triage, and bodies fetched only for a small number of emails per vendor.

Built With

  • auth.js
  • gmail-api
  • gpt-5.6
  • next.js
  • openai-responses-api
  • tailwind-css
  • typescript
  • vercel
  • vitest
  • zod
Share this project:

Updates