Live demo — shared accounts, sample data, reset regularly. Don't enter anything real.Get the source
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:

  1. Auth — email/password is enough; OAuth is a nice-to-have you add when support tickets ask for it.
  2. A single paid tier — resist multi-tier pricing until you have users asking for it.
  3. A dashboard with one real number on it — proof the product does the thing.
  4. 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.