租户入驻全流程 (Tenant Onboarding)

从 Landing Page 获客 → Demo 请求 → 租户创建 → 账户激活 → 登录

Spec: 056-tenant-onboarding | 更新: 2026-02-05

流程总览

客户
Landing Page
填写表单
系统
发送邮件通知
管理员
你(手动)
评估客户 &
创建租户
系统
发送激活邮件
给客户
客户
点击链接
设置密码
完成
登录系统
开始使用

分步详解

1

客户访问 Landing Page 并提交 Demo 请求

客户操作

客户在 celoria.ai 的 Contact 区域填写姓名、电话、邮箱和留言,点击 Submit。

涉及端点: POST /api/demo-request(公开,无需认证)
速率限制: 3 次/小时/IP
2

系统自动发送两封邮件

系统自动
📧 客户确认邮件
  • • 感谢提交
  • • Calendly 预约链接(如果配了 CALENDLY_DEMO_URL
  • • "1 个工作日内联系"
📧 管理员通知邮件
  • • 发到 PLATFORM_ADMIN_EMAIL
  • • 包含客户姓名、邮箱、电话、留言
  • • 提交时间戳
注意: 邮件发送是 fire-and-forget,失败不阻塞 API 响应。查看后端日志确认邮件是否发送成功。
3

你:评估客户 & 创建租户

你的操作

收到管理员通知邮件后,评估客户需求,决定是否创建租户。

操作方式:通过平台管理员 API 创建租户
# 1. 登录平台管理员
curl -X POST http://localhost:3000/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"platform@celoria.ai","password":"test123"}'

# 2. 创建租户(用返回的 token)
curl -X POST http://localhost:3000/api/platform/tenants \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <token>' \
  -d '{
    "name": "客户的沙龙名称",
    "planType": "standard",
    "contactName": "客户姓名",
    "contactEmail": "客户邮箱",
    "contactPhone": "客户电话"
  }'
创建成功后返回值包含:
  • tenant.shortId — 租户短 ID(用于 URL,如 salon001
  • activation.token — 激活令牌
  • activation.activationUrl — 完整激活链接
  • activation.expiresAt — 过期时间(默认 72 小时)
注意事项:
  • contactEmail 就是客户将来登录用的邮箱,务必确认准确
  • • 激活令牌有过期时间,过期后客户无法激活,需要你重新生成
  • shortId 创建后不可修改,会出现在客户的 URL 中(celoria.ai/{shortId}
4

你:将激活链接发给客户

你的操作

把 Step 3 返回的激活链接发给客户。链接格式:

https://celoria.ai/en/activate?token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
发送方式建议:
  • • 目前需要手动发(邮件/短信/微信均可)
  • • 未来可以做成系统自动发激活邮件(TODO)
  • • 告诉客户激活链接 72 小时内有效
  • • 如果客户反馈链接过期,需要你通过 API 重新生成
5

客户点击激活链接,设置密码

客户操作

客户打开链接后看到激活页面:

页面显示内容
  • • 租户名称(如 "Jane's Nail Salon")
  • • 脱敏邮箱(如 j***e@example.com)
  • • 密码输入框 + 确认框
  • • 最少 8 位
异常状态处理
  • • 无效令牌 → 错误提示
  • • 已过期 → 提示联系管理员
  • • 已激活 → 提示直接登录
  • • 网络错误 → 通用错误页
涉及端点:
GET /api/tenants/activate?token=xxx — 预验证令牌
POST /api/tenants/activate — 提交密码完成激活
页面路由: /[locale]/activate?token=xxx
6

激活成功,自动跳转登录

系统自动

密码设置成功后,页面显示成功消息,3 秒后自动跳转到该租户的登录页:

/en/{tenantShortId}/login

客户用刚设置的邮箱 + 密码登录即可。首次登录的角色为 super_admin(租户级超级管理员)。

环境配置清单

以下环境变量必须在 .env 中正确配置,否则相关功能不工作:

变量 用途 必须?
RESEND_API_KEY 邮件发送(Demo 请求确认 + 管理员通知) 必须
RESEND_FROM_EMAIL 邮件发件人地址 必须
PLATFORM_ADMIN_EMAIL 接收 Demo 请求通知的管理员邮箱 必须
CALENDLY_DEMO_URL Calendly 预约链接(放在客户确认邮件中) 可选
NEXT_PUBLIC_API_URL Landing Page 调用后端 API 的地址(生产: https://api.celoria.ai 生产必须

常见问题 & 排查

Landing Page 提交后没收到邮件

  1. 检查后端日志:pm2 logs celoria-api --lines 50,搜索 "demo request" 或 "Failed to send"
  2. 确认 RESEND_API_KEY 是否有效(过期/quota 耗尽?)
  3. 确认 RESEND_FROM_EMAIL 的域名已在 Resend 验证
  4. API 返回 200 不代表邮件发送成功(fire-and-forget 机制)

Landing Page 提交报 CORS 错误

  1. 确认后端 CORS 中已包含 Landing Page 的源(localhost:3003https://celoria.ai
  2. 确认 Landing Page 的 NEXT_PUBLIC_API_URL 没有拼错
  3. 生产环境确认 https://celoria.ai 在白名单里

客户说激活链接打不开 / 显示无效

  1. 链接是否超过 72 小时?→ 需要你重新生成令牌
  2. 链接是否被截断?(邮件客户端有时会断行)→ 让客户复制完整 URL
  3. 是否已经激活过?→ 页面会显示"已激活"提示,让客户直接登录
  4. 检查 URL 中的 locale 是否正确(/en/activate/zh/activate

客户激活后登录失败

  1. 确认激活 API 返回了 success: true(查后端日志)
  2. 确认客户用的邮箱和创建租户时的 contactEmail 一致
  3. 确认登录页 URL 中的 tenantShortId 正确
  4. 检查租户状态是否为 active

待办 & 未来优化

  • ! 自动发送激活邮件 — 租户创建后系统自动发激活链接给客户,免去手动发送的步骤
  • ! 重新生成激活令牌 API — 给管理员一个 UI 按钮,在令牌过期后可以重新生成并发送
  • ? Demo 请求持久化 — 当前 demo 请求只发邮件不入库,未来可以存到数据库用于 CRM 跟踪
  • ? Self-service 注册 — 客户自助创建租户(免费试用 → 付费升级),彻底去掉人工环节

快速参考:涉及的文件

文件 职责
backend/api/demo-request.jsDemo 请求 API(公开)
backend/api/tenant-activate.js租户激活 API(公开)
backend/services/tenant/tenant-service.js核心激活逻辑(activateAdmin)
backend/server.jsCORS 白名单 + 路由挂载
landingpage/src/components/Contact.tsxLanding Page 表单(功能化)
frontend/web_app/src/app/[locale]/activate/page.tsx账户激活页面
frontend/web_app/src/i18n/locales/{en,zh}/auth.json激活页面中英文翻译