Skip to main content

Best Boilerplates for Building Micro-SaaS 2026

·StarterPick Team
micro-saasindie-hackersaas-boilerplateshipfastt3-stack2026

TL;DR

Micro-SaaS is about shipping fast with minimal tech debt — you need a boilerplate that's pre-wired for auth, Stripe, email, and SEO blog without customization overhead. ShipFast ($299) is the most micro-SaaS-optimized: Marc Lou built it for his own micro-SaaS products. T3 Stack (free) is the best free option if you're technical and want to own every decision. The key is picking something that's "done enough" to launch in a week.

Key Takeaways

  • ShipFast: Optimized for solo devs, minimal codebase, auth + Stripe + email + blog wired up
  • T3 Stack: Free, full control, but more setup required for billing/email
  • Best micro-SaaS feature: Stripe checkout with success/cancel + webhook ready in < 1 hour
  • Avoid: Heavy enterprise boilerplates (Bedrock, Supastarter) — overkill for micro-SaaS
  • Auth: Magic link or Google OAuth (nobody wants to type a password for a $9/mo tool)
  • Deploy: Vercel + Neon free tier handles 100% of micro-SaaS early-stage needs

What Micro-SaaS Actually Needs

Core requirements (must have Day 1):
  ✅ Auth (Google OAuth + magic link)
  ✅ Stripe checkout + webhook
  ✅ Email (transactional + welcome)
  ✅ Landing page with pricing
  ✅ Simple subscription check (isPro?)

Nice to have (add as needed):
  → Blog for SEO
  → Admin panel to see users
  → Usage tracking
  → Customer support chat

Skip until traction:
  → Multi-tenancy
  → Teams/orgs
  → Advanced analytics
  → i18n
  → Mobile app

ShipFast: The Micro-SaaS Standard

ShipFast was built by Marc Lou (solo indie hacker, $1M+ ARR from micro-SaaS products).

// The killer feature: it's all wired up
// Auth, Stripe, email, SEO — just fill in your logic

// pages/api/stripe/checkout.ts — pre-wired checkout:
import { createCheckoutSession } from '@/libs/stripe';
import { getServerSession } from 'next-auth';

export default async function handler(req, res) {
  const session = await getServerSession(req, res, authOptions);
  if (!session) return res.status(401).json({ error: 'Unauthorized' });
  
  const { priceId } = req.body;
  const checkoutSession = await createCheckoutSession({
    priceId,
    customerId: session.user.stripeCustomerId,
    successUrl: `${process.env.NEXTAUTH_URL}/dashboard?success=true`,
    cancelUrl: `${process.env.NEXTAUTH_URL}/pricing`,
  });
  
  res.json({ url: checkoutSession.url });
}
// Subscription check — one line anywhere:
import { getServerSession } from 'next-auth';
import { authOptions } from '@/libs/next-auth';

export default async function ProtectedPage() {
  const session = await getServerSession(authOptions);
  const isPro = session?.user.hasAccess;  // ShipFast pre-wires this
  
  if (!isPro) redirect('/pricing');
  
  return <YourFeature />;
}
ShipFast micro-SaaS strengths:
  → 1 day to launch a basic SaaS (if you have the idea)
  → Magic link + Google OAuth pre-configured
  → Stripe + LemonSqueezy both supported
  → Mailgun/Resend/Sendgrid email templates pre-built
  → Blog with markdown pre-configured (good for SEO)
  → Next.js App Router
  
ShipFast limitations for micro-SaaS:
  → No TypeScript by default (but community fork exists)
  → Limited testing setup
  → No organization/team features (you'd add manually)

T3 Stack: Free Full Control

npx create-t3-app@latest my-micro-saas
# Select: tRPC, Prisma, NextAuth, Tailwind
// server/api/routers/subscription.ts — add Stripe yourself:
import { createTRPCRouter, protectedProcedure } from '@/server/api/trpc';
import Stripe from 'stripe';
import { z } from 'zod';

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);

export const subscriptionRouter = createTRPCRouter({
  createCheckout: protectedProcedure
    .input(z.object({ priceId: z.string() }))
    .mutation(async ({ ctx, input }) => {
      const session = await stripe.checkout.sessions.create({
        customer_email: ctx.session.user.email!,
        line_items: [{ price: input.priceId, quantity: 1 }],
        mode: 'subscription',
        success_url: `${process.env.NEXTAUTH_URL}/dashboard`,
        cancel_url: `${process.env.NEXTAUTH_URL}/pricing`,
        metadata: { userId: ctx.session.user.id },
      });
      return { url: session.url };
    }),
  
  getStatus: protectedProcedure.query(async ({ ctx }) => {
    const user = await ctx.db.user.findUnique({
      where: { id: ctx.session.user.id },
      select: { stripeSubscriptionStatus: true, stripePriceId: true },
    });
    return { isPro: user?.stripeSubscriptionStatus === 'active' };
  }),
});

Micro-SaaS-Specific Patterns

One-Click Subscription

// The simplest possible Stripe checkout:
'use client';
import { useState } from 'react';

export function BuyButton({ priceId, label = 'Get Started — $9/mo' }: {
  priceId: string;
  label?: string;
}) {
  const [loading, setLoading] = useState(false);
  
  const handleClick = async () => {
    setLoading(true);
    const res = await fetch('/api/stripe/checkout', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ priceId }),
    });
    const { url } = await res.json();
    window.location.href = url;
  };
  
  return (
    <button onClick={handleClick} disabled={loading}
      className="bg-black text-white px-6 py-3 rounded-lg font-semibold hover:bg-gray-800 disabled:opacity-50">
      {loading ? 'Loading...' : label}
    </button>
  );
}

Simple Access Gate

// Simple isPro check — works for 95% of micro-SaaS:
import { db } from '@/lib/db';

export async function getUserAccess(userId: string) {
  const user = await db.user.findUnique({
    where: { id: userId },
    select: { subscriptionStatus: true, trialEndsAt: true },
  });
  
  const isActive = user?.subscriptionStatus === 'active';
  const isTrialing = user?.trialEndsAt ? new Date() < user.trialEndsAt : false;
  
  return { hasAccess: isActive || isTrialing };
}

Micro-SaaS Pricing Tiers That Work

// 2026 micro-SaaS pricing that converts:
const PRICING = [
  {
    name: 'Starter',
    price: 0,
    limits: { projects: 1, apiCalls: 100 },
    cta: 'Start for free',
    highlight: false,
  },
  {
    name: 'Pro',
    price: 9,
    limits: { projects: 10, apiCalls: 10000 },
    cta: 'Get Pro',
    highlight: true,  // Most visible
    stripePriceId: process.env.NEXT_PUBLIC_STRIPE_PRO_PRICE_ID,
  },
  {
    name: 'Lifetime',
    price: 99,
    limits: { projects: 999, apiCalls: 999999 },
    cta: 'Buy once, own forever',
    highlight: false,
    stripePriceId: process.env.NEXT_PUBLIC_STRIPE_LIFETIME_PRICE_ID,
  },
];

Deployment Stack (Free Tier Ready)

For micro-SaaS early stage (0-100 paying customers):

Hosting:  Vercel (free tier)
Database: Neon Postgres (free 0.5GB)
Email:    Resend (3,000 emails/month free)
Auth:     NextAuth (free, self-hosted)
Payments: Stripe (2.9% + $0.30 per transaction)
Storage:  Cloudflare R2 (free 10GB)
Analytics: Vercel Analytics (free) + PostHog (free 1M events)

Monthly cost at 0 users: $0
Monthly cost at 100 users: ~$15 (Resend paid plan)
Monthly cost at 500 users: ~$35 (Neon Launch tier)

Decision Guide

Choose ShipFast if:
  → Want to ship in < 1 week
  → Non-technical co-founder who just needs to go live
  → Willing to pay $299 to save 2 weeks of setup
  → Don't need TypeScript in the boilerplate itself

Choose T3 Stack if:
  → Want TypeScript end-to-end (tRPC)
  → Need full control over every library choice
  → Comfortable spending 3-5 days on initial setup
  → Budget-constrained (free)

Choose Next SaaS Starter / Nextacular if:
  → Want a free boilerplate closer to ShipFast in features
  → Contributing back to open source is a priority

Avoid if building micro-SaaS:
  → Supastarter (overkill complexity for 1-person SaaS)
  → Bedrock (enterprise pricing, enterprise features)
  → Makerkit (great but plugin system overhead)

Find micro-SaaS boilerplates at StarterPick.

Comments