> For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.

# 1. My Stores

My Stores 是管理多家门店的人看的**多店对比表**：同一个日期范围下，每家门店一行，最下面一行 "Total" 是全部门店的合计。想看某一家店的细节，点门店名就跳到那家店的 Dashboard；点某个数字就跳到能解释这个数字的清单页（线索、任务或电话列表）。

入口在侧栏最上方 "General" › **My Stores**（点侧栏顶上的 Retaintive 标志也到这里）。这是登录后所有能访问门店的用户都能打开的页面，代码里没有按角色（Owner / Editor / Viewer）区分显示内容。进入某家店之后，侧栏顶部有 "My Stores" 返回按钮（提示 "Back to My Stores"），会带着当前日期范围回到这页。

## 1 页面框架

### (1) 内容

页面标题 "My Stores"，右上角两个按钮 "Export Report"、"Grab Snap"；工具栏左边三个页签 "Leads" / "Tasks" / "Calls"，右边是 "Help" 按钮、日期范围下拉和 "Compare: …" 下拉。

| 项目         | 说明                                                                                                                                                                                                        |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 哪些门店会出现在表里 | 你自己建的门店（你是 Owner）+ 别人在 Access Management 里加你进去的门店（你是 Editor 或 Viewer），且只列**已激活**的门店。一次最多支持 50 家门店，超过后端会直接报错                                                                                               |
| 日期范围       | 写在网址里（`?startDate=&endDate=`）；网址没写日期时沿用本次会话最后一次选的范围，首次打开预设为**截至今天的最近 7 天**。这一页同时看多家店，没法用某一家店的时区，所以"今天"按你电脑的时区定；人在国内看美国的店，默认的"今天"可能比店里早一天，看最近一两天的数据时手动选日期。统计时每家店各按自己当地的日期算，纽约店按纽约的一天、洛杉矶店按洛杉矶的一天，横向比较是公平的。 |
| 对比期间       | "Compare: Previous period"（环比：和紧挨着的上一段等长期间比，选了 7 天就和再往前的 7 天比）或 "Same period last year"（同比：和去年同一段日期比，天数保持一致）。默认是 Previous period。                                                                         |
| 页签         | 网址 `?tab=leads` / `task-performance` / `call-activity`，默认 Leads。三张表共用同一次数据请求，切页签不重新加载                                                                                                                     |
| 门店名        | 每行的门店名是按钮，点击切换当前门店并跳到 `/store-detail/<门店>`，带上当前日期范围：从 Tasks 页签跳过去落在单店 Dashboard 的 Tasks 页签，从 Calls 页签落在单店 Dashboard 的 Calls 页签，从 Leads 页签落在单店 Dashboard 默认页签（Leads）                                       |
| 数字格        | 可点的数字带虚线下划线（Calls 页签的 Total 例外：显示为链接色，悬停才出下划线），跳到对应清单页（各页签下面写明去处）。"—" 表示**这一格没能统计出来**（后端查询失败或缺少必要数据），不是 0；真正的 0 会显示 "0" 且仍可点                                                                              |
| Total 行    | 各列合计，不可点。凡是某家店那一格是 "—"，合计也是 "—"，不会把已知的店加起来冒充全部                                                                                                                                                            |

日期范围会在带 `preserveDateRange` 标记的页面之间保留（例如从这里点进单店 Dashboard 再回来，日期不变）。

### (2) 管理价值

多店管理者一眼看到哪家店线索转化差、任务结果少、电话量异常，再点进去查原因，不用一家家切店。

### (3) 使用方法

先选日期范围和对比期间，再切页签看表。看到异常的格子直接点数字进清单核对；想看这家店完整情况点门店名。想把表发给别人用 "Export Report"（CSV）或 "Grab Snap"（截图），见第 6 节。

## 2 Leads 页签

### (1) 内容

Received 显示事件数，Unique / Outreached / Contacted / Intros Booked 四列只显示**人数**；最右列显示整体预约率和变化。时间口径是**线索进来的时间**：统计选定期间内到达的线索，后续联系、预约的证据也只在这段期间内找。

| 列                        | 口径                                                                                       | 点击去处                                                   |
| ------------------------ | ---------------------------------------------------------------------------------------- | ------------------------------------------------------ |
| "Received"               | 期间内收到的原始线索事件数：邮件线索 + 电话/短信识别出的线索，**按事件数**，不去重                                            | 不可点。                                                   |
| "Unique"                 | 上述事件去重并通过校验后的**实际客户人数**                                                                  | `/leads-v3`，带门店和日期，列出的正是这批人                            |
| "Outreached"             | Unique 里有联系证据、且已建了线索任务的人数：证据包括触发建任务的那通来电/来信本身、从门店号码打出去的电话（含打到语音信箱的）、发出的短信，或员工记录的联系动作     | Tasks 页面的线索任务清单（`/tasks/lead`，阶段 Outreached，按线索到达日期筛选） |
| "Contacted"              | Outreached 里有成功联系上证据的人数：接通的电话不分方向，客户回短信也算                                                | 同上，阶段 Contacted                                        |
| "Intros Booked"          | Contacted 里已预约体验课的人数（系统记录的预约进度、任务以 "booked" 关闭、或表单自带预约，三者取并集）                            | 同上，阶段 Intro Booked                                     |
| "Unique → Intros Booked" | 整体预约率 = Intros Booked ÷ Unique，后面跟着相对对比期间的变化，单位是百分点（"↑3 pp" 绿色、"↓3 pp" 红色、没有对比基数时显示 "—"） | 不可点                                                    |

两个特殊情况：

- **门店没有绑定电话号码**（或号码查询失败）时，"Outreached" 和 "Contacted" 显示 "—" 且不可点，因为没有门店号码就分不清哪通电话是店里打出去的；"Received"、"Unique"、"Intros Booked" 不受影响。
- 点 Outreached / Contacted / Intros Booked 进去的任务清单开着和关了的任务都列（状态 all），并带 "Lead Funnel"、"Stage: …" 筛选片。

Total 行：各列人数相加（任一店未知则为 "—"），预约率按合计的 Intros Booked ÷ 合计 Unique 重新算，不是各店比例的平均。

### (2) 管理价值

横向比较各店的漏斗，看人数从 Unique → Outreached → Contacted → Intros Booked 哪一步掉得最多，判断是"线索没人联系"、"联系不上"还是"联系上了没预约"，再看整体预约率相对上期升还是降。Received 与 Unique 的差距能看出重复提交和无效线索的比例。

### (3) 使用方法

先看最右列整体预约率和趋势找出落后的店，再从左到右看哪一环人数掉得最多，点那一格进任务清单看具体是哪些人、谁在跟。

## 3 Tasks 页签

### (1) 内容

这一页看的是：这段时间每家店**关了多少任务、其中办成了多少事**。五列里前四列是数量，最后一列在正式环境里一直是空的。

| 列                       | 是什么       | 怎么数                                                                                                                           | 点击去处                               |
| ----------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
| "Closed Tasks"          | 关掉的任务数    | 所选期间内关闭的任务，不管什么类型、什么结果，按关闭那天算                                                                                                 | `/tasks`，筛出这些已关闭的任务                |
| "Intro Booked"          | 预约了体验课的人数 | 和 Leads 页签最后一列是同一个数：这段时间进来的线索里，有多少人预约了体验课。数的是人，按线索进来那天算                                                                       | 和 Leads 页签同一个清单                    |
| "Membership Conversion" | 办了会籍的任务数  | 员工把客户的任务关掉、选"已办卡"、填上办卡日期，算一张，按办卡那天算。AI 识别出办卡会弹审批让员工确认，确认后才算。**门店开了 Automatic 档后 AI 自己关掉的办卡不算**（当前缺口，见当前限制）                    | 不可点                                |
| "Cancel Saved"          | 挽留成功的任务数  | 会员来说要取消，员工处理后关闭任务时选"留住了"，算一个，按关闭那天算。副标 "Legacy outcome" 的意思是只看员工选的结果，系统不另外核实                                                  | `/tasks`，筛出关闭结果为 cancel\_saved 的任务 |
| "Team Productivity"     | 一个比例      | **正式环境一直显示 "—"，可以忽略。** 只有后台用旧算法时才有数：(旧算法的预约 + 办卡 + 挽留任务数) ÷ (体验课 + 会籍 + 取消类通话数)，它和本表其他列口径对不上，所以新算法一开就整列置空，副标 "Not comparable" | 不可点                                |

三点注意：

- 五列的**单位不一样**：Intro Booked 数的是人，其余数的是任务；**日期也不一样**：Intro Booked 按线索进来那天，Membership Conversion 按办卡那天，另外两列按关闭那天。所以同一行的数不能相加、相除。
- 后台有个开关决定 Membership Conversion 用新算法还是旧算法（旧算法叫 "Membership Sold"，直接数关闭时选了"已办卡"的任务，不看日期和证据）。test 和 prod 都开着新算法，正式产品里只会看到 "Membership Conversion"。新算法查询出错时显示 "—" 并标 "Temporarily unavailable"，不会拿旧算法的数顶上。
- Help 弹窗对这页的说明原文："Intro Booked uses the same lead funnel definition as the Leads tab, so both tabs always report the same number. A count we cannot confirm shows a dash — never a zero, and never a substitute number from a different way of counting."

### (2) 管理价值

看各店这段时间**干了多少活（Closed Tasks）、办成了多少事（预约、办卡、挽留）**。Intro Booked 和 Leads 页签是同一个数，两张表不会打架；Membership Conversion 只算员工确认过的，数字偏保守。

### (3) 使用方法

先比 Closed Tasks 看工作量，再比 Intro Booked / Membership Conversion / Cancel Saved 看产出；关得多但产出少的店，点 Closed Tasks 进任务列表看关闭结果都是什么。Team Productivity 不用看。

## 4 Calls 页签

### (1) 内容

| 列                     | 口径                                                | 点击去处（`/calls-v3`，带门店、日期）                               |
| --------------------- | ------------------------------------------------- | ------------------------------------------------------ |
| "Total"               | 有人接通的通话数，旁边小字 "N out · M in" 是呼出 / 呼入拆分（手机宽度下不显示） | 状态 live\_call，方向 Inbound,Outbound                      |
| "Intro"               | AI 分类为体验课预约相关的接通通话                                | 子类 intro\_booking                                      |
| "Membership Purchase" | 分类为影响营收、子类会籍购买相关的接通通话                             | 类别 revenue\_impacting，子类 membership\_purchase\_related |
| "Cancellation"        | 分类为影响营收、子类会籍取消的接通通话                               | 类别 revenue\_impacting，子类 membership\_cancel            |

**表格下方的 "Include voicemail" 开关**（默认打开）：打开时，四列各自额外加上同类型的语音留言。点击数字进清单页时，状态筛选跟着这个开关走（开关打开则筛 live\_call,voicemail，关闭则只筛 live\_call），保证点进去看到的条数和格子里的数字一致。

### (2) 管理价值

比各店电话总量和三类关键电话的多少：体验课电话少说明获客端弱，取消电话多要关注留存。配合 Tasks 页签的 Team Productivity 看"电话换来多少结果"。

### (3) 使用方法

先决定要不要算留言（开关会同时影响导出的 CSV），再横向比各列；点数字进电话列表听录音、看逐字稿。

## 5 当前限制

- 只列已激活且你有权限的门店；一次最多 50 家。页面没有排序、筛选、搜索，行的先后顺序代码里没有规定。
- 所有能访问的用户看到的内容一样，代码里没有按 Owner / Editor / Viewer 区分列或按钮。
- "Received" 不可点（没有按原始事件列出的清单页）；新口径下的 "Membership Conversion" 不可点；"Unique → Intros Booked" 与 "Team Productivity" 不可点。
- "Team Productivity" 只在新口径关闭时显示；新口径启用后整列为 "—"。
- Calls 页签不显示与对比期间的变化；后端返回的通话趋势字段页面没有渲染。
- 门店没有绑定电话号码时，"Outreached"、"Contacted" 为 "—"。
- 门店没有设置时区时，后端按美国太平洋时区算这家店的统计窗口。
- Membership Conversion 只统计员工手动关闭（或批准 AI 提议后关闭）的办卡；门店 Task Automation 在 Automatic 档时 AI 自动关闭的办卡不计入，报表会少算。新店默认就是 Automatic 档。
- "Grab Snap" 只截当前页签；CSV 才是三个页签一起导。

## 6 实现依据

本篇按本地代码核查，页面实际启用情况以部署版本为准。

[页面壳](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/pages/my-stores/index.vue) · [Leads 表](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/pages/my-stores/components/leads-report-table.vue) · [Tasks 表](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/pages/my-stores/components/tasks-report-table.vue) · [Calls 表](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/pages/my-stores/components/calls-report-table.vue) · [Help 弹窗](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/pages/my-stores/components/report-metric-help-dialog.vue) · [格子取值](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/pages/my-stores/my-stores-report-derivations.ts) · [未知值处理](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/pages/my-stores/my-stores-report-metrics.ts) · [CSV 导出](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/pages/my-stores/my-stores-report-export.ts) · [点击去处](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/pages/my-stores/composables/use-report-drill-targets.ts) · [线索跳转规则](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/utils/lead-funnel-contract.ts) · [日期范围](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/stores/date-range.ts) · [侧栏](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/composables/use-sidebar.ts) · [旧路由转向](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/web/src/router/guard/disabled-routes.ts) · [多店 API](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/api/src/routes/v3/dashboard-multi-store.ts) · [门店时区窗口](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/api/src/utils/reporting/date-range.ts) · [指标 SQL 与合计](https://github.com/retaintive/callytics-infrastructure/blob/main/packages/task-engine/src/metrics/multi-store.ts) · [关闭任务口径](https://github.com/retaintive/callytics-infrastructure/blob/main/packages/task-engine/src/metrics/reporting-contract.ts) · [Team Productivity 公式](https://github.com/retaintive/callytics-infrastructure/blob/main/packages/common/src/metrics/dashboard-kpis.ts) · [漏斗口径](https://github.com/retaintive/callytics-infrastructure/blob/main/packages/common/src/metrics/lead-funnel.ts) · [报表口径说明](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/api/docs/reporting-contracts.md) · [新口径开关配置](https://github.com/retaintive/callytics-infrastructure/blob/main/apps/api/infra/lib/stack.ts)
