All posts
saasnextjsstripe
Shipping a SaaS MVP in a weekend
What actually has to exist before you can charge someone money, and what doesn't — a checklist for the first 48 hours.
Most SaaS MVPs die from scope, not from a missing feature. Here's the checklist I actually use for a first paid version.
The non-negotiables
Four things have to work before a stranger can pay you:
- Auth — email/password is enough; OAuth is a nice-to-have you add when support tickets ask for it.
- A single paid tier — resist multi-tier pricing until you have users asking for it.
- A dashboard with one real number on it — proof the product does the thing.
- A way to cancel — skipping this erodes trust and violates most payment processors' terms.
Everything else — teams, roles, audit logs, notifications — is Phase 2.
Wiring Stripe without overbuilding it
A single Checkout Session redirect covers 90% of first-version billing:
// lib/actions/checkout.ts
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: process.env.STRIPE_PRICE_ID, quantity: 1 }],
customer: user.stripeCustomerId,
success_url: `${appUrl}/dashboard?upgraded=1`,
cancel_url: `${appUrl}/pricing`,
});Handle exactly one webhook event (checkout.session.completed) to flip the user's access on. Everything else — proration, trials, dunning — you bolt on once revenue justifies the complexity.
What to explicitly cut
- Multi-currency support
- Invoicing/PDF receipts (Stripe already emails these)
- A public API
- Localization
Ship the smallest thing that lets someone pay you, then let real usage tell you what's next.