Validate a SaaS Idea Before Writing Any Code
Executive TL;DR
- Validate the problem before the product: ten honest customer conversations beat ten thousand lines of code.
- Count only commitment signals (money, time, or data). Compliments and email signups are not demand.
- Do it manually first. Automate only the step customers have already paid for.
Most SaaS products that fail don't fail on engineering. They ship a clean architecture for a problem nobody will pay to solve.
Engineers are especially exposed. Building feels like progress, and opening a repo is easier than booking a sales call. Three months in, you have auth, billing, and a dashboard, and no evidence anyone wants them.
Validation is an architecture decision too. You are choosing a stack of cheap experiments, each with its own cost, lock-in, and signal strength. Pick the wrong one and you learn nothing, or learn it too late.
Which validation approach gives the strongest signal per dollar?
| Option A | Option B |
|---|
When to pick each option
Landing page + waitlist: select if the category is already present and you want to test positioning. Run a small ad budget on a clear promise, and measure signups per visitor. This is a smoke test, not proof, as email is free to give.
Concierge MVP: Select this when the value is an outcome, not an interface. Deliver by hand with spreadsheets and scripts. If the process is ugly and customers keep coming back, you’ve found something real and you’ll know exactly what to automate.
No-code prototype: Select this option if user satisfaction is critical for the product. Tools like Bubble or Softr get a clickable flow in front of users quickly. Plan to throw it away, as the data model and performance limits will not survive real scale.
Paid pre-sale / LOI: Choose this option if you can name your buyers. Request a deposit, a signed letter of intent or a paying pilot. A single company paying upfront for a product not yet built tells you more than 1000 signups on a waitlistintent,.
Rendering diagram…
export default {
async fetch(req, env) {
if (req.method !== "POST") return new Response("ok");
const { email, source } = await req.json();
if (!/^\S+@\S+\.\S+$/.test(email)) {
return new Response("bad email", { status: 400 });
}
await env.WAITLIST.put(email, JSON.stringify({ source, at: Date.now() }));
return new Response("joined");
},
};MVP development planner
Scope, budget, and launch plan
Choose the product, platforms, and modules. The range, phases, and team update as you go. It is a planning figure, not a quote.
Newsletter
Subscribe for updates
Newsletter
Get the 2026 Tech Stack Guide
Join the KarmaKoders newsletter for architecture notes, stack evaluations, and build playbooks.