The Problem with SPAs for SaaS
When we started building SaaS products in 2016, React SPAs were the go-to choice. They're fast once loaded — but that "once loaded" caveat causes real problems: poor SEO, slow initial paint, and painful routing logic spread across the codebase.
Why Next.js Changed Everything
Next.js gave us the best of both worlds: the React component model we love, combined with server-side rendering that search engines and users appreciate.
File-based Routing
No more configuring React Router. Drop a file in app/ and it's a route. This alone cuts setup time significantly on every new project.
Server Components
With the App Router, data fetching happens on the server — no waterfall API calls, no loading spinners for initial data, no leaked API keys in the client bundle.
// This runs on the server — no useEffect, no loading state
export default async function DashboardPage() {
const data = await fetchFromDatabase();
return <Dashboard data={data} />;
}
Edge-ready
Deploying to Vercel, Netlify, or Cloudflare Workers is trivial. Your app runs close to users globally with zero DevOps overhead.
When We'd Choose Something Else
Next.js isn't always the right call:
- Pure API services — use Express or .NET Core
- Highly interactive dashboards — a pure Vite SPA may be simpler
- Mobile apps — React Native with Expo
Our Stack
For most SaaS projects we pair Next.js with:
- TypeScript — always
- Tailwind CSS — utility-first, fast to prototype
- Prisma + PostgreSQL — type-safe database access
- AWS / Azure — for compute and storage beyond what edge functions offer