- Honest Context: What I've Actually Shipped
- The Stack Decision: Why PHP, Laravel and React
- Validate Before You Build
- The MVP Timeline That Actually Works
- Payments: Get This Right Early
- Infrastructure Without the Overhead
- The Feature Creep Trap
- After Launch: The Part Nobody Talks About
- Real Talk: What I'd Do Differently
The internet is full of "how I built a SaaS in a weekend" articles written by people who had either already built twenty products before that one, or who are quietly omitting the months of false starts that preceded the weekend sprint. I want to write something more honest than that.
I'm a full stack developer with over 20 years of experience building web applications in PHP, Laravel, and React. In that time I've shipped multiple SaaS products — some that found users, some that quietly died, and a few that are still running and generating revenue today. This article is a distillation of what I've actually learned from that process: the decisions that mattered, the shortcuts that cost me later, and the patterns I now apply to every new product I build.
If you're a developer who wants to build and launch a SaaS product solo, this is written specifically for you. It assumes you can write the code. The hard parts are the decisions around the code.
"The biggest advantage a full stack developer has as a solo founder is the ability to move extremely fast from idea to working product. The biggest risk is that moving fast in the wrong direction is just an efficient way to waste time."
Honest Context: What I've Actually Shipped
Before taking advice from anyone on the internet, you should know what they've actually shipped. Here's mine:
ExpenShare is a budget tracking SaaS application built with React and Supabase. It helps individuals and small groups track shared expenses without the ceremony of a spreadsheet. It's live at expenshare.app and has real users who pay for it.
Calculator Paradise is a collection of precise financial calculators built with React and TypeScript. It sounds unglamorous — and it is — but unglamorous tools often have the most durable user bases. People who need a reliable mortgage calculator at 11 PM aren't looking for beautiful design; they're looking for accurate math and a fast, distraction-free interface.
ATS Resume Optimizer is an AI-powered SaaS tool that helps job seekers optimize their resumes for Applicant Tracking Systems. Built with React, TypeScript, and the OpenAI API, it sits at the intersection of a genuine user pain point and a technology that makes solving it tractable for a solo developer.
Each of these taught me something different. Together they form the foundation of the opinions in this article.
The Stack Decision: Why PHP, Laravel and React
When you're building alone, your technology choices have enormous consequences. The wrong stack doesn't just slow you down — it isolates you. You can't hire help, you can't find tutorials when you're stuck at midnight, and you can't hand the project off when life intervenes.
My stack for solo SaaS development is PHP, Laravel, and React — and I come back to it not out of habit but out of deliberate re-evaluation every time I start a new project. Here's why each piece earns its place:
PHP / Laravel
20 years of maturity. Authentication, queues, email, file storage, cron jobs — all solved, all documented, all consistent. Hosting is cheap and widely available. The hiring pool is enormous if you ever need help.
React + TypeScript
Component model maps to real UI problems. TypeScript catches entire categories of bugs before they reach users. The ecosystem — TanStack Query, Zustand, React Router — is stable and battle-tested.
MySQL / PostgreSQL
Relational databases are the right default for SaaS. They give you transactions, foreign keys, and a query language that every developer already knows. Don't reach for NoSQL until you have a specific reason.
Stripe
The payment layer of the stack is as important as everything else. Stripe's API is the most developer-friendly in the industry, and their Laravel Cashier integration makes subscription billing genuinely simple.
The advice to "use what you know" is wisdom that sounds trite until you've wasted three weeks learning a new framework while also trying to build a product. Your competitive advantage as a solo developer is speed. The stack that lets you move fastest in the first six months is almost always the one you know best.
Validate Before You Build
This is the part most developers skip because building is more comfortable than selling. It is also the most important phase of the entire process.
Before I write a single line of application code on a new SaaS idea, I spend time answering three questions as specifically as possible:
- Who, exactly, has this problem? Not "small businesses" — a real answer looks like "freelance graphic designers who invoice more than five clients per month and currently use spreadsheets to track project time."
- How are they solving it today? Every problem has an existing solution, even if that solution is a spreadsheet, a sticky note, or doing nothing. Understanding the incumbent solution tells you what your product needs to beat and what it can afford to be worse at.
- Will they pay for a better solution? The answer to this question is not "yes, I think so." The answer is either "yes, I have pre-signups or letters of intent from five people who match the profile," or "I don't know yet."
Validation doesn't have to mean months of customer discovery interviews. It can mean posting in a relevant community and counting how many people say "I have this problem." It can mean building a landing page with a waitlist and measuring how many people sign up after seeing the value proposition. What it cannot mean is just trusting your instinct that people will want it.
The MVP Timeline That Actually Works
Here is how I structure the first eight weeks of a new solo SaaS project using Laravel and React. This isn't a rigid prescription but a template I've refined across multiple product launches:
Payments: Get This Right Early
I cannot stress this enough: integrate payments in week five, not week fifteen. The psychology of having money in the product — even if nobody has paid yet — changes how you build it. You start asking "would someone pay for this feature?" instead of "is this feature cool?"
Laravel Cashier makes Stripe integration genuinely painless. Subscription management, invoice generation, usage-based billing, trial periods, grace periods — it's all handled. Here's the minimum you need for a functional subscription flow:
// routes/web.php
Route::post('/subscribe', [BillingController::class, 'subscribe'])
->middleware(['auth', 'verified']);
// app/Http/Controllers/BillingController.php
public function subscribe(Request $request): RedirectResponse
{
$request->validate([
'payment_method' => ['required', 'string'],
'plan' => ['required', Rule::in(['starter', 'pro'])],
]);
$priceId = config("billing.plans.{$request->plan}.stripe_price_id");
$request->user()
->newSubscription('default', $priceId)
->trialDays(14)
->create($request->payment_method);
return redirect()->route('dashboard')
->with('success', 'Welcome to Pro! Your 14-day trial has started.');
}
Your first pricing is almost certainly wrong, and that's fine. What matters is that you pick a number and charge it. A common mistake is setting prices too low because you feel guilty charging for something you built yourself. Price based on the value delivered to the customer, not the hours you spent building it. You can always adjust — going up is harder than going down, so start slightly higher than feels comfortable.
Infrastructure Without the Overhead
As a solo developer, your infrastructure goal is simplicity first, performance second, cost third. A product that goes down every week because the infrastructure is too complex to maintain is worse than a slightly slower product that stays up reliably.
My current default setup for a new Laravel SaaS application:
- Application server: A single VPS on Hetzner or DigitalOcean running Laravel with Laravel Forge for server management. Forge handles Nginx, PHP-FPM, SSL, and deployment hooks — removing hours of server admin from my week.
- Database: Managed MySQL or PostgreSQL from the same VPS provider. Managed databases handle backups, failover, and updates. The cost premium is worth every rupee for a solo developer.
- Frontend: React SPA deployed to Cloudflare Pages. It's free, globally distributed, and deploys on every git push. Zero configuration for SSL and CDN.
- File storage: Cloudflare R2 or AWS S3. S3-compatible, Laravel's Flysystem integrates with both, and you only pay for what you store.
- Email: Resend or Postmark for transactional email. Both have Laravel integrations and generous free tiers that will last you through early growth.
- Error monitoring: Sentry. Free tier covers most early-stage apps and the Laravel SDK integrates in five minutes. You need to know when things break before your users tell you.
This stack costs roughly $30–50 per month before you have significant traffic. That's a reasonable bet to take on a product idea.
The Feature Creep Trap
Feature creep is the primary cause of solo SaaS products that never launch. It's seductive because every feature you add feels like progress — you're building, you're writing code, you're making the product better. But every feature you add before launch is a feature that delayed your first customer, delayed your first feedback, and delayed the moment when you learn whether any of it matters.
I use a rule I call the "ten-user test": before adding any feature to a pre-launch product, I ask whether ten real users have explicitly asked for it. Not whether I think they'll want it. Not whether it would make the product more complete. Whether actual humans who have the problem I'm solving have said they need this specific thing.
The second layer of this discipline is maintaining a written "not now" list. Every feature idea that doesn't pass the ten-user test goes on this list. This is different from a backlog — a backlog implies these things will get built eventually. A "not now" list is honest: these are ideas, and most of them will never get built, because most ideas are not worth building.
After Launch: The Part Nobody Talks About
Launch is not the finish line. This is something that startup content conspicuously fails to address. The Product Hunt launch, the Hacker News post, the spike in sign-ups — these are exciting, but they're also temporary. What determines whether your SaaS product survives and grows is what happens in the six weeks after the initial excitement fades.
In that window, your job is:
- Talk to churning users. Every person who signs up and doesn't convert to a paid plan, or who cancels their subscription, is a source of information. Most won't respond to your email. The ones who do will tell you things that invalidate assumptions you didn't know you were making.
- Identify your power users. In every early-stage product, there's a small subset of users who use the product in ways you didn't anticipate and get significantly more value from it than average. Find these people. They are showing you the real use case for your product.
- Instrument everything. You need to know which features are being used, where users drop off in your onboarding flow, and what actions precede a conversion to paid. Without this data you're making product decisions based on guesswork. Tools like PostHog have generous free tiers and integrate with Laravel in minutes.
- Fix retention before acquisition. There is no point spending time or money bringing new users into a product that fails to retain the ones you already have. A leaky bucket doesn't get fixed by pouring more water in.
Real Talk: What I'd Do Differently
Every product I've shipped has taught me something I wish I'd known before I started. Here are the most consistent lessons across all of them:
I would validate more aggressively before writing code. In every case where a product struggled to find users, I can trace the problem back to insufficient validation. I built something I was confident people wanted, and I was wrong, and I found out six months later than I should have because I was too comfortable building to spend time talking to potential users.
I would launch two to three weeks earlier than felt comfortable. The product is never ready. There will always be one more feature that you're sure will make the difference. Ship without it. The feedback you get from real users in a slightly rough product is worth more than the polish you would have added with those extra weeks.
I would invest more in onboarding from day one. The onboarding flow is not a nice-to-have. It is the product experience for the majority of your users, because the majority of your users will leave during or immediately after onboarding if they don't immediately understand the value. Every hour you spend making onboarding clearer pays back in retention.
I would resist the urge to build integrations early. Integrations feel like they unlock a wider market. In practice, they take far longer to build and maintain than you expect, they create dependencies on third-party APIs that change without warning, and they distract you from the core product. Build them when your users are explicitly blocked without them, not before.
Being a full stack developer is a genuine superpower for solo SaaS. You can move from idea to deployed product faster than any team of specialists. The discipline is in pointing that speed in the right direction — validating early, launching fast, listening carefully, and iterating relentlessly on the thing users actually need rather than the thing you imagined they would need.
The best SaaS products aren't the ones with the most features or the cleverest technology. They're the ones that solve a real problem for a real set of people and keep doing it reliably, month after month. Everything else — the tech stack, the architecture, the UI — is in service of that goal.
If you're building a SaaS product and want to talk through the decisions — stack, architecture, pricing, launch strategy — feel free to reach out. I've made most of the available mistakes already, and I'm happy to help you skip a few of them.
