MoveFast has a built-in system for managing pre-launch access. You can collect emails via a waitlist, invite users selectively, and switch to open signup when you are ready.
Platform Access Modes
The access mode is set in src/config/platform.config.ts:
import { PlatformAccessMode } from "@/config/platform.config";
export const PLATFORM_ACCESS_MODE = PlatformAccessMode.WAITLIST_WITH_INVITES;WAITLIST_WITH_INVITES
This is the default mode. It is designed for pre-launch:
- A waitlist form appears on the landing page
- New users cannot sign up unless they have an invite
- Existing users (already in the database) can still log in
- Admins manage access through the invite system
OPEN
This is for when you are ready to go public:
- Anyone can sign up freely
- No waitlist form is shown
- No invite required
- Standard SaaS signup experience
The Waitlist Flow
1. User Joins the Waitlist
When in WAITLIST_WITH_INVITES mode, the landing page shows a waitlist form. When a user submits their email:
- Their email is stored in the
waitingListcollection/table - They receive a welcome email confirming they are on the list
- Duplicate submissions are blocked
2. Admin Reviews Waitlist
In the admin dashboard at /admin/dashboard/waitlist, you can see all emails that signed up for the waitlist.
3. Admin Sends Launch Emails
When you are ready to let users in, select waitlist entries and send launch emails. The launch email includes:
- A message that the product is live
- A link to the sign-in page
The system tracks who received the launch email to avoid sending duplicates.
4. Admin Sends Reminder Emails
For users who got the launch email but have not signed up, you can send a reminder. Reminders only go to users who:
- Already received the launch email
- Have not yet received a reminder
- Are still on the waitlist (have not signed up)
5. User Signs Up
When a user signs up through the normal flow:
- They are automatically removed from the waitlist
- Their invite (if one exists) is marked as used
The Invite Flow
Invites give specific people permission to sign up, even before you send a mass launch email.
Creating an Invite
From the admin dashboard (/admin/dashboard/invites):
- Enter the email address
- Choose expiry (1 to 90 days, defaults to 7)
- Click "Send Invite"
The system:
- Generates a unique token
- Stores the invite record
- Sends an email with a sign-up link
What the User Sees
The invite email contains a link like:
https://yourdomain.com/auth/invite?token=abc123def456When they click it:
- The token is verified (checks it exists, is not expired, not used, not revoked)
- They are shown the sign-in page
- They sign in with Google or magic link
- The invite is marked as used
- They now have a full account
Invite Protection Rules
- Cannot create an invite for someone who already has an account
- Cannot create a duplicate invite for the same email (if one is already active)
- Expired invites cannot be used
- Revoked invites cannot be used
- Admins can revoke any active invite at any time
Transitioning to Open Signup
When you are ready to let everyone in:
- Open
src/config/platform.config.ts - Change the mode:
export const PLATFORM_ACCESS_MODE = PlatformAccessMode.OPEN;- Deploy the change
That is it. The waitlist form disappears from the landing page, and anyone can sign up without an invite. Existing waitlist data remains in the database (you can clean it up later if you want).
API Endpoints
These endpoints power the waitlist and invite system:
| Endpoint | Method | Access | What it does |
|---|---|---|---|
/api/waiting-list | POST | Public | Join the waitlist |
/api/waiting-list/send-emails | POST | Admin | Send launch or reminder emails |
/api/admin/waiting-list | GET | Admin | List all waitlist entries |
/api/admin/invites | GET | Admin | List all invites |
/api/admin/invites | POST | Admin | Create a new invite |
/api/admin/invites/[email] | DELETE | Admin | Delete an invite |
/api/admin/invites/[email]/revoke | POST | Admin | Revoke an invite |
/api/auth/verify-invite | GET | Public | Verify an invite token |
/api/auth/signup-with-invite | POST | Public | Sign up using an invite token |
Tips
- Start with
WAITLIST_WITH_INVITESmode. It creates urgency and lets you control early access. - Use waitlist emails to build anticipation. Send launch emails in batches rather than all at once.
- Invites are great for beta testers. Give them access early and collect feedback.
- The waitlist welcome email is a good place to set expectations (timeline, what to expect).
- When you switch to
OPEN, consider sending one final launch email to remaining waitlist members.
