Claude-skill-registry-data Micro-SaaS Accelerator
Rapidly build and launch micro-SaaS applications with best practices, monetization, and deployment
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry-data
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry-data "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/micro-saas-accelerator" ~/.claude/skills/majiayu000-claude-skill-registry-data-micro-saas-accelerator && rm -rf "$T"
manifest:
data/micro-saas-accelerator/SKILL.mdsource content
Micro-SaaS Accelerator Skill
Rapidly build, launch, and scale micro-SaaS applications following proven patterns and best practices.
What is a Micro-SaaS?
A micro-SaaS is a small, focused Software-as-a-Service business that:
- Solves ONE specific problem extremely well
- Can be built and maintained by 1-5 people
- Targets a niche audience
- Generates $1K-$50K MRR
- Requires minimal ongoing maintenance
Core Capabilities
- MVP development (ship in 2-4 weeks)
- Authentication & user management
- Payment integration (Stripe/LemonSqueezy)
- Database schema design for SaaS
- Landing page & onboarding flows
- Usage tracking & analytics
- Email notifications
- API development
- Multi-tenancy setup
- Deployment & CI/CD
Proven Tech Stack
Frontend
Next.js 14+ (App Router) + TypeScript + Tailwind CSS + shadcn/ui components + Framer Motion (animations)
Backend & Database
Supabase + PostgreSQL (database) + Auth (built-in) + Row Level Security (RLS) + Realtime subscriptions + Storage (files)
Payments
Stripe or LemonSqueezy + Checkout sessions + Webhooks + Subscription management + Customer portal
Deployment
Vercel (frontend + API routes) + Automatic deployments + Preview environments + Edge functions + Analytics
Rapid MVP Development Process
Week 1: Foundation
Day 1-2: Project Setup - Initialize Next.js 14 project - Configure Supabase project - Set up database schema - Configure authentication Day 3-4: Core Feature - Implement main value proposition - Build essential UI components - Connect frontend to backend - Add basic error handling Day 5-7: User Flow - Landing page - Sign up/sign in - Onboarding flow - Dashboard layout
Week 2: Polish & Launch
Day 8-10: Monetization - Stripe integration - Subscription plans - Payment webhooks - Customer portal Day 11-13: Essential Features - Usage limits enforcement - Email notifications - User settings - Basic analytics Day 14: Launch Prep - Production deployment - Domain setup - Basic documentation - Launch checklist completion
Database Schema Pattern
Core SaaS Tables
-- Users (managed by Supabase Auth) -- Just extend with profile data -- User profiles CREATE TABLE profiles ( id UUID PRIMARY KEY REFERENCES auth.users(id), email TEXT, full_name TEXT, avatar_url TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Subscriptions CREATE TABLE subscriptions ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID REFERENCES auth.users(id), stripe_customer_id TEXT UNIQUE, stripe_subscription_id TEXT UNIQUE, status TEXT NOT NULL, -- 'active', 'canceled', 'past_due' plan_id TEXT NOT NULL, -- 'free', 'pro', 'enterprise' current_period_end TIMESTAMPTZ, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Usage tracking CREATE TABLE usage ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID REFERENCES auth.users(id), resource_type TEXT NOT NULL, amount INTEGER DEFAULT 1, created_at TIMESTAMPTZ DEFAULT NOW() ); -- Main resource (replace with your core entity) CREATE TABLE resources ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID REFERENCES auth.users(id), title TEXT NOT NULL, content JSONB, status TEXT DEFAULT 'active', created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Enable RLS on ALL tables ALTER TABLE profiles ENABLE ROW LEVEL SECURITY; ALTER TABLE subscriptions ENABLE ROW LEVEL SECURITY; ALTER TABLE usage ENABLE ROW LEVEL SECURITY; ALTER TABLE resources ENABLE ROW LEVEL SECURITY; -- Basic RLS policies CREATE POLICY "Users can view own profile" ON profiles FOR SELECT USING (auth.uid() = id); CREATE POLICY "Users can update own profile" ON profiles FOR UPDATE USING (auth.uid() = id); -- Repeat for other tables...
Authentication Setup
Supabase Auth Configuration
// lib/supabase.ts import { createClientComponentClient } from '@supabase/auth-helpers-nextjs' export const supabase = createClientComponentClient() // Protected route middleware // middleware.ts import { createMiddlewareClient } from '@supabase/auth-helpers-nextjs' import { NextResponse } from 'next/server' export async function middleware(req) { const res = NextResponse.next() const supabase = createMiddlewareClient({ req, res }) const { data: { session } } = await supabase.auth.getSession() if (!session && req.nextUrl.pathname.startsWith('/dashboard')) { return NextResponse.redirect(new URL('/login', req.url)) } return res }
Payment Integration
Stripe Setup (Recommended)
// lib/stripe.ts import Stripe from 'stripe' export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: '2023-10-16', }) // API route: /api/create-checkout export async function POST(req: Request) { const { priceId, userId } = await req.json() const session = await stripe.checkout.sessions.create({ mode: 'subscription', payment_method_types: ['card'], line_items: [{ price: priceId, quantity: 1 }], success_url: `${process.env.NEXT_PUBLIC_URL}/dashboard?success=true`, cancel_url: `${process.env.NEXT_PUBLIC_URL}/pricing?canceled=true`, client_reference_id: userId, }) return Response.json({ url: session.url }) } // API route: /api/webhooks/stripe export async function POST(req: Request) { const sig = req.headers.get('stripe-signature')! const body = await req.text() const event = stripe.webhooks.constructEvent( body, sig, process.env.STRIPE_WEBHOOK_SECRET! ) switch (event.type) { case 'checkout.session.completed': // Create subscription record break case 'customer.subscription.updated': // Update subscription status break case 'customer.subscription.deleted': // Cancel subscription break } return Response.json({ received: true }) }
Usage Limits Enforcement
Check and Enforce Limits
// lib/usage-limits.ts const PLAN_LIMITS = { free: { resources: 5, api_calls: 100 }, pro: { resources: 100, api_calls: 10000 }, enterprise: { resources: -1, api_calls: -1 }, // unlimited } export async function checkUsageLimit( userId: string, resourceType: string ) { // Get user's current plan const { data: subscription } = await supabase .from('subscriptions') .select('plan_id') .eq('user_id', userId) .single() const plan = subscription?.plan_id || 'free' // Count current usage const { count } = await supabase .from('usage') .select('*', { count: 'exact', head: true }) .eq('user_id', userId) .eq('resource_type', resourceType) const limit = PLAN_LIMITS[plan][resourceType] if (limit === -1) return true // unlimited return count < limit } // Usage in API routes export async function POST(req: Request) { const { userId } = await getSession(req) const canCreate = await checkUsageLimit(userId, 'resources') if (!canCreate) { return Response.json( { error: 'Usage limit reached. Upgrade to create more.' }, { status: 403 } ) } // Create resource... }
Landing Page Essentials
Hero Section Template
// app/page.tsx export default function LandingPage() { return ( <div className="flex flex-col items-center justify-center min-h-screen"> <h1 className="text-5xl font-bold text-center"> {/* Clear, benefit-focused headline */} Transform X into Y in Minutes </h1> <p className="text-xl text-gray-600 mt-4 max-w-2xl text-center"> {/* One-sentence explanation of what it does */} The fastest way to [achieve outcome] without [pain point] </p> <div className="flex gap-4 mt-8"> <button className="px-8 py-3 bg-blue-600 text-white rounded-lg"> Start Free Trial </button> <button className="px-8 py-3 border border-gray-300 rounded-lg"> View Demo </button> </div> {/* Social proof */} <p className="text-sm text-gray-500 mt-8"> Join 1,000+ users who love [Product] </p> </div> ) }
Pricing Section
const PLANS = [ { name: 'Free', price: '$0', features: [ '5 resources', '100 API calls/month', 'Basic support', ], }, { name: 'Pro', price: '$19', features: [ '100 resources', '10,000 API calls/month', 'Priority support', 'Advanced features', ], popular: true, }, { name: 'Enterprise', price: 'Custom', features: [ 'Unlimited resources', 'Unlimited API calls', 'Dedicated support', 'Custom integrations', ], }, ]
Email Notifications
Setup with Resend (Recommended)
// lib/email.ts import { Resend } from 'resend' const resend = new Resend(process.env.RESEND_API_KEY) export async function sendWelcomeEmail(email: string, name: string) { await resend.emails.send({ from: 'onboarding@yourdomain.com', to: email, subject: 'Welcome to [Product]!', html: ` <h1>Welcome, ${name}!</h1> <p>Thanks for signing up. Here's how to get started...</p> `, }) } // Trigger on user signup // Trigger on subscription created // Trigger on usage limit reached
Analytics & Monitoring
Essential Metrics to Track
// Track these events: - User signups - Trial starts - Trial to paid conversions - Feature usage - Churn events - Support requests - Error rates // Use: - Vercel Analytics (built-in) - PostHog (self-hosted) - Plausible (privacy-focused)
Launch Checklist
Pre-Launch
- Core feature fully functional
- Authentication working
- Payments integrated and tested
- RLS policies on all tables
- Error handling implemented
- Loading states added
- Mobile responsive
- Basic SEO (title, description, OG tags)
- Terms of Service & Privacy Policy
- Email notifications working
Launch Day
- Deploy to production
- Custom domain configured
- SSL certificate active
- Analytics tracking
- Monitoring/alerts setup
- Stripe webhook endpoint verified
- Test full signup → payment flow
- Create launch post (Twitter, HN, etc.)
Post-Launch (Week 1)
- Monitor error logs daily
- Respond to user feedback
- Fix critical bugs within 24h
- Track key metrics
- Send welcome emails
- Engage with early users
Common SaaS Patterns
Freemium Model
Free Plan → Limited features/usage ↓ Pro Plan → Unlock full features ↓ Enterprise → Custom pricing/support
Usage-Based Pricing
Track usage → Calculate bill ↓ Charge per unit (API calls, storage, etc.) ↓ Real-time usage display
Seat-Based Pricing
Per user pricing ↓ Team management ↓ Invitation system
Security Best Practices
Critical Checklist
- Environment variables never committed
- RLS enabled on ALL database tables
- API routes validate auth tokens
- Input validation on all forms
- SQL injection prevention (use parameterized queries)
- CORS configured correctly
- Rate limiting on API routes
- Webhook signature verification
- Sensitive operations require re-authentication
- User data encrypted at rest
Performance Optimization
Must-Do Optimizations
// 1. Image optimization import Image from 'next/image' <Image src={url} alt="..." width={500} height={300} /> // 2. Database query optimization // Use indexes on frequently queried columns CREATE INDEX idx_user_id ON resources(user_id); // 3. API response caching export const revalidate = 60 // Cache for 60 seconds // 4. Use React Server Components // Keep client components minimal // 5. Lazy load heavy components const HeavyComponent = dynamic(() => import('./HeavyComponent'))
Deployment Process
Vercel Deployment (Recommended)
# 1. Install Vercel CLI npm i -g vercel # 2. Link project vercel link # 3. Set environment variables vercel env add SUPABASE_URL vercel env add SUPABASE_ANON_KEY vercel env add STRIPE_SECRET_KEY vercel env add STRIPE_WEBHOOK_SECRET # 4. Deploy vercel --prod
Environment Variables Needed
# Supabase NEXT_PUBLIC_SUPABASE_URL= NEXT_PUBLIC_SUPABASE_ANON_KEY= SUPABASE_SERVICE_ROLE_KEY= # Stripe STRIPE_SECRET_KEY= STRIPE_WEBHOOK_SECRET= NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= # App NEXT_PUBLIC_URL=https://yourdomain.com # Email (optional) RESEND_API_KEY=
Scaling Considerations
When to Scale
< 1,000 users: Don't optimize, just ship 1K - 10K users: Basic optimization (caching, indexes) 10K - 100K users: Database optimization, CDN 100K+ users: Consider dedicated infrastructure
Cost Management
Free Tiers to Use: - Vercel: 100GB bandwidth - Supabase: 500MB database, 2GB bandwidth - Stripe: No monthly fee, just transaction % - Resend: 3,000 emails/month Expected Costs (at 1,000 users): - Hosting: $0-20/month - Database: $0-25/month - Email: $0-10/month - Total: $0-55/month
Marketing & Growth
Launch Platforms
- Product Hunt: Best for B2B tools, Wednesday launches
- Hacker News: Show HN posts, technical products
- Twitter/X: Build in public, share progress
- Reddit: Niche subreddits (be helpful, not spammy)
- Indie Hackers: Community of builders
Content Strategy
Week 1: Launch announcement Week 2-4: Tutorial content, use cases Month 2+: SEO content, case studies
Common Mistakes to Avoid
- Building too many features: Ship core feature first
- Perfect design obsession: Good enough is good enough for MVP
- No monetization: Add payments from day 1
- Ignoring feedback: Talk to users daily
- Over-engineering: Use proven tech, not experimental
- No marketing: Build audience while building product
- Forgetting analytics: Can't improve what you don't measure
Success Metrics
MVP Success (First 30 Days)
- 100+ signups
- 10+ paying customers
- $500+ MRR
- <5% churn rate
- Product-market fit signals
Growth Phase (Months 2-6)
- 1,000+ signups
- 50+ paying customers
- $2,500+ MRR
- Positive unit economics
- Organic growth starting
Resources & Tools
Essential Reading
- "The Mom Test" - Customer interviews
- "Traction" - Marketing channels
- "Zero to Sold" - Building & selling SaaS
Useful Tools
- Excalidraw - Architecture diagrams
- Figma - UI design (optional)
- Linear - Issue tracking
- Plausible - Analytics
- Statuspage - Uptime monitoring
Remember: Ship fast, iterate based on feedback, and focus on solving ONE problem extremely well!
Motto: "Working software > Perfect software"