diff --git a/docs/tasks/onboarding-prd.md b/docs/tasks/onboarding-prd.md new file mode 100644 index 000000000000..b5e3bf13ca8d --- /dev/null +++ b/docs/tasks/onboarding-prd.md @@ -0,0 +1,707 @@ +# PRD — DeepRouter Onboarding å…šæ—…çš‹ + +> **Status**: 📝 Draft v0.1 · 埅评审 +> **Author**: Lightman + Claude +> **Date**: 2026-05-16 +> **Owner**: DeepRouter Frontend + Platform +> **Parent**: [`docs/PRD.md`](../PRD.md), [`docs/tasks/api-key-simple-advanced-prd.md`](api-key-simple-advanced-prd.md) +> **范囎**: 甚户从访问站点 → 泚册 → 銖次成功 API 调甚 → 长期留存 的完敎 funnel + +--- + +## 0. 版本变曎 + +### v0.12026-05-16 +- 初皿把已散萜圚 PR #1-#6 + 各 plan 文件里的 onboarding 决策汇总加入未做的 Phase泚册 wizard / 默讀 Key 展瀺 / 行䞚甚量等画像字段 / 获客園因 / 匀始枅单 / 邮件验证流 / A/B 测试 + +--- + +## 1. 背景䞎目标 + +### 1.1 现状 + +经过 PR #1 - #6DeepRouter 已经把 upstream `new-api` 的 **B2B2C 运营商 UI** 重做成了 **B2C 终端甚户 UI** + +- 甚户旅皋已打通sign up → login → persona picker → playground 或 keys +- 已自劚赠送 Â¥1 试甚额床PR #4`common.QuotaForNewUser = 500_000` +- 已自劚创建䞀把 default tokenupstream 已有逻蟑`controller.Register` line 200-211 +- 6 䞪客户端教皋页已就䜍PR #4`/onboarding/{cherry-studio,chatbox,lobechat,cursor,claude-code,code}` +- 銖次调甚 🎉 toast 已就䜍PR #6 + +䜆**泚册环节本身没劚** +- 泚册衚单仍是 upstream 的 username/password/email/code 单步衚单 +- 泚册成功 → è·³ `/sign-in` 让甚户再登䞀次叀怪的 funnel 二次跳蜬 +- 登圕后才匹 persona picker +- 默讀创建的 Key **甚户䞍知道有** +- 试甚额床 **甚户䞍知道送了** +- 泚册时**完党没有捕获甚户画像**陀了邮箱/密码什么郜没问 + +结果funnel 步数倪倚蜬化文案猺倱画像数据空癜营销園因䞺零。 + +### 1.2 北极星指标 + +> **泚册 → 銖次成功 API 调甚的 P50 æ—¶é—Ž** +> +> 目标< 5 分钟。 + +### 1.3 二级指标 + +- 泚册衚单完成率每步 conversion +- persona 选择分垃casual / dev / team 各占比 +- brand 偏奜分垃Claude / OpenAI / Gemini / DeepSeek 各占比 +- 萜地页选择分垃哪䞪客户端教皋 / playground / 盎接 dashboard +- 銖次调甚率泚册后 24h / 7d / 30d 内是吊产生 ≥ 1 次成功调甚 +- 试甚额床耗尜率倚少甚户甚完免莹 Â¥1 → 蜬化䞺充倌 +- 泚册到銖次充倌的 P50 æ—¶é—Ž + +--- + +## 2. 甚户画像䞎兞型旅皋 + +按 PR #3 已䞊线的 persona 䜓系䞻芁 3 类。每类兞型旅皋䞍同 + +### 2.1 Casual 🎚聊倩 / 创䜜 / 翻译 / 孊习 + +``` +访问銖页pricing 或 home + → 看到"送 Â¥1 试甚" + → 泚册邮箱 + 䞀键 OAuth + → 选 personaCasual + → 选 brand 偏奜Claude最垞见 + → 选萜地Cherry Studio 教皋 + → 教皋页倍制 Base URL + Key + Model → 䞋蜜 Cherry Studio + → Cherry Studio 配眮 → 发 "䜠奜" → 收到 Claude 回倍 + → 回 dashboard 看到 "🎉 第䞀次调甚成功了" + → 䜙额¥0.997甚了 Â¥0.003 + → 䞀段时闎后自然消耗 → 来充倌 +``` + +**关键蜬化点**Cherry Studio 安装胜䞍胜成功 + 配眮胜䞍胜跑通 + +### 2.2 Dev 💻䞪人匀发者 / 写代码 / 集成 API + +``` +访问銖页 + → 看到"OpenAI 兌容 API + 倚暡型路由" + → 泚册 + → 选 personaDeveloper + → 选 brand通垞倚选或无偏奜 + → 选萜地CodePython/Node 代码瀺䟋 + → 教皋页倍制 curl / Python snippet 䞀键 paste 到 IDE + → curl/Python 调甚成功 + → 回 dashboard 看 token 甹量 + → 集成进自己的应甚 / Cursor / Claude Code + → 甚量䞊来后充倌 +``` + +**关键蜬化点**API 文档枅晰床 + Python/Node 代码瀺䟋可粘莎即甚 + +### 2.3 Team 👥团队 / 䌁䞚接入 + +``` +访问銖页或 BD 掚荐 + → 泚册 + → 选 personaTeam + → 询问行䞚 / 团队规暡profile 后填 + → 萜地dashboard看暡型 / 甹量 / 团队管理 — 后续䞊 + → 创建倚把 Key 分配团队 + → 充倌䌁䞚额床 + → 甚量监控 +``` + +**关键蜬化点**团队管理 / 审计日志 / 子莊号DeepRouter 后续 phase + +--- + +## 3. 栞心决策 + +### 3.1 泚册时应该问什么只问 3 ä»¶ + +#### 决策原则 + +每倚问䞀䞪字段funnel 掉 ~5-10% 蜬化。我们坚持「**泚册时只问对路埄选择关键的profile 让甚户慢慢补**」。 + +#### 泚册时问 + +| 字段 | 后端存傚 | 䞺什么必须圚泚册时 | +|---|---|---| +| **email + password**或 OAuth| `users.email`, `users.password` | 莊号本䜓 | +| **persona** | `setting.persona` | 决定 sidebar、銖页、Create Key 默讀 modePR #3 已萜地 | +| **brand_preference** | `setting.brand_preference` | 决定**自劚创建的 default Key 的品牌绑定**这把 Key 已经存圚只是没䞻劚展瀺| +| **preferred_client + 萜地页** | `setting.preferred_client` | 决定泚册成功跳到哪䞪客户端教皋funnel 最少跳蜬| + +#### 泚册时**䞍**问进 profile 慢慢填 + +| 字段 | 䜕时收集 | +|---|---| +| 星瀺名 `display_name` | profile 猖蟑默讀 = email 前猀 | +| 行䞚 / vertical `industry` | profile 猖蟑dev / team persona 才星瀺 | +| 预期甚量 `expected_volume` | 銖次调甚后匹䞀次"想知道䜠的甚量级别垮䜠䌘化" | +| 营销邮件 opt-in `marketing_emails` | profile默讀 `false`双 opt-in 合规 | +| 手机 / 埮信 | profile 侭的"莊号绑定"区已有 | + +#### 静默捕获甚户感觉䞍到 + +| 字段 | 时机 | +|---|---| +| `setting.acquisition_channel` | 泚册前自劚捕获 `document.referrer` + URL `utm_*` 参数 | +| `setting.timezone` | 浏览噚 `Intl.DateTimeFormat().resolvedOptions().timeZone` | +| `setting.signup_meta` | user agent / IP已有/ 泚册时 page URL | +| `setting.onboarding_completed_at` | wizard 走完时打 timestamp | + +### 3.2 泚册成功后自劚登圕绕过 /sign-in 二次跳蜬 + +#### 现状 + +`controller.Register` 䞍 set session cookie。泚册成功 → 前端跳 `/sign-in` → 甚户再次蟓入邮箱密码登圕。**funnel 倚走䞀敎步**。 + +#### 改造 + +`controller.Register` 泚册成功后**盎接调甚䞎 Login 等效的 session 生成逻蟑**gin sessionsset cookie → 前端拿到响应后盎接跳 `PERSONA_PRESETS[persona].defaultRoute`。 + +**风险 + 猓解** +- 劂果未来加 2FA / 邮箱二次验证圚 Register handler 里刀断 `EmailVerificationEnabled` 是吊芁求第二步仅圓**党郚凭据通过**时才 set cookie +- 劂果甚户匀了 OAuth原本 OAuth callback å°± set session本就没问题 + +### 3.3 泚册成功页面 / 萜地突出"䜠已经获埗了什么" + +#### 讟计原则 + +甚户付钱前已经拿到 3 样䞜西我们芁**星匏告诉他** + +1. **Â¥1 试甚额床≈ 200 次对话** — 后端 `QuotaForNewUser` 送的䜆目前甚户毫无知觉 +2. **䞀把默讀 API Key** — `controller.Register` line 200-211 自劚创建的 `default` token甚户䞍知道 +3. **persona / brand / client 偏奜** — wizard 选奜的已经绑定 + +#### Welcome screen 长这样 + +``` +┌───── 欢迎䜿甚 DeepRouter ─────┐ +│ │ +│ 🎁 䜠已获赠 Â¥1 试甚额床 │ +│ 纊 200 次对话 │ +│ │ +│ 🔑 我们已䞺䜠准倇奜䞀把 Key │ +│ sk-xxx... [📋 倍制] │ +│ Base URL: ... [📋 倍制] │ +│ Model: deeprouter │ +│ │ +│ 📖 现圚做什么 │ +│ ┌──────┬──────┬──────┐ │ +│ │ 教皋 │ 试聊 │ 文档 │ │ +│ └──────┮──────┮──────┘ │ +│ │ +└────────────────────────────────┘ +``` + +3 䞪萜地选项基于 Step 4 选择默讀高亮䜆甚户可以现场改。 + +### 3.4 Dashboard 匀始枅单"Getting Started" + +第䞀次进 dashboard / 没走完 onboarding 的甚户顶郚星瀺䞀䞪 **dismissable** 的进床枅单 + +``` +匀始䜿甚 DeepRouter +☑ 创建莊号 +☑ 选择䜿甚方匏 +☐ 拿到第䞀把 Key →其实已经有了[展瀺] +☐ 完成第䞀次调甚 →Cherry Studio / Cursor / Playground +☐ 第䞀次充倌 →可选¥1 试甚额床可甚到耗尜 +``` + +完成党郚 → 自劚隐藏。 +甚户点 X → 写 `setting.onboarding_dismissed_at` → 氞䞍再星瀺。 + +Linear / Stripe / Notion 郜是这䞪暡匏。 + +### 3.5 试甚额床的呜运 + +#### 圓前 + +`common.QuotaForNewUser = 500_000`= $1 USD = ~500K tokens ≈ 200 次平均对话 + +#### 决策点 + +- 是吊需芁**可配眮**是。已经圚 admin options map 里运营可改。 +- 是吊需芁**星瀺倒计时 / 进床条**䜎䌘先级profile 页借了。 +- 试甚额床耗尜后的蜬化文案耗尜时匹通知"䜠的试甚䜙额已甚完[充倌] 匀始畅享" — Phase 4 做。 + +### 3.6 OAuth 䞊提 + +将 GitHub / Google / 埮信 / Linux.do 登圕按钮**移到衚单䞊方**加倧尺寞。 + +理由现代 SaaSVercel / Linear / Cursor郜把 OAuth 摆圚䞻芁䜍眮。䞭囜垂场尀其重视埮信登圕。䞀键登圕免去填衚步骀盎接到 Step 2 persona。 + +--- + +## 4. 泚册 Wizard 诊细讟计 + +### 4.1 流皋囟 + +``` + ┌─────────────────┐ + │ /sign-up 进入 │ + └────────┬────────┘ + │ + ┌────────▌────────┐ + │ Step 1: 凭据 │ + │ email/password │ + │ 或 OAuth 䞀键 │ + └────────┬────────┘ + │ + ┌────────▌────────┐ + │ 邮箱验证 (可选) │ + │ 仅圓后台匀启 │ + └────────┬────────┘ + │ + ┌────────▌────────┐ + │ Step 2: persona │ + │ [casual][dev][team] │ + │ [跳过] │ + └────────┬────────┘ + │ + ┌────────▌────────┐ + │ Step 3: brand │ + │ [Claude][GPT][...] │ + │ [跳过] │ + └────────┬────────┘ + │ + ┌────────▌────────┐ + │ Step 4: client │ + │ [Cherry][Cursor]│ + │ [Playground][SDK]│ + │ [跳过] │ + └────────┬────────┘ + │ + ┌────────▌────────┐ + │ 自劚 sign-in │ + └────────┬────────┘ + │ + ┌────────▌────────────────┐ + │ Welcome screen │ + │ - "🎁 已送 Â¥1 试甚" │ + │ - "🔑 已生成 default Key"│ + │ - 3 䞪萜地按钮 │ + └────────┬────────────────┘ + │ + â–Œ + Step 4 选的萜地页 或 + PERSONA_PRESETS.defaultRoute +``` + +### 4.2 Step 1莊号凭据 + +``` +┌─────────────────────────────────────┐ +│ 匀始䜿甚 DeepRouter │ +│ 已送 Â¥1 试甚 · 无需绑卡 │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ 🐙 甹 GitHub 䞀键登圕 │ │ +│ └─────────────────────────────┘ │ +│ ┌─────────────────────────────┐ │ +│ │ 🌐 甹 Google 䞀键登圕 │ │ +│ └─────────────────────────────┘ │ +│ ┌─────────────────────────────┐ │ +│ │ 💬 甹 埮信 䞀键登圕 │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ─────── 或 甚邮箱泚册 ─────── │ +│ │ +│ Email [________________] │ +│ Password [________________] │ +│ Verify [____] [发送验证码] │ +│ │ +│ [ 䞋䞀步 → ] │ +│ │ +│ 已有莊号[去登圕] │ +└─────────────────────────────────────┘ +``` + +UI 来自 PR #3 的 `PersonaPickerDialog` 风栌黑底癜卡 + ChevronRight。 + +#### OAuth 路埄 + +OAuth 成功 → 盎接进 Step 2跳过邮箱验证。劂果 OAuth provider 提䟛了倎像/displayName/email自劚预填到 `setting`。 + +### 4.3 Step 2persona + +PR #3 已有的 `PersonaPickerDialog`inline 化成卡片选择 + +``` +┌─────────────────────────────────────┐ +│ 䜠打算怎么甚 DeepRouter │ +│ 以后可以随时圚䞪人资料里改 │ +│ │ +│ ┌──────────┬──────────┬──────────┐ │ +│ │ 🎚 聊倩/ │ 💻 写代码 │ 👥 团队/ │ │ +│ │ 创䜜 │ 集成 API │ 䌁䞚 │ │ +│ │ 掚荐 │ │ │ │ +│ └──────────┮──────────┮──────────┘ │ +│ │ +│ [跳过] [䞋䞀步 →] │ +└─────────────────────────────────────┘ +``` + +跳过 → `setting.persona = "unset"`萜地 dashboard 时再匹 pickerPR #3 兜底逻蟑保留 + +### 4.4 Step 3brand 偏奜可跳过 + +``` +┌─────────────────────────────────────┐ +│ 䜠垞甚哪家 AI │ +│ 我们䌚把䜠的默讀 Key 绑定到这家 │ +│ │ +│ ┌────┬────┬────┬────┬────┐ │ +│ │ 🟣 │ 🟠 │ 🔵 │ 🟢 │ 郜行 │ │ +│ │ Cla │ GPT │ Gem │ DS │ │ │ +│ └────┮────┮────┮────┮────┘ │ +│ │ +│ [← 䞊䞀步] [跳过] [䞋䞀步 →] │ +└─────────────────────────────────────┘ +``` + +跳过 → `brand_preference = ""`default Key 䞍绑定 brand èµ° `auto` 路由。 + +### 4.5 Step 4萜地选择可跳过 + +``` +┌─────────────────────────────────────┐ +│ 泚册完了想从哪里匀始 │ +│ 根据䜠的 persona 掚荐䜠的銖选 │ +│ │ +│ ┌──────────────────────┐ 掚荐 │ +│ │ 🍒 Cherry Studio 教皋 │ │ +│ └──────────────────────┘ │ +│ ┌──────────────────────┐ │ +│ │ 💬 Chatbox 教皋 │ │ +│ └──────────────────────┘ │ +│ ┌──────────────────────┐ │ +│ │ 🎯 Cursor 接入 │ │ +│ └──────────────────────┘ │ +│ ┌──────────────────────┐ │ +│ │ 💻 Python / Node 代码 │ │ +│ └──────────────────────┘ │ +│ ┌──────────────────────┐ │ +│ │ 🧪 浏览噚试聊playground │ │ +│ └──────────────────────┘ │ +│ ┌──────────────────────┐ │ +│ │ 🏠 先看看 dashboard │ │ +│ └──────────────────────┘ │ +│ │ +│ [← 䞊䞀步] [完成泚册] │ +└─────────────────────────────────────┘ +``` + +掚荐顺序按 persona +- casual → Cherry Studio 掚荐 +- dev → Cursor + Code +- team → dashboard + +### 4.6 Welcome screen泚册成功后第䞀屏 + +无论甚户圚 Step 4 选了什么**先看䞀県"䜠已经埗到了什么"再去**。这是给甚户的 dopamine。 + +``` +┌─────────────────────────────────────┐ +│ 👋 欢迎{display_name} │ +│ │ +│ 🎁 试甚额床 Â¥1.00 ≈ 200 次对话 │ +│ 🔑 默讀 Key sk-abc...123 [📋 倍制] │ +│ 🌐 Base URL https://... [📋 倍制] │ +│ 🀖 掚荐暡型 deeprouter [📋 倍制] │ +│ │ +│ ┌──────────────────────────────┐ │ +│ │ [继续前埀Cherry Studio 教皋] │ │ ← Step 4 选的 +│ └──────────────────────────────┘ │ +│ │ +│ 或者 │ +│ [浏览噚试聊] [看 dashboard] │ +└─────────────────────────────────────┘ +``` + +3-5 秒后自劚跳 / 甚户点继续 → 萜地页。 + +--- + +## 5. Schema 改劚 + +### 5.1 后端 — `dto.UserSetting` 扩展Go + +**File**: `dto/user_settings.go` + +```go +type UserSetting struct { + // ... existing ... + + // === Onboarding-captured fields (PR #7+) === + + // BrandPreference: 'claude' | 'openai' | 'gemini' | 'deepseek' | '' + // Set during signup Step 3. Drives the auto-created default token's + // simple_brand binding so Cherry Studio etc. immediately route to + // the user's preferred provider when they type model: "deeprouter". + BrandPreference string `json:"brand_preference,omitempty"` + + // PreferredClient: 'cherry-studio' | 'chatbox' | 'lobechat' | + // 'cursor' | 'claude-code' | 'code' | 'playground' | 'dashboard' | '' + // Drives the post-signup redirect target. /onboarding/. + PreferredClient string `json:"preferred_client,omitempty"` + + // AcquisitionChannel: captured silently from document.referrer + + // utm parameters at signup time. Marketing attribution. + AcquisitionChannel string `json:"acquisition_channel,omitempty"` + + // Timezone: IANA tz string from browser. Used for billing-period + // boundaries + activity charts. + Timezone string `json:"timezone,omitempty"` + + // OnboardingCompletedAt: ISO timestamp set when the user finishes + // the registration wizard (skipping steps still counts). Drives + // the "Getting Started" checklist on dashboard. + OnboardingCompletedAt string `json:"onboarding_completed_at,omitempty"` + + // === Optional profile fields (PR #8+, edited in /profile not signup) === + + // Industry: 'education' | 'finance' | 'ecommerce' | 'gaming' | + // 'individual' | 'saas' | 'other' | '' + Industry string `json:"industry,omitempty"` + + // ExpectedVolume: 'trying' | 'daily-low' | 'daily-medium' | + // 'daily-high' | '' (admin tooltips on rate-limit budgeting) + ExpectedVolume string `json:"expected_volume,omitempty"` + + // MarketingEmails: explicit opt-in. Default false. + MarketingEmails bool `json:"marketing_emails,omitempty"` + + // OnboardingChecklistDismissedAt: user clicked X on the Getting + // Started widget. Don't show again. + OnboardingChecklistDismissedAt string `json:"onboarding_checklist_dismissed_at,omitempty"` +} +``` + +**所有字段郜圚已存圚的 `setting` JSON 列䞊零 schema migration**。 + +### 5.2 前端 — TS 镜像 + +**File**: `web/default/src/features/profile/types.ts` + +```ts +export interface UserSettings { + // ... existing ... + brand_preference?: 'claude' | 'openai' | 'gemini' | 'deepseek' | '' + preferred_client?: + | 'cherry-studio' | 'chatbox' | 'lobechat' + | 'cursor' | 'claude-code' | 'code' + | 'playground' | 'dashboard' | '' + acquisition_channel?: string + timezone?: string + onboarding_completed_at?: string + industry?: string + expected_volume?: 'trying' | 'daily-low' | 'daily-medium' | 'daily-high' | '' + marketing_emails?: boolean + onboarding_checklist_dismissed_at?: string +} +``` + +### 5.3 controller.Register 改劚 + +**File**: `controller/user.go::Register` (lines 137-220) + +1. **接受新字段**JSON body 倚接受 `persona`, `brand_preference`, `preferred_client`, `acquisition_channel`, `timezone` 五䞪 onboarding 字段 +2. **写入 setting**圚 `defaultSetting := dto.UserSetting{...}` 倄䞀次性填入兜底逻蟑persona 䞺空时仍写 "unset"brand/client 䞺空就䞍写 +3. **创建 default token 时绑 brand**`controller.Register` 圚 line 200-211 自劚创建 token 的逻蟑里加 `SimplePurpose + SimpleBrand`来自新字段 +4. **session 自劚 sign-in**泚册成功后调 `setupLogin(user, c)` (从 controller/user.go::Login 提取共享 helper)set gin session cookie + +### 5.4 泚册 API 响应栌匏扩展 + +`POST /api/auth/register` 返回 body 扩展 + +```json +{ + "success": true, + "message": "", + "data": { + "user": { "id": 123, "email": "..." }, + "default_token": "sk-xxx", + "trial_quota": 500000, + "next": "/onboarding/cherry-studio" + } +} +``` + +`data.next` 是前端跳蜬目标按 preferred_client 计算。`data.default_token` 暎露默讀 Key 䞀次 —— 之后只胜去 /keys 重新生成**关键** —— 这是 token 唯䞀䞀次被明文返回。 + +--- + +## 6. 兌容性 & 降级 + +### 6.1 老甚户已泚册 + +- 所有新字段 `setting.brand_preference / preferred_client / ...` 䞺空 +- 现有 dashboard 匹窗 pickerPR #3逻蟑䞍变persona 䞺空 → 匹 picker +- 老甚户进 dashboard **䞍䌚自劚给 brand_preference 匹 picker**他们已经手劚管理 Key 了䞍芁打扰 +- profile 猖蟑里胜补填 + +### 6.2 wizard 䞭途关闭 + +- 任䜕 step 郜有"跳过"按钮 → 写 `persona = "unset"` / `brand = ""` / `client = ""` → 兜底 +- 关浏览噚䞭途退出account 已经创建Step 1 提亀时就创建了后续 fields 空 → dashboard picker 兜底 + +### 6.3 邮箱验证匀启时 + +- 圓前 upstream 逻蟑劂果 `common.EmailVerificationEnabled = true`泚册时区制芁邮箱 + 验证码 +- 我们的改造圚 Step 1 内嵌入验证码字段保持现状䞍增加额倖步骀 + +### 6.4 OAuth 泚册路埄 + +- OAuth callback 完成莊号创建后**仍芁走 Step 2 - 4**䞍胜跳过这些 +- 䞍过 OAuth callback 已经 set 了 session cookie → 自劚登圕免做 + +--- + +## 7. UX 关键文案 + +每䞪文案郜需芁 en + zh 䞀版加进 `i18n/locales/{en,zh}.json` + +| Key | en | zh | +|---|---|---| +| 泚册銖屏副标题 | "Start in 30 seconds. Â¥1 trial credit included — no card needed." | "30 秒匀始甚泚册即送 Â¥1 试甚额床䞍甚绑卡。" | +| Welcome screen 标题 | "Welcome, {name}" | "欢迎䜠{name}" | +| 试甚额床展瀺 | "🎁 Trial credit: Â¥1.00 (~200 chats)" | "🎁 试甚额床¥1.00纊 200 次对话" | +| 默讀 Key 提瀺 | "🔑 Your default API key is ready — copy and store it now, you won't see it again." | "🔑 䜠的默讀 Key 已就绪 —— 立刻倍制保存䞋次进来就看䞍到了。" | +| 萜地 CTAcasual| "Continue with Cherry Studio guide" | "继续Cherry Studio 教皋" | +| 萜地 CTAdev| "See code examples" | "看代码瀺䟋" | +| 銖次进 dashboard banner | "You haven't made an API call yet. Try the [Playground] or follow the [Cherry Studio guide]." | "䜠还没调甚过 API试试 [Playground] 或者跟着 [Cherry Studio 教皋] 接入。" | +| Getting started checklist 标题 | "Get started with DeepRouter" | "匀始䜿甚 DeepRouter" | + +--- + +## 8. 䞊线指标 & A/B 测试 + +### 8.1 必埋的事件前端 → 暂存 console / Sentry / 自研 analytics + +``` +- signup_step1_shown +- signup_step1_submitted (with: source = 'form' | 'github' | 'google' | 'wechat') +- signup_step2_persona_picked (with: persona) +- signup_step2_skipped +- signup_step3_brand_picked (with: brand) +- signup_step3_skipped +- signup_step4_client_picked (with: client) +- signup_step4_skipped +- welcome_screen_shown +- welcome_screen_action (with: action = 'cherry-studio' | 'playground' | 'dashboard' | ...) +- onboarding_completed +- first_api_call (already tracked via request_count delta in PR #6) +``` + +### 8.2 关键指标 dashboard埅 admin 后台支持 + +- step-by-step funnel 挏斗囟 +- persona / brand / client 䞉绎分垃 +- 泚册到銖次调甚时闎分垃 +- 泚册 → 銖充时闎分垃 +- 各 acquisition_channel 的蜬化率 + +### 8.3 第䞀批 A/B 实验 + +| 实验 | 假讟 | 测试组 vs 对照 | +|---|---|---| +| A1 | OAuth 倧按钮䞊提胜提高完成率 | 䞊提版 vs 圓前底郚小按钮 | +| A2 | brand 偏奜这䞀步是䞍是必芁 | 4 æ­¥ vs 3 步跳过 Step 3 | +| A3 | Welcome screen 是吊圱响銖次调甚率 | 星瀺 vs 盎接萜地 | +| A4 | 试甚额床从 Â¥1 → Â¥3 胜吊拉升銖充率 | Â¥1 vs Â¥3 | + +--- + +## 9. 风险 & 匀攟问题 + +### 9.1 已识别风险 + +| 风险 | 䞥重床 | 猓解 | +|---|---|---| +| 4 步泚册 wizard 反而降䜎完成率 | 高 | 每步郜有"跳过"按钮 + A/B 测 4 æ­¥ vs 2 æ­¥ | +| 自劚 sign-in 绕过 2FA / 邮箱验证 | 高 | session 生成圚 Register handler 里**等所有区制验证通过之后** | +| Welcome screen 暎露 default Key 字笊䞲 → 甚户截囟泄挏 | äž­ | 加 "立刻倍制保存䞋次进来就看䞍到了" 提瀺 + 仅泚册圓䞋展瀺刷新即消倱 | +| 默讀创建的 Key 䌚被自劚 binding brand → 甚户没募"无偏奜"时混乱 | 䜎 | brand_preference 䞺空时 default token 䞍绑 brand èµ° `auto` | +| 老甚户进 dashboard 匹䞀层 pickerpersona + brand | äž­ | 老甚户只觊发 persona picker䞍觊发 brandprofile 里胜补 | +| 泚册成功暎露 token 字笊䞲圱响 sleep重新登圕就看䞍到 | 䜎 | 讟计就这样芁倍甚 ApiKeySuccessDialog 的"只星瀺䞀次"暡匏 | + +### 9.2 埅拍板的匀攟问题 + +- [ ] **试甚额床数倌**¥1500K token是䞍是合适倪少䞍借试倪倚被薅。考虑 Â¥0.5 / Â¥1 / Â¥3 / Â¥5 几种 +- [ ] **brand 偏奜"郜行"选项**选了的话 default token èµ° `auto` group / 普通 group芁䞍芁给 `auto` 单独跑通 +- [ ] **default token 呜名**upstream 默讀叫 "default"芁䞍芁改成曎有亲和力的"我的第䞀把 Key" +- [ ] **Cherry Studio 教皋 vs Playground**casual 甚户默讀掚哪䞪目前我借向 Playground零安装䜆 Cherry Studio 曎接近真实䜿甚场景 +- [ ] **wizard 步骀是吊胜圚 footer 星瀺"4/4"进床条**或者只星瀺圓前步号"Step 2 of 4" + +### 9.3 已决v0.1 + +- ✅ 泚册问 3 件persona / brand / client +- ✅ profile 慢慢填的 4 件行䞚 / 甹量 / 营销 opt-in / 星瀺名 +- ✅ 静默捕获 3 件acquisition / timezone / signup_meta +- ✅ 泚册成功自劚 sign-in绕过 /sign-in 跳蜬 +- ✅ Welcome screen 星匏展瀺"获赠的 3 样䞜西" +- ✅ 老甚户 dashboard 匹窗兜底PR #3 䞍砎坏 +- ✅ 邮箱验证匀启时第 1 步内嵌䞍增加步骀 + +--- + +## 10. Phase 计划 + +### Phase 1PR #7~6 倩— 泚册 wizard MVP + +- [x] 已盘点dto.UserSetting + TS UserSettings 加 5 䞪字段 +- [ ] 泚册 wizard 4 步莊号 + persona + brand + client +- [ ] OAuth 按钮䞊提 +- [ ] controller.Register 接受 5 䞪新字段 +- [ ] 泚册成功自劚 sign-in +- [ ] 泚册成功 Welcome screen星瀺 default token + 试甚额床 + 萜地 CTA +- [ ] 兌容老甚户 dashboard picker 兜底 + +### Phase 2PR #8~4 倩— Dashboard 匕富 + +- [ ] Getting Started checklist 组件 + dismiss 逻蟑 +- [ ] 銖次调甚前的 banner圚 dashboard 星瀺"还没调甚过" +- [ ] /usage-logs 空状态"还没调甚过 → 试试 Playground" +- [ ] 默讀 token 进入 /keys 列衚已有䜆銖次星瀺加区突出 + +### Phase 3PR #9~3 倩— Profile 扩展 + +- [ ] profile 增加"䞪人资料"扩展区 +- [ ] 星瀺名猖蟑 +- [ ] 行䞚 / 甹量 / 营销 opt-in 衚单 +- [ ] persona / brand / client 偏奜的再猖蟑已绑 wizard 选择profile 可改 + +### Phase 4PR #10+持续— A/B 测试 + 䌘化 + +- [ ] 事件埋点 +- [ ] 实验 A1-A4 +- [ ] 试甚额床耗尜通知 +- [ ] 銖充蜬化文案 +- [ ] 留存 7d/30d 通知 + +--- + +## 11. 参考 + +### 内郚 +- `docs/PRD.md` — äž» PRD +- `docs/tasks/api-key-simple-advanced-prd.md` — API Key 创建子 PRD +- PR #2 - #6 description +- `controller/user.go::Register` — 圓前泚册逻蟑 +- `controller/user.go::Login` — 圓前 session 生成逻蟑芁提取共享 +- `dto/user_settings.go` — UserSetting JSON 结构 +- `setting/alias_setting/seed/aliases.yaml` — purpose × brand 映射 +- `web/default/src/components/persona-picker-dialog.tsx` — Step 2 倍甚 +- `web/default/src/features/keys/components/api-key-purpose-picker.tsx` — Step 3/4 倍甚 +- `web/default/src/features/keys/components/api-key-success-dialog.tsx` — Welcome screen 的"只星瀺䞀次"暡匏参考 + +### 倖郚 +- **Vercel signup**邮箱 + OAuth + 倚步选 framework + 萜地空 project +- **Linear signup**单步泚册 + 邀请 + 团队 + 䞪性化 settings 倚步 +- **Cursor signup**OAuth-only + 立刻 dashboard + tooltip 匕富 +- **Stripe signup**邮箱 → 䞚务类型倚步 + KYCB2B-only +- **ChatGPT signup**邮箱 + 手机 → 立刻试聊最䜎 friction + +DeepRouter 走的是 **Linear + Cursor 䞭闎路线**泚册分倚步以获埗画像䜆每步郜胜跳过、䞍区制。