siluzan-tso-cli 1.1.29-beta.2 → 1.1.29-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.
- package/README.md +1 -1
- package/dist/index.js +3174 -867
- package/dist/skill/AGENTS.md +30 -31
- package/dist/skill/SKILL.md +16 -33
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/assets/campaign-create-keyword-test.fixed.json +10 -33
- package/dist/skill/assets/campaign-create-template.json +2 -0
- package/dist/skill/assets/campaign-create-template.md +114 -99
- package/dist/skill/assets/market-analysis-rules.md +55 -55
- package/dist/skill/assets/meta-period-report-rules.md +61 -60
- package/dist/skill/assets/pmax-asset-group-template.json +12 -4
- package/dist/skill/assets/pmax-asset-group-template.md +25 -0
- package/dist/skill/assets/pmax-brand-assets-template.json +25 -0
- package/dist/skill/assets/pmax-brand-assets-template.md +22 -0
- package/dist/skill/assets/pmax-brand-guidelines-enable-template.json +24 -0
- package/dist/skill/assets/pmax-brand-guidelines-enable-template.md +22 -0
- package/dist/skill/assets/pmax-create-template.json +41 -2
- package/dist/skill/assets/pmax-create-template.md +84 -51
- package/dist/skill/assets/pmax-lead-form-template.json +36 -0
- package/dist/skill/assets/pmax-lead-form-template.md +70 -0
- package/dist/skill/assets/pmax-signals-template.json +2 -6
- package/dist/skill/assets/pmax-whatsapp-template.json +26 -0
- package/dist/skill/assets/pmax-whatsapp-template.md +45 -0
- package/dist/skill/assets/website-diagnosis-rules.md +67 -67
- package/dist/skill/references/README.md +78 -65
- package/dist/skill/references/accounts/accounts.md +99 -105
- package/dist/skill/references/accounts/finance.md +23 -79
- package/dist/skill/references/accounts/open-account-by-media.md +84 -81
- package/dist/skill/references/accounts/open-account-google-ui.md +24 -24
- package/dist/skill/references/analytics/account-analytics.md +94 -103
- package/dist/skill/references/analytics/facebook-analysis-guide.md +61 -61
- package/dist/skill/references/analytics/google-analysis-batch.md +2 -2
- package/dist/skill/references/analytics/keyword-planner-workflows.md +22 -23
- package/dist/skill/references/analytics/market-analysis-guide.md +31 -25
- package/dist/skill/references/analytics/rag.md +20 -20
- package/dist/skill/references/analytics/reporting.md +4 -4
- package/dist/skill/references/analytics/website-diagnosis-guide.md +24 -24
- package/dist/skill/references/core/agent-conventions.md +136 -106
- package/dist/skill/references/core/cli-enums.md +47 -53
- package/dist/skill/references/core/playbooks.md +42 -41
- package/dist/skill/references/core/subagent-orchestration.md +40 -40
- package/dist/skill/references/core/tips.md +18 -61
- package/dist/skill/references/core/workflows.md +36 -29
- package/dist/skill/references/google-ads/google-ads-campaign-plan.md +25 -24
- package/dist/skill/references/google-ads/google-ads.md +81 -57
- package/dist/skill/references/google-ads/pmax-api.md +138 -34
- package/dist/skill/references/google-ads/rules/README.md +15 -15
- package/dist/skill/references/google-ads/rules/google-ads-account-audit.md +22 -22
- package/dist/skill/references/google-ads/rules/google-ads-compliance.md +27 -27
- package/dist/skill/references/google-ads/rules/google-ads-keyword-strategy.md +15 -15
- package/dist/skill/references/google-ads/rules/google-ads-keyword-taxonomy.md +32 -22
- package/dist/skill/references/google-ads/rules/google-ads-launch-plan-template.md +32 -30
- package/dist/skill/references/google-ads/rules/google-ads-pmax-guide.md +3 -1
- package/dist/skill/references/misc/tso-home.md +8 -8
- package/dist/skill/references/operations/clue.md +1 -1
- package/dist/skill/references/operations/forewarning.md +1 -1
- package/dist/skill/references/operations/hosted-automation-optimize-index.md +2 -2
- package/dist/skill/references/operations/hosted-automation-scenarios.md +5 -5
- package/dist/skill/references/operations/hosted-automation-self-control.md +15 -15
- package/dist/skill/references/operations/hosted-automation-user-catalog.md +13 -13
- package/dist/skill/references/operations/optimize.md +8 -8
- package/dist/skill/references/report-templates/README.md +45 -0
- package/dist/skill/references/report-templates/REPORT-WORKFLOW.md +114 -0
- package/dist/skill/references/report-templates/bing-period-report.md +65 -0
- package/dist/skill/references/report-templates/google-account-diagnosis-report.md +83 -0
- package/dist/skill/references/report-templates/google-ads-diagnosis.md +378 -0
- package/dist/skill/references/report-templates/google-inquiry-analysis.md +543 -0
- package/dist/skill/references/report-templates/google-period-report-excel.md +126 -0
- package/dist/skill/references/report-templates/google-period-report.md +60 -0
- package/dist/skill/references/report-templates/market-analysis-report.md +40 -0
- package/dist/skill/references/report-templates/meta-account-diagnosis-report.md +74 -0
- package/dist/skill/references/report-templates/meta-period-report-excel.md +230 -0
- package/dist/skill/references/report-templates/meta-period-report.md +219 -0
- package/dist/skill/references/report-templates/okki-weekly-google-client.md +217 -0
- package/dist/skill/references/report-templates/tiktok-period-report.md +56 -0
- package/dist/skill/references/report-templates/website-diagnosis-report.md +79 -0
- package/dist/skill/report-templates/README.md +16 -14
- package/dist/skill/report-templates/REPORT-WORKFLOW.md +13 -13
- package/dist/skill/report-templates/google-account-diagnosis-report.md +1 -1
- package/dist/skill/report-templates/google-ads-diagnosis.md +21 -21
- package/dist/skill/report-templates/google-inquiry-analysis.md +44 -44
- package/dist/skill/report-templates/google-period-report-excel.md +24 -24
- package/dist/skill/report-templates/google-period-report.md +23 -23
- package/dist/skill/report-templates/market-analysis-report.md +1 -1
- package/dist/skill/report-templates/meta-period-report-excel.md +72 -64
- package/dist/skill/report-templates/meta-period-report.html +706 -428
- package/dist/skill/report-templates/meta-period-report.md +61 -60
- package/dist/skill/report-templates/okki-weekly-google-client.md +26 -26
- package/dist/skill/report-templates/report-template-academic.html +1 -1
- package/dist/skill/report-templates/report-template-dark.html +1 -1
- package/dist/skill/report-templates/report-template-formal.html +1 -1
- package/dist/skill/report-templates/report-template-mobile.html +1 -1
- package/dist/skill/report-templates/report-template-onepager.html +1 -1
- package/dist/skill/report-templates/report-template-print.html +1 -1
- package/dist/skill/report-templates/report-template.html +1 -1
- package/dist/skill/report-templates/website-diagnosis-report.html +1731 -1653
- package/dist/skill/report-templates/website-diagnosis-report.md +21 -23
- package/dist/skill/scripts/install.ps1 +1 -1
- package/dist/skill/scripts/install.sh +1 -1
- package/dist/skill/snippets/handoff-p7-inquiry.md +5 -5
- package/eval/cases/accounts-entityid-vs-mediaccustomerid.scenario.json +2 -14
- package/eval/cases/accounts-mcc-bind-inquiry.scenario.json +1 -3
- package/eval/cases/accounts-single-balance-not-bulk.scenario.json +3 -14
- package/eval/cases/budget-display-not-raw-micros.scenario.json +1 -8
- package/eval/cases/clue-meta-leads-json.scenario.json +2 -14
- package/eval/cases/clue-tiktok-leads-json.scenario.json +2 -11
- package/eval/cases/destructive-account-delink-needs-confirm.scenario.json +3 -9
- package/eval/cases/destructive-forewarning-delete-needs-confirm.scenario.json +3 -9
- package/eval/cases/destructive-invoice-apply-needs-confirm.scenario.json +3 -9
- package/eval/cases/facebook-analysis-google-section-aliases.scenario.json +2 -11
- package/eval/cases/facebook-analysis-not-google-keywords.scenario.json +3 -10
- package/eval/cases/facebook-analysis-period-default.scenario.json +2 -14
- package/eval/cases/finance-invoice-info-list.scenario.json +3 -11
- package/eval/cases/forewarning-list-google.scenario.json +3 -14
- package/eval/cases/google-ads-no-structural-without-confirm.scenario.json +2 -6
- package/eval/cases/google-analysis-keywords-route.scenario.json +2 -14
- package/eval/cases/human-p1-multiturn.scenario.json +1 -5
- package/eval/cases/meta-single-balance-not-bulk.scenario.json +3 -17
- package/eval/cases/no-legacy-json-flag.scenario.json +2 -6
- package/eval/cases/open-account-google-noninteractive.scenario.json +1 -3
- package/eval/cases/open-account-tiktok-license-file.scenario.json +1 -3
- package/eval/cases/optimize-list-by-account.scenario.json +3 -11
- package/eval/cases/p1-single-account-profile.scenario.json +1 -11
- package/eval/cases/p2-balance-scan-bulk.scenario.json +2 -9
- package/eval/cases/p3-accounts-digest.scenario.json +1 -5
- package/eval/cases/p4-fb-meta-period-report.scenario.json +2 -12
- package/eval/cases/p4-period-report-window.scenario.json +1 -8
- package/eval/cases/pmax-asset-group-create-with-bg.scenario.json +15 -0
- package/eval/cases/pmax-brand-edit-routing.scenario.json +12 -0
- package/eval/cases/pmax-edit-not-campaign-edit.scenario.json +15 -0
- package/eval/cases/pmax-enable-brand-guidelines.scenario.json +15 -0
- package/eval/cases/pmax-no-assets-update-brand-fields.scenario.json +12 -0
- package/eval/cases/rag-before-keyword-expand.scenario.json +1 -11
- package/eval/cases/rag-list-then-query.scenario.json +2 -14
- package/eval/cases/report-list-google.scenario.json +2 -11
- package/eval/cases/report-push-list-google.scenario.json +2 -11
- package/eval/cases/setup-login-or-env.scenario.json +1 -3
- package/eval/cases/setup-siluzan-data-permission-env.scenario.json +1 -3
- package/eval/cases/tiktok-bc-bind-inquiry.scenario.json +2 -6
- package/eval/cases/time-range-user-delegates-default.scenario.json +1 -8
- package/eval/cases/tips-json-out-filtering.scenario.json +1 -3
- package/eval/cases/tips-large-json-pagination.scenario.json +1 -3
- package/eval/cases/uj-ad-campaign-validate-before-create-stub.scenario.json +2 -11
- package/eval/cases/uj-ad-outdoor-campgear-search-plan.scenario.json +1 -3
- package/eval/cases/uj-analytics-30d-pdf-campaign-device-geo.scenario.json +6 -18
- package/eval/cases/uj-analytics-compare-google-tiktok-last-month-roi.scenario.json +1 -8
- package/eval/cases/uj-analytics-google-weekly-trends-campaigns-keywords.scenario.json +2 -11
- package/eval/cases/uj-analytics-report-push-weekly-email.scenario.json +1 -3
- package/eval/cases/uj-finance-invoice-records-this-month.scenario.json +2 -11
- package/eval/cases/uj-life-newbie-siluzan-google-end-to-end.scenario.json +1 -4
- package/eval/cases/uj-ops-google-accounts-list-normal.scenario.json +2 -17
- package/eval/cases/uj-ops-google-yesterday-spend-conversions.scenario.json +2 -14
- package/eval/cases/uj-ops-pause-worst-adgroup-confirm.scenario.json +2 -6
- package/eval/cases/uj-ops-tiktok-leads-last-week.scenario.json +3 -17
- package/eval/cases/uj-patrol-cpc-spike-adgroups-over-15.scenario.json +1 -5
- package/eval/cases/uj-patrol-forewarning-create-daily-cap-3000.scenario.json +1 -3
- package/eval/cases/uj-patrol-forewarning-trigger-records.scenario.json +3 -17
- package/eval/cases/uj-patrol-google-balances-low.scenario.json +2 -11
- package/eval/cases/uj-roi-optimize-records-then-execute-cautiously.scenario.json +3 -14
- package/eval/cases/uj-roi-search-terms-add-negative-keywords.scenario.json +2 -14
- package/eval/stub-fixtures/facebook-analysis.json +24 -4
- package/eval/stub-fixtures/meta-overview.json +4 -1
- package/eval/stub-fixtures/pmax-asset-group-create-ok.json +12 -0
- package/eval/stub-fixtures/pmax-brand-assets-edit-ok.json +11 -0
- package/eval/stub-fixtures/pmax-brand-guidelines-enable-ok.json +11 -0
- package/eval/stub-fixtures/pmax-edit-ok.json +11 -0
- package/eval/stub-fixtures/pmax-get-bg-on.json +20 -0
- package/package.json +1 -1
- package/dist/skill/references/core/deliverable-preflight.md +0 -109
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
# Google 账户询盘分析(运营固定触发模板)
|
|
2
|
+
|
|
3
|
+
> **触发话术**(等价即可,命中即走本模板)
|
|
4
|
+
>
|
|
5
|
+
> - `Goog账户询盘分析` / `Google 账户询盘分析`
|
|
6
|
+
> - `分析XXX Google账号的询盘效果`
|
|
7
|
+
> - `我给你询盘信息分析Google账号XXX效果`(附询盘资料 + 账户 ID)
|
|
8
|
+
> - 含「询盘 + 账户 + Google」三要素的近义表述
|
|
9
|
+
|
|
10
|
+
命中以上触发词时:**不要**按 `google-period-report.md` 的「8 维 + 追问」流程;按本文**固定字段 + 固定话术 + 固定时间窗**交付(数据全部来自 CLI 落盘 JSON,见 `references/analytics/account-analytics.md`)。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 用户两种入场流程
|
|
15
|
+
|
|
16
|
+
### 流程 A:用户直接带询盘资料
|
|
17
|
+
|
|
18
|
+
`我给你询盘信息分析Google账号<id>效果` + 附件(**任意载体**:xlsx / csv / pdf / 截图 / 纯文本表格 / 飞书表格粘贴均可)。
|
|
19
|
+
|
|
20
|
+
由**宿主 Agent**(Claude / Cursor / WorkBuddy 等)负责解析附件 → 抽取询盘行 → 落盘为 `./snap-inquiry/inquiries.json`。本 Skill 不约束载体格式,只规定字段清单(见下)。
|
|
21
|
+
|
|
22
|
+
### 流程 B:用户没给资料
|
|
23
|
+
|
|
24
|
+
用户说 `分析<id>Google账号的询盘效果`(仅给账户)。**Agent 须做**:
|
|
25
|
+
|
|
26
|
+
1. 反问账户与分析月份(见下方「须先确认」)。
|
|
27
|
+
2. 同时贴出**询盘字段清单 + 1 行示例**,让用户用任意方式补齐再回传:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
请把近 3 个月({S} ~ {E})的询盘记录回贴或上传(Excel / CSV / 截图 / 文本表格均可),字段如下:
|
|
31
|
+
月份 | 序号(可空) | 国家(中文) | 时间(YYYY-MM-DD 或 Excel 序列) | 产品 | 客户来源 | IP(可空)
|
|
32
|
+
示例:4月份 | 1 | 印度 | 2026-04-12 | 滴灌带 | WhatsApp(www.extruder.cn)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
3. 拿到资料后由宿主 Agent 解析、落盘 `inquiries.json`,再进入「拉数与写 Excel」节。
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 须先确认
|
|
40
|
+
|
|
41
|
+
1. **账户**:`mediaCustomerId` 来自 `list-accounts -m Google -k <id>`,**禁止猜 ID**。
|
|
42
|
+
2. **分析月份**:默认**上一个完整自然月**(例:今天 5/13 → 默认 4 月)。用户未明确时**反问**(A) 上月 B) 本月 1 号到昨天 C) 自定义 YYYY-MM)。
|
|
43
|
+
3. **时间窗口(硬约束)**:**严格 3 个月** = 分析月份 + 向前 2 个完整自然月。例:分析月 = 2026-04 → `--start 2026-02-01 --end 2026-04-30`。**所有月度表只展示 3 行**(不延伸到 7 个月)。
|
|
44
|
+
4. **询盘字段最小集**:`月份 / 国家(中文) / 时间 / 产品 / 客户来源`;可选 `序号 / IP`。
|
|
45
|
+
5. **日期规范化**:`2026.4.1` / `2026/4/1` 等先规范成 `YYYY-MM-DD` 再传 CLI。
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 架构约定 · Excel 由谁生成
|
|
50
|
+
|
|
51
|
+
- **`siluzan-tso` 不提供**「一键生成询盘分析 Excel」CLI 子命令,**也不要**新增。
|
|
52
|
+
- 需交付 Excel 时:由 **Agent**(宿主或 WorkBuddy 编排)在 CLI `--json-out` 落盘后,自行编写 **Node.js / Python** 脚本(`exceljs` / `xlsx` / `openpyxl`)读 JSON → 写 `.xlsx`。
|
|
53
|
+
- **数值一律来自落盘 JSON 或 `inquiries.json`,禁止在脚本里写死业务数字。**
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Subagent 编排(可选)
|
|
58
|
+
|
|
59
|
+
主 Agent 先 Read `references/core/subagent-orchestration.md` § P7:
|
|
60
|
+
|
|
61
|
+
- **主 snap + 按月拉数**:可并行 3× Task(`snippets/handoff-p7-inquiry.md` 变体 m1/m2/m3),或主会话顺序执行。
|
|
62
|
+
- **8 Sheet xlsx**:主 Agent 或单 Task 收尾;子会话禁止扩展 7 个月窗口、禁止编造询盘数据。
|
|
63
|
+
- handoff 与 `returnSchema` 见 orchestration 文档。
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 拉数(同一目录落盘)
|
|
68
|
+
|
|
69
|
+
`./snap-inquiry` 为示例目录。设 `S` = 起始月 1 号、`E` = 分析月最后一天。
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
mkdir -p ./snap-inquiry
|
|
73
|
+
|
|
74
|
+
# 1) 账户清单(核 mediaCustomerId 与 advertiserName / currencyCode)
|
|
75
|
+
siluzan-tso list-accounts -m Google -k <mediaCustomerId> --json-out ./snap-inquiry
|
|
76
|
+
|
|
77
|
+
# 2) 区间维度(Sheet 5/7/8;系列为整段 S~E 汇总)
|
|
78
|
+
siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-out ./snap-inquiry \
|
|
79
|
+
--sections campaigns,keywords,search-terms,campaign-geo
|
|
80
|
+
|
|
81
|
+
# 3) 按月循环(Sheet 4 上区 + Sheet 4 下区 + Sheet 6)
|
|
82
|
+
for month in <S月, S+1月, E月>:
|
|
83
|
+
mkdir -p ./snap-inquiry/<YYYY-MM>
|
|
84
|
+
siluzan-tso google-analysis -a <mediaCustomerId> \
|
|
85
|
+
--start <月1号> --end <月末> --json-out ./snap-inquiry/<YYYY-MM> \
|
|
86
|
+
--sections campaigns,geographic
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**说明**:
|
|
90
|
+
|
|
91
|
+
- **禁止**用 `daily-metrics` 填 Sheet 4 上区:该维度走 TSO 主平台 `account-daily-reports`,与 Google 前台 / Web 分析(`CampaignSectionData`)**不同数据源**,产品已确认存在不可接受偏差。
|
|
92
|
+
- **Sheet 4 上区(账户月汇总)**:读 `./<YYYY-MM>/campaigns-*.json`,对 `items[]`(`schemaVersion 3` 行统一在 `items`)**全系列求和**得到当月账户级点击/展示/费用/转化,再算 CTR/CPC/CPA/CVR(公式见下文 Sheet 4);与 Google「广告系列」页同区间加总口径一致。
|
|
93
|
+
- `./snap-inquiry/campaigns-<accountId>_<S>-<E>.json`(步骤 2,整段 S~E):仅用于 **Sheet 5** 系列明细;**不得**用它按月拆行填 Sheet 4。
|
|
94
|
+
- `geographic`:账户级国家聚合;Sheet 6 与 Sheet 4 **下区**(重点国切片)按月目录读取。
|
|
95
|
+
- `keywords` / `search-terms`:Sheet 7 / 8;默认拉取**全部有消耗**行(`keywords` 网关 `costGreater=0`,`limit=0` 不封顶);需 TOP N 时加 `--limit <n>`。
|
|
96
|
+
- `campaign-geo`:含 `campaignName`,用于 Sheet 6「暂停的系列」列辅助派生(若运营不需要可留空);也用于 Sheet 3 国家级消耗 join。
|
|
97
|
+
- `geographic`:账户级国家聚合;Sheet 6 月度循环主源;Sheet 4 下半区「重点国家 vs 非重点国」按月切片(重点国默认取分析月询盘 Top1 国家,可由运营覆盖,详见下文 Sheet 4 节)。
|
|
98
|
+
- **地理字段自动补齐**(由 `translate-fields.ts` 在 `campaign-geo` / `geographic` 行上自动补,未命中字典则不补,详见 `references/analytics/account-analytics.md`「中文化字段」):
|
|
99
|
+
- `countryOrRegionZh`:与 `countryOrRegion` **同粒度**的中文翻译(`Mumbai → 孟买` / `India → 印度` / `Davao Region → 达沃地区`)
|
|
100
|
+
- `countryCode`:归并到的 ISO alpha-2 国家代码(`Mumbai → "IN"` / `Davao Region → "PH"` / `India → "IN"`),数据源 Google Ads 官方 geotargets CSV(约 9.5 万条目)
|
|
101
|
+
- `countryNameZh`:归并后的**国家级中文名**(`Mumbai → "印度"` / `Davao Region → "菲律宾"`)。**Sheet 3 国家透视、Sheet 6 国家维度均应按 `countryNameZh` 聚合**,自动把城市/地区行归并到所属国家,不再出现"未知大洲"。
|
|
102
|
+
|
|
103
|
+
**写脚本前先读 `<section>-<id>.outline.txt`**(几百字节 TS 类型字面量),别直接 `Read` 几 MB 的 JSON。
|
|
104
|
+
|
|
105
|
+
### 落盘防覆盖(必读)
|
|
106
|
+
|
|
107
|
+
CLI 业务 JSON 默认名为 `<section>-<accountId>.json`。**带 `--start`/`--end` 的 range 维度**会自动追加区间后缀,例如:
|
|
108
|
+
|
|
109
|
+
`campaigns-3206866200_20260401-20260430.json`
|
|
110
|
+
|
|
111
|
+
因此:
|
|
112
|
+
|
|
113
|
+
| 做法 | 结果 |
|
|
114
|
+
| ------------------------------------------ | ---------------------------------------------------------------------------------- |
|
|
115
|
+
| 三个月都 `--json-out ./snap-inquiry` | **旧版会覆盖**;新版 CLI 同目录可共存 3 个 `campaigns-*_YYYYMM01-YYYYMM31.json` |
|
|
116
|
+
| 每月 `--json-out ./snap-inquiry/<YYYY-MM>` | 每月目录内仍是 `campaigns-<id>_<月首>-<月末>.json`,**推荐**(脚本按目录读最直观) |
|
|
117
|
+
| 步骤 2 整段 + 步骤 3 某月共用一个目录 | 文件名不同(整段 S~E vs 单月),**不会**互相覆盖 |
|
|
118
|
+
|
|
119
|
+
**脚本读数**(二选一,禁止写死无日期后缀的旧文件名):
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
# 推荐:按月子目录
|
|
123
|
+
./snap-inquiry/<YYYY-MM>/campaigns-<accountId>_<月1号>-<月末>.json
|
|
124
|
+
|
|
125
|
+
# 或:同目录 glob(manifest.artifacts 会列出每个区间文件)
|
|
126
|
+
./snap-inquiry/campaigns-<accountId>_*.json
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Sheet 5 整段系列明细读:`./snap-inquiry/campaigns-<accountId>_<S>-<E>.json`(S、E 为 3 个月起止,无连字符)。
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 询盘字段规范(宿主 Agent 解析输出)
|
|
134
|
+
|
|
135
|
+
宿主 Agent 解析任意载体后,**统一落盘** `./snap-inquiry/inquiries.json`:
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
[
|
|
139
|
+
{
|
|
140
|
+
"month": "4月份",
|
|
141
|
+
"seq": 1,
|
|
142
|
+
"country": "印度",
|
|
143
|
+
"time": "2026-04-12",
|
|
144
|
+
"product": "滴灌带",
|
|
145
|
+
"source": "WhatsApp(www.extruder.cn)",
|
|
146
|
+
"ip": null
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
- `month`:保留运营原文(`1月份` / `4月份` …)。
|
|
152
|
+
- `country`:**中文名**,与 `countryOrRegionZh` 字典对齐(脚本会自动 lookup 大洲)。Agent 解析时遇到英文/缩写应先翻译为中文,未知国家保留原文并在脚本里标 `未知大洲`。
|
|
153
|
+
- `time`:`YYYY-MM-DD`;Excel 日期序列号也接受,由解析方转换。
|
|
154
|
+
- `product`:自由文本(`滴灌带` / `打包带` / `片材` / `滴头` / `模具` / `贴条` / `涂布水带` …),脚本以此作 Sheet 3 产品维度透视分桶 key。
|
|
155
|
+
- `source`:自由文本(`WhatsApp` / `tawk.to` / `info邮箱` / `网站留言` / `微信(xxxx)` / `阿里巴巴` / `made-in-china` / `Youtube` / `TikTok` …),脚本以此作 Sheet 3 客户来源透视分桶 key。
|
|
156
|
+
- `ip`:可空。
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 国家 → 大洲映射
|
|
161
|
+
|
|
162
|
+
- **数据源**:`references/analytics/geo-continents.json`
|
|
163
|
+
- **默认 7 桶**:`亚洲` / `中东` / `欧洲` / `北美` / `南美` / `非洲` / `大洋洲`。
|
|
164
|
+
- **运营常用 5 桶合并**(与样表 Sheet 3 一致):`<重点国>` / `中东` / `非洲` / `欧美` / `亚洲(除重点国)`。**由脚本在写表前做二次合并**,伪代码:
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
// focusCountries 由运营每次会议前确认(见下方「重点国家配置」节);
|
|
168
|
+
// 单国时桶名 = 国家名(如 "印度");多国时桶名 = 列表拼接(如 "印度+印度尼西亚")。
|
|
169
|
+
function bucketForSheet3(country, continents, focusCountries) {
|
|
170
|
+
if (focusCountries.includes(country)) return focusCountries.join("+");
|
|
171
|
+
const c = continents[country];
|
|
172
|
+
if (c === "欧洲" || c === "北美" || c === "南美") return "欧美";
|
|
173
|
+
return c || "未知";
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
- **未命中**:标 `未知大洲`(不阻塞、不报错)。脚本在末尾打印未命中国家清单,让运营回补字典。
|
|
178
|
+
- **若同一国家在询盘里出现中英文两种写法**:脚本归一化(先按 `geo-en2zh.json` 翻译英文 → 中文,再查 continents)。
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## xlsx 版式规范
|
|
183
|
+
|
|
184
|
+
工作簿 8 个 Sheet,**顺序与名称须完全一致**(按运营样表《2026 年 4 月月报-TO 询盘分析模板》)。表头、合并单元格、数值格式严格执行;列宽 / 排序为可选,但**不得**因此改数。
|
|
185
|
+
|
|
186
|
+
### 数值格式(强约束)
|
|
187
|
+
|
|
188
|
+
- **金额、CPL / CPA / CPC / 平均费用**:保留 **2 位小数**,写明货币代码(如 `¥123.45 CNY`)。
|
|
189
|
+
- **点击率 / 转化率 / 互动率**(`ctr` / `conversionRate` / `interactionRate`):CLI 已归一为 **0~1 小数**(schemaVersion ≥ 2),写入 Excel 时**直接写 0~1**(与运营样表对齐,Excel 单元格用百分比格式自动渲染)。话术 `x%` 用 `(v * 100).toFixed(2) + "%"`。
|
|
190
|
+
- **空值**:`interactions === 0` 时「平均费用」「互动率」填 `—`,**禁止**除零。
|
|
191
|
+
|
|
192
|
+
### 分析输出区位置(**全局硬约束**)
|
|
193
|
+
|
|
194
|
+
每个 Sheet 的分析输出区(`数据质量提示` / `Agent 数据洞察` / `优化建议` / Sheet 1 议题区与会后补写区)一律遵守:
|
|
195
|
+
|
|
196
|
+
1. **位置**:放在该 Sheet **全部数据区最末行**下方留空 1 行接续,**从 A 列起**;禁止落在数据行之间。
|
|
197
|
+
2. **最末行计算**:脚本需先算 `lastDataRow = MAX(各数据区的最末行号)`,再从 `lastDataRow + 2` 开始写分析输出区。
|
|
198
|
+
- Sheet 3 含**左右两区**(左明细 A-F / 右 4 个透视 H-K):`lastDataRow = MAX(左区最末行, 右区第 4 个透视最末行)`。
|
|
199
|
+
- Sheet 4 含**上下两区**(汇总 + 重点国切片):`lastDataRow = 下区最末行`。
|
|
200
|
+
- Sheet 5 含**上区主表 + 下区优化建议**:优化建议本身就是分析输出区,位置规则与其它 Sheet 一致。
|
|
201
|
+
- 其余 Sheet(2 / 6 / 7 / 8)单数据区:`lastDataRow = 主表最末行`。
|
|
202
|
+
3. **跨列宽度**:分析输出区表格横跨 A 列至该 Sheet 主表的**最右占用列**(如 Sheet 3 横跨 A-K、Sheet 4 横跨 A-L),便于运营在最末位置一眼读完。
|
|
203
|
+
4. **禁止**为对齐美观而**人工指定固定行号**(如"R30 起写洞察"):行号必须由脚本动态算,否则数据条数变化时会插入数据中间。
|
|
204
|
+
|
|
205
|
+
### Sheet 顺序
|
|
206
|
+
|
|
207
|
+
| 顺序 | Sheet 名 | 主源 |
|
|
208
|
+
| ---: | ----------------------------- | ----------------------------------------------------------------------------------------------- |
|
|
209
|
+
| 1 | `会议讨论议题` | Agent 从 Sheet 2~8 提炼议题(不拉数);**含「会后补写区」由运营会后手填决策** |
|
|
210
|
+
| 2 | `询盘明细---<S月>-<E月>月份` | `inquiries.json` |
|
|
211
|
+
| 3 | `询盘分析-最近3个月` | `inquiries.json` + `campaign-geo-*.json` |
|
|
212
|
+
| 4 | `账号分析-最近3个月` | `./<YYYY-MM>/campaigns-*.json`(上区,系列加总)+ `./<YYYY-MM>/geographic-*.json`(下区)× 3 月 |
|
|
213
|
+
| 5 | `广告系列消费明细` | `./snap-inquiry/campaigns-<accountId>_<S>-<E>.json`(整段 3 月) |
|
|
214
|
+
| 6 | `国家消费明细<S月>-<E月>月份` | `./<YYYY-MM>/geographic-*.json` × 3 + `inquiries.json` 左 join |
|
|
215
|
+
| 7 | `关键词` | `keywords-*.json` |
|
|
216
|
+
| 8 | `搜索字词` | `search-terms-*.json` |
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
### Sheet 1 `会议讨论议题`
|
|
221
|
+
|
|
222
|
+
> **语义**:Agent 产出的是**会议前数据分析**,**不可能**知道会上讨论了什么 / 决策了什么。本 Sheet 由 Agent 把其他 7 个 Sheet 的**数据异常与机会**提炼成**待讨论议题**,会后由运营手工把决策结论补到「会后补写区」。
|
|
223
|
+
>
|
|
224
|
+
> **口吻硬约束**:议题区**只用**「建议讨论…」「是否…」「Top X 是…,是否…」等开放语气,**禁止**出现「已暂停」「已新增」「决定切换」这类决策口吻;禁止编造未在数据中出现的国家/产品/渠道。
|
|
225
|
+
|
|
226
|
+
| 行 | 内容 |
|
|
227
|
+
| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
228
|
+
| R1 | 一句话数据要点(Agent 基于本期 Sheet 2~8 的核心发现概括,例:`本期 3 个月共 {N} 条询盘,{E月} CPL ¥{x}(环比 {±%}),消耗 Top3 国家:{A/B/C},询盘 Top3 国家:{X/Y/Z}。`) |
|
|
229
|
+
| R2 | `议题分类` \| `数据要点(引用具体数字)` \| `候选讨论选项` \| `数据来源` |
|
|
230
|
+
| R3+ | 议题列表(**Agent 基于其他 7 个 Sheet 数据撰写,每条都要带具体数字**),4 大类,每类视数据出 1~3 条: |
|
|
231
|
+
| | ① **国家投放议题**:列出 (a) 消耗 Top + 询盘 Top (b) 高消耗 0 询盘国家 (c) 有询盘但消耗 ≈ 0 的国家;候选选项写「建议讨论:暂停 / 持平 / 加大」三选;数据来源标 `Sheet 3 / Sheet 6` |
|
|
232
|
+
| | ② **产品策略议题**:基于 Sheet 3 产品透视 + Sheet 5 系列;指出 CPL 显著高/低的产品系列;候选选项写「建议讨论:调匹配类型 / 切 Pmax / 暂停」;数据来源标 `Sheet 3 / Sheet 5` |
|
|
233
|
+
| | ③ **渠道与数据采集议题**:基于 Sheet 3 客户来源透视,列出占比 Top1/Top2 渠道;若多渠道字面无法区分(如 `AI Search` / `Info邮箱`),议题写「建议讨论:是否加追踪参数」;数据来源标 `Sheet 3` |
|
|
234
|
+
| | ④ **预算与节奏议题**:基于 Sheet 4 上区月趋势(CPL / CVR / 消耗环比)+ Sheet 5 系列消耗占比,列出预算保持/上调/下调 3 个候选方向,每个方向给出对应的「触发数据」;数据来源标 `Sheet 4 / Sheet 5` |
|
|
235
|
+
| 空 1 行 | — |
|
|
236
|
+
| 标题 | `会后补写区 · 由运营会议结束后手填` |
|
|
237
|
+
| 表头 | `#` \| `决策内容` \| `负责人` \| `截止日期` \| `所属议题(R3+ 行号)` |
|
|
238
|
+
| R… | **留 5~8 空行,Agent 不填**;运营开完会按议题手工补写 |
|
|
239
|
+
|
|
240
|
+
**禁造数硬规范**:
|
|
241
|
+
|
|
242
|
+
- 议题区每条结论必须能在其他 Sheet 里找到具体数据来源行(标注 Sheet 号),否则不写。
|
|
243
|
+
- **禁止**写「玻利维亚消耗高已暂停」这类肯定句;只能写「玻利维亚消耗 ¥XXX、0 询盘,建议讨论是否暂停」。
|
|
244
|
+
- 「会后补写区」**保持空白**,等运营手填;Agent **不**预填决策。
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
### Sheet 2 `询盘明细---<S月>-<E月>月份`
|
|
249
|
+
|
|
250
|
+
| 行 | 内容 |
|
|
251
|
+
| --------- | ------------------------------------------------------------------------------------------- |
|
|
252
|
+
| R1(A→G) | `月份` \| `序号` \| `国家` \| `时间` \| `产品` \| `客户来源` \| `IP` |
|
|
253
|
+
| R2… | 来自 `inquiries.json` 逐行;`seq` 缺失时用 1..N 递增;`time` 写 `YYYY-MM-DD`;`ip` 缺失留空 |
|
|
254
|
+
|
|
255
|
+
按 `month` + `seq` 升序。**不**对询盘做去重 / 校验。
|
|
256
|
+
|
|
257
|
+
**`数据质量提示`**(**位置**:主表最末数据行下方空 1 行接续,**A 列起**;Agent 基于本表数据自动生成,**禁止**编造;纯观察、不带建议口吻):
|
|
258
|
+
|
|
259
|
+
| # | 观察 | 数据依据 |
|
|
260
|
+
| --- | ---------------------------------- | ------------------------------------------------------------------------------------------- |
|
|
261
|
+
| 1 | 询盘总量与月分布 | 3 个月共 `{N}` 条;分月:S月 `{n1}` / 中月 `{n2}` / E月 `{n3}` |
|
|
262
|
+
| 2 | 字段缺失率(IP / 产品 / 客户来源) | `IP` 缺失 `{x}%`、`产品` 缺失 `{y}%`、`客户来源` 缺失 `{z}%`(任一字段缺失率 > 30% 时高亮) |
|
|
263
|
+
| 3 | 重复 IP(同 IP 出现 ≥ 2 条询盘) | `{m}` 条,涉及 `{k}` 个 IP(列出 Top3) |
|
|
264
|
+
| 4 | 国家集中度 | Top1 国家 `{country}` 占 `{p1}%`、Top3 合计 `{p3}%`(> 60% 时高亮"高度集中") |
|
|
265
|
+
| 5 | 询盘时间分布异常 | 若存在单日 ≥ 5 条询盘的"尖峰日",列日期与条数;否则填 `—` |
|
|
266
|
+
|
|
267
|
+
**口径硬约束**:所有 `{...}` 占位符**必须**替换为本期真实数字;某项若数据不足则填 `—`,**禁止**写"约""大概"等模糊词。
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
### Sheet 3 `询盘分析-最近3个月`
|
|
272
|
+
|
|
273
|
+
左右两区。**左区**:明细子集(仅本期 3 个月的询盘 + IP 列);**右区**:4 个透视表。
|
|
274
|
+
|
|
275
|
+
**左区**(A→F):与 Sheet 2 同表头,但仅 `time` 落在 `[S, E]` 区间内的行。
|
|
276
|
+
|
|
277
|
+
**右区**(H 起)4 个透视:
|
|
278
|
+
|
|
279
|
+
1. **国家 × 询盘 & 消耗**(H→K)
|
|
280
|
+
表头:`国家(分析月份询盘国家)` \| `询盘个数` \| `所属大洲` \| `消耗`
|
|
281
|
+
`询盘个数` = `inquiries.json` 按国家 count;
|
|
282
|
+
`所属大洲` = 按上文「运营常用 5 桶合并」规则;
|
|
283
|
+
`消耗` = `campaign-geo-*.json` 按 **`countryNameZh`** 聚合的 `spend`(同一国家的所有 city / region 行也归并;未命中归并字典时回落 `countryOrRegionZh`);
|
|
284
|
+
末行 `总计`。
|
|
285
|
+
|
|
286
|
+
2. **客户来源 × 询盘数**(H→I,国家透视下方留空 1 行后接续)
|
|
287
|
+
表头:`客户来源` \| `询盘个数`;按 `source` 字段 count;末行 `总计`。
|
|
288
|
+
|
|
289
|
+
3. **产品 × 询盘 & 消耗 & CPL**(H→K,再留空 1 行后接续)
|
|
290
|
+
表头:`产品` \| `询盘个数` \| `消耗` \| `CPL`;
|
|
291
|
+
`消耗`:产品维度的消耗在 `campaigns-*.json` 中需运营自配「产品 → 系列前缀映射」(见下方「可选:产品 → 系列前缀映射」节)。如未配置,**留空** + 脚注:`[ 数据不可用:未配置产品→系列映射 ]`,**禁止**编造分摊;
|
|
292
|
+
`CPL` = `消耗 / 询盘个数`,询盘个数为 0 时填 `—`。
|
|
293
|
+
|
|
294
|
+
**`Agent 数据洞察`**(**位置**:**左区明细最末行**与**右区 4 个透视最末行**两者中**行号更大者**下方留空 1 行接续,**A 列起**(横跨 A-K,绝不允许出现在两区数据行之间);Agent 基于本 Sheet 数据自动生成,**禁止**编造;每条**必带**具体数字):
|
|
295
|
+
|
|
296
|
+
> **写表脚本必做**:先算 `lastRow = max(左区最末数据行号, 右区最末透视行号)`,再从 `lastRow + 2` 开始写洞察标题与表格。**禁止**直接接在右区透视下方(会落在左区明细中间)。
|
|
297
|
+
|
|
298
|
+
| # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
|
|
299
|
+
| --- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
300
|
+
| 1 | **高消耗 0 询盘国家**(透视 1 交叉) | 列出消耗 > `{阈值}` 但询盘 = 0 的国家清单(按消耗降序,最多 5 个);阈值取本期国家消耗中位数 |
|
|
301
|
+
| 2 | **0 消耗有询盘国家**(透视 1 交叉,可能是自然流量/远端品牌词) | 列出消耗 ≈ 0(< `¥10`)但询盘 ≥ 1 的国家(按询盘降序,最多 5 个) |
|
|
302
|
+
| 3 | **客户来源集中度**(透视 2) | Top1 渠道占 `{p1}%`、Top3 合计 `{p3}%`;> 70% 高亮"渠道高度集中,风险敞口大" |
|
|
303
|
+
| 4 | **长尾渠道**(透视 2) | 占比 < 5% 的渠道数量与合计占比;用于会议讨论"是否归并/精简" |
|
|
304
|
+
| 5 | **产品 CPL 偏差**(透视 3,仅当产品→系列映射已配置) | 列出 CPL > 整体均值 × 1.5 的产品(拖累),CPL < 整体均值 × 0.5 的产品(明星) |
|
|
305
|
+
| 6 | **大洲映射缺漏** | 透视 1 中"所属大洲 = 未知大洲"的国家清单(提示运营回流 `analytics/geo-continents.json`) |
|
|
306
|
+
|
|
307
|
+
**条数**:上表 6 条为**完整模板**;若某条数据为空(如未配置产品映射、无大洲缺漏),可省略该行,但其余必出。
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
### Sheet 4 `账号分析-最近3个月`
|
|
312
|
+
|
|
313
|
+
上下两区。
|
|
314
|
+
|
|
315
|
+
#### 上区口径:系列维度加总(对齐 Google)
|
|
316
|
+
|
|
317
|
+
| 项 | 约定 |
|
|
318
|
+
| -------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
319
|
+
| 数据源 | `./snap-inquiry/<YYYY-MM>/campaigns-<accountId>_<月1号>-<月末>.json`(每月单独拉 `campaigns`;见「落盘防覆盖」) |
|
|
320
|
+
| 聚合范围 | 该月内 **全部** `items[]` 行(`schemaVersion 3` 行统一在 `items`;含已暂停但在区间内有消耗的系列;**禁止**只取 Top N 或手工筛系列) |
|
|
321
|
+
| 数据口径 | `google-analysis campaigns` 与账户月表一致;账户月表 = 各系列在当月起止日内指标之和 |
|
|
322
|
+
| 禁止 | `daily-metrics` / `stats` / `overview` 填上区投放列(询盘列仍来自 `inquiries.json`) |
|
|
323
|
+
|
|
324
|
+
**脚本聚合(每月一份 `campaigns-*.json`)**:
|
|
325
|
+
|
|
326
|
+
```text
|
|
327
|
+
rows = payload.items ?? []
|
|
328
|
+
spend = Σ rows[].spend
|
|
329
|
+
clicks = Σ rows[].clicks
|
|
330
|
+
impressions = Σ rows[].impressions
|
|
331
|
+
conversions = Σ rows[].conversions
|
|
332
|
+
点击率 = impressions > 0 ? clicks / impressions : —
|
|
333
|
+
平均每次点击费用 = clicks > 0 ? spend / clicks : —
|
|
334
|
+
每次转化费用 = conversions > 0 ? spend / conversions : —
|
|
335
|
+
转化率 = clicks > 0 ? conversions / clicks : — # 与样表一致:转化÷点击,非÷展示
|
|
336
|
+
询盘个数 = inquiries.json 该月 count
|
|
337
|
+
CPL = 询盘个数 > 0 ? spend / 询盘个数 : —
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
`时间` 列写 `YYYY-MM` 或 `YYYY年M月`(与样表一致即可)。金额列用 `list-accounts` 的 `currencyCode`。
|
|
341
|
+
|
|
342
|
+
**可选校验(不写入 Excel,仅日志)**:同月再拉 `overview`,对比 `record.currentPeriod.spend`(汇总维度在 `record`)与系列 `spend` 之和;偏差 >1% 时在 Agent 交付说明中脚注差异,**仍以系列加总为准**。
|
|
343
|
+
|
|
344
|
+
**上区**(B→L,跳过 A 列保持与运营样表一致)3 行月汇总:
|
|
345
|
+
|
|
346
|
+
| R | 内容 |
|
|
347
|
+
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
348
|
+
| R1 | (A 列空)`汇总` |
|
|
349
|
+
| R2 | `时间` \| `点击次数` \| `展示次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` \| `询盘个数` \| `CPL` |
|
|
350
|
+
| R3..R5 | 倒序写 3 个月(**E 月在上**,S 月在下):脚本读 `./<YYYY-MM>/campaigns-*.json` 按上表对 `items[]` 全量求和;`询盘个数` = `inquiries.json` 按月 count;`CPL` = `费用 / 询盘个数`(询盘 0 填 `—`) |
|
|
351
|
+
|
|
352
|
+
**下区**(B→G)3 月 × **重点国家 / 非重点国** 切片(共 6 行):
|
|
353
|
+
|
|
354
|
+
> **重点国家口径**(`focusCountries`):见下方「重点国家配置」节,**禁止**在模板里写死任何国家名。
|
|
355
|
+
|
|
356
|
+
| R | 内容 |
|
|
357
|
+
| ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
358
|
+
| R7 | `时间` \| `国家` \| `消费` \| `线索数` \| `成本` \| `备注` |
|
|
359
|
+
| 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 填 `—` |
|
|
360
|
+
|
|
361
|
+
**`Agent 数据洞察`**(**位置**:下区(重点国切片)最末行下方留空 1 行接续,**A 列起**;Agent 基于本 Sheet 上 + 下区数据自动生成,**禁止**编造;每条**必带**具体数字):
|
|
362
|
+
|
|
363
|
+
| # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
|
|
364
|
+
| --- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | --- | ---------------------------------------------------------------------- |
|
|
365
|
+
| 1 | **CPL 月环比**(上区) | E月 CPL `¥{x_E}` vs 中月 `¥{x_M}` vs S月 `¥{x_S}`;E月环比 `{±%}`;幅度 \|`> 30%`\| 高亮"显著波动" |
|
|
366
|
+
| 2 | **CTR / CVR 月环比**(上区) | CTR:`{ctr_E}` / `{ctr_M}` / `{ctr_S}`(趋势 ↑↓→);CVR:`{cvr_E}` / `{cvr_M}` / `{cvr_S}`(趋势 ↑↓→) |
|
|
367
|
+
| 3 | **消耗与询盘相关性**(上区) | 列出 3 个月 `费用` 与 `询盘个数` 的同向 / 反向关系(如"消耗 ↓ 但询盘 ↑"提示效率提升) |
|
|
368
|
+
| 4 | **重点国 vs 非重点国成本差额**(下区) | E月:重点国 CPL `¥{a}` vs 非重点国 `¥{b}`,差额 `{ | a-b | }`;若重点国 CPL < 非重点国 CPL × 0.5 高亮"重点国成本显著低于其他市场" |
|
|
369
|
+
| 5 | **重点国线索贡献占比**(下区) | E月重点国线索 `{n}` 条,占总量 `{p}%`;3 个月平均占比 `{avg_p}%`;< 20% 提示"重点国线索贡献低,考虑扩展其他市场" |
|
|
370
|
+
| 6 | **重点国趋势**(下区,3 月对比) | 重点国线索数 / 消耗 / CPL 三个月趋势(如"重点国 CPL 连续 3 月下降"或"消耗稳定线索下降") |
|
|
371
|
+
|
|
372
|
+
**条数**:6 条为完整模板;若 `focusCountries = []`(本期无询盘),仅出第 1~3 条上区洞察,下区 3 条标 `[ 本期无重点国,省略下区洞察 ]`。
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
### Sheet 5 `广告系列消费明细`
|
|
377
|
+
|
|
378
|
+
**上区**:
|
|
379
|
+
|
|
380
|
+
| R | 内容 |
|
|
381
|
+
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
382
|
+
| R1 | `广告系列表现明细 · 账户 <mediaCustomerId(带连字符)> · <数据开始月>-<数据结束月>` |
|
|
383
|
+
| R2(A→M,13 列) | `系列名称` \| `系列ID` \| `策略` \| `开始日期` \| `消耗 (¥)` \| `展示` \| `点击` \| `CTR` \| `平均CPC` \| `转化` \| `CPA (¥)` \| `转化率` \| `消耗占比` |
|
|
384
|
+
| R3… | 读 `campaigns-*.json` 的 `items[]`:`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 小数) |
|
|
385
|
+
| 末行 | `合计`:A 列写 `合计`;金额、展示、点击、转化 求和;CTR/CVR/CPA 按合计反推(**禁止**对各行比率求平均) |
|
|
386
|
+
|
|
387
|
+
**下区**:
|
|
388
|
+
|
|
389
|
+
| R | 内容 |
|
|
390
|
+
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
391
|
+
| 空 1 行 | — |
|
|
392
|
+
| 标题 | `优化建议 · 账户 <id> · <分析月份>` |
|
|
393
|
+
| 表头(A→H) | `#` \| `问题/机会类别` \| `现状描述` \| `影响分析` \| `具体优化建议` \| `(留空)` \| `(留空)` \| `优先级` |
|
|
394
|
+
| 数据 | Agent 基于本期 Sheet 4/5/6/7/8 撰写 5~8 条建议;每条引用具体数字(如 `CPA ¥287,远高于均值 ¥111`);`优先级` 取 `高` / `中` / `低`;**禁止**在建议里包含模板占位符或硬编码示例数字 |
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
### Sheet 6 `国家消费明细<S月>-<E月>月份`
|
|
399
|
+
|
|
400
|
+
| R | 内容 |
|
|
401
|
+
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
402
|
+
| R1(A→N,14 列) | `月份(Excel 序列号)` \| `国家/地区(匹配)` \| `点击次数` \| `展示次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` \| `询盘个数` \| `(留空)` \| `(留空)` \| `暂停的系列` |
|
|
403
|
+
| R2… | 笛卡尔积:`3 个月 × N 个国家`;脚本循环读 `./<YYYY-MM>/geographic-*.json`,每行**按 `countryNameZh` 聚合**(自动把 `Mumbai / Karachi / London` 等 city / region 行归并到所属国家;未命中归并字典回落 `countryOrRegionZh`)+ 该月该国家的指标;`询盘个数` = `inquiries.json` 同月同国家 count(左 join,缺失为 0);`暂停的系列` 留空给运营手填(不要编造) |
|
|
404
|
+
|
|
405
|
+
排序:按月份升序(与运营样表"45931 / 45962 / 45992 / 46023"顺序一致——分别对应 2025-10 ~ 2026-01 起算的 Excel 日期序列号);同月内按 `点击次数` 降序。
|
|
406
|
+
|
|
407
|
+
> **月份列用 Excel 日期序列号**还是 `YYYY-MM` 字符串?运营样表用日期序列号(如 `45931`、`46023`);本模板**任选其一**,但**全表统一**;若用字符串则 R1 表头改为 `月份(YYYY-MM)`。
|
|
408
|
+
|
|
409
|
+
**`Agent 数据洞察`**(**位置**:笛卡尔积主表最末数据行下方留空 1 行接续,**A 列起**;Agent 基于本 Sheet 数据自动生成,**禁止**编造):
|
|
410
|
+
|
|
411
|
+
| # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
|
|
412
|
+
| --- | --------------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
413
|
+
| 1 | **国家月趋势 · 连续下降** | 列出 `费用` 连续 3 个月下降的国家(S → 中 → E 单调递减),按 E月消耗降序前 5 |
|
|
414
|
+
| 2 | **国家月趋势 · 连续上升** | 列出 `费用` 连续 3 个月上升的国家(S → 中 → E 单调递增),按 E月消耗降序前 5 |
|
|
415
|
+
| 3 | **新进入国家**(E 月有消耗,S 月消耗 = 0) | 列国家、E 月消耗、E 月询盘;提示"本期新铺量国家" |
|
|
416
|
+
| 4 | **退出国家**(S 月有消耗,E 月消耗 = 0) | 列国家、S 月消耗、3 月累计询盘;提示"本期已停投国家,可与暂停系列对照" |
|
|
417
|
+
| 5 | **高消耗 0 询盘国家**(与 Sheet 3 透视 1 交叉验证) | 列 3 月累计 `费用` Top10 中 3 月累计 `询盘个数` = 0 的国家 |
|
|
418
|
+
| 6 | **CPA 异常国家** | 列 3 月平均 `每次转化费用` > 整体平均 × 2 的国家(且转化数 ≥ 3,排除小样本噪声) |
|
|
419
|
+
|
|
420
|
+
**条数**:6 条为完整模板;某类无数据时该行填 `[ 无 ]`,**禁止**省略(保持出表完整)。
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
### Sheet 7 `关键词`
|
|
425
|
+
|
|
426
|
+
| R | 内容 |
|
|
427
|
+
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
428
|
+
| R1 | `关键词表现 · 账户 <id> · <分析月份>` |
|
|
429
|
+
| R2(A→J,10 列) | `关键词` \| `匹配方式` \| `系列` \| `消耗 (¥)` \| `展示` \| `点击` \| `CTR` \| `平均CPC` \| `转化` \| `CPA (¥)` |
|
|
430
|
+
| R3… | 读 `keywords-*.json` 的 `items[]`:`keyword` / `keywordMatchTypeZh`(中文匹配方式:`Broad` / `Phrase` / `Exact`)/ `campaignName` / `spend` / `impressions` / `clicks` / `ctr` / `averageCpc` / `conversions` / `costPerConversion` |
|
|
431
|
+
|
|
432
|
+
按 `转化` 降序、`消耗` 降序双排序。
|
|
433
|
+
|
|
434
|
+
**`Agent 数据洞察`**(**位置**:关键词主表最末数据行下方留空 1 行接续,**A 列起**;Agent 基于本 Sheet 数据自动生成,**禁止**编造):
|
|
435
|
+
|
|
436
|
+
| # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
|
|
437
|
+
| --- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
438
|
+
| 1 | **匹配方式占比** | `Broad`:`{n_b}` 个、占消耗 `{p_b}%`;`Phrase`:`{n_p}` 个、占消耗 `{p_p}%`;`Exact`:`{n_e}` 个、占消耗 `{p_e}%`;Broad 消耗占比 > 70% 高亮"过度依赖广泛匹配" |
|
|
439
|
+
| 2 | **高消耗 0 转化关键词**(精准止损候选) | 列 `消耗` Top20 中 `转化` = 0 的关键词,按消耗降序前 5;每条标 `关键词` + `匹配方式` + `消耗` |
|
|
440
|
+
| 3 | **CPA 异常关键词**(拖累候选) | 列 `CPA` > 整体平均 × 2 且 `转化` ≥ 2 的关键词,前 5;每条标 `关键词` + `CPA` + `转化数` |
|
|
441
|
+
| 4 | **明星关键词**(性价比候选) | 列 `CPA` < 整体平均 × 0.5 且 `转化` ≥ 3 的关键词,前 5;每条标 `关键词` + `CPA` + `转化数` |
|
|
442
|
+
| 5 | **单关键词消耗集中度** | Top3 关键词合计消耗占比 `{p3}%`;> 50% 高亮"消耗高度集中于少数关键词,风险敞口大" |
|
|
443
|
+
| 6 | **跨系列关键词重复** | 同一 `关键词` + `匹配方式` 出现在 ≥ 2 个 `系列` 中的条目数;提示"内部互抢候选" |
|
|
444
|
+
|
|
445
|
+
**条数**:6 条为完整模板;某类无数据时该行填 `[ 无 ]`。
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
### Sheet 8 `搜索字词`
|
|
450
|
+
|
|
451
|
+
| R | 内容 |
|
|
452
|
+
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
453
|
+
| R1 | `搜索字词--TOP100` |
|
|
454
|
+
| R2 | `<S> - <E>`(如 `2026年4月1日 - 2026年4月30日` 等中文区间) |
|
|
455
|
+
| R3(A→Q,17 列) | `搜索字词` \| `搜索字词匹配类型` \| `已添加/已排除` \| `广告系列` \| `广告组` \| `搜索广告关键字` \| `点击次数` \| `展示次数` \| `点击率` \| `货币代码` \| `平均每次点击费用` \| `费用` \| `绝对页首展示次数百分比` \| `页首展示次数百分比` \| `转化次数` \| `每次转化费用` \| `转化率` |
|
|
456
|
+
| R4… | 读 `search-terms-*.json`(`data[]`):`searchTermText` / `matchTypeZh` / **`queryTargetingStatusZh`**(已添加/已排除/都没有;网关字段 `queryTargetingStatus`)/ `campaignName` / `adGroupName` / `keywordText` / 数值字段;`货币代码` 来自 `list-accounts` 同账户 `currencyCode` |
|
|
457
|
+
|
|
458
|
+
按 `费用` 降序前 100。
|
|
459
|
+
|
|
460
|
+
> **关于"绝对页首展示次数百分比 / 页首展示次数百分比"**:当前 `SearchTermListRow` 类型只显式声明了通用指标,但 `[key: string]: unknown` 兜底使原始字段照常落盘。脚本应读 JSON 原始字段名(实际跑一次确认网关返回字段名,如 `absoluteTopImpressionPercentage` / `topImpressionPercentage`),命中即写、未返回则填 `—`。
|
|
461
|
+
|
|
462
|
+
**`Agent 数据洞察`**(**位置**:搜索字词主表最末数据行下方留空 1 行接续,**A 列起**;Agent 基于本 Sheet 数据自动生成,**禁止**编造):
|
|
463
|
+
|
|
464
|
+
| # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
|
|
465
|
+
| --- | ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
466
|
+
| 1 | **未添加但高转化搜索词**(候选加为关键词) | `queryTargetingStatusZh` = "都没有" 且 `转化次数` ≥ `{阈值}`,按转化降序前 10;阈值取本期搜索词转化中位数 |
|
|
467
|
+
| 2 | **已添加但 0 转化高消耗搜索词**(候选加为否定关键词) | `queryTargetingStatusZh` = "已添加" 且 `转化次数` = 0 且 `费用` > `¥{阈值}`,按消耗降序前 10;阈值取本期搜索词消耗 P75 |
|
|
468
|
+
| 3 | **无关搜索词**(意图偏离候选) | 基于 `搜索字词` 文本扫描,标出与广告组 / 关键字 主题明显不符的词(如"工厂"系列出现"价格便宜""免费""教程"等),前 5;**仅展示**,**不**自动判定,由运营会上拍板 |
|
|
469
|
+
| 4 | **匹配方式分布** | `Broad`:`{n_b}` 个、占消耗 `{p_b}%`;`Phrase`:`{n_p}` 个、占消耗 `{p_p}%`;`Exact`:`{n_e}` 个、占消耗 `{p_e}%` |
|
|
470
|
+
| 5 | **页首展示低 / 高消耗搜索词**(仅当 `页首展示次数百分比` 字段可用) | 列 `费用` Top20 中 `页首展示次数百分比` < 50% 的搜索词,前 5;提示"花了钱但很少展示到页首,出价/质量得分待优化" |
|
|
471
|
+
|
|
472
|
+
**条数**:5 条为完整模板;若网关未返回页首展示字段(第 5 条),整行填 `[ 字段不可用 ]`;其余无数据填 `[ 无 ]`。
|
|
473
|
+
|
|
474
|
+
---
|
|
475
|
+
|
|
476
|
+
## 重点国家配置(Sheet 3 大洲桶 + Sheet 4 下半区切片共用)
|
|
477
|
+
|
|
478
|
+
`focusCountries` 是一个**中文国家名数组**,决定:
|
|
479
|
+
|
|
480
|
+
1. Sheet 3 国家透视「所属大洲」列的特殊桶名(如 `印度` / `印度+印度尼西亚` / `美国` …);
|
|
481
|
+
2. Sheet 4 下半区按月二分的「重点国 / 非重点国」分桶。
|
|
482
|
+
|
|
483
|
+
**取值规则**(按优先级):
|
|
484
|
+
|
|
485
|
+
1. **运营在会议前显式指定**(最高优先级),例如:
|
|
486
|
+
|
|
487
|
+
```json
|
|
488
|
+
{ "focusCountries": ["印度"] }
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
或多国(与样表 Sheet 3「印度+印尼」桶呼应):
|
|
492
|
+
|
|
493
|
+
```json
|
|
494
|
+
{ "focusCountries": ["印度", "印度尼西亚"] }
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
2. **默认值(运营未指定时)**:取**分析月(最后一个月 E 月)`inquiries.json` 询盘数 Top1 国家**。脚本在控制台打印一行:`[focusCountry auto-pick] {E月}询盘 Top1 = {国家}({count} 条),如需调整请回填运营配置`。
|
|
498
|
+
3. **空数组兜底**:若分析月询盘 0 条,`focusCountries = []`;Sheet 3 跳过「重点国」单桶(直接走默认 5 桶里的对应大洲),Sheet 4 下半区**整段省略**并在 Sheet 标题留脚注 `[ 本期无询盘,省略国家切片 ]`。
|
|
499
|
+
|
|
500
|
+
**禁止**:在脚本里硬编码 `"印度"`、`"India"` 等具体国家名作为业务逻辑(仅 `geo-en2zh.json` / `analytics/geo-continents.json` 这种字典数据除外)。
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
## 可选:产品 → 系列前缀映射
|
|
505
|
+
|
|
506
|
+
样表里产品(`滴灌带` / `打包带` / `预制孔水带`)与系列名前缀对应(`A-滴灌带-…` / `B-打包带-…` / `C-预制孔水带设备`)。若运营给出映射,脚本可补 Sheet 3 第 3 个透视的「消耗」「CPL」列;否则**留空 + 脚注**。
|
|
507
|
+
|
|
508
|
+
映射示例(由运营每次会议前确认,不写死在模板):
|
|
509
|
+
|
|
510
|
+
```json
|
|
511
|
+
{
|
|
512
|
+
"滴灌带": ["A-滴灌带-"],
|
|
513
|
+
"打包带": ["B-打包带-"],
|
|
514
|
+
"预制孔水带": ["C-预制孔水带"]
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
脚本逻辑:`产品消耗 = sum(campaigns[campaignName 以前缀 startsWith].spend)`。
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## 与其他报告模板的差异
|
|
523
|
+
|
|
524
|
+
| 项 | `google-period-report.md` | `okki-weekly-google-client.md` | **本文(询盘分析)** |
|
|
525
|
+
| ------------------------ | ------------------------- | ------------------------------ | ---------------------------------------------- |
|
|
526
|
+
| 时间窗 | 用户给定 | 用户给定(通常 1 周) | **严格 3 个自然月** |
|
|
527
|
+
| 默认维度 | 8 维 + 追问 | 6 维固定 | **7 维固定(多 `geographic` 月度循环 3 次)** |
|
|
528
|
+
| 是否需要询盘原始数据 | 否 | 否 | **是**(用户上传 / 反问索要) |
|
|
529
|
+
| 输出形态 | 长文报告 | 客户话术 + 多 Sheet xlsx | **8 Sheet xlsx(不含客户话术)** |
|
|
530
|
+
| Excel 由谁写 | Agent 脚本(可选) | Agent 脚本 | **Agent 脚本(必需)** |
|
|
531
|
+
| 大洲映射 | 不涉及 | 不涉及 | **`references/analytics/geo-continents.json`** |
|
|
532
|
+
| 重点国家 vs 非重点国切片 | 否 | 否 | **是**(Sheet 4 下半区,重点国可配置) |
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
## 验收口径
|
|
537
|
+
|
|
538
|
+
- 用户说出 3 条触发话术之一 → AI 切到本模板(**不**走 `google-period-report.md`)。
|
|
539
|
+
- AI 反问:账户 + 分析月份 + 询盘资料(若用户未给)。
|
|
540
|
+
- AI 跑 1 次区间多维度 + 3 次月度 `geographic` 循环;产物全部落 `./snap-inquiry`。
|
|
541
|
+
- AI 产出 8 Sheet `.xlsx`,**每个数字可追溯到 `./snap-inquiry/**/\*.json`或`inquiries.json` 的具体字段\*\*。
|
|
542
|
+
- 未命中大洲映射的国家:标 `未知大洲`,**不阻塞**、**不编造**;末尾打印未命中清单。
|
|
543
|
+
- 产品 → 系列映射未给:Sheet 3 产品透视的「消耗 / CPL」列填空 + 脚注,**不分摊、不编造**。
|