ProductReadyProductReady

Waitlist and Invite Codes

Understanding ProductReady's access control system for pre-launch phases

Waitlist and Invite Codes

ProductReady provides a flexible access control system for managing pre-launch phases and controlled rollouts using Waitlist and Invite Codes.

Overview

The system supports three access modes:

  1. PUBLIC - Normal operation, everyone can access the full application
  2. INVITE_ONLY - Controlled launch, UI visible but requires invite codes for protected routes (redirects to /waitlist/apply)
  3. WAITING_LIST - Pre-launch mode, login UI hidden, requires invite codes for protected routes (redirects to /waitlist/activate)

Access Modes Explained

PUBLIC Mode

Best for: Production / General Availability

  • ✅ All features accessible to everyone
  • ✅ No restrictions on dashboard or protected routes
  • ✅ Normal user experience

INVITE_ONLY Mode

Best for: Soft launch / Beta testing

  • ✅ Login and signup buttons visible on landing page
  • ✅ Users can register freely
  • 🔒 Dashboard and protected routes require invite codes
  • 📧 Users without codes are redirected to request access

User Experience:

  • New users see normal "Sign In" button
  • After login, if no invite code → redirect to activation page
  • Must enter valid invite code to access dashboard

WAITING_LIST Mode

Best for: Pre-launch / Coming Soon

  • ❌ Login buttons hidden from landing page
  • ✅ Shows "Get Early Access" button instead
  • ✅ Users can register but need invite codes
  • 🔒 Same dashboard protection as INVITE_ONLY

User Experience:

  • Landing page shows "Get Early Access" CTA
  • Clicking leads to waitlist submission form
  • Approved users receive invite codes via email

For End Users

Joining the Waitlist

  1. Visit the landing page
  2. Click "Get Early Access" (WAITING_LIST mode) or find the waitlist link
  3. Fill out the form with:
    • Email address (required)
    • Name (optional)
    • Company (optional)
    • Use case (optional)
  4. Submit and wait for approval

Activating Your Invite Code

Once approved, you'll receive an email with your invite code.

Steps to activate:

  1. Sign in to your account (or create one if you haven't)
  2. You'll be automatically redirected to the activation page
  3. Enter your invite code (format: EARLY-2026-XXXXXXXX)
  4. Click "Activate"
  5. You're in! Access the dashboard and all features

Alternative: Visit /waitlist/activate directly to enter your code.

Troubleshooting

"Invalid invite code":

  • Check for typos (codes are case-sensitive)
  • Ensure you're using the latest code from your email
  • Contact support if issues persist

"Code already used":

  • Each code can only be used once
  • If you didn't use it, someone else might have
  • Request a new code from support

"Redirected to waitlist after login":

  • You don't have an active invite code yet
  • Check your email for the invite
  • Or submit a waitlist request

For Administrators

Managing Access Modes

Location: /systemadmin/access-mode

Switching modes:

  1. Select desired mode (PUBLIC / INVITE_ONLY / WAITING_LIST)
  2. Click "Update Access Mode"
  3. Changes take effect immediately

Managing Waitlist Users

Location: /systemadmin/waitlist-users

Workflow:

  1. Review submissions: See all waitlist entries with status
  2. Approve users: Click "Approve & Send Invite" to:
    • Automatically generate unique invite code (format: EARLY-YYYY-XXXXXXXX)
    • Automatically send email notification to user containing:
      • Personalized welcome message (using submitted name)
      • Highlighted invite code
      • Detailed activation steps:
        1. Sign in to account
        2. Visit /waitlist/activate page
        3. Enter invite code from email
      • Email failures are logged but don't block approval operation
    • Update status to "invited"
  3. Track status: Monitor invite code usage
  4. Handle rejections: Users can resubmit (status resets to pending)

Status flow:

pending → [Approve & Send] → invited → [User activates] → activated
   ↓                            ↓              ↓
   └─[Reject]────────────────────┘         (final state)

Important Notes:

  • Status auto-updates: When an invite code is used, the waitlist user's status automatically changes to "activated"
  • Code sharing allowed: Any authenticated user can use any valid invite code (email restriction removed 2026-01-21)
  • Prevents re-submission: Users with "invited" or "activated" status cannot resubmit the waitlist form
    • "invited" status → Error: "You have already been approved. Please check your email for the invite code."
    • "activated" status → Error: "You have already been approved and activated your invite code. Please sign in to continue."
  • Rejected users can retry: Users with "rejected" status can resubmit (status resets to "pending")

Email Notifications

Currently Implemented:

  • Waitlist Confirmation: User receives email immediately after joining waitlist

    • Subject: "Thank you for joining our waitlist!"
    • Contains: Confirmation message, submitted information, what to expect next
    • Personalized with user's submitted name
  • Waitlist Approval: User receives email with invite code when admin approves

    • Subject: "Your ProductReady Invite Code"
    • Contains: Welcome message, invite code, step-by-step activation guide
    • Personalized with user's submitted name
  • Application Rejection: User receives email when application is rejected

    • Subject: "Update on your ProductReady application"
    • Contains: Reason explanation, encouragement to resubmit with updated info
    • Includes link to reapply
  • Successful Activation: User receives welcome email after activating invite code

    • Subject: "Welcome to ProductReady! 🎉"
    • Contains: Welcome message, getting started guide, help resources
    • Sent immediately after code activation

Not Yet Implemented (requires scheduled job):

  • ❌ Invite code expiration reminder (e.g., "Your code expires in 3 days")

Email Service Configuration:

  • Supports multiple providers: Resend, Postmark, SendGrid, AWS SES
  • Requires EMAIL_FROM environment variable (sender email address)
  • Email failures are logged but don't affect core operations (e.g., approval still succeeds)

Managing Invite Codes

Location: /systemadmin/invite-codes

Features:

  • View all generated codes with status (unused/used/expired)
  • See which waitlist user each code was generated for
  • Track who used each code
  • Generate bulk codes manually for special cases
  • Export unused codes for external distribution

Code format: EARLY-YYYY-XXXXXXXX

  • EARLY: Prefix indicating early access
  • YYYY: Year generated
  • XXXXXXXX: Random 8-character identifier

Best Practices

For Pre-Launch (WAITING_LIST)

  1. Start in WAITING_LIST mode before launch
  2. Collect emails via waitlist form
  3. Approve users in batches
  4. Monitor activation rates
  5. Switch to PUBLIC when ready for general availability

For Soft Launch (INVITE_ONLY)

  1. Use for closed beta or soft launch
  2. Keep login visible for better conversion
  3. Approve users as capacity allows
  4. Monitor system load and user feedback
  5. Gradually open access by approving more users

For Production (PUBLIC)

  1. Switch to PUBLIC for general availability
  2. Existing invite codes remain valid (no disruption)
  3. New users don't need codes
  4. Keep waitlist system for future campaigns

Security Notes

  • Invite codes are single-use only
  • Codes can have optional expiration dates
  • All access checks happen server-side
  • Administrators can revoke access by rejecting users
  • Email verification ensures legitimate signups

API Integration

For programmatic access, use the tRPC endpoints:

// Submit waitlist (public)
trpc.systemAdmin.waitlist.submit.mutate({
  email: "user@example.com",
  name: "John Doe",
  company: "Acme Inc"
});

// Activate invite code (protected)
trpc.systemAdmin.inviteCodes.use.mutate({
  code: "EARLY-2026-ABC123XY"
});

Frequently Asked Questions (FAQ)

General Questions

Q: What happens if I switch from WAITING_LIST to PUBLIC mode?

A: All existing invite codes remain valid, but new users won't need them. Users who already activated codes keep their access. The waitlist system stays available for future use.

Q: Can I switch back to INVITE_ONLY after going PUBLIC?

A: Yes, but existing users who already have accounts will keep their access. Only new users will need invite codes.

Q: How long do invite codes last?

A: By default, codes don't expire. Administrators can optionally set expiration dates when generating codes manually.

For Users

Q: I submitted the waitlist form but haven't received an email. What should I do?

A: Check your spam folder first. If still not found, wait 24-48 hours as approvals are manual. Contact support if you don't hear back within a week.

Q: Can I use someone else's invite code?

A: Yes! As of 2026-01-21, invite codes are no longer tied to specific email addresses. Any authenticated user can use any valid code. However, each code can only be used once.

Q: I already submitted the waitlist. Can I submit again?

A: It depends on your status:

  • Pending: No need to resubmit, your application is being reviewed
  • Invited: No, you already have an invite code (check your email)
  • Activated: No, you already have access (just sign in)
  • Rejected: Yes, you can resubmit with updated information

Q: What if I lost my invite code email?

A: Contact support with your registered email address. Administrators can look up your code or generate a new one.

Q: Do I need to create an account before using my invite code?

A: Yes, you must have an account first. Sign up normally, then enter your invite code when prompted after login.

Q: Can I share my invite code with friends?

A: Yes, codes can be shared! However, they're single-use only - whoever uses it first gets access.

For Administrators

Q: What happens to waitlist status when a user activates their invite code?

A: The status automatically updates from "invited" to "activated". This happens even if a different user activates the code (since codes can be shared).

Q: Can I manually change a user's waitlist status?

A: Currently, status changes happen automatically:

  • "pending" → "invited" (when you approve)
  • "invited" → "activated" (when code is used)
  • "pending" → "rejected" (when you reject)

Q: What if the approval email fails to send?

A: The approval still succeeds and the invite code is generated. Email failures are logged but don't block the operation. You can manually send the code to the user or they can contact support.

Q: How do I know if a user has activated their code?

A: Check the Waitlist Users page - the status will show "activated". You can also see usage details on the Invite Codes page.

Q: Can I revoke access after approving someone?

A: You can reject their waitlist entry, but if they already activated the code, they'll keep access. To fully revoke, you'd need to disable their user account separately.

Q: How many invite codes should I generate?

A: For waitlist approvals, codes are auto-generated one per user. For bulk distribution (events, partnerships), generate as many as needed - unused codes don't expire by default.

Q: Can I customize the invite code format?

A: The format is currently fixed as EARLY-YYYY-XXXXXXXX. This ensures consistency and easy validation.

Technical Questions

Q: Are invite codes case-sensitive?

A: Yes, codes are case-sensitive. Make sure to copy them exactly as shown.

Q: What happens if someone tries to use an already-used code?

A: They'll see an error: "This invite code has already been used." Each code works only once.

Q: Can I integrate the waitlist with external tools?

A: Yes, use the tRPC API endpoints. See the "API Integration" section above for examples.

Q: Where is waitlist data stored?

A: In the PostgreSQL database, in the WaitlistUser and InviteCode tables. All data is encrypted at rest.

Q: Can I export waitlist data?

A: Yes, administrators can export unused invite codes from the Invite Codes page. For full waitlist data export, use database queries or contact support for a CSV export feature.

On this page