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
- Go to Stripe Dashboard → toggle to Live mode
- Activate account (provide business details)
- Recreate all products and prices in live mode
- Update price IDs in app code (test IDs start
price_test_..., live IDsprice_...) - Create production webhook:
https://your-domain.com/api/stripe/webhook - Copy webhook signing secret → update
STRIPE_WEBHOOK_SECRETin 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)