2025
Stripe Billing Portal
Subscription billing built on Stripe for a SaaS team that had outgrown a hand-rolled checkout. It handles plans, upgrades, and one-off payments, keeps subscription state in sync through webhooks, and gives customers a billing dashboard where they can manage their card, plan, and invoices on their own.
- Next.js
- Stripe
- Supabase
- Node.js

01
The problem
A SaaS team had grown out of a checkout that had been hand-built early on. Subscription state lived in their own database and drifted from Stripe whenever a payment failed or a customer changed plan, customers had to email support to update a card or download an invoice, and every new plan meant more custom code.
02
The solution
I rebuilt billing around Stripe as the source of truth. Plans and prices are defined in Stripe, a webhook handler in Node.js keeps the Supabase database in sync with subscription events, and the Next.js app reads entitlements from that synced state. Customers get a billing dashboard where they can upgrade or downgrade, update their card, and see their invoices, and failed payments are handled through Stripe's recovery flow instead of custom code.
03
The result
Subscription state stopped drifting, billing support requests fell away because customers can help themselves, and adding a new plan became a configuration change rather than a deployment. The team now trusts their billing data enough to base product decisions on it.
