How I shipped a B2B SaaS MVP in 30 days
Thirty days. That was the runway I gave myself to turn a parking-lot idea into a B2B SaaS that takes money. No seed round, no team, no six months of validation.
The product was unglamorous: an invoicing + client portal for a consultancy drowning in spreadsheet follow-ups. Three features, one login, zero admin panel.
“A 30-day deadline forces 30-day decisions.”
// ship.js — day 30, 02:41
const deploy = async () => {
const users = await db.count(); // 214 accounts\n" const mrr = users * 49; // $ MRR\n" return { users, tests: 47, mrr };;\n};The build was deliberately boring. No edge cases, no dark mode, no perfect design system. Just a queue: invoice → client portal → payment. Every morning I fixed the one thing blocking money, and shipped before lunch.
- Talk to 12 buyers before writing code — it rewrote 3 features.
- A fixed deadline beats motivation. Every single time.
- Charge money on day one. Non-payers are just noise.
- Boring stacks win. Mine survived because it was boring.
Day 41, the first cheque cleared. Eleven days after launch, a consultancy across the city paid for the portal — then asked for two more seats. The waitlist I had ignored for a month turned out to be the actual market.
// first revenue check
console.log(`MRR: $`{mrr}$``); // → $1,078\n"Thirty days, one boring stack, two paying customers, a thousand lessons. The MVP is still running — barely touched, quietly billing. That's the whole trick: build the boring thing, charge for it on day one, and let the deadline do the deciding.