I've been building SaaS apps for 8 years and I've seen some shit. Angular died while I was mid-project. React hooks broke half my components when they launched. I've had databases crash at 2am more times than my liver can handle. This stack - Next.js 15, Supabase, and Stripe - still pisses me off sometimes, but it's the first combo that doesn't make me want to set my laptop on fire.
The Stack That Sucks Less Than Everything Else
Let me be clear: there's no perfect stack. Every technology choice is a trade-off between pain points. But after building 12 SaaS apps and watching most of them die from technical debt or feature velocity problems, this combination of Next.js 15 + Supabase + Stripe is the first one that doesn't make me actively hate my job.
Next.js 15: Less Broken Than Before
Next.js 15 finally unfucked the caching disaster that made versions 13-14 completely unusable. I'm talking about users getting charged for subscriptions they cancelled, dashboards showing wrong data - the kind of bugs that make you question your career choices. They stopped caching GET Route Handlers by default. About fucking time.
The async Request APIs change will absolutely destroy your weekend if you're upgrading from 14. I spent 3 days fixing TypeScript errors that looked like this: Property 'get' does not exist on type 'Promise<ReadonlyRequestCookies>'
. Every component that touched cookies()
or headers()
exploded. The codemod caught maybe 60% of the issues.
// This will break in Next.js 15
const cookieStore = cookies()
// This works
const cookieStore = await cookies()
Turbopack finally works without crashing every 10 minutes. Our app with 200+ pages starts in 3 seconds instead of the 15-second webpack hell we lived with. Still slower than Vite, but I can actually develop without wanting to punch my monitor.
React 19 integration is a complete shitshow. Half the libraries you depend on will break. React Hook Form threw errors I'd never seen before. Radix Select components just... stopped working. Multiple popular libraries had compatibility issues. Spent a full day downgrading everything back to React 18 because deadlines don't care about bleeding edge features.
Supabase: PostgreSQL Without the DevOps Hell
Next.js handles your frontend and API routes, but every serious SaaS needs a real database that can handle complex queries, transactions, and actual scale. This is where most full-stack developers shit the bed.
Here's what nobody tells you: your full-stack developer who "knows PostgreSQL" will fuck up connection pooling, forget to add indexes, and write RLS policies that scan entire tables. I've seen it happen. Hell, I've done it. Supabase saves you from yourself until you're big enough to hire someone who actually knows databases.
The connection pool literally saved my business: Every morning at 9am PST, when West Coast users started logging in, I'd get the dreaded FATAL: too many connections for role "postgres"
error. Users couldn't log in, payments couldn't process, and I'm frantically googling "postgresql connection limit" while my phone buzzes with angry support tickets. Supabase's PgBouncer setup fixed this automatically.
Row Level Security is a lifesaver: Instead of writing tenant isolation logic in every single query, RLS policies handle it at the database level. One wrong WHERE clause can expose customer data - I've seen it happen. RLS prevents that entire class of bugs.
But here's the gotcha that cost me 3 days of debugging: RLS policies can absolutely murder performance. Had this innocent-looking policy that was doing full table scans on 2.3 million rows. Every. Single. Query. Users were waiting 8 seconds for their dashboard to load. I learned to worship EXPLAIN ANALYZE after that shitshow.
The $25/month Pro plan is actually reasonable. You get:
- 8GB storage (enough for most MVPs)
- 100K monthly active users
- Built-in auth that doesn't suck
- Real-time subscriptions that work
Try building this yourself and you're looking at $300-500/month in AWS bills plus 3 weeks of your time setting up connection pooling, auth flows, and database migrations. I know because I tried it once. Spent more on therapy than I saved on hosting.
The gotchas that will bite you: Connection limits start choking at around 800 active users, not 1,000. That 60-connection pool gets exhausted fast when Next.js serverless functions each grab their own connection. And of course their dashboard went down during my first traffic spike - Murphy's Law in action.
Stripe: The Only Payment Processor That Doesn't Hate Developers
Database and frontend sorted, now you need to collect money. This is where shit gets real because payment processing touches legal compliance, international tax law, and financial regulations that can literally shut down your business if you fuck them up.
I've integrated PayPal (absolute nightmare), Braintree (they deprecated half their APIs mid-project), Square (works great if you only serve the US), and some fly-by-night processors that shall remain nameless. Stripe is the only one where I didn't want to quit programming halfway through.
Webhooks that don't make you cry: Stripe webhooks actually retry when they fail, use proper signatures so you know they're legit, and their dashboard shows you exactly what happened when shit breaks. PayPal webhooks? I once spent 6 hours debugging why they were sending duplicate payment_completed
events. Turns out it was a "known issue" buried in some forum post.
The 2.9% + $0.30 fee hurts: At $10K monthly revenue, you're paying $320/month in fees. But I tried rolling my own payment processing once with a cheaper processor. Spent 4 months dealing with failed transactions, declined cards that should have worked, and customers who couldn't understand why their payment kept bouncing. Never. Again.
Subscription states are a minefield: active
, past_due
, canceled
, incomplete
, trialing
, unpaid
, incomplete_expired
- 7 states because subscription billing is genuinely fucked up in ways you haven't thought of. I tried to "simplify" this once. Ended up with customers who thought they were subscribed but weren't getting charged. Financial reconciliation was a nightmare.
Webhook replay attacks are real: Store the processed event IDs in your database or you'll charge someone twice. Happened to me on a Sunday morning - customer's card got charged twice for their monthly subscription. Spent my entire Sunday morning on the phone with Stripe support and writing refund logic. The customer was... not happy.
Where This Stack Will Fuck You Over
Look, I just spent 600 words telling you why this stack is great. But I'm not trying to sell you anything, and every technology choice has downsides that'll bite you in the ass at the worst possible moment. Here's what to expect when the honeymoon period ends.
Database Performance Hell
Supabase is great until you hit their limits. Hit around 8,500 active users and shit starts breaking:
- Queries timing out during lunch hour traffic
Connection pool exhausted
errors during peak usage- Supabase dashboard takes 30 seconds to load your tables
The read replica costs $100/month minimum. I thought I was being smart by waiting until I "needed" it. Woke up to a crashed database and 2 hours of downtime because I was too cheap to spend an extra hundred bucks.
Next.js Build Times
Complex SaaS apps take forever to build. Ours hits 12 minutes on Vercel's free tier. Every git push becomes a coffee break. The Pro plan drops it to 4 minutes for $20/month per developer. Worth every penny for developer sanity.
Stripe's International Nightmare
Stripe works in 40+ countries but tax compliance will make you want to die. EU VAT rates change by country. Canadian GST has different rules for digital services. US state taxes... just don't get me started on that clusterfuck. Stripe collects the money, but calculating and filing taxes? That's all you, buddy.
"Adaptive pricing" sounds fancy but it's just Stripe A/B testing how much they can charge your customers. Saw conversion rates drop 18% in Germany when they decided to test higher prices without telling me. Thanks, Stripe.
The Reality Check
This stack stops being cute around 40,000 users. After that, you're looking at some expensive decisions:
- Database migration: AWS RDS will cost 3x more but actually scales
- Caching layer: Redis becomes mandatory, not optional
- Real monitoring: Supabase's dashboard won't cut it when you're losing $1000/hour during outages
But here's the thing - if you're hitting these limits, you're making real money. This stack's job is to get you from zero to profitable without you having to become a database expert. Mission accomplished.
Too many developers start with Kubernetes and microservices on day one. This stack is the opposite - ship fast, figure out scaling when you actually have users who pay you money. Most startups die from lack of customers, not from technical debt.