siluzan-tso-cli 1.1.20-beta.2 → 1.1.20-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +3777 -1190
  3. package/dist/skill/SKILL.md +144 -125
  4. package/dist/skill/_meta.json +2 -2
  5. package/dist/skill/assets/campaign-create-template.json +146 -93
  6. package/dist/skill/assets/campaign-create-template.md +238 -0
  7. package/dist/skill/references/account-analytics.md +39 -32
  8. package/dist/skill/references/accounts.md +13 -11
  9. package/dist/skill/references/currency.md +72 -0
  10. package/dist/skill/references/geo-continents.json +1 -9
  11. package/dist/skill/references/google-ads-campaign-plan.md +89 -0
  12. package/dist/skill/references/google-ads-rules/google-ads-campaign-optimization.md +1 -15
  13. package/dist/skill/references/google-ads-rules/google-ads-compliance.md +7 -8
  14. package/dist/skill/references/google-ads-rules/google-ads-keyword-strategy.md +2 -3
  15. package/dist/skill/references/google-ads-rules/google-ads-keyword-taxonomy.md +86 -0
  16. package/dist/skill/references/google-ads-rules/google-ads-launch-plan-template.md +59 -129
  17. package/dist/skill/references/google-ads.md +256 -144
  18. package/dist/skill/references/google-analysis-batch.md +18 -18
  19. package/dist/skill/references/hosted-automation-optimize-weak-downbid.md +1 -1
  20. package/dist/skill/references/hosted-automation-self-control.md +2 -2
  21. package/dist/skill/references/keyword-planner-workflows.md +132 -28
  22. package/dist/skill/references/rag.md +104 -0
  23. package/dist/skill/references/reporting.md +1 -1
  24. package/dist/skill/references/tips.md +12 -6
  25. package/dist/skill/references/workflows.md +24 -172
  26. package/dist/skill/report-templates/README.md +8 -8
  27. package/dist/skill/report-templates/REPORT-WORKFLOW.md +12 -12
  28. package/dist/skill/report-templates/google-inquiry-analysis.md +185 -127
  29. package/dist/skill/report-templates/okki-weekly-google-client.md +66 -66
  30. package/dist/skill/scripts/install.ps1 +8 -6
  31. package/dist/skill/scripts/install.sh +7 -3
  32. package/eval/cases/accounts-entityid-vs-mediaccustomerid.scenario.json +14 -2
  33. package/eval/cases/accounts-mcc-bind-inquiry.scenario.json +3 -1
  34. package/eval/cases/accounts-single-balance-not-bulk.scenario.json +14 -3
  35. package/eval/cases/budget-display-not-raw-micros.scenario.json +10 -3
  36. package/eval/cases/clue-meta-leads-json.scenario.json +14 -2
  37. package/eval/cases/clue-tiktok-leads-json.scenario.json +11 -2
  38. package/eval/cases/destructive-account-delink-needs-confirm.scenario.json +9 -3
  39. package/eval/cases/destructive-forewarning-delete-needs-confirm.scenario.json +9 -3
  40. package/eval/cases/destructive-invoice-apply-needs-confirm.scenario.json +9 -3
  41. package/eval/cases/finance-invoice-info-list.scenario.json +11 -3
  42. package/eval/cases/forewarning-list-google.scenario.json +14 -3
  43. package/eval/cases/google-ads-no-structural-without-confirm.scenario.json +6 -2
  44. package/eval/cases/google-analysis-keywords-route.scenario.json +14 -2
  45. package/eval/cases/human-p1-multiturn.scenario.json +5 -1
  46. package/eval/cases/meta-single-balance-not-bulk.scenario.json +17 -3
  47. package/eval/cases/open-account-bing-noninteractive.scenario.json +4 -1
  48. package/eval/cases/open-account-google-noninteractive.scenario.json +3 -1
  49. package/eval/cases/open-account-tiktok-license-file.scenario.json +3 -1
  50. package/eval/cases/optimize-list-by-account.scenario.json +11 -3
  51. package/eval/cases/p1-single-account-profile.scenario.json +11 -1
  52. package/eval/cases/p2-balance-scan-bulk.scenario.json +9 -2
  53. package/eval/cases/p3-accounts-digest.scenario.json +5 -1
  54. package/eval/cases/p4-period-report-window.scenario.json +8 -1
  55. package/eval/cases/rag-before-keyword-expand.scenario.json +24 -0
  56. package/eval/cases/rag-list-then-query.scenario.json +23 -0
  57. package/eval/cases/report-list-google.scenario.json +11 -2
  58. package/eval/cases/report-push-list-google.scenario.json +11 -2
  59. package/eval/cases/reporting-vs-account-analytics-routing.scenario.json +4 -1
  60. package/eval/cases/setup-login-or-env.scenario.json +3 -1
  61. package/eval/cases/setup-siluzan-data-permission-env.scenario.json +3 -1
  62. package/eval/cases/skill-optimize-vs-google-ads-distinction.scenario.json +4 -1
  63. package/eval/cases/tiktok-bc-bind-inquiry.scenario.json +6 -2
  64. package/eval/cases/time-range-user-delegates-default.scenario.json +8 -1
  65. package/eval/cases/tips-json-filtering.scenario.json +3 -1
  66. package/eval/cases/tips-large-json-pagination.scenario.json +3 -1
  67. package/eval/cases/uj-ad-campaign-validate-before-create-stub.scenario.json +20 -0
  68. package/eval/cases/uj-ad-keywords-camping-tent-outdoor-plan.scenario.json +1 -1
  69. package/eval/cases/uj-ad-outdoor-campgear-search-plan.scenario.json +5 -3
  70. package/eval/cases/uj-analytics-30d-pdf-campaign-device-geo.scenario.json +18 -6
  71. package/eval/cases/uj-analytics-compare-google-tiktok-last-month-roi.scenario.json +8 -1
  72. package/eval/cases/uj-analytics-google-weekly-trends-campaigns-keywords.scenario.json +11 -2
  73. package/eval/cases/uj-analytics-report-push-weekly-email.scenario.json +3 -1
  74. package/eval/cases/uj-finance-invoice-records-this-month.scenario.json +11 -2
  75. package/eval/cases/uj-life-newbie-siluzan-google-end-to-end.scenario.json +4 -1
  76. package/eval/cases/uj-ops-google-accounts-list-normal.scenario.json +14 -2
  77. package/eval/cases/uj-ops-google-yesterday-spend-conversions.scenario.json +14 -2
  78. package/eval/cases/uj-ops-open-google-b2c-usd-shenzhen.scenario.json +4 -1
  79. package/eval/cases/uj-ops-pause-worst-adgroup-confirm.scenario.json +6 -2
  80. package/eval/cases/uj-ops-tiktok-leads-last-week.scenario.json +17 -3
  81. package/eval/cases/uj-patrol-cpc-spike-adgroups-over-15.scenario.json +9 -2
  82. package/eval/cases/uj-patrol-forewarning-create-daily-cap-3000.scenario.json +3 -1
  83. package/eval/cases/uj-patrol-forewarning-trigger-records.scenario.json +17 -3
  84. package/eval/cases/uj-patrol-google-balances-low.scenario.json +11 -2
  85. package/eval/cases/uj-roi-optimize-records-then-execute-cautiously.scenario.json +14 -3
  86. package/eval/cases/uj-roi-search-terms-add-negative-keywords.scenario.json +14 -2
  87. package/eval/stub-fixtures/rag-list.json +19 -0
  88. package/eval/stub-fixtures/rag-query.json +20 -0
  89. package/package.json +1 -1
@@ -64,23 +64,25 @@ mkdir -p ./snap-inquiry
64
64
  # 1) 账户清单(核 mediaCustomerId 与 advertiserName / currencyCode)
65
65
  siluzan-tso list-accounts -m Google -k <mediaCustomerId> --json-out ./snap-inquiry
66
66
 
67
- # 2) 区间维度(一次拿齐 Sheet 4/5/7/8 所需)
67
+ # 2) 区间维度(Sheet 5/7/8;系列为整段 S~E 汇总)
68
68
  siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-out ./snap-inquiry \
69
- --sections daily-metrics,campaigns,keywords,search-terms,campaign-geo,geographic \
69
+ --sections campaigns,keywords,search-terms,campaign-geo \
70
70
  --limit 200
71
71
 
72
- # 3) 按月循环(Sheet 6 必需:geographic 不返回日期字段)
72
+ # 3) 按月循环(Sheet 4 上区 + Sheet 4 下区 + Sheet 6)
73
73
  for month in <S月, S+1月, E月>:
74
74
  mkdir -p ./snap-inquiry/<YYYY-MM>
75
75
  siluzan-tso google-analysis -a <mediaCustomerId> \
76
76
  --start <月1号> --end <月末> --json-out ./snap-inquiry/<YYYY-MM> \
77
- --sections geographic
77
+ --sections campaigns,geographic
78
78
  ```
79
79
 
80
80
  **说明**:
81
81
 
82
- - `daily-metrics`:按日数据,脚本按月聚合得到 Sheet 4 上半区 3 行;金额、点击率、转化率字段已归一(见 `references/account-analytics.md` 顶部「指标字段对照」)。
83
- - `campaigns`:Sheet 5 主表,含 `biddingStrategyTypeV2`(策略)、`startDate`(开始日期)、`budgetAmount`(**分**,÷100 为元)。
82
+ - **禁止**用 `daily-metrics` Sheet 4 上区:该维度走 TSO 主平台 `account-daily-reports`,与 Google 前台 / Web 分析(`CampaignSectionData`)**不同数据源**,产品已确认存在不可接受偏差。
83
+ - **Sheet 4 上区(账户月汇总)**:读 `./<YYYY-MM>/campaigns-*.json`,对 `campaigns[]` **全系列求和**得到当月账户级点击/展示/费用/转化,再算 CTR/CPC/CPA/CVR(公式见下文 Sheet 4);与 Google「广告系列」页同区间加总口径一致。
84
+ - `./snap-inquiry/campaigns-<accountId>_<S>-<E>.json`(步骤 2,整段 S~E):仅用于 **Sheet 5** 系列明细;**不得**用它按月拆行填 Sheet 4。
85
+ - `geographic`:账户级国家聚合;Sheet 6 与 Sheet 4 **下区**(重点国切片)按月目录读取。
84
86
  - `keywords` / `search-terms`:Sheet 7 / 8;默认 `limit=200`(TOP200)。
85
87
  - `campaign-geo`:含 `campaignName`,用于 Sheet 6「暂停的系列」列辅助派生(若运营不需要可留空);也用于 Sheet 3 国家级消耗 join。
86
88
  - `geographic`:账户级国家聚合;Sheet 6 月度循环主源;Sheet 4 下半区「重点国家 vs 非重点国」按月切片(重点国默认取分析月询盘 Top1 国家,可由运营覆盖,详见下文 Sheet 4 节)。
@@ -91,6 +93,32 @@ for month in <S月, S+1月, E月>:
91
93
 
92
94
  **写脚本前先读 `<section>-<id>.outline.txt`**(几百字节 TS 类型字面量),别直接 `Read` 几 MB 的 JSON。
93
95
 
96
+ ### 落盘防覆盖(必读)
97
+
98
+ CLI 业务 JSON 默认名为 `<section>-<accountId>.json`。**带 `--start`/`--end` 的 range 维度**会自动追加区间后缀,例如:
99
+
100
+ `campaigns-3206866200_20260401-20260430.json`
101
+
102
+ 因此:
103
+
104
+ | 做法 | 结果 |
105
+ | --- | --- |
106
+ | 三个月都 `--json-out ./snap-inquiry` | **旧版会覆盖**;新版 CLI 同目录可共存 3 个 `campaigns-*_YYYYMM01-YYYYMM31.json` |
107
+ | 每月 `--json-out ./snap-inquiry/<YYYY-MM>` | 每月目录内仍是 `campaigns-<id>_<月首>-<月末>.json`,**推荐**(脚本按目录读最直观) |
108
+ | 步骤 2 整段 + 步骤 3 某月共用一个目录 | 文件名不同(整段 S~E vs 单月),**不会**互相覆盖 |
109
+
110
+ **脚本读数**(二选一,禁止写死无日期后缀的旧文件名):
111
+
112
+ ```text
113
+ # 推荐:按月子目录
114
+ ./snap-inquiry/<YYYY-MM>/campaigns-<accountId>_<月1号>-<月末>.json
115
+
116
+ # 或:同目录 glob(manifest.artifacts 会列出每个区间文件)
117
+ ./snap-inquiry/campaigns-<accountId>_*.json
118
+ ```
119
+
120
+ Sheet 5 整段系列明细读:`./snap-inquiry/campaigns-<accountId>_<S>-<E>.json`(S、E 为 3 个月起止,无连字符)。
121
+
94
122
  ---
95
123
 
96
124
  ## 询盘字段规范(宿主 Agent 解析输出)
@@ -157,26 +185,26 @@ for month in <S月, S+1月, E月>:
157
185
  每个 Sheet 的分析输出区(`数据质量提示` / `Agent 数据洞察` / `优化建议` / Sheet 1 议题区与会后补写区)一律遵守:
158
186
 
159
187
  1. **位置**:放在该 Sheet **全部数据区最末行**下方留空 1 行接续,**从 A 列起**;禁止落在数据行之间。
160
- 2. **最末行计算**:脚本需先算 `lastDataRow = MAX(各数据区的最末行号)`,再从 `lastDataRow + 2` 开始写分析输出区。
161
- - Sheet 3 含**左右两区**(左明细 A-F / 右 4 个透视 H-K):`lastDataRow = MAX(左区最末行, 右区第 4 个透视最末行)`。
162
- - Sheet 4 含**上下两区**(汇总 + 重点国切片):`lastDataRow = 下区最末行`。
163
- - Sheet 5 含**上区主表 + 下区优化建议**:优化建议本身就是分析输出区,位置规则与其它 Sheet 一致。
188
+ 2. **最末行计算**:脚本需先算 `lastDataRow = MAX(各数据区的最末行号)`,再从 `lastDataRow + 2` 开始写分析输出区。
189
+ - Sheet 3 含**左右两区**(左明细 A-F / 右 4 个透视 H-K):`lastDataRow = MAX(左区最末行, 右区第 4 个透视最末行)`。
190
+ - Sheet 4 含**上下两区**(汇总 + 重点国切片):`lastDataRow = 下区最末行`。
191
+ - Sheet 5 含**上区主表 + 下区优化建议**:优化建议本身就是分析输出区,位置规则与其它 Sheet 一致。
164
192
  - 其余 Sheet(2 / 6 / 7 / 8)单数据区:`lastDataRow = 主表最末行`。
165
193
  3. **跨列宽度**:分析输出区表格横跨 A 列至该 Sheet 主表的**最右占用列**(如 Sheet 3 横跨 A-K、Sheet 4 横跨 A-L),便于运营在最末位置一眼读完。
166
194
  4. **禁止**为对齐美观而**人工指定固定行号**(如"R30 起写洞察"):行号必须由脚本动态算,否则数据条数变化时会插入数据中间。
167
195
 
168
196
  ### Sheet 顺序
169
197
 
170
- | 顺序 | Sheet 名 | 主源 |
171
- | ---: | --- | --- |
172
- | 1 | `会议讨论议题` | Agent 从 Sheet 2~8 提炼议题(不拉数);**含「会后补写区」由运营会后手填决策** |
173
- | 2 | `询盘明细---<S月>-<E月>月份` | `inquiries.json` |
174
- | 3 | `询盘分析-最近3个月` | `inquiries.json` + `campaign-geo-*.json` |
175
- | 4 | `账号分析-最近3个月` | `daily-metrics-*.json`(按月聚合)+ `geographic-*.json` × 3 月 |
176
- | 5 | `广告系列消费明细` | `campaigns-*.json` |
177
- | 6 | `国家消费明细<S月>-<E月>月份` | `./<YYYY-MM>/geographic-*.json` × 3 + `inquiries.json` 左 join |
178
- | 7 | `关键词` | `keywords-*.json` |
179
- | 8 | `搜索字词` | `search-terms-*.json` |
198
+ | 顺序 | Sheet 名 | 主源 |
199
+ | ---: | ----------------------------- | ----------------------------------------------------------------------------- |
200
+ | 1 | `会议讨论议题` | Agent 从 Sheet 2~8 提炼议题(不拉数);**含「会后补写区」由运营会后手填决策** |
201
+ | 2 | `询盘明细---<S月>-<E月>月份` | `inquiries.json` |
202
+ | 3 | `询盘分析-最近3个月` | `inquiries.json` + `campaign-geo-*.json` |
203
+ | 4 | `账号分析-最近3个月` | `./<YYYY-MM>/campaigns-*.json`(上区,系列加总)+ `./<YYYY-MM>/geographic-*.json`(下区)× 3 月 |
204
+ | 5 | `广告系列消费明细` | `./snap-inquiry/campaigns-<accountId>_<S>-<E>.json`(整段 3 月) |
205
+ | 6 | `国家消费明细<S月>-<E月>月份` | `./<YYYY-MM>/geographic-*.json` × 3 + `inquiries.json` 左 join |
206
+ | 7 | `关键词` | `keywords-*.json` |
207
+ | 8 | `搜索字词` | `search-terms-*.json` |
180
208
 
181
209
  ---
182
210
 
@@ -186,21 +214,22 @@ for month in <S月, S+1月, E月>:
186
214
  >
187
215
  > **口吻硬约束**:议题区**只用**「建议讨论…」「是否…」「Top X 是…,是否…」等开放语气,**禁止**出现「已暂停」「已新增」「决定切换」这类决策口吻;禁止编造未在数据中出现的国家/产品/渠道。
188
216
 
189
- | 行 | 内容 |
190
- | --- | --- |
191
- | R1 | 一句话数据要点(Agent 基于本期 Sheet 2~8 的核心发现概括,例:`本期 3 个月共 {N} 条询盘,{E月} CPL ¥{x}(环比 {±%}),消耗 Top3 国家:{A/B/C},询盘 Top3 国家:{X/Y/Z}。`) |
192
- | R2 | `议题分类` \| `数据要点(引用具体数字)` \| `候选讨论选项` \| `数据来源` |
193
- | R3+ | 议题列表(**Agent 基于其他 7 个 Sheet 数据撰写,每条都要带具体数字**),4 大类,每类视数据出 1~3 条: |
194
- | | ① **国家投放议题**:列出 (a) 消耗 Top + 询盘 Top (b) 高消耗 0 询盘国家 (c) 有询盘但消耗 ≈ 0 的国家;候选选项写「建议讨论:暂停 / 持平 / 加大」三选;数据来源标 `Sheet 3 / Sheet 6` |
195
- | | ② **产品策略议题**:基于 Sheet 3 产品透视 + Sheet 5 系列;指出 CPL 显著高/低的产品系列;候选选项写「建议讨论:调匹配类型 / 切 Pmax / 暂停」;数据来源标 `Sheet 3 / Sheet 5` |
196
- | | ③ **渠道与数据采集议题**:基于 Sheet 3 客户来源透视,列出占比 Top1/Top2 渠道;若多渠道字面无法区分(如 `AI Search` / `Info邮箱`),议题写「建议讨论:是否加追踪参数」;数据来源标 `Sheet 3` |
197
- | | ④ **预算与节奏议题**:基于 Sheet 4 上区月趋势(CPL / CVR / 消耗环比)+ Sheet 5 系列消耗占比,列出预算保持/上调/下调 3 个候选方向,每个方向给出对应的「触发数据」;数据来源标 `Sheet 4 / Sheet 5` |
198
- | 空 1 行 | — |
199
- | 标题 | `会后补写区 · 由运营会议结束后手填` |
200
- | 表头 | `#` \| `决策内容` \| `负责人` \| `截止日期` \| `所属议题(R3+ 行号)` |
201
- | R… | **留 5~8 空行,Agent 不填**;运营开完会按议题手工补写 |
217
+ | 行 | 内容 |
218
+ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
219
+ | R1 | 一句话数据要点(Agent 基于本期 Sheet 2~8 的核心发现概括,例:`本期 3 个月共 {N} 条询盘,{E月} CPL ¥{x}(环比 {±%}),消耗 Top3 国家:{A/B/C},询盘 Top3 国家:{X/Y/Z}。`) |
220
+ | R2 | `议题分类` \| `数据要点(引用具体数字)` \| `候选讨论选项` \| `数据来源` |
221
+ | R3+ | 议题列表(**Agent 基于其他 7 个 Sheet 数据撰写,每条都要带具体数字**),4 大类,每类视数据出 1~3 条: |
222
+ | | ① **国家投放议题**:列出 (a) 消耗 Top + 询盘 Top (b) 高消耗 0 询盘国家 (c) 有询盘但消耗 ≈ 0 的国家;候选选项写「建议讨论:暂停 / 持平 / 加大」三选;数据来源标 `Sheet 3 / Sheet 6` |
223
+ | | ② **产品策略议题**:基于 Sheet 3 产品透视 + Sheet 5 系列;指出 CPL 显著高/低的产品系列;候选选项写「建议讨论:调匹配类型 / 切 Pmax / 暂停」;数据来源标 `Sheet 3 / Sheet 5` |
224
+ | | ③ **渠道与数据采集议题**:基于 Sheet 3 客户来源透视,列出占比 Top1/Top2 渠道;若多渠道字面无法区分(如 `AI Search` / `Info邮箱`),议题写「建议讨论:是否加追踪参数」;数据来源标 `Sheet 3` |
225
+ | | ④ **预算与节奏议题**:基于 Sheet 4 上区月趋势(CPL / CVR / 消耗环比)+ Sheet 5 系列消耗占比,列出预算保持/上调/下调 3 个候选方向,每个方向给出对应的「触发数据」;数据来源标 `Sheet 4 / Sheet 5` |
226
+ | 空 1 行 | — |
227
+ | 标题 | `会后补写区 · 由运营会议结束后手填` |
228
+ | 表头 | `#` \| `决策内容` \| `负责人` \| `截止日期` \| `所属议题(R3+ 行号)` |
229
+ | R… | **留 5~8 空行,Agent 不填**;运营开完会按议题手工补写 |
202
230
 
203
231
  **禁造数硬规范**:
232
+
204
233
  - 议题区每条结论必须能在其他 Sheet 里找到具体数据来源行(标注 Sheet 号),否则不写。
205
234
  - **禁止**写「玻利维亚消耗高已暂停」这类肯定句;只能写「玻利维亚消耗 ¥XXX、0 询盘,建议讨论是否暂停」。
206
235
  - 「会后补写区」**保持空白**,等运营手填;Agent **不**预填决策。
@@ -209,22 +238,22 @@ for month in <S月, S+1月, E月>:
209
238
 
210
239
  ### Sheet 2 `询盘明细---<S月>-<E月>月份`
211
240
 
212
- | 行 | 内容 |
213
- | --- | --- |
214
- | R1(A→G) | `月份` \| `序号` \| `国家` \| `时间` \| `产品` \| `客户来源` \| `IP` |
215
- | R2… | 来自 `inquiries.json` 逐行;`seq` 缺失时用 1..N 递增;`time` 写 `YYYY-MM-DD`;`ip` 缺失留空 |
241
+ | 行 | 内容 |
242
+ | --------- | ------------------------------------------------------------------------------------------- |
243
+ | R1(A→G) | `月份` \| `序号` \| `国家` \| `时间` \| `产品` \| `客户来源` \| `IP` |
244
+ | R2… | 来自 `inquiries.json` 逐行;`seq` 缺失时用 1..N 递增;`time` 写 `YYYY-MM-DD`;`ip` 缺失留空 |
216
245
 
217
246
  按 `month` + `seq` 升序。**不**对询盘做去重 / 校验。
218
247
 
219
248
  **`数据质量提示`**(**位置**:主表最末数据行下方空 1 行接续,**A 列起**;Agent 基于本表数据自动生成,**禁止**编造;纯观察、不带建议口吻):
220
249
 
221
- | # | 观察 | 数据依据 |
222
- | --- | --- | --- |
223
- | 1 | 询盘总量与月分布 | 3 个月共 `{N}` 条;分月:S月 `{n1}` / 中月 `{n2}` / E月 `{n3}` |
224
- | 2 | 字段缺失率(IP / 产品 / 客户来源) | `IP` 缺失 `{x}%`、`产品` 缺失 `{y}%`、`客户来源` 缺失 `{z}%`(任一字段缺失率 > 30% 时高亮) |
225
- | 3 | 重复 IP(同 IP 出现 ≥ 2 条询盘) | `{m}` 条,涉及 `{k}` 个 IP(列出 Top3) |
226
- | 4 | 国家集中度 | Top1 国家 `{country}` 占 `{p1}%`、Top3 合计 `{p3}%`(> 60% 时高亮"高度集中") |
227
- | 5 | 询盘时间分布异常 | 若存在单日 ≥ 5 条询盘的"尖峰日",列日期与条数;否则填 `—` |
250
+ | # | 观察 | 数据依据 |
251
+ | --- | ---------------------------------- | ------------------------------------------------------------------------------------------- |
252
+ | 1 | 询盘总量与月分布 | 3 个月共 `{N}` 条;分月:S月 `{n1}` / 中月 `{n2}` / E月 `{n3}` |
253
+ | 2 | 字段缺失率(IP / 产品 / 客户来源) | `IP` 缺失 `{x}%`、`产品` 缺失 `{y}%`、`客户来源` 缺失 `{z}%`(任一字段缺失率 > 30% 时高亮) |
254
+ | 3 | 重复 IP(同 IP 出现 ≥ 2 条询盘) | `{m}` 条,涉及 `{k}` 个 IP(列出 Top3) |
255
+ | 4 | 国家集中度 | Top1 国家 `{country}` 占 `{p1}%`、Top3 合计 `{p3}%`(> 60% 时高亮"高度集中") |
256
+ | 5 | 询盘时间分布异常 | 若存在单日 ≥ 5 条询盘的"尖峰日",列日期与条数;否则填 `—` |
228
257
 
229
258
  **口径硬约束**:所有 `{...}` 占位符**必须**替换为本期真实数字;某项若数据不足则填 `—`,**禁止**写"约""大概"等模糊词。
230
259
 
@@ -257,14 +286,14 @@ for month in <S月, S+1月, E月>:
257
286
 
258
287
  > **写表脚本必做**:先算 `lastRow = max(左区最末数据行号, 右区最末透视行号)`,再从 `lastRow + 2` 开始写洞察标题与表格。**禁止**直接接在右区透视下方(会落在左区明细中间)。
259
288
 
260
- | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
261
- | --- | --- | --- |
262
- | 1 | **高消耗 0 询盘国家**(透视 1 交叉) | 列出消耗 > `{阈值}` 但询盘 = 0 的国家清单(按消耗降序,最多 5 个);阈值取本期国家消耗中位数 |
263
- | 2 | **0 消耗有询盘国家**(透视 1 交叉,可能是自然流量/远端品牌词) | 列出消耗 ≈ 0(< `¥10`)但询盘 ≥ 1 的国家(按询盘降序,最多 5 个) |
264
- | 3 | **客户来源集中度**(透视 2) | Top1 渠道占 `{p1}%`、Top3 合计 `{p3}%`;> 70% 高亮"渠道高度集中,风险敞口大" |
265
- | 4 | **长尾渠道**(透视 2) | 占比 < 5% 的渠道数量与合计占比;用于会议讨论"是否归并/精简" |
266
- | 5 | **产品 CPL 偏差**(透视 3,仅当产品→系列映射已配置) | 列出 CPL > 整体均值 × 1.5 的产品(拖累),CPL < 整体均值 × 0.5 的产品(明星) |
267
- | 6 | **大洲映射缺漏** | 透视 1 中"所属大洲 = 未知大洲"的国家清单(提示运营回流 `geo-continents.json`) |
289
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
290
+ | --- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
291
+ | 1 | **高消耗 0 询盘国家**(透视 1 交叉) | 列出消耗 > `{阈值}` 但询盘 = 0 的国家清单(按消耗降序,最多 5 个);阈值取本期国家消耗中位数 |
292
+ | 2 | **0 消耗有询盘国家**(透视 1 交叉,可能是自然流量/远端品牌词) | 列出消耗 ≈ 0(< `¥10`)但询盘 ≥ 1 的国家(按询盘降序,最多 5 个) |
293
+ | 3 | **客户来源集中度**(透视 2) | Top1 渠道占 `{p1}%`、Top3 合计 `{p3}%`;> 70% 高亮"渠道高度集中,风险敞口大" |
294
+ | 4 | **长尾渠道**(透视 2) | 占比 < 5% 的渠道数量与合计占比;用于会议讨论"是否归并/精简" |
295
+ | 5 | **产品 CPL 偏差**(透视 3,仅当产品→系列映射已配置) | 列出 CPL > 整体均值 × 1.5 的产品(拖累),CPL < 整体均值 × 0.5 的产品(明星) |
296
+ | 6 | **大洲映射缺漏** | 透视 1 中"所属大洲 = 未知大洲"的国家清单(提示运营回流 `geo-continents.json`) |
268
297
 
269
298
  **条数**:上表 6 条为**完整模板**;若某条数据为空(如未配置产品映射、无大洲缺漏),可省略该行,但其余必出。
270
299
 
@@ -274,33 +303,62 @@ for month in <S月, S+1月, E月>:
274
303
 
275
304
  上下两区。
276
305
 
277
- **上区**(B→L,跳过 A 列保持与运营样表一致)3 行月汇总:
306
+ #### 上区口径:系列维度加总(对齐 Google)
278
307
 
279
- | R | 内容 |
308
+ | | 约定 |
280
309
  | --- | --- |
281
- | R1 | (A 列空)`汇总` |
282
- | R2 | `时间` \| `点击次数` \| `展示次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` \| `询盘个数` \| `CPL` |
283
- | R3..R5 | 倒序写 3 个月(**E 月在上**,S 月在下):脚本读 `daily-metrics-*.json` 按月(`date` 7 位 `YYYY-MM`)求和;`点击率` = sum(clicks)/sum(impressions);`转化率` = sum(conversions)/sum(clicks);`每次转化费用` = sum(spend)/sum(conversions),转化 0 填 `—`;`询盘个数` = `inquiries.json` 按月 count;`CPL` = sum(spend)/`询盘个数`(询盘 0 填 `—`) |
310
+ | 数据源 | `./snap-inquiry/<YYYY-MM>/campaigns-<accountId>_<月1号>-<月末>.json`(每月单独拉 `campaigns`;见「落盘防覆盖」) |
311
+ | 聚合范围 | 该月内 **全部** `campaigns[]` 行(含已暂停但在区间内有消耗的系列;**禁止**只取 Top N 或手工筛系列) |
312
+ | Google 对齐 | 网关 `CampaignSectionData` Web「账户分析 / 广告系列」同源;账户月表 = 各系列在当月起止日内指标之和 |
313
+ | 禁止 | `daily-metrics` / `stats` / `overview` 填上区投放列(询盘列仍来自 `inquiries.json`) |
314
+
315
+ **脚本聚合(每月一份 `campaigns-*.json`)**:
316
+
317
+ ```text
318
+ rows = payload.campaigns ?? []
319
+ spend = Σ rows[].spend
320
+ clicks = Σ rows[].clicks
321
+ impressions = Σ rows[].impressions
322
+ conversions = Σ rows[].conversions
323
+ 点击率 = impressions > 0 ? clicks / impressions : —
324
+ 平均每次点击费用 = clicks > 0 ? spend / clicks : —
325
+ 每次转化费用 = conversions > 0 ? spend / conversions : —
326
+ 转化率 = clicks > 0 ? conversions / clicks : — # 与样表一致:转化÷点击,非÷展示
327
+ 询盘个数 = inquiries.json 该月 count
328
+ CPL = 询盘个数 > 0 ? spend / 询盘个数 : —
329
+ ```
330
+
331
+ `时间` 列写 `YYYY-MM` 或 `YYYY年M月`(与样表一致即可)。金额列用 `list-accounts` 的 `currencyCode`。
332
+
333
+ **可选校验(不写入 Excel,仅日志)**:同月再拉 `overview`,对比 `currentPeriod.spend` 与系列 `spend` 之和;偏差 >1% 时在 Agent 交付说明中脚注差异,**仍以系列加总为准**。
334
+
335
+ **上区**(B→L,跳过 A 列保持与运营样表一致)3 行月汇总:
336
+
337
+ | R | 内容 |
338
+ | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
339
+ | R1 | (A 列空)`汇总` |
340
+ | R2 | `时间` \| `点击次数` \| `展示次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` \| `询盘个数` \| `CPL` |
341
+ | R3..R5 | 倒序写 3 个月(**E 月在上**,S 月在下):脚本读 `./<YYYY-MM>/campaigns-*.json` 按上表对 `campaigns[]` 全量求和;`询盘个数` = `inquiries.json` 按月 count;`CPL` = `费用 / 询盘个数`(询盘 0 填 `—`) |
284
342
 
285
343
  **下区**(B→G)3 月 × **重点国家 / 非重点国** 切片(共 6 行):
286
344
 
287
345
  > **重点国家口径**(`focusCountries`):见下方「重点国家配置」节,**禁止**在模板里写死任何国家名。
288
346
 
289
- | R | 内容 |
290
- | --- | --- |
291
- | R7 | `时间` \| `国家` \| `消费` \| `线索数` \| `成本` \| `备注`|
347
+ | R | 内容 |
348
+ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
349
+ | R7 | `时间` \| `国家` \| `消费` \| `线索数` \| `成本` \| `备注` |
292
350
  | R8..R13 | 每月一对(`<focusLabel>` / `非<focusLabel>`,其中 `focusLabel` = `focusCountries.join("+")`):脚本读 `./<YYYY-MM>/geographic-*.json`,**按 `countryNameZh` 字段判桶**(CLI 已自动归并 city → country;未命中时回落 `countryOrRegionZh`):`focusCountries.includes(countryNameZh)`;`消费` = 该桶 `spend` 求和;`线索数` = `inquiries.json` 同月同桶(按 `country` 字段匹配 `focusCountries`) count;`成本` = `消费 / 线索数`,线索 0 填 `—` |
293
351
 
294
352
  **`Agent 数据洞察`**(**位置**:下区(重点国切片)最末行下方留空 1 行接续,**A 列起**;Agent 基于本 Sheet 上 + 下区数据自动生成,**禁止**编造;每条**必带**具体数字):
295
353
 
296
- | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
297
- | --- | --- | --- |
298
- | 1 | **CPL 月环比**(上区) | E月 CPL `¥{x_E}` vs 中月 `¥{x_M}` vs S月 `¥{x_S}`;E月环比 `{±%}`;幅度 \|`> 30%`\| 高亮"显著波动" |
299
- | 2 | **CTR / CVR 月环比**(上区) | CTR:`{ctr_E}` / `{ctr_M}` / `{ctr_S}`(趋势 ↑↓→);CVR:`{cvr_E}` / `{cvr_M}` / `{cvr_S}`(趋势 ↑↓→) |
300
- | 3 | **消耗与询盘相关性**(上区) | 列出 3 个月 `费用` 与 `询盘个数` 的同向 / 反向关系(如"消耗 ↓ 但询盘 ↑"提示效率提升) |
301
- | 4 | **重点国 vs 非重点国成本差额**(下区) | E月:重点国 CPL `¥{a}` vs 非重点国 `¥{b}`,差额 `{|a-b|}`;若重点国 CPL < 非重点国 CPL × 0.5 高亮"重点国成本显著低于其他市场" |
302
- | 5 | **重点国线索贡献占比**(下区) | E月重点国线索 `{n}` 条,占总量 `{p}%`;3 个月平均占比 `{avg_p}%`;< 20% 提示"重点国线索贡献低,考虑扩展其他市场" |
303
- | 6 | **重点国趋势**(下区,3 月对比) | 重点国线索数 / 消耗 / CPL 三个月趋势(如"重点国 CPL 连续 3 月下降"或"消耗稳定线索下降") |
354
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
355
+ | --- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | --- | ---------------------------------------------------------------------- |
356
+ | 1 | **CPL 月环比**(上区) | E月 CPL `¥{x_E}` vs 中月 `¥{x_M}` vs S月 `¥{x_S}`;E月环比 `{±%}`;幅度 \|`> 30%`\| 高亮"显著波动" |
357
+ | 2 | **CTR / CVR 月环比**(上区) | CTR:`{ctr_E}` / `{ctr_M}` / `{ctr_S}`(趋势 ↑↓→);CVR:`{cvr_E}` / `{cvr_M}` / `{cvr_S}`(趋势 ↑↓→) |
358
+ | 3 | **消耗与询盘相关性**(上区) | 列出 3 个月 `费用` 与 `询盘个数` 的同向 / 反向关系(如"消耗 ↓ 但询盘 ↑"提示效率提升) |
359
+ | 4 | **重点国 vs 非重点国成本差额**(下区) | E月:重点国 CPL `¥{a}` vs 非重点国 `¥{b}`,差额 `{ | a-b | }`;若重点国 CPL < 非重点国 CPL × 0.5 高亮"重点国成本显著低于其他市场" |
360
+ | 5 | **重点国线索贡献占比**(下区) | E月重点国线索 `{n}` 条,占总量 `{p}%`;3 个月平均占比 `{avg_p}%`;< 20% 提示"重点国线索贡献低,考虑扩展其他市场" |
361
+ | 6 | **重点国趋势**(下区,3 月对比) | 重点国线索数 / 消耗 / CPL 三个月趋势(如"重点国 CPL 连续 3 月下降"或"消耗稳定线索下降") |
304
362
 
305
363
  **条数**:6 条为完整模板;若 `focusCountries = []`(本期无询盘),仅出第 1~3 条上区洞察,下区 3 条标 `[ 本期无重点国,省略下区洞察 ]`。
306
364
 
@@ -310,30 +368,30 @@ for month in <S月, S+1月, E月>:
310
368
 
311
369
  **上区**:
312
370
 
313
- | R | 内容 |
314
- | --- | --- |
315
- | R1 | `广告系列表现明细 · 账户 <mediaCustomerId(带连字符)> · <分析月份>` |
316
- | R2(A→M,13 列) | `系列名称` \| `系列ID` \| `策略` \| `开始日期` \| `消耗 (¥)` \| `展示` \| `点击` \| `CTR` \| `平均CPC` \| `转化` \| `CPA (¥)` \| `转化率` \| `消耗占比` |
317
- | R3… | 读 `campaigns-*.json`:`campaignName` / `campaignId` / `biddingStrategyTypeV2`(中文化:`MAXIMIZE_CONVERSIONS` → `Max转化`、`TARGET_SPEND` → `目标支出`、`MANUAL_CPC` → `手动CPC` 等;未命中保留原文)/ `startDate` / `spend` / `impressions` / `clicks` / `ctr` / `averageCpc` / `conversions` / `costPerConversion` / `conversionRate` / **`消耗占比` = `spend` / `sum(spend)`**(脚本算,写 0~1 小数) |
318
- | 末行 | `合计`:A 列写 `合计`;金额、展示、点击、转化 求和;CTR/CVR/CPA 按合计反推(**禁止**对各行比率求平均) |
371
+ | R | 内容 |
372
+ | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
373
+ | R1 | `广告系列表现明细 · 账户 <mediaCustomerId(带连字符)> · <数据开始月>-<数据结束月>` |
374
+ | R2(A→M,13 列) | `系列名称` \| `系列ID` \| `策略` \| `开始日期` \| `消耗 (¥)` \| `展示` \| `点击` \| `CTR` \| `平均CPC` \| `转化` \| `CPA (¥)` \| `转化率` \| `消耗占比` |
375
+ | R3… | 读 `campaigns-*.json`:`campaignName` / `campaignId` / `biddingStrategyTypeV2`(中文化:`MAXIMIZE_CONVERSIONS` → `Max转化`、`TARGET_SPEND` → `目标支出`、`MANUAL_CPC` → `手动CPC` 等;未命中保留原文)/ `startDate` / `spend` / `impressions` / `clicks` / `ctr` / `averageCpc` / `conversions` / `costPerConversion` / `conversionRate` / **`消耗占比` = `spend` / `sum(spend)`**(脚本算,写 0~1 小数) |
376
+ | 末行 | `合计`:A 列写 `合计`;金额、展示、点击、转化 求和;CTR/CVR/CPA 按合计反推(**禁止**对各行比率求平均) |
319
377
 
320
378
  **下区**:
321
379
 
322
- | R | 内容 |
323
- | --- | --- |
324
- | 空 1 行 | — |
325
- | 标题 | `优化建议 · 账户 <id> · <分析月份>` |
326
- | 表头(A→H) | `#` \| `问题/机会类别` \| `现状描述` \| `影响分析` \| `具体优化建议` \| `(留空)` \| `(留空)` \| `优先级` |
327
- | 数据 | Agent 基于本期 Sheet 4/5/6/7/8 撰写 5~8 条建议;每条引用具体数字(如 `CPA ¥287,远高于均值 ¥111`);`优先级` 取 `高` / `中` / `低`;**禁止**在建议里包含模板占位符或硬编码示例数字 |
380
+ | R | 内容 |
381
+ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
382
+ | 空 1 行 | — |
383
+ | 标题 | `优化建议 · 账户 <id> · <分析月份>` |
384
+ | 表头(A→H) | `#` \| `问题/机会类别` \| `现状描述` \| `影响分析` \| `具体优化建议` \| `(留空)` \| `(留空)` \| `优先级` |
385
+ | 数据 | Agent 基于本期 Sheet 4/5/6/7/8 撰写 5~8 条建议;每条引用具体数字(如 `CPA ¥287,远高于均值 ¥111`);`优先级` 取 `高` / `中` / `低`;**禁止**在建议里包含模板占位符或硬编码示例数字 |
328
386
 
329
387
  ---
330
388
 
331
389
  ### Sheet 6 `国家消费明细<S月>-<E月>月份`
332
390
 
333
- | R | 内容 |
334
- | --- | --- |
335
- | R1(A→N,14 列) | `月份(Excel 序列号)` \| `国家/地区(匹配)` \| `点击次数` \| `展示次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` \| `询盘个数` \| `(留空)` \| `(留空)` \| `暂停的系列` |
336
- | R2… | 笛卡尔积:`3 个月 × N 个国家`;脚本循环读 `./<YYYY-MM>/geographic-*.json`,每行**按 `countryNameZh` 聚合**(自动把 `Mumbai / Karachi / London` 等 city / region 行归并到所属国家;未命中归并字典回落 `countryOrRegionZh`)+ 该月该国家的指标;`询盘个数` = `inquiries.json` 同月同国家 count(左 join,缺失为 0);`暂停的系列` 留空给运营手填(不要编造) |
391
+ | R | 内容 |
392
+ | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
393
+ | R1(A→N,14 列) | `月份(Excel 序列号)` \| `国家/地区(匹配)` \| `点击次数` \| `展示次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` \| `询盘个数` \| `(留空)` \| `(留空)` \| `暂停的系列` |
394
+ | R2… | 笛卡尔积:`3 个月 × N 个国家`;脚本循环读 `./<YYYY-MM>/geographic-*.json`,每行**按 `countryNameZh` 聚合**(自动把 `Mumbai / Karachi / London` 等 city / region 行归并到所属国家;未命中归并字典回落 `countryOrRegionZh`)+ 该月该国家的指标;`询盘个数` = `inquiries.json` 同月同国家 count(左 join,缺失为 0);`暂停的系列` 留空给运营手填(不要编造) |
337
395
 
338
396
  排序:按月份升序(与运营样表"45931 / 45962 / 45992 / 46023"顺序一致——分别对应 2025-10 ~ 2026-01 起算的 Excel 日期序列号);同月内按 `点击次数` 降序。
339
397
 
@@ -341,14 +399,14 @@ for month in <S月, S+1月, E月>:
341
399
 
342
400
  **`Agent 数据洞察`**(**位置**:笛卡尔积主表最末数据行下方留空 1 行接续,**A 列起**;Agent 基于本 Sheet 数据自动生成,**禁止**编造):
343
401
 
344
- | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
345
- | --- | --- | --- |
346
- | 1 | **国家月趋势 · 连续下降** | 列出 `费用` 连续 3 个月下降的国家(S → 中 → E 单调递减),按 E月消耗降序前 5 |
347
- | 2 | **国家月趋势 · 连续上升** | 列出 `费用` 连续 3 个月上升的国家(S → 中 → E 单调递增),按 E月消耗降序前 5 |
348
- | 3 | **新进入国家**(E 月有消耗,S 月消耗 = 0) | 列国家、E 月消耗、E 月询盘;提示"本期新铺量国家" |
349
- | 4 | **退出国家**(S 月有消耗,E 月消耗 = 0) | 列国家、S 月消耗、3 月累计询盘;提示"本期已停投国家,可与暂停系列对照" |
350
- | 5 | **高消耗 0 询盘国家**(与 Sheet 3 透视 1 交叉验证) | 列 3 月累计 `费用` Top10 中 3 月累计 `询盘个数` = 0 的国家 |
351
- | 6 | **CPA 异常国家** | 列 3 月平均 `每次转化费用` > 整体平均 × 2 的国家(且转化数 ≥ 3,排除小样本噪声) |
402
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
403
+ | --- | --------------------------------------------------- | -------------------------------------------------------------------------------- |
404
+ | 1 | **国家月趋势 · 连续下降** | 列出 `费用` 连续 3 个月下降的国家(S → 中 → E 单调递减),按 E月消耗降序前 5 |
405
+ | 2 | **国家月趋势 · 连续上升** | 列出 `费用` 连续 3 个月上升的国家(S → 中 → E 单调递增),按 E月消耗降序前 5 |
406
+ | 3 | **新进入国家**(E 月有消耗,S 月消耗 = 0) | 列国家、E 月消耗、E 月询盘;提示"本期新铺量国家" |
407
+ | 4 | **退出国家**(S 月有消耗,E 月消耗 = 0) | 列国家、S 月消耗、3 月累计询盘;提示"本期已停投国家,可与暂停系列对照" |
408
+ | 5 | **高消耗 0 询盘国家**(与 Sheet 3 透视 1 交叉验证) | 列 3 月累计 `费用` Top10 中 3 月累计 `询盘个数` = 0 的国家 |
409
+ | 6 | **CPA 异常国家** | 列 3 月平均 `每次转化费用` > 整体平均 × 2 的国家(且转化数 ≥ 3,排除小样本噪声) |
352
410
 
353
411
  **条数**:6 条为完整模板;某类无数据时该行填 `[ 无 ]`,**禁止**省略(保持出表完整)。
354
412
 
@@ -356,24 +414,24 @@ for month in <S月, S+1月, E月>:
356
414
 
357
415
  ### Sheet 7 `关键词`
358
416
 
359
- | R | 内容 |
360
- | --- | --- |
361
- | R1 | `关键词表现 · 账户 <id> · <分析月份>` |
362
- | R2(A→J,10 列) | `关键词` \| `匹配方式` \| `系列` \| `消耗 (¥)` \| `展示` \| `点击` \| `CTR` \| `平均CPC` \| `转化` \| `CPA (¥)` |
363
- | R3… | 读 `keywords-*.json`(`keywords[]`):`keyword` / `keywordMatchTypeZh`(中文匹配方式:`Broad` / `Phrase` / `Exact`)/ `campaignName` / `spend` / `impressions` / `clicks` / `ctr` / `averageCpc` / `conversions` / `costPerConversion` |
417
+ | R | 内容 |
418
+ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
419
+ | R1 | `关键词表现 · 账户 <id> · <分析月份>` |
420
+ | R2(A→J,10 列) | `关键词` \| `匹配方式` \| `系列` \| `消耗 (¥)` \| `展示` \| `点击` \| `CTR` \| `平均CPC` \| `转化` \| `CPA (¥)` |
421
+ | R3… | 读 `keywords-*.json`(`keywords[]`):`keyword` / `keywordMatchTypeZh`(中文匹配方式:`Broad` / `Phrase` / `Exact`)/ `campaignName` / `spend` / `impressions` / `clicks` / `ctr` / `averageCpc` / `conversions` / `costPerConversion` |
364
422
 
365
423
  按 `转化` 降序、`消耗` 降序双排序。
366
424
 
367
425
  **`Agent 数据洞察`**(**位置**:关键词主表最末数据行下方留空 1 行接续,**A 列起**;Agent 基于本 Sheet 数据自动生成,**禁止**编造):
368
426
 
369
- | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
370
- | --- | --- | --- |
371
- | 1 | **匹配方式占比** | `Broad`:`{n_b}` 个、占消耗 `{p_b}%`;`Phrase`:`{n_p}` 个、占消耗 `{p_p}%`;`Exact`:`{n_e}` 个、占消耗 `{p_e}%`;Broad 消耗占比 > 70% 高亮"过度依赖广泛匹配" |
372
- | 2 | **高消耗 0 转化关键词**(精准止损候选) | 列 `消耗` Top20 中 `转化` = 0 的关键词,按消耗降序前 5;每条标 `关键词` + `匹配方式` + `消耗` |
373
- | 3 | **CPA 异常关键词**(拖累候选) | 列 `CPA` > 整体平均 × 2 且 `转化` ≥ 2 的关键词,前 5;每条标 `关键词` + `CPA` + `转化数` |
374
- | 4 | **明星关键词**(性价比候选) | 列 `CPA` < 整体平均 × 0.5 且 `转化` ≥ 3 的关键词,前 5;每条标 `关键词` + `CPA` + `转化数` |
375
- | 5 | **单关键词消耗集中度** | Top3 关键词合计消耗占比 `{p3}%`;> 50% 高亮"消耗高度集中于少数关键词,风险敞口大" |
376
- | 6 | **跨系列关键词重复** | 同一 `关键词` + `匹配方式` 出现在 ≥ 2 个 `系列` 中的条目数;提示"内部互抢候选" |
427
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
428
+ | --- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
429
+ | 1 | **匹配方式占比** | `Broad`:`{n_b}` 个、占消耗 `{p_b}%`;`Phrase`:`{n_p}` 个、占消耗 `{p_p}%`;`Exact`:`{n_e}` 个、占消耗 `{p_e}%`;Broad 消耗占比 > 70% 高亮"过度依赖广泛匹配" |
430
+ | 2 | **高消耗 0 转化关键词**(精准止损候选) | 列 `消耗` Top20 中 `转化` = 0 的关键词,按消耗降序前 5;每条标 `关键词` + `匹配方式` + `消耗` |
431
+ | 3 | **CPA 异常关键词**(拖累候选) | 列 `CPA` > 整体平均 × 2 且 `转化` ≥ 2 的关键词,前 5;每条标 `关键词` + `CPA` + `转化数` |
432
+ | 4 | **明星关键词**(性价比候选) | 列 `CPA` < 整体平均 × 0.5 且 `转化` ≥ 3 的关键词,前 5;每条标 `关键词` + `CPA` + `转化数` |
433
+ | 5 | **单关键词消耗集中度** | Top3 关键词合计消耗占比 `{p3}%`;> 50% 高亮"消耗高度集中于少数关键词,风险敞口大" |
434
+ | 6 | **跨系列关键词重复** | 同一 `关键词` + `匹配方式` 出现在 ≥ 2 个 `系列` 中的条目数;提示"内部互抢候选" |
377
435
 
378
436
  **条数**:6 条为完整模板;某类无数据时该行填 `[ 无 ]`。
379
437
 
@@ -381,12 +439,12 @@ for month in <S月, S+1月, E月>:
381
439
 
382
440
  ### Sheet 8 `搜索字词`
383
441
 
384
- | R | 内容 |
385
- | --- | --- |
386
- | R1 | `搜索字词--TOP100` |
387
- | R2 | `<S> - <E>`(如 `2026年4月1日 - 2026年4月30日` 等中文区间) |
442
+ | R | 内容 |
443
+ | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
444
+ | R1 | `搜索字词--TOP100` |
445
+ | R2 | `<S> - <E>`(如 `2026年4月1日 - 2026年4月30日` 等中文区间) |
388
446
  | R3(A→Q,17 列) | `搜索字词` \| `搜索字词匹配类型` \| `已添加/已排除` \| `广告系列` \| `广告组` \| `搜索广告关键字` \| `点击次数` \| `展示次数` \| `点击率` \| `货币代码` \| `平均每次点击费用` \| `费用` \| `绝对页首展示次数百分比` \| `页首展示次数百分比` \| `转化次数` \| `每次转化费用` \| `转化率` |
389
- | R4… | 读 `search-terms-*.json`(`data[]`):`searchTermText` / `matchTypeZh` / **`已添加/已排除`**(若 JSON 字段不存在则填 `—`,**禁止**臆造)/ `campaignName` / `adGroupName` / `keywordText`(关键字)/ 数值字段;`货币代码` 来自 `list-accounts` 同账户 `currencyCode` |
447
+ | R4… | 读 `search-terms-*.json`(`data[]`):`searchTermText` / `matchTypeZh` / **`已添加/已排除`**(若 JSON 字段不存在则填 `—`,**禁止**臆造)/ `campaignName` / `adGroupName` / `keywordText`(关键字)/ 数值字段;`货币代码` 来自 `list-accounts` 同账户 `currencyCode` |
390
448
 
391
449
  按 `费用` 降序前 100。
392
450
 
@@ -394,13 +452,13 @@ for month in <S月, S+1月, E月>:
394
452
 
395
453
  **`Agent 数据洞察`**(**位置**:搜索字词主表最末数据行下方留空 1 行接续,**A 列起**;Agent 基于本 Sheet 数据自动生成,**禁止**编造):
396
454
 
397
- | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
398
- | --- | --- | --- |
399
- | 1 | **未添加但高转化搜索词**(候选加为关键词) | 列 `已添加/已排除` ≠ "已添加" 且 `转化次数` ≥ `{阈值}` 的搜索词,按转化降序前 10;阈值取本期搜索词转化中位数 |
400
- | 2 | **已添加但 0 转化高消耗搜索词**(候选加为否定关键词) | 列 `已添加/已排除` = "已添加" 且 `转化次数` = 0 且 `费用` > `¥{阈值}` 的搜索词,按消耗降序前 10;阈值取本期搜索词消耗 P75 |
401
- | 3 | **无关搜索词**(意图偏离候选) | 基于 `搜索字词` 文本扫描,标出与广告组 / 关键字 主题明显不符的词(如"工厂"系列出现"价格便宜""免费""教程"等),前 5;**仅展示**,**不**自动判定,由运营会上拍板 |
402
- | 4 | **匹配方式分布** | `Broad`:`{n_b}` 个、占消耗 `{p_b}%`;`Phrase`:`{n_p}` 个、占消耗 `{p_p}%`;`Exact`:`{n_e}` 个、占消耗 `{p_e}%` |
403
- | 5 | **页首展示低 / 高消耗搜索词**(仅当 `页首展示次数百分比` 字段可用) | 列 `费用` Top20 中 `页首展示次数百分比` < 50% 的搜索词,前 5;提示"花了钱但很少展示到页首,出价/质量得分待优化" |
455
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
456
+ | --- | ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
457
+ | 1 | **未添加但高转化搜索词**(候选加为关键词) | 列 `已添加/已排除` ≠ "已添加" 且 `转化次数` ≥ `{阈值}` 的搜索词,按转化降序前 10;阈值取本期搜索词转化中位数 |
458
+ | 2 | **已添加但 0 转化高消耗搜索词**(候选加为否定关键词) | 列 `已添加/已排除` = "已添加" 且 `转化次数` = 0 且 `费用` > `¥{阈值}` 的搜索词,按消耗降序前 10;阈值取本期搜索词消耗 P75 |
459
+ | 3 | **无关搜索词**(意图偏离候选) | 基于 `搜索字词` 文本扫描,标出与广告组 / 关键字 主题明显不符的词(如"工厂"系列出现"价格便宜""免费""教程"等),前 5;**仅展示**,**不**自动判定,由运营会上拍板 |
460
+ | 4 | **匹配方式分布** | `Broad`:`{n_b}` 个、占消耗 `{p_b}%`;`Phrase`:`{n_p}` 个、占消耗 `{p_p}%`;`Exact`:`{n_e}` 个、占消耗 `{p_e}%` |
461
+ | 5 | **页首展示低 / 高消耗搜索词**(仅当 `页首展示次数百分比` 字段可用) | 列 `费用` Top20 中 `页首展示次数百分比` < 50% 的搜索词,前 5;提示"花了钱但很少展示到页首,出价/质量得分待优化" |
404
462
 
405
463
  **条数**:5 条为完整模板;若网关未返回页首展示字段(第 5 条),整行填 `[ 字段不可用 ]`;其余无数据填 `[ 无 ]`。
406
464
 
@@ -454,15 +512,15 @@ for month in <S月, S+1月, E月>:
454
512
 
455
513
  ## 与其他报告模板的差异
456
514
 
457
- | 项 | `google-period-report.md` | `okki-weekly-google-client.md` | **本文(询盘分析)** |
458
- | --- | --- | --- | --- |
459
- | 时间窗 | 用户给定 | 用户给定(通常 1 周) | **严格 3 个自然月** |
460
- | 默认维度 | 8 维 + 追问 | 6 维固定 | **7 维固定(多 `geographic` 月度循环 3 次)** |
461
- | 是否需要询盘原始数据 | 否 | 否 | **是**(用户上传 / 反问索要) |
462
- | 输出形态 | 长文报告 | 客户话术 + 多 Sheet xlsx | **8 Sheet xlsx(不含客户话术)** |
463
- | Excel 由谁写 | Agent 脚本(可选) | Agent 脚本 | **Agent 脚本(必需)** |
464
- | 大洲映射 | 不涉及 | 不涉及 | **`references/geo-continents.json`** |
465
- | 重点国家 vs 非重点国切片 | 否 | 否 | **是**(Sheet 4 下半区,重点国可配置) |
515
+ | 项 | `google-period-report.md` | `okki-weekly-google-client.md` | **本文(询盘分析)** |
516
+ | ------------------------ | ------------------------- | ------------------------------ | --------------------------------------------- |
517
+ | 时间窗 | 用户给定 | 用户给定(通常 1 周) | **严格 3 个自然月** |
518
+ | 默认维度 | 8 维 + 追问 | 6 维固定 | **7 维固定(多 `geographic` 月度循环 3 次)** |
519
+ | 是否需要询盘原始数据 | 否 | 否 | **是**(用户上传 / 反问索要) |
520
+ | 输出形态 | 长文报告 | 客户话术 + 多 Sheet xlsx | **8 Sheet xlsx(不含客户话术)** |
521
+ | Excel 由谁写 | Agent 脚本(可选) | Agent 脚本 | **Agent 脚本(必需)** |
522
+ | 大洲映射 | 不涉及 | 不涉及 | **`references/geo-continents.json`** |
523
+ | 重点国家 vs 非重点国切片 | 否 | 否 | **是**(Sheet 4 下半区,重点国可配置) |
466
524
 
467
525
  ---
468
526
 
@@ -471,6 +529,6 @@ for month in <S月, S+1月, E月>:
471
529
  - 用户说出 3 条触发话术之一 → AI 切到本模板(**不**走 `google-period-report.md`)。
472
530
  - AI 反问:账户 + 分析月份 + 询盘资料(若用户未给)。
473
531
  - AI 跑 1 次区间多维度 + 3 次月度 `geographic` 循环;产物全部落 `./snap-inquiry`。
474
- - AI 产出 8 Sheet `.xlsx`,**每个数字可追溯到 `./snap-inquiry/**/*.json` 或 `inquiries.json` 的具体字段**。
532
+ - AI 产出 8 Sheet `.xlsx`,**每个数字可追溯到 `./snap-inquiry/**/\*.json`或`inquiries.json` 的具体字段\*\*。
475
533
  - 未命中大洲映射的国家:标 `未知大洲`,**不阻塞**、**不编造**;末尾打印未命中清单。
476
534
  - 产品 → 系列映射未给:Sheet 3 产品透视的「消耗 / CPL」列填空 + 脚注,**不分摊、不编造**。