Pre-Launch Waitlist System
Complete guide to setting up and managing your pre-launch waitlist with email capture, live counter, and admin dashboard.
Features
- ✅ Email Capture - Collect emails with optional fields (name, feature interest, pain points)
- ✅ Live Counter - Real-time signup counter for FOMO
- ✅ Admin Dashboard - View, export, and manage all signups
- ✅ Announcements - Send bulk emails to waitlist members
- ✅ Conversion Tracking - Track who converts from waitlist to customer
- ✅ Social Proof - Testimonials and feature highlights
- ✅ Responsive Design - Mobile-first design with dark mode
Setup
1. Run Database Migration
- Go to your Supabase dashboard
- Navigate to SQL Editor
- Copy and paste the contents of
supabase/migrations/003_waitlist.sql - Click Run
This creates:
waitlisttable - Stores email signupswaitlist_conversionstable - Links waitlist entries to converted customers- Helper functions for stats
2. Environment Variables
No new environment variables needed! The system uses existing Supabase and Resend credentials.
3. Access the Pre-Launch Page
Visit: http://localhost:3000/coming-soon
Usage
For Users
- Join Waitlist
- Visit
/coming-soon - Enter email (required)
- Optional: Name, feature interest, pain point
- Get confirmation message
- Visit
For Admins
-
Access Waitlist Dashboard
- Navigate to
/admin/waitlist - View all signups with stats
- Navigate to
-
View Statistics
- Total signups
- Conversion count
- Conversion rate
-
Export Data
- Click "Export CSV"
- Get all emails with metadata
- Use for email marketing
-
Send Announcements
- Write subject and message
- Click "Send to All"
- Emails sent via Resend
-
Manage Entries
- Select entries with checkboxes
- Delete unwanted entries
- Bulk operations supported
API Endpoints
Public Endpoints
POST /api/waitlist/signup
{
"email": "user@example.com",
"full_name": "John Doe",
"feature_interest": "Analytics dashboard",
"pain_point": "Manual reporting"
}Response:
{
"success": true,
"message": "Successfully joined the waitlist"
}GET /api/waitlist/stats
Response:
{
"total_signups": 247,
"conversions": 12,
"conversion_rate": 4.86
}Admin Endpoints
GET /api/admin/waitlist
- Returns all waitlist entries
- Requires admin authentication
POST /api/admin/waitlist
{
"action": "export" // or "delete"
"ids": ["id1", "id2"] // for delete action
}POST /api/admin/waitlist/announce
{
"subject": "We are launching!",
"message": "Join us on launch day...",
"htmlContent": "<h1>We are launching!</h1>..." // optional
}Customization
Change Pre-Launch Page Content
Edit /src/app/(landing)/coming-soon/page.tsx:
const FEATURES = [
{
icon: Zap,
title: 'Your Feature',
description: 'Your description',
},
// Add more features
];
const FAQ_ITEMS = [
{
question: 'Your question?',
answer: 'Your answer',
},
// Add more FAQs
];
const TESTIMONIALS = [
{
name: 'John Doe',
role: 'CEO, Company',
content: 'Great product!',
},
// Add testimonials
];Customize Email Form
Edit /src/components/waitlist/EmailForm.tsx:
- Add/remove fields
- Change validation
- Customize styling
Customize Hero Section
Edit /src/components/waitlist/Hero.tsx:
- Change title, subtitle, CTA text
- Modify background effects
- Adjust colors and spacing
Conversion Tracking
When a user signs up for your app:
// In your signup handler
const { error } = await supabase
.from('waitlist_conversions')
.insert({
waitlist_id: waitlistId,
user_id: newUserId,
});This links the waitlist entry to the converted customer and updates conversion rate.
Email Announcements
Send Launch Announcement
- Go to
/admin/waitlist - Fill in subject and message
- Click "Send to All"
- Emails sent via Resend
Customize Email Template
Edit /src/app/api/admin/waitlist/announce/route.ts:
html: htmlContent || `
<h1>${subject}</h1>
<p>${message}</p>
<a href="${process.env.NEXT_PUBLIC_APP_URL}">Visit our site</a>
`Best Practices
1. Collect Valuable Data
- Ask about feature interest
- Ask about pain points
- Use for product validation
2. Leverage FOMO
- Show live signup counter
- Update frequently
- Highlight milestones ("500 people signed up!")
3. Engagement
- Send regular updates
- Build anticipation
- Share behind-the-scenes content
4. Conversion
- Track who converts
- Monitor conversion rate
- Optimize based on data
Troubleshooting
Emails not sending?
- Check Resend API key in
.env.local - Verify email addresses are valid
- Check Resend dashboard for errors
Stats not updating?
- Check API endpoint is working
- Verify RLS policies allow access
- Check browser console for errors
Admin page not accessible?
- Verify user has admin role
- Check authentication token
- Ensure user is logged in
Security
RLS Policies
- Public can insert (join waitlist)
- Only admins can view all entries
- Service role can manage data
- Prevents unauthorized access
Best Practices
- Never expose API keys in frontend
- Validate all inputs server-side
- Use HTTPS in production
- Implement rate limiting for signup endpoint
Next Steps
- Customize content - Update hero, features, FAQ
- Send test announcement - Verify email delivery
- Monitor signups - Check admin dashboard
- Launch campaign - Share pre-launch page
- Track conversions - Link signups to customers
Support
For issues or questions:
- Check the troubleshooting section
- Review API endpoint documentation
- Check browser console for errors
- Verify Supabase and Resend are configured correctly