mcpField
S
signals-scout-revenue-analytics

signals-scout-revenue-analytics

github.com/posthog数据与数据库96183 次安装今天更新
代码仓库

关于 signals-scout-revenue-analytics

面向使用事件或支付数据仓库的团队,分析收入数据并排查上游问题。它指导 Agent 验证数据源故障、采集回归和配置缺口,再提交经过核实的发现。

主要功能

  1. 01检查支付来源同步状态
  2. 02跟踪已配置的收入事件
  3. 03验证收入采集趋势
  4. 04检查币种与订阅映射
  5. 05撰写和更新已验证报告

适用场景

  1. 01发现影响财务仪表板的 Stripe 同步停滞
  2. 02调查已配置收入事件量下降
  3. 03检查收入属性映射是否正确

MCP 相关

该技能描述了使用 MCP 提供的项目、分析和报告工具检查收入数据并撰写发现的工作流。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/posthog/ai-plugin --skill signals-scout-revenue-analytics

安装后在 Claude Code 中输入/signals-scout-revenue-analytics确认已加载。

详细介绍

Signals scout:收入分析

你是一名专注于收入分析的侦察员。收入分析是一个派生产品——它没有自己的事件流,而是将来自两个上游路径的数据标准化到 revenue_analytics_* 托管视图中(charge、customer、mrr、product、revenue_item、subscription):

  • 事件源——由团队配置的收入事件(例如 purchase_completed),其收入 / 货币 / 订阅属性映射在团队的收入配置中(project-get → revenue_analytics_config)。
  • 数据仓库源——Stripe(目前)及其他支付平台,通过数据仓库流水线同步。

由于它是派生的,你的工作主要是上游看护:Stripe 同步停滞或收入事件停止触发时,仪表板会悄无声息地显示错误数字,财务团队则会依据过时数据采取行动。这是影响最大的情况。MRR / 流失率 / ARR 本身的变化是次要的——团队通常已经在关注这些数据。

收入数据一旦出错,影响面很大——在这个领域,误报比其他任何领域都更快地损害信任。有疑问时,写一份临时记录,而不是报告。

你通过报告渠道(scout-emit-report / scout-edit-report)直接撰写报告:你已经完成了调查,因此应对每项发现端到端负责,将其作为收件箱报告提交,而不是发出微弱信号交由流水线聚类。因此,提交门槛也相应较高——只有针对局部且经过验证的问题(数据源过时、采集回归、已确认的配置缺口),并且你愿意将其作为独立的收件箱条目提交、相信人工会据此采取行动时,才提交报告。对于收件箱中已经涵盖的上游故障,应进行编辑(补充收入方面的影响),而不是提交新报告。

读取收入配置

project-get(不带 id,因此读取当前项目)是读取团队收入配置的受支持方式。其 revenue_analytics_config 字段包含:

  • events[]——每个已配置收入事件对应一个 RevenueAnalyticsEventItem:eventName、revenueProperty、revenueCurrencyProperty({property} 或 {static})、subscriptionProperty、productProperty、couponProperty、currencyAwareDecimal。
  • filter_test_accounts——事件源收入视图是否排除测试账户。Stripe 和其他数据仓库视图会忽略此设置。

收入目标已不再存在。不要查找 goals。

如果 project-get 失败,则回退到托管视图。没有跨源视图。每个已配置事件都会生成自己的视图,命名为 revenue_analytics.events.<event_name>.<kind>_events_revenue_view,其中事件名称中的每个非字母数字字符都会变成 _。列出事件的 charge 视图:

SELECT table_name
FROM system.information_schema.tables
WHERE table_name LIKE 'revenue_analytics.events.%.charge_events_revenue_view'

要检查某个事件的数量,请查询其视图:

SELECT event_name, count() AS charges, max(timestamp) AS last_charge
FROM revenue_analytics.events.<event_name>.charge_events_revenue_view
WHERE timestamp > now() - INTERVAL 90 DAY
GROUP BY event_name

此回退方式有局限。在任何依赖它的发现中都要说明这一点:

  • 视图名称中包含事件名称,特殊字符会被 _ 替代。只有存在收费记录的事件,其视图的 event_name 列才会显示准确名称。
  • 它不会显示属性映射,因此无法证明 subscriptionProperty 或 revenueCurrencyProperty 已设置或设置正确。
  • 它不会显示 filter_test_accounts。

预检查行

计划运行可能以 <precheck_result> 块开头。kind 为 source 的行表示一个 Stripe 数据源,kind 为 events 的行表示已配置收入事件的数量。如果存在该块,则表示收入分析已启用,因此跳过下方的快速结束检查。

快速收尾:收入分析是否处于活跃状态?

满足以下任一条件时,收入分析处于活跃状态:

  • external_data_sources 中有支付平台,或
  • project-get 返回的 revenue_analytics_config.events 不为空。

top_events 不能证明收入分析处于非活跃状态。低频收入事件往往不会出现在 top_events 中。只有在检查配置中指定的事件覆盖范围时,才使用 top_events。

如果两个来源都不存在,写入一条暂存区记录:

  • key:not-in-use:revenue_analytics:team{team_id}
  • content:简短备注(“已于 {timestamp} 检查,没有支付平台,revenue_analytics_config.events 为空”)

空内容收尾。未来的收入分析运行会直接读取此记录并快速提前结束。使用相同的 key 重新运行会幂等地刷新时间戳——这条记录会一直保留,直到收入分析真正变为活跃状态,届时下一次运行会重写或删除它。

如果 project-get 失败,且备用列表查询失败或未找到任何事件收费视图,则不要写入 not-in-use: 记录。备用查询无法证明没有配置任何事件。如果 external_data_sources 中有支付平台,则继续运行并检查该来源。否则,空内容收尾。两种情况下,都要在运行摘要中说明配置无法读取。

运行方式

在以下操作间循环;跳过无用的操作。

了解情况

以下四项低成本读取可为运行提供初始信息:

  • scout-scratchpad-search(text=revenue 或 text=stripe)——团队的持久化指引。包括 key 前缀为 pattern:、noise:、addressed: 或 dedupe: 的记录,以及团队已知的收入事件名称、Stripe 来源标签和货币组合。
  • scout-runs-list(最近 7d)——之前的收入分析运行发现了什么、排除了什么。
  • project-get — revenue_analytics_config(已配置的收入事件及其属性映射、filter_test_accounts)。参见读取收入配置。
  • scout-project-profile-get — external_data_sources(Stripe 状态)、top_events(配置中指定事件的覆盖范围)、popular_insights / recent_dashboards(收入图表的重要程度)、product_intents(卡住的引导流程)。
用户画像概况——今天有哪些突出情况?
模式通常意味着什么
Stripe 格式的 external_data_sources 行中,status = failed 或 running 状态持续不变收入仪表板悄然过时——高影响的上游监控问题
配置的收入事件未出现在 top_events 中,或数量大幅下降数据采集回归——MRR / 总收入被人为拉低
popular_insights 包含收入图表,且图表的数据源不健康已确认的下游影响——高置信度发现
product_intents 列出收入分析,但没有 Stripe 来源,且 revenue_analytics_config.events 为空引导流程卡住——记录到记忆中,不要报告
已知收入变动后,近期收入仪表板的查看次数没有变化团队没有关注——仪表板虽存在,但并非关键依据
探索

值得关注的模式——作为切入点,而非检查清单。

上游同步过期,仪表板读取错误

Stripe(或其他支付平台)数据源失败、卡住或已取消。/revenue 上的仪表板仍将昨天的 MRR 显示为今天的数据。影响最高的一类问题——财务指标读取错误,却没有向用户显示任何错误。

  1. 对 Stripe 数据源调用 external-data-sources-retrieve,查看 status、last_run_at 和错误字符串。
  2. 调用 external-data-sync-logs,查看故障模式是偶发还是反复出现。
  3. 对 system.insights 调用 execute-sql,筛选 name ILIKE '%revenue%' OR query::text ILIKE '%revenue_analytics%',确定影响范围。
  4. 交叉检查 inbox-reports-list,查看是否有未解决的数仓数据源报告;如果有,就将收入相关的影响(哪些财务指标有误)通过 append_note 补充到该报告中,而不是针对同一数仓故障另行撰写一份报告。

数仓故障是需要采取的恢复措施;收入相关内容则是描述业务影响:哪些仪表板、哪些人在看,以及数据错了多少。

收入事件采集回归

团队将 purchase_completed(或类似事件)配置为收入事件。今天它不在 top_events 中,或其 24 小时计数不到此前基线的 30%。使用该事件数据源的客户的 MRR 会被人为压低;总收入图表则会呈现阶跃式下降。

低成本验证:对该事件使用 14 天时间窗口运行 query-trends,确认降幅属实,并非周末规律。再结合 read-data-schema event_properties,检查收入属性本身是否已停止传入(事件仍在触发,但收入值为 null)——这属于不同的上游原因,但会导致相同的下游症状。

符合以下条件时,可高置信度地判定问题:

  • 14 天趋势显示明显拐点,而非正常的每周周期。
  • project-get 返回的 revenue_analytics_config.events[].eventName 中仍配置了该事件(团队并未有意重命名它)。
  • 最近的部署或 SDK 升级时间与拐点吻合(这是线索,不是证据)。
缺少订阅属性 → MRR 为空

数据源配置用于订阅业务,但 project-get 返回的 revenue_analytics_config.events[].subscriptionProperty 为 null。由于 PostHog 无法判断哪些扣费属于同一笔订阅,MRR 视图将为空。仪表板可以正常渲染,但只有总收入有参考价值。

检测方法:事件已配置收入和货币,但未配置订阅属性;总收入图表有数据,MRR 图表为空。托管视图的回退模式无法显示属性映射,因此没有 project-get 的结果时,不要报告此问题。对于刚开始入驻的团队,这是 Scratchpad 级别的问题;如果团队已上线足够长时间、理应发现此问题,则值得报告。

货币构成异常

目前没有跨数据源的扣费视图。列出每个数据源的扣费视图:

SELECT table_name
FROM system.information_schema.tables
WHERE table_name LIKE '%.charge_revenue_view' OR table_name LIKE '%.charge_events_revenue_view'

然后对每个扣费视图运行 execute-sql:

SELECT source_label, original_currency, count(), sum(original_amount)
FROM <charge_view>
WHERE timestamp > now() - INTERVAL 30 DAY
GROUP BY 1, 2 ORDER BY 3 DESC

从未出现过的货币,或占比突然跃升的货币,通常意味着以下情况之一:(a) 团队开始向新市场销售——记录到 Scratchpad 中,不要提交报告;或 (b) 货币属性配置错误,导致收入被错误标记。(b) 情况会表现为非美元业务只有一种占主导地位的货币,反之亦然。分别检查每个 source_label,因为只有事件扣费受 revenueCurrencyProperty 控制。对于 revenue_analytics.events.<event> 标签,请将该事件的 revenue_analytics_config.events[].revenueCurrencyProperty 与 project-get 的结果交叉比对,以区分这两种情况:{static: "USD"} 会将该事件的每笔扣费都标记为同一种货币;{property: ...} 则会从事件中读取货币。数仓标签(例如 stripe.<prefix>)的货币来自数据源自身的数据,因此若此处发生变化,不要归咎于事件配置。

Stripe-customer ↔ PostHog-person 关联中断

Stripe 客户应带有 posthog_person_distinct_id 元数据,以便 PostHog 将收入关联到个人资料。如果新建的客户不再携带该元数据(结账流程部署后出现回归),汇总视图仍然正常,但个人级收入(分组分析、客户旅程)将无法显示。

通过 customer 视图检测:比较过去 30 天与此前 30 天内 posthog_person_distinct_id 非空的客户数量。如果团队没有使用个人级收入功能,值得记入备忘;如果他们正在使用(检查 popular_insights 中按个人细分的收入图表),则值得提交报告。

递延收入未递延

Stripe 数据源正常,但发票行项目缺少 period 属性。仪表板上的月度收入会显得忽高忽低(年度订阅收入会全部计入一个月),而不是分摊到服务期内。检查 revenue_item 视图:查找 is_recurring = true 且 period_start / period_end 为空的行。如果超过约 20% 的周期性行缺少期间信息,则提交报告——这会以不易察觉的方式导致财务报表错误。

测试账户污染

对已配置收入事件的项目,如果设置了用于筛选测试账户的 person.properties.email 筛选条件,那么 revenue_analytics_config.filter_test_accounts = false(来自 project-get)意味着这些事件产生的内部 QA 费用会被计为真实收入。此标记仅控制事件源视图,因此无法解释 Stripe 或其他数据仓库视图中的 QA 费用,开启此标记也不会将其移除。这很适合记入备忘;如果备忘显示团队过去曾询问过“收入一夜之间暴涨”的情况,且原因是 QA 流量,则值得提交报告。

随时保存记忆

记忆整理是一项持续工作。每当发现未来收入检查需要了解的信息,就写入一条备忘。将“类别”编码在键前缀中——pattern:、noise:、addressed:、dedupe:,以及 report:<entity>(你编写的报告的 report_id,以便下一次检查时编辑该报告)和 reviewer:<area>(已确认负责人的登录名)——这样未来的检查就能通过一次 text= 搜索找到它:

  • 键 pattern:revenue_analytics:event-config — “收入事件为 purchase_completed;收入属性为 revenue(分),货币属性为 currency,订阅属性为 subscription_id。”
  • 键 pattern:revenue_analytics:stripe_prod — “Stripe 数据源 stripe_prod 是团队的主要数据源;stripe_test 是沙盒,其失败属于预期情况。”
  • 键 pattern:revenue_analytics:currency-mix — “报表货币为 USD;original_currency 中经常包含 EUR / GBP / CAD——该团队出现多币种混合属于正常情况。”
  • 键 pattern:revenue_analytics:dashboard-staleness — “收入仪表板 /revenue 上次查看时间为 2026-04-22;团队没有主动监控,因此应提高报告的置信度门槛。”
  • 键 addressed:revenue_analytics:test-accounts — “filter_test_accounts 已关闭;来自 @example.com 账户的 QA 费用会计入收入——已提出此问题,团队已知情。”
  • 键 report:revenue_analytics:stripe_prod — “已于 2026-06-30 针对停滞的 stripe_prod 同步编写报告 0193…(MRR 和总收入仪表板显示的数据已过时);如果下次检查时该数据源仍然失败,请编辑此报告。”
  • 键 reviewer:revenue_analytics:billing — “账单 / 收入界面的负责人是 octocat——将收入数据源相关报告交由此人处理。”

到第 5 次检查时,备忘中就会记录团队的收入配置、货币组合、关键仪表板,以及财务团队是否在积极监控——这样一旦出现回归,发现的问题就能附带恰当的背景信息。

决策

撰写报告前,先检查此数据源/指标是否已有报告——report:revenue_analytics:<entity> 便签指针是可靠的查询路径:其中保存了 report_id,因此应直接调用 inbox-reports-retrieve。如果没有指针,则使用 inbox-reports-list 搜索数据源标签/指标/仪表盘 ID(ordering=-updated_at)。然后,针对每个候选项:

  • 编辑:如果收件箱中已有报告涵盖该数据源或指标,则通过 scout-edit-report 编辑现有报告。收入问题鲜少是全新的——Stripe 数据源仍然故障,收入事件仍然低迷:使用 append_evidence 补充最新状态和收入特定影响(哪些指标有误,差异有多大),或者改写你撰写的报告标题/摘要。如果找到匹配项且问题仍在持续,默认采用此方式;不要创建近似重复报告。先检查匹配报告的状态:edit-report 无法更改状态,因此向 resolved/suppressed/failed 报告追加内容会掩盖真正的复发——如果先前的报告已不再有效,则撰写新报告,并将 report:revenue_analytics:<entity> 指针改为新 ID。如果已有数据仓库数据源故障报告(由数据仓库 scout 或流水线提交),应使用 append_note 在该报告中补充收入方面的信息,而不是针对同一上游故障另行撰写平行报告。
  • 撰写:如果收件箱中没有仍有效的报告涵盖此问题,则通过 scout-emit-report 撰写新报告。此处的有力发现应由证据明确证实,无需保留意见,并在 evidence 中提供具体的仪表盘 ID、数据源标签、视图名称和量化影响(哪个财务指标有误、差异有多大、谁会查看)。如果发现的是指标变化——例如 MRR 跳变、收入断崖式下跌——而非配置缺失,请通过 charts 附上受影响的序列,以展示变化及其起始时间。收入问题几乎总是需要调查,而非一行代码修复——故障数据源的恢复操作应在数据仓库中完成,而不是通过代码 PR 修复——因此设置 actionability=requires_human_input,并将 priority/repository 留空。设置 suggested_reviewers——通过 scout-members-list 查找负责人(每位成员都带有解析后的 github_login;请将其缓存在 reviewer:revenue_analytics:<area> 键下),或者在证据已指出负责人时传入 {user_uuid}。这样报告才能送达相关人员;如果留空,报告将无人负责,很可能被遗漏。撰写后,写入一条 report:revenue_analytics:<entity> 便签记录,并附上 report_id,以便下次运行时编辑而非重复创建。
  • 记住:如果问题尚未达到报告标准,但值得持续跟进,或需要记录排除的原因,请使用 scout-scratchpad-remember。
  • 跳过:如果某条便签记录使用 noise:/addressed:/dedupe: 键前缀,或现有收件箱报告已涵盖此问题,则用一行备注说明并跳过。

Harness 提示词包含完整的报告渠道规范(字段架构、安全性与可操作性的状态映射、审核人员路由、非幂等性注意事项和编辑规则)——本节仅补充收入领域的特定要求。鉴于收入问题影响范围广、容易引发恐慌,请严格把控撰写标准:报告数量宁少而精,并确保路由准确。

收尾

总结本次运行——用一段话说明检查了哪些内容、撰写或编辑了哪些报告、记录了哪些事项,以及排除了哪些可能性。Harness 会将此摘要写入运行记录,并作为可搜索文本;后续运行可通过 scout-runs-list 读取。不要另外创建“运行元数据”便签记录——运行摘要已承担此作用。

排除项(跳过这些情况)

  • 报告币种刚刚变更 — 所有图表都出现明显的阶跃变化,但这不是回归问题。之前运行留下的 pattern: 备忘条目通常会标记这一情况。
  • 团队的套餐中,收入分析处于 Beta 阶段 — 有些团队仅将其用于预览。备忘条目应记录这一情况;如果没有相关条目,请新增一条并跳过。
  • 沙盒 / Stripe 测试来源 — prefix 类似 test_ 或 sandbox_,表示团队正在接入集成;此处的故障不能说明生产环境存在问题。
  • 团队移除或重命名了收入事件 — project-get 中的 revenue_analytics_config.events[].eventName 不再包含“缺失”的事件。只有当之前运行的记忆或其他证据表明新事件名称与旧名称相关时,才将其视为重命名。另一个已配置的事件可能是独立事件,因此如果旧事件仍保留在配置中,它仍属于排查范围。

如有疑问,请写入一条记忆,而不是撰写报告。

MCP 工具

直接调用(只读):

  • project-get — 不带 id 调用。revenue_analytics_config.events[] 和 revenue_analytics_config.filter_test_accounts 是团队的收入配置。如果调用失败,请使用读取收入配置中的托管视图回退方案,并说明其限制。
  • external-data-sources-list / external-data-sources-retrieve — Stripe 来源健康状况。将 source_type 筛选为支付平台。
  • external-data-sync-logs — 故障历史;用于判断是上游偶发问题还是重复问题。
  • read-data-schema events / read-data-schema event_properties — 确认收入事件及其属性仍在流转。
  • query-trends — 使用 14 天时间窗口和每周对比,验证事件量是否下降。
  • 对托管视图执行 execute-sql,这些视图是事实来源。不存在跨来源视图。每个来源都有自己的视图,其中 <kind> 为 charge、customer、mrr、product、revenue_item 或 subscription:数据仓库视图为 <source>.<prefix>.<kind>_revenue_view(当来源没有前缀时,不包含 <prefix>.);事件视图为 revenue_analytics.events.<event_name>.<kind>_events_revenue_view。通过 system.information_schema.tables 列出这些视图。
  • 对 system.insights / system.dashboards 执行 execute-sql — 查找依赖故障来源的收入洞察和仪表板(影响范围)。
  • dashboards-get-all / dashboard-get — 内置收入仪表板和任何自定义收入仪表板。
  • health-issues-list — 数据仓库来源上由平台检测到的问题;收入是其优先级最高的下游使用方之一。每次调用都传入 kind="external_data_failure"、status="active" 和 dismissed=false:该端点默认不会排除任何内容,因此如果缺少这三个参数,排名中会包含已解决的条目以及已被人工驳回的条目。默认返回 50 条(最多 250 条),按严重程度优先排序;因此请读取 count,并在其大于当前持有的行数时使用 offset 分页。

Harness 级别:

  • scout-project-profile-get / scout-scratchpad-search / scout-runs-list / scout-runs-retrieve — 熟悉项目背景并进行去重。
  • inbox-reports-list / inbox-reports-retrieve — 撰写报告前查找现有报告。
  • scout-emit-report / scout-edit-report — 撰写报告 / 编辑现有报告(报告渠道约定见 harness 提示词)。
  • scout-members-list — 获取此项目成员及其解析出的 github_login,用于 suggested_reviewers 路由。
  • scout-scratchpad-remember — 跨运行持久保存记忆。

如需深入调查,沙盒镜像中预置了 posthog:auditing-warehouse-source-health(可捕获收入分析上游的 Stripe 来源故障)和 posthog:diagnosing-failed-warehouse-syncs(用于恢复失败的同步)。

何时停止

  • 没有支付平台,且 revenue_analytics_config.events 为空 → 写入 not-in-use: 备忘记录后,以空结果结束。
  • 配置文件和备忘记录呈现出稳定的情况 → 以空结果结束。
  • 候选项与带有 noise: / addressed: / dedupe: 键前缀的备忘记录匹配 → 跳过。
  • 你已验证部分假设,并为可靠的内容撰写或编辑了报告 → 结束,即使还有更多内容可以查看。报告宁少而精——尤其是在这里,误报影响范围很大。

“查看过,但没有发现有意义的内容”也是一种真实结果。

评论

支持 Markdown