The stack. What we run. What it cost.
Not the top ten. The ones that survived
7 min readBy Mujtaba Abbas
The SaaS Founder Stack: What We Actually Run in 2026
Summary
- Boring is a hiring decision
- Authentication and payments are solved, and rebuilding them is the common mistake
- Postgres does more than people reach for other databases to do
- Observability goes in before the first user
- AI, if it is part of the product
- The stack, and what it costs to start
- Two we were wrong about
Summarize with AI
Key takeaways
Tool sprawl is the problem, not tool selection. Most early stacks carry twelve subscriptions doing the work of six.
Boring is a hiring decision. Next.js, TypeScript, and Postgres matter because the next engineer already knows them.
Never build authentication or payments. Two solved problems that each cost about two weeks to rebuild worse.
Observability goes in before the first user, not after the first outage. The point is knowing before somebody tells you.
Choose tools you can leave. Anything holding your data with no export path is a decision you will regret at the worst possible moment.
Almost all of this is free at the scale where budget is the binding constraint.
Every article of this kind has the same defect. It lists ten individually good things and never establishes whether they work together, what they cost once the product is real, or whether the author uses any of them.
So this is not a top ten. It is the stack we run at Codroon across our own products and most client builds, what each thing replaced, and the two choices we got wrong and reversed.
Boring is a hiring decision
Next.js with TypeScript and Tailwind is the most hireable frontend stack that exists, and that property matters more than any technical argument anyone can make about alternatives.
The reasoning is about year two rather than week one. When you bring engineering in-house, or hand a codebase to somebody else, you want a stack the next developer already knows. Choosing something more interesting means choosing a smaller hiring pool and a longer onboarding period, and both of those costs arrive precisely when the company can least afford them.
This is the general principle behind most of the choices below. The question is rarely which tool is best. It is which tool leaves you with the fewest problems eighteen months from now, and those are different questions with different answers.
Cost is zero. You pay for hosting rather than for the framework.
Authentication and payments are solved, and rebuilding them is the common mistake
Two categories where building your own is the most frequent early error we see, and both fail for the same reason. They appear simple and are not.
Authentication means Clerk or Auth.js. Sessions, password resets, social login, multi-factor, organisations, and the security implications of getting any of it slightly wrong. Clerk handles it with a component you drop in. Auth.js gives you more control and less magic. Building it yourself is a two-week estimate that becomes six weeks and produces something worse than the thing you would have installed in an afternoon.
Payments means Stripe, and not only checkout. Subscriptions, trials, proration when somebody upgrades mid-cycle, failed card recovery, invoicing, and tax. Stripe Billing covers all of it. The part teams skip is webhook reconciliation, which keeps your database and Stripe agreeing about what happened, and skipping it produces billing bugs that cost real money and are discovered by customers rather than by you.
Both have free tiers that last well past launch, which means the case for building your own is not even a cost argument. It is an instinct, and it is an expensive one.
Postgres does more than people reach for other databases to do
Postgres for anything relational, which in practice is nearly everything. It is the most capable open database available and it handles jobs that regularly send teams looking for a second system. JSON documents, full-text search, and vector search through pgvector, which means an AI feature frequently does not require a separate vector database at all. That is one fewer service, one fewer bill, and one fewer thing to keep in sync.
Supabase if you want Postgres with an API layer, authentication, storage, and row-level security without standing up infrastructure. It is Postgres underneath, so there is no proprietary query language to learn and no migration to fear later, which is the property that makes it a safe default rather than a lock-in.
We use it on smaller builds and reach for raw Postgres on AWS when scale or compliance demands it. The free tier is generous. Note that inactive projects pause, which surprises people who leave a project alone for a fortnight and return to a slow first request.
Observability goes in before the first user
This is the section founders skip and it is the one that separates a product from a demonstration.
Sentry for errors, because you want to know a user hit an exception before they email you, and you want the stack trace when they do.
PostHog for product analytics, meaning where people abandon onboarding, which feature nobody opens, and whether the change you shipped last week helped. It replaces three or four separate tools and has a genuinely usable free tier.
Grafana when you depend on external services. If your product calls model providers or third-party APIs, you want a dashboard showing degradation before a support ticket does. We learned this building Decipher Engine, which calls around twenty external providers, where the practical reality is that one of them is having a bad day most weeks.
The argument against doing this early is that there is nothing to measure yet, and the argument is wrong. Early users are where the sharpest signal exists, because there are few enough of them that individual behaviour is legible. Adding observability after something breaks means spending a day reconstructing what happened from logs that were not designed to answer the question.
AI, if it is part of the product
Claude, GPT, and Gemini behind a single abstraction, so that switching is a configuration change rather than a rewrite. This matters more than it sounds, because model pricing and capability shift every few months and being locked to a decision made in week one is a genuine cost.
OpenRouter if you want many models behind one API. Replicate for image models. Langfuse or LangSmith for tracing and evaluations, because a generative feature without an evaluation suite is one you can change and hope about but cannot improve deliberately.
The lever most teams miss is routing. Send simple steps to a cheaper model and reserve the frontier model for actual reasoning. It routinely halves the bill, and it is the first thing we examine on any AI build that has become expensive.
The stack, and what it costs to start
| Job | What we use | Free tier | When you start paying |
|---|---|---|---|
| Frontend | Next.js, TypeScript, Tailwind | Free permanently | Never |
| Hosting | Vercel | Yes | Real traffic |
| Backend services | Render | Yes | First always-on service |
| Database | Postgres or Supabase | Yes | Storage and connections |
| Authentication | Clerk or Auth.js | Yes | Past a few thousand users |
| Payments | Stripe | No fee, percentage per transaction | First sale |
| Errors | Sentry | Yes | Event volume |
| Analytics | PostHog | Generous | Event volume |
| Monitoring | Grafana | Yes | Rarely |
| Resend | Thousands per month | Real volume | |
| AI models | Claude, GPT, Gemini | Pay as you go | Immediately |
| CI and deployment | GitHub Actions | Yes | Heavy build minutes |
Scroll the table sideways to see every column.
Two we were wrong about
We built our own authentication once, on an early product, because it looked straightforward. It is straightforward until password reset, then session invalidation, then somebody asks for Google login, then multi-factor. Two weeks became six and the result was worse than a component we could have installed in an afternoon. We do not do it any more, and the lesson generalises. The features that look simple in authentication are the ones you have thought about, and the expensive ones are the ones you have not.
We also skipped analytics until launch, reasoning that there was nothing to measure before there were users. The consequence was launching, acquiring users, and having no idea which part of onboarding was losing them. The instrumentation you want is the instrumentation that was already running when the interesting thing happened, which means it has to be in place before you know what the interesting thing will be.
The SaaS stack: common questions
The stack is not the hard part
None of these choices explains why a build takes three weeks rather than three months. That comes from cutting scope hard before anybody opens an editor, and no tool substitutes for that decision.
If you want to know what your product would actually cost and take, the estimator is free and does not ask for your email.