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.