All posts
ENGINEERING · APR 12, 2026 · FURKAN — 8 MIN READ

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.”
— NOTEBOOK ENTRY, DAY 2
ship.js — FINAL BUILD
// 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};
✓ deployed · 47 tests · 1 invoice paid

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.

FIELD NOTES — 4/4
  • 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.

metrics.js — DAY 41
// first revenue check
console.log(`MRR: $`{mrr}$``);  // → $1,078\n"
2 invoices · 2 seats · 0 churn

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.

INDIE SAASNEXT.JSPOSTGRESB2B30-DAY BUILD
NEXT ARTICLE

TÜBİTAK 2204-A: my regional final journey

Türkiye's national research competition — Ankara