等待列表和邀请码
了解 ProductReady 的访问控制系统,用于预发布阶段管理
等待列表和邀请码
ProductReady 提供灵活的访问控制系统,通过等待列表和邀请码来管理预发布阶段和受控发布。
概述
系统支持三种访问模式:
- PUBLIC(公开) - 正常运营,所有人都可以访问完整应用
- INVITE_ONLY(仅邀请) - 受控发布,界面可见但需要邀请码才能访问仪表板
- WAITING_LIST(等待列表) - 预发布模式,登录界面隐藏,需要邀请码才能访问
访问模式详解
PUBLIC 模式(公开)
适用场景: 正式生产 / 全面开放
- ✅ 所有功能对所有人开放
- ✅ 仪表板和受保护路由无限制
- ✅ 正常用户体验
INVITE_ONLY 模式(仅邀请)
适用场景: 软发布 / Beta 测试
- ✅ 落地页显示登录和注册按钮
- ✅ 用户可以自由注册
- 🔒 仪表板和受保护路由需要邀请码
- 📧 没有邀请码的用户将被重定向到申请访问页面
用户体验:
- 新用户看到正常的"登录"按钮
- 登录后,如果没有邀请码 → 重定向到激活页面
- 必须输入有效邀请码才能访问仪表板
WAITING_LIST 模式(等待列表)
适用场景: 预发布 / 即将推出
- ❌ 落地页隐藏登录按钮
- ✅ 显示"获得早期访问权限"按钮
- ✅ 用户可以注册但需要邀请码
- 🔒 与 INVITE_ONLY 相同的仪表板保护
用户体验:
- 落地页显示"获得早期访问权限" CTA
- 点击后进入等待列表提交表单
- 批准的用户通过邮件收到邀请码
面向最终用户
加入等待列表
- 访问落地页
- 点击"获得早期访问权限"(WAITING_LIST 模式)或找到等待列表链接
- 填写表单:
- 邮箱地址(必填)
- 姓名(可选)
- 公司(可选)
- 使用场景(可选)
- 提交并等待批准
激活邀请码
批准后,您将收到包含邀请码的电子邮件。
激活步骤:
- 登录您的账户(如果还没有账户,请先创建)
- 系统会自动重定向到激活页面
- 输入您的邀请码(格式:
EARLY-2026-XXXXXXXX) - 点击"激活"
- 完成!现在可以访问仪表板和所有功能
或者: 直接访问 /waitlist/activate 输入邀请码。
故障排除
"无效的邀请码":
- 检查拼写错误(邀请码区分大小写)
- 确保使用邮件中的最新邀请码
- 如果问题持续,请联系支持团队
"邀请码已被使用":
- 每个邀请码只能使用一次
- 如果您没有使用,可能是其他人使用了
- 向支持团队申请新的邀请码
"登录后被重定向到等待列表":
- 您还没有激活的邀请码
- 检查邮箱中的邀请
- 或者提交等待列表申请
面向管理员
管理访问模式
位置: /systemadmin/access-mode
切换模式:
- 选择所需模式(PUBLIC / INVITE_ONLY / WAITING_LIST)
- 点击"更新访问模式"
- 更改立即生效
管理等待列表用户
位置: /systemadmin/waitlist-users
工作流程:
- 审核提交: 查看所有等待列表条目及其状态
- 批准用户: 点击"批准并发送邮请"将:
- 自动生成唯一邀请码(格式:
EARLY-YYYY-XXXXXXXX) - 自动发送邮件通知给用户,包含:
- 个性化欢迎信息(使用用户提交的姓名)
- 突出显示的邀请码
- 详细的激活步骤:
- 登录账户
- 访问
/waitlist/activate页面 - 输入邮件中的邀请码
- 如果邮件发送失败,系统会记录错误但不会阻止批准操作
- 更新状态为"已邀请"
- 自动生成唯一邀请码(格式:
- 跟踪状态: 监控邀请码使用情况
- 处理拒绝: 用户可以重新提交(状态重置为待处理)
状态流转:
pending → [批准并发送] → invited → [用户激活] → activated
↓ ↓
└─[拒绝]────────────────┘邮件通知
当前已实现:
-
✅ 等待列表确认: 用户提交申请后立即收到确认邮件
- 主题:"Thank you for joining our waitlist!"
- 内容:确认信息、提交的资料、后续流程说明
- 使用用户提交的姓名个性化
-
✅ 批准等待列表申请: 管理员批准后用户收到邀请码邮件
- 主题:"Your ProductReady Invite Code"
- 内容:欢迎信息、邀请码、详细激活指南
- 使用用户提交的姓名个性化
-
✅ 申请被拒绝: 申请被拒绝时用户收到通知邮件
- 主题:"Update on your ProductReady application"
- 内容:拒绝原因说明、鼓励用户更新资料重新申请
- 包含重新申请的链接
-
✅ 成功激活: 用户激活邀请码后收到欢迎邮件
- 主题:"Welcome to ProductReady! 🎉"
- 内容:欢迎信息、入门指南、帮助资源
- 在激活邀请码后立即发送
未实现的场景 (需要定时任务):
- ❌ 邀请码即将过期的提醒(例如:"您的邀请码还有3天过期")
邮件服务配置:
- 支持多种邮件服务商:Resend、Postmark、SendGrid、AWS SES
- 需要配置
EMAIL_FROM环境变量(发件人地址) - 邮件发送失败会记录日志,但不影响核心操作(例如批准仍然会成功)
管理邀请码
位置: /systemadmin/invite-codes
功能:
- 查看所有生成的邀请码及其状态(未使用/已使用/已过期)
- 查看每个邀请码是为哪个等待列表用户生成的
- 跟踪谁使用了每个邀请码
- 为特殊情况手动批量生成邀请码
- 导出未使用的邀请码以便外部分发
邀请码格式: EARLY-YYYY-XXXXXXXX
EARLY: 前缀,表示早期访问YYYY: 生成年份XXXXXXXX: 随机 8 字符标识符
最佳实践
预发布阶段(WAITING_LIST)
- 在发布前启用 WAITING_LIST 模式
- 通过等待列表表单收集邮箱
- 分批批准用户
- 监控激活率
- 准备好全面开放时切换到 PUBLIC
软发布阶段(INVITE_ONLY)
- 用于封闭 Beta 测试或软发布
- 保持登录可见以提高转化率
- 根据容量批准用户
- 监控系统负载和用户反馈
- 通过批准更多用户逐步开放访问
正式生产(PUBLIC)
- 全面开放时切换到 PUBLIC
- 现有邀请码仍然有效(无中断)
- 新用户不需要邀请码
- 保留等待列表系统用于未来活动
安全说明
- 邀请码只能使用一次
- 邀请码可以设置可选的过期日期
- 所有访问检查都在服务器端进行
- 管理员可以通过拒绝用户来撤销访问权限
- 邮箱验证确保合法注册
API 集成
对于编程访问,使用 tRPC 端点:
// 提交等待列表(公开)
trpc.systemAdmin.waitlist.submit.mutate({
email: "user@example.com",
name: "张三",
company: "某某公司"
});
// 激活邀请码(受保护)
trpc.systemAdmin.inviteCodes.use.mutate({
code: "EARLY-2026-ABC123XY"
});