There are three plans: Free, Pro at twelve dollars a month, and Enterprise at ninety-nine. The mechanics are simple: every paid feature checks the user's plan field at request time, and successful Stripe checkouts auto-promote that field via an idempotent flag on the payment_transactions ledger.
What Free actually includes
- Unlimited short links, with custom aliases and expirations.
- Basic click analytics — totals, 14-day trend, device + country bars.
- QR codes (PNG + SVG export).
- Tags and CSV export of your full link inventory.
- Bulk delete (because data egress is a right, not a perk).
What Pro adds
- Smart routing — rotator, A/B, geo, device.
- Campaigns CRUD with roll-up analytics.
- Link superpowers — password, max_clicks, scheduled activation.
- Bulk shorten, CSV import, bulk tag / campaign edits.
- Heatmap, live feed, full breakdowns by browser & referrer.
What Enterprise adds
- Custom domains with DNS TXT verification.
- Per-link domain swap.
- Higher anonymous and API ceilings (on request).
- Priority support + dedicated migration help.
How upgrading works
- 1On /pricing, pick a plan. The SPA calls POST /api/payments/checkout/session with the package_id and your current origin.
- 2Stripe Checkout redirects you to a hosted card form. On success you land back on /payment-success?session_id=…
- 3The success page polls GET /api/payments/checkout/status/{session_id}. The first 'paid' response flips user.plan to pro or enterprise and marks the transaction plan_upgraded so the promotion is exactly-once.
- 4From that moment on, paid features stop returning 402.
