D
Dev SOPKnowledge Base
Search
← All topics

PRD to Production: SaaS Build and Deployment Checklist

End-to-end SaaS build and deployment process — PRD creation via guided conversation, GSD build phases, GitHub push, Vercel production deployment, Stripe sandbox-to-production migration, Supabase URL updates, and env var audit.

prdsaasdeploymentvercelstripesupabasechecklist
Agent trigger phrases: PRD generator · SaaS deployment checklist · deploy SaaS · PRD to production · Stripe production · Vercel deploy checklist · SaaS go-live

Overview

The PRD-to-production pipeline has two phases: planning (PRD creation) and deployment (go-live checklist). Planning happens before code. Deployment happens after localhost verification.

Phase 1: PRD Creation

Stream of Consciousness Input

Talk or type freely about the app — what it does, who uses it, how it earns, what it integrates. Voice input works well here. The output feeds into the planning prompt.

Planning Prompt

Use with any LLM (Claude, GPT, Gemini):

You are a senior product architect. Help me create a complete PRD for a SaaS app.

My app: [paste stream-of-consciousness description]

Ask me clarifying questions about:
1. Core user journey (what does a user do first, second, third)
2. Authentication (Clerk, Supabase Auth, or other)
3. Database (Supabase, Convex, PlanetScale)
4. Payments (Stripe, Lemon Squeezy, none)
5. AI integration (yes/no, which model, what for)
6. Deployment target (Vercel, Railway, self-hosted)
7. Key differentiator (what makes this different from alternatives)

Then output a structured PRD with: overview, user stories, data models, API routes, UI screens, and success criteria.

PRD Output Structure

# [App Name] PRD

## Overview
[1-paragraph summary]

## User Stories
- As a [role], I want to [action] so that [outcome]

## Data Models
- users: id, email, created_at
- projects: id, user_id, name, status

## API Routes
- POST /api/auth/signup
- GET /api/projects
- POST /api/projects

## UI Screens
- /landing — marketing page
- /dashboard — main app
- /settings — account settings

## Success Criteria
- [ ] User can sign up and log in
- [ ] User can create and list projects
- [ ] Stripe checkout completes successfully

Phase 2: Pre-Deployment Verification

Before pushing to Vercel, confirm all of these pass on localhost:

[ ] npm run dev runs without errors
[ ] Authentication flow: signup → login → logout
[ ] Core features work end-to-end
[ ] Stripe sandbox checkout: test card 4242 4242 4242 4242
[ ] Database CRUD operations work, RLS enforced
[ ] No hardcoded localhost URLs in application code
[ ] .env.local has all required variables populated
[ ] .gitignore covers .env*, node_modules/, .next/

Phase 3: GitHub Repository

# Create repo (private)
gh repo create my-saas-app --private

# Push existing code
git init
git add .
git commit -m "initial build"
git remote add origin https://github.com/username/my-saas-app.git
git branch -M main
git push -u origin main

Phase 4: Vercel Deployment

npm i -g vercel

# Link and deploy
vercel link
vercel env pull .env.local          # sync env vars
vercel deploy --prod

Or via GitHub integration — connect repo in Vercel dashboard, set production branch to main.

Environment Variables Checklist

In Vercel dashboard → Settings → Environment Variables:

[ ] NEXT_PUBLIC_SUPABASE_URL         (production Supabase project URL)
[ ] NEXT_PUBLIC_SUPABASE_ANON_KEY    (production anon key)
[ ] SUPABASE_SERVICE_ROLE_KEY        (production service role)
[ ] NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY (production Clerk key)
[ ] CLERK_SECRET_KEY                  (production Clerk secret)
[ ] STRIPE_SECRET_KEY                 (sk_live_... NOT sk_test_...)
[ ] NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY (pk_live_...)
[ ] STRIPE_WEBHOOK_SECRET             (production webhook secret)
[ ] NEXT_PUBLIC_APP_URL               (https://your-domain.com)

Red flag: any test or sandbox key in production env = blocked payment in prod.

Phase 5: Stripe Production Migration

  1. Go to Stripe Dashboard → toggle to Live mode
  2. Activate account (provide business details)
  3. Recreate all products and prices in live mode
  4. Update price IDs in app code (test IDs start price_test_..., live IDs price_...)
  5. Create production webhook: https://your-domain.com/api/stripe/webhook
  6. Copy webhook signing secret → update STRIPE_WEBHOOK_SECRET in Vercel
# Test webhook with Stripe CLI
stripe listen --forward-to localhost:3000/api/stripe/webhook
stripe trigger checkout.session.completed

Phase 6: Supabase Production Setup

Supabase free projects pause after 7 days of inactivity. For production: upgrade to Pro ($25/mo).

[ ] Create production Supabase project (separate from dev)
[ ] Run migrations on production database
[ ] Verify RLS policies are active on all tables
[ ] Set up database backups (Pro: daily, point-in-time recovery)
[ ] Add production domain to CORS allowed origins
[ ] Update SUPABASE_URL and keys in Vercel env vars
[ ] Run auth flow on production URL to verify Supabase Auth

Phase 7: Domain and SSL

# Add custom domain in Vercel
vercel domains add yourdomain.com

# Update DNS (add CNAME record)
# CNAME: @ → cname.vercel-dns.com
# Vercel auto-provisions SSL certificate

Phase 8: Final Smoke Test

On the production URL:

[ ] Landing page loads without errors
[ ] Signup/login flow works
[ ] Core feature works end-to-end
[ ] Stripe checkout completes (use real card or test in sandbox mode)
[ ] No console errors in browser DevTools
[ ] Lighthouse score > 80 (optional but recommended)