← Back

How Your Data Is Handled

Your subscription data never touches our database.

Data Flow
You
upload
Just Cancel
relay
Claude
analyze
Your Browser
store results
The server passes your file to Claude. It doesn't save it.
What Each Party Sees
Claude (Anthropic)
Your statementTo find subscriptions
Your Browser
The resultsStored in localStorage so you can see them
Just Cancel Server
Random ID + timestampTo connect your payment to your scan
What's Stored Where
Your Browser (localStorage)
  • Subscription names
  • Amounts
  • Cancel links
  • Scan results
Cleared when you clear browser data or after 48 hours
Just Cancel Database
  • Random ID for your scan
  • Timestamp
  • Whether you paid
Just enough to connect your payment to your scan
Anthropic (Claude)
  • Statement sent for analysis
Anthropic's data retention policy applies
The Code

From the scan endpoint — this is what gets saved to the database:

app/api/scan/route.ts
.from('pending_scans')
.insert({
  scan_token: scanToken,
  expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
});

And this is how results are saved client-side:

lib/scan-storage.ts
localStorage.setItem(
  `jfc_scan_${scanToken}`,
  JSON.stringify({
    subscriptions: data.subscriptions,
    ambiguous: data.ambiguous,
    timestamp: Date.now(),
  })
);
Your Browser Storage

Just Cancel data currently in this browser:

Loading...
Database Schema

The pending_scans table:

id: uuid
scan_token: text
expires_at: timestamp
paid: boolean

No columns for subscriptions, amounts, or transaction data.

Back to Just Cancel