Commit 323a720b91999f92f157f423ec65c781aa36245c

Authored by tangwang
1 parent fbc7f114

docs

Showing 11 changed files with 476 additions and 9 deletions   Show diff stats
docs/UA-站内全站埋点数据结构定义.md 0 → 100644
... ... @@ -0,0 +1,105 @@
  1 +# UA 站内全站埋点数据结构定义(推荐/搜索/画像统一口径)
  2 +
  3 +本文档用于定义站内全量行为采集(基于“全站埋点采集”,可落地到神策 JS SDK 二次开发),覆盖推荐、搜索、画像、转化分析等核心场景。
  4 +
  5 +## 1. 目标与约束
  6 +
  7 +- **目标**:用一套统一事件模型覆盖全站行为(Pageview / Exposure / Click / View Product / Add to Cart / Purchase / Search&Filtering / Cart&Checkout)。
  8 +- **约束**:事件需要能在“推荐/搜索请求”与“曝光-点击-加购”等链路上串联;同时需要能表达购物车/结账阶段的状态快照,用于搭配、互补、凑单、替代品推荐。
  9 +
  10 +## 2. 关键设计原则
  11 +
  12 +- **统一事件骨架**:所有事件共享同一套顶层字段(用户标识、时间、页面、trace、设备、扩展字段),业务差异放到 `event`(oneof)里。
  13 +- **可串联**:用 `trace_id` 串联一次搜索/推荐请求与后续点击、加购、详情浏览等行为;用 `session_id` 串联同一次访问会话。
  14 +- **可回放/可训练**:曝光事件尽量携带曝光商品列表、位置、模块;购物车/结账事件携带快照(items + 国家/币种/价格等)。
  15 +- **停留时长口径一致**:对 `page_view`/`view_item` 统一给出 `dwell_time_ms` 的采集口径与上报方式。
  16 +
  17 +## 3. 顶层事件模型(概念)
  18 +
  19 +每条 UA 事件为一个 `UserActionEvent`,包含:
  20 +
  21 +- **identity**:tenant / user / anonymous / device / cookie
  22 +- **time**:事件发生时间(毫秒时间戳)
  23 +- **page**:页面类型、URL、来源、模块位置信息
  24 +- **trace**:`trace_id`、`session_id`、实验信息
  25 +- **device**:OS / UA / viewport 等
  26 +- **event**:具体业务事件(page_view、exposure、click、view_item、search、filter、cart、checkout、purchase…)
  27 +- **extra**:业务扩展 KV
  28 +
  29 +> proto 草案见 `docs/proto/user_action.proto`(本次补充文件)。
  30 +
  31 +## 4. 核心字段说明
  32 +
  33 +### 4.1 标识体系(强烈建议)
  34 +
  35 +- **tenant_id**:租户/店铺/商家维度的隔离主键。
  36 +- **user_id**:登录用户 ID(未登录可为空)。
  37 +- **anonymous_id**:匿名用户 ID(建议 Cookie 级别稳定,登录后可与 user_id 做归因合并)。
  38 +- **device_id**:设备指纹(可选;Web 端更推荐 anonymous_id + cookie_id)。
  39 +- **cookie_id**:首次访问生成的持久化 Cookie ID(与 anonymous_id 可以一致,也可分开)。
  40 +
  41 +### 4.2 trace_id(最重要)
  42 +
  43 +**定义**:串联一次“搜索/推荐请求(曝光)”与后续点击、详情、加购等行为的请求级会话 ID,同时用于串联内部技术模块(召回/排序/重排等子模块日志)。
  44 +
  45 +**规则建议**:
  46 +
  47 +- **新搜索/新推荐刷新**:生成新的 `trace_id`。
  48 +- **搜索翻页**:沿用原 `trace_id`,用 `page_number` 区分页(见 `SearchEvent`)。
  49 +- **曝光 → 点击/详情/加购**:沿用产生曝光的 `trace_id`,用于表达“该转化源自哪一次曝光/哪一次请求”。
  50 +- **购买/支付**:如果链路被购物车长时间阻隔,串联成本高,可不强制要求延续 `trace_id`;但建议在 `PurchaseEvent.attribution_trace_id` 上尽力保留“主要来源”的 trace(若可得)。
  51 +
  52 +### 4.3 停留时长(dwell_time_ms)
  53 +
  54 +**适用事件**:
  55 +
  56 +- `PageViewEvent`:用户在该页面的停留时长
  57 +- `ViewItemEvent`:用户在详情页/商品内容上的停留时长(可与 pageview 相同,也可更精细)
  58 +
  59 +**采集口径建议(Web)**:
  60 +
  61 +- 在 `pagehide` / `beforeunload` / SPA 路由切换时计算当前页面停留:`now - enter_time`。
  62 +- 若页面进入后立即产生 `page_view`,则可在离开页面时补发一条 `page_view_end`(或在同一条事件里填充 `dwell_time_ms`,需要延迟上报)。
  63 +- 对详情页:可按“进入详情页到离开详情页”计算;若停留时长无法计算,允许不上报或置 0,但需要在文档/ETL 中区分“缺失 vs 真实 0”。
  64 +
  65 +## 5. 必须覆盖的事件清单(推荐)
  66 +
  67 +- **Pageview**
  68 + - 分类页、活动页、列表页、首页、店铺页、购物车页、结账页等
  69 + - *最好携带该页面曝光的商品列表*(见 `ExposureEvent`,或在 `PageViewEvent.exposed_items` 携带“本页首屏/本次渲染”曝光)
  70 +- **Exposure / Click**
  71 + - 列表/推荐位曝光与点击(必须包含 position / module_id / item)
  72 +- **View product(详情页浏览)**
  73 + - 包含 `dwell_time_ms`
  74 +- **Add to cart**
  75 + - 商品信息 + 数量 + 价格(若可得)+ 当前 cart 快照(若可得)
  76 +- **Purchase**
  77 + - 订单信息(order_id / currency / total)+ 购买 items
  78 +- **On-site Search & Filtering**
  79 + - 搜索词、建议词、排序、筛选条件(结构化,避免仅 JSON 字符串)
  80 + - 搜索结果曝光/点击建议归入 Exposure/Click,但必须携带 `search_context`
  81 +- **Cart Logic / Checkout 状态**
  82 + - `cart_snapshot`:购物车当前 items 及属性(qty、price、category、brand…)
  83 + - `checkout`:shipping_country、step、payment_method(如可得)
  84 +
  85 +## 6. 落地建议(神策 JS SDK 二次开发)
  86 +
  87 +- **事件名**:建议统一用一个事件名(如 `ua_event`),将 `action_type`(主类型)+ `event_id`(子类型,可选)作为属性;或按神策习惯拆分事件名,但必须保证字段一致。
  88 +- **批量上报**:曝光事件可批量(一屏/一次渲染一次上报)以降低量级;点击/加购/购买等强转化事件单条实时上报。
  89 +- **字段扩展**:放入 `extra.debug_info`,严禁在顶层无限加字段造成版本失控。
  90 +
  91 +## 7. proto 草案
  92 +
  93 +见 `docs/proto/user_action.proto`。
  94 +
  95 +### 7.1 枚举命名说明(避免 proto 枚举值冲突)
  96 +
  97 +为兼容较旧版本 `protoc`(枚举值采用 package 级作用域),本 proto 中枚举值都带前缀:
  98 +
  99 +- **ActionType**:`ACTION_TYPE_*`(如 `ACTION_TYPE_PAGEVIEW`)
  100 +- **EventId**:`EVENT_ID_*`(如 `EVENT_ID_ADD_TO_CART`)
  101 +- **PageType**:`PAGE_TYPE_*`
  102 +- **SortType**:`SORT_TYPE_*`
  103 +- **CheckoutStep**:`CHECKOUT_STEP_*`
  104 +
  105 +
... ...
docs/blog/个性化.md deleted
... ... @@ -1,9 +0,0 @@
1   -
2   -| 数据类型 | 采集方式 | 应用场景 | 示例 |
3   -| ---------- | ----------------- | ---------- | -------------------------------------- |
4   -| **流量来源** | UTM参数、referrer解析 | 欢迎页差异化展示 | Instagram用户看到"网红同款",Facebook用户看到"好友购买" |
5   -| **页面行为** | 前端埋点、SDK | 实时意图判断 | 商品页停留>30秒→触发"库存紧张"提示 |
6   -| **交易数据** | 订单API、Webhook | RFM分群、复购预测 | 近30天购买3次+客单价>\$100→标记"高价值用户" |
7   -| **用户属性** | 注册表单、CRM导入 | 精准分群 | 年龄>35岁+女性→推荐抗衰老护肤品 |
8   -| **设备/环境** | User-Agent、IP地理定位 | 体验适配 | iOS用户→App下载引导,安卓用户→Google Pay支付 |
9   -| **邮箱/手机号** | 登录、订阅(需授权) | 跨渠道唤醒 | 弃购后2小时发邮件,展示"最近浏览"抽屉 |
docs/Shopify生态-个性化营销SaaS如何获取外部用户信息与个性化信号.md renamed to docs/blog/全渠道数据整合、外部数据打通/Shopify生态-个性化营销SaaS如何获取外部用户信息与个性化信号.md
... ... @@ -291,4 +291,14 @@
291 291 - Shopify Help Center(Audiences/隐私/营销报告等):`https://help.shopify.com/`
292 292 - Shopify Audiences(受众类型说明等,help center 页面为准):`https://help.shopify.com/`
293 293  
  294 +### 7.1 关联平台(广告/社交)官方入口
  295 +
  296 +- **Meta / Facebook**
  297 + - [Meta Conversions API](https://developers.facebook.com/docs/marketing-api/conversions-api/)
  298 + - [Meta Marketing API](https://developers.facebook.com/docs/marketing-api/)
  299 +- **Google**
  300 + - [Google Ads API(Start)](https://developers.google.com/google-ads/api/docs/start)
  301 +- **TikTok**
  302 + - [TikTok for Business / Marketing API Docs](https://ads.tiktok.com/marketing_api/docs)
  303 +
294 304  
... ...
docs/全渠道数据整合-广告平台S2S对接手册.md renamed to docs/blog/全渠道数据整合、外部数据打通/全渠道数据整合-广告平台S2S对接手册.md
... ... @@ -406,4 +406,19 @@ SA360 çš„å…³é”®ä¸æ˜¯â€œå¤šæ‹¿åˆ°ä»€ä¹ˆç”¨æˆ·è¡Œä¸ºâ€ï¼Œè€Œæ˜¯â€œå¤šä¸€å¥—ä¼ä¸
406 406 - **哈希规则**:邮箱/手机å·å¿…须标准化åŽå†å“ˆå¸Œï¼ˆSHA-256 等),åªåœ¨â€œç”¨äºŽåŒ¹é…â€çš„å¿…è¦èŒƒå›´å†…传输
407 407 - **æ•°æ®æœ€å°åŒ–**ï¼šä¸æ”¶é›†ä¸å¿…è¦çš„ PII;对 `referrer/landing_url` åšè„±æ•ä¸Žå‚æ•°ç™½åå•
408 408  
  409 +---
  410 +
  411 +## 9. å‚考链接(官方入å£ï¼‰
  412 +
  413 +- **Meta / Facebook**
  414 + - [Meta Conversions API](https://developers.facebook.com/docs/marketing-api/conversions-api/)
  415 + - [Meta Marketing API](https://developers.facebook.com/docs/marketing-api/)
  416 + - [Facebook Login(OAuth 手动æµç¨‹ï¼‰](https://developers.facebook.com/docs/facebook-login/guides/advanced/manual-flow/)
  417 +- **Google**
  418 + - [Google Ads API(Start)](https://developers.google.com/google-ads/api/docs/start)
  419 + - [Google Ads API OAuth(Overview)](https://developers.google.com/google-ads/api/docs/oauth/overview)
  420 +- **TikTok**
  421 + - [TikTok for Business / Marketing API Docs](https://ads.tiktok.com/marketing_api/docs)
  422 + - [TikTok Events API(文档入å£ï¼‰](https://ads.tiktok.com/marketing_api/docs?id=1701890979375106)
  423 +
409 424  
... ...
docs/用户匹配与外部数据打通-平台官方机制提权.md renamed to docs/blog/全渠道数据整合、外部数据打通/用户匹配与外部数据打通-平台官方机制提权.md
... ... @@ -278,4 +278,19 @@ TikTok 场景下最常见的串联信号:
278 278 - 全量 S2S 闭环、归因标签字段、端到端案例(更偏“怎么接入平台”):`docs/全渠道数据整合-广告平台S2S对接手册.md`
279 279 - 本文(更偏“为什么这样能匹配、哪些字段/机制能提权匹配率、跨设备怎么做”):`docs/用户匹配与外部数据打通-平台官方机制提权.md`
280 280  
  281 +---
  282 +
  283 +## 9. 参考链接(官方入口)
  284 +
  285 +- **Meta / Facebook**
  286 + - [Meta Conversions API](https://developers.facebook.com/docs/marketing-api/conversions-api/)
  287 + - [Meta Marketing API](https://developers.facebook.com/docs/marketing-api/)
  288 + - [Facebook Login(OAuth 手动流程)](https://developers.facebook.com/docs/facebook-login/guides/advanced/manual-flow/)
  289 +- **Google**
  290 + - [Google Ads API(Start)](https://developers.google.com/google-ads/api/docs/start)
  291 + - [Google Ads API OAuth(Overview)](https://developers.google.com/google-ads/api/docs/oauth/overview)
  292 +- **TikTok**
  293 + - [TikTok for Business / Marketing API Docs](https://ads.tiktok.com/marketing_api/docs)
  294 + - [TikTok Events API(文档入口)](https://ads.tiktok.com/marketing_api/docs?id=1701890979375106)
  295 +
281 296  
... ...
docs/竞品参考文档/Bloomreach-用户数据获取技术方案.md renamed to docs/blog/全渠道数据整合、外部数据打通/竞品参考文档/Bloomreach-用户数据获取技术方案.md
... ... @@ -132,4 +132,16 @@ Engagement 类平台通常会:
132 132 - 身份合并:匿名 → email/phone/customer_id(确定性优先)
133 133 - 触达互动回流(open/click/退订)是“营销型个性化”的关键外部信号
134 134  
  135 +---
  136 +
  137 +## 7. 参考链接(官方/公开入口)
  138 +
  139 +- **Bloomreach**
  140 + - [Bloomreach 文档中心(入口)](https://documentation.bloomreach.com/)
  141 + - [Bloomreach Discovery Web SDK(公开文档)](https://bloomreach.github.io/discovery-web-sdk/index.html)
  142 + - [Bloomreach 官网 Docs(入口)](https://www.bloomreach.com/en/docs)
  143 +- **关联阅读(本仓库)**
  144 + - `docs/全渠道数据整合-广告平台S2S对接手册.md`
  145 + - `docs/用户匹配与外部数据打通-平台官方机制提权.md`
  146 +
135 147  
... ...
docs/竞品参考文档/DynamicYield-用户数据获取技术方案.md renamed to docs/blog/全渠道数据整合、外部数据打通/竞品参考文档/DynamicYield-用户数据获取技术方案.md
... ... @@ -133,4 +133,14 @@ DY 的 A/B 测试与个性化要成立,必须同时拥有:
133 133 - purchase 必须 S2S 幂等回传(order_id)
134 134 - 广告平台闭环:click id + S2S 回传 + 报表富化(见 `docs/用户匹配与外部数据打通-平台官方机制提权.md`)
135 135  
  136 +---
  137 +
  138 +## 7. 参考链接(官方/公开入口)
  139 +
  140 +- **Dynamic Yield**
  141 + - [Dynamic Yield Support Center(支持文档入口)](https://support.dynamicyield.com/hc/en-us)
  142 +- **关联阅读(本仓库)**
  143 + - `docs/全渠道数据整合-广告平台S2S对接手册.md`
  144 + - `docs/用户匹配与外部数据打通-平台官方机制提权.md`
  145 +
136 146  
... ...
docs/竞品参考文档/Nosto-用户数据获取技术方案.md renamed to docs/blog/全渠道数据整合、外部数据打通/竞品参考文档/Nosto-用户数据获取技术方案.md
... ... @@ -195,4 +195,17 @@ Nosto 邀サ莠ァ蜩∝シコ隹噪窶懆★蜷域頗邏「荳守、セ莠、蟷ウ蜿ー謨ー謐ョ窶晢シ悟キ・遞倶ク企壼ク
195 195 - **霄ォ莉ス蜷亥ケカ荳サ體セ霍ッ**啾nonymous_id 竊 customer_id/email/phone育。ョ螳壽ァ莨伜
196 196 - **蟷ソ蜻雁ケウ蜿ー髣ュ邇ッ**喞lick id + S2S 蝗樔シ + 謚・陦ィ蟇悟喧井ク崎ヲ∽セ晁オ問懷ケウ蜿ー蝗樔シ逕ィ謌キ陦御クコ窶晢シ
197 197  
  198 +---
  199 +
  200 +## 8. 蜿り得謗・亥ョ俶婿/蜈ャ蠑蜈・蜿」
  201 +
  202 +- **Nosto**
  203 + - [Nosto 螳倡ス曽(https://www.nosto.com/)
  204 + - [Nosto Tech Docs域枚譯」蜈・蜿」云(https://docs.nosto.com/)
  205 + - [Nosto Support Center域髪謖∵枚譯」蜈・蜿」云(https://support.nosto.com/)
  206 + - [Nosto Magento2 髮亥シ貅蝉サ灘コ難シ云(https://github.com/Nosto/nosto-magento2)
  207 +- **蜈ウ閨秘隸サ域悽莉灘コ難シ**
  208 + - `docs/蜈ィ貂驕捺焚謐ョ謨エ蜷-蟷ソ蜻雁ケウ蜿ーS2S蟇ケ謗・謇句.md`
  209 + - `docs/逕ィ謌キ蛹ケ驟堺ク主、夜Κ謨ー謐ョ謇馴-蟷ウ蜿ー螳俶婿譛コ蛻カ謠先揀.md`
  210 +
198 211  
... ...
docs/竞品参考文档/prefixbox_api.md renamed to docs/blog/全渠道数据整合、外部数据打通/竞品参考文档/prefixbox_api.md
docs/竞品参考文档/电商个性化推荐 SaaS 技术方案:数据获取与打通.md renamed to docs/blog/全渠道数据整合、外部数据打通/竞品参考文档/电商个性化推荐 SaaS 技术方案:数据获取与打通.md
docs/proto/user_action.proto 0 → 100644
... ... @@ -0,0 +1,296 @@
  1 +syntax = "proto3";
  2 +
  3 +package ua.v1;
  4 +
  5 +// UA: 站内全站埋点统一事件模型(推荐/搜索/画像/转化)
  6 +//
  7 +// 设计要点:
  8 +// - 单条事件统一骨架(identity/time/page/trace/device + oneof event)
  9 +// - trace_id 串联一次搜索/推荐请求产生的曝光与后续点击/详情/加购等
  10 +// - 支持 pageview 携带曝光列表、搜索筛选上下文、购物车/结账快照、购买明细
  11 +
  12 +// 详细事件子类型(可选),用于更细粒度区分同一主类型下的来源/动作。
  13 +// 例如:CLICK + SEARCH_RESULT_ITEM_CLICK / RECOMMEND_ITEM_CLICK
  14 +enum EventId {
  15 + EVENT_ID_UNSPECIFIED = 0;
  16 +
  17 + // 搜索相关 (1-99)
  18 + EVENT_ID_SEARCH_SUBMIT = 1;
  19 + EVENT_ID_SEARCH_SUGGESTION_CLICK = 2;
  20 + EVENT_ID_SEARCH_RESULT_EXPOSURE = 3;
  21 + EVENT_ID_SEARCH_RESULT_ITEM_CLICK = 4;
  22 +
  23 + // 推荐相关 (100-199)
  24 + EVENT_ID_RECOMMEND_REQUEST = 100;
  25 + EVENT_ID_RECOMMEND_EXPOSURE = 101;
  26 + EVENT_ID_RECOMMEND_ITEM_CLICK = 102;
  27 +
  28 + // 页面/浏览 (200-299)
  29 + EVENT_ID_PAGE_VIEW = 200;
  30 + EVENT_ID_VIEW_ITEM = 201;
  31 +
  32 + // 购物车/结账 (300-399)
  33 + EVENT_ID_ADD_TO_CART = 300;
  34 + EVENT_ID_REMOVE_FROM_CART = 301;
  35 + EVENT_ID_CART_VIEW = 302;
  36 + EVENT_ID_CHECKOUT_STEP_VIEW = 330;
  37 + EVENT_ID_CHECKOUT_STEP_COMPLETE = 331;
  38 +
  39 + // 购买 (400-499)
  40 + EVENT_ID_PURCHASE = 400;
  41 + EVENT_ID_PAYMENT_SUCCESS = 401;
  42 +}
  43 +
  44 +// 行为主类型(用于统计/分流;细分用 EventId 或各事件内字段表达)
  45 +enum ActionType {
  46 + ACTION_TYPE_UNSPECIFIED = 0;
  47 + ACTION_TYPE_PAGEVIEW = 1;
  48 + ACTION_TYPE_EXPOSURE = 2;
  49 + ACTION_TYPE_CLICK = 3;
  50 + ACTION_TYPE_VIEW_ITEM = 4;
  51 + ACTION_TYPE_ADD_TO_CART = 5;
  52 + ACTION_TYPE_REMOVE_FROM_CART = 6;
  53 + ACTION_TYPE_CART = 7;
  54 + ACTION_TYPE_CHECKOUT = 8;
  55 + ACTION_TYPE_PURCHASE = 9;
  56 + ACTION_TYPE_SEARCH = 10;
  57 + ACTION_TYPE_FILTER = 11;
  58 +}
  59 +
  60 +// 页面类型(可按业务扩展;无法归类时用 OTHER 并填 page_id/page_name/url)
  61 +enum PageType {
  62 + PAGE_TYPE_UNSPECIFIED = 0;
  63 + PAGE_TYPE_HOME = 1;
  64 + PAGE_TYPE_SEARCH_RESULT = 2;
  65 + PAGE_TYPE_CATEGORY_PAGE = 3;
  66 + PAGE_TYPE_COLLECTION_PAGE = 4; // 活动页/专题页/聚合页
  67 + PAGE_TYPE_PRODUCT_DETAIL = 5;
  68 + PAGE_TYPE_CART_PAGE = 6;
  69 + PAGE_TYPE_CHECKOUT_PAGE = 7;
  70 + PAGE_TYPE_ORDER_CONFIRM = 8;
  71 + PAGE_TYPE_MERCHANT_SHOP = 9;
  72 + PAGE_TYPE_OTHER = 99;
  73 +}
  74 +
  75 +// 排序方式(无法覆盖时,用 CUSTOM 并填 sort_key)
  76 +enum SortType {
  77 + SORT_TYPE_UNSPECIFIED = 0;
  78 + SORT_TYPE_RELEVANCE = 1;
  79 + SORT_TYPE_PRICE_ASC = 2;
  80 + SORT_TYPE_PRICE_DESC = 3;
  81 + SORT_TYPE_SALES_DESC = 4;
  82 + SORT_TYPE_NEWEST_DESC = 5;
  83 + SORT_TYPE_CUSTOM = 99;
  84 +}
  85 +
  86 +// 结账阶段(可按业务扩展)
  87 +enum CheckoutStep {
  88 + CHECKOUT_STEP_UNSPECIFIED = 0;
  89 + CHECKOUT_STEP_CART = 1;
  90 + CHECKOUT_STEP_SHIPPING = 2;
  91 + CHECKOUT_STEP_PAYMENT = 3;
  92 + CHECKOUT_STEP_REVIEW = 4;
  93 + CHECKOUT_STEP_COMPLETE = 5;
  94 +}
  95 +
  96 +message UserActionEvent {
  97 + // 基础标识
  98 + string tenant_id = 1; // 租户/店铺/商家ID
  99 + string user_id = 2; // 登录用户ID(未登录可为空)
  100 + string anonymous_id = 3; // 匿名用户ID(建议 cookie 级别稳定)
  101 + string device_id = 4; // 设备指纹(可选)
  102 + string ip = 5; // 客户端IP(可选)
  103 +
  104 + // 时间
  105 + int64 event_timestamp_ms = 6; // 行为发生时刻(毫秒)
  106 +
  107 + // 事件类型
  108 + ActionType action_type = 7; // 行为主类型
  109 + EventId event_id = 8; // 详细事件子类型(可选)
  110 +
  111 + // 公共上下文
  112 + PageInfo page = 9;
  113 + TraceInfo trace = 10;
  114 + DeviceProfile device = 11;
  115 + ContextProfile context = 12;
  116 +
  117 + // 具体事件载荷
  118 + oneof event {
  119 + PageViewEvent page_view = 20;
  120 + ExposureEvent exposure = 21;
  121 + ClickEvent click = 22;
  122 + ViewItemEvent view_item = 23;
  123 + SearchEvent search = 24;
  124 + FilterEvent filter = 25;
  125 + CartEvent cart = 26;
  126 + CheckoutEvent checkout = 27;
  127 + PurchaseEvent purchase = 28;
  128 + }
  129 +
  130 + Extra extra = 90; // 扩展字段(灵活KV)
  131 +}
  132 +
  133 +message PageInfo {
  134 + PageType page_type = 1;
  135 + string page_id = 2; // 页面唯一标识(如活动页ID/类目ID/自定义key)
  136 + string page_name = 3; // 可读名称(可选)
  137 + string url = 4; // 完整URL(可选)
  138 + string path = 5; // path(可选)
  139 + string refer_url = 6; // 来源URL(可选)
  140 + string lang = 7; // 页面语言(可选)
  141 +
  142 + // 模块信息:用于表达曝光/点击发生在哪个模块
  143 + string module_id = 20; // e.g. "search_result", "recommend_home"
  144 + int32 position = 21; // 在本屏/本列表的位置(从0开始;无则填 -1)
  145 +}
  146 +
  147 +message TraceInfo {
  148 + // 串联一次搜索/推荐请求产生的曝光与后续点击/详情/加购
  149 + string trace_id = 1;
  150 +
  151 + // 会话ID(同一次访问,跨多个 trace_id)
  152 + string session_id = 2;
  153 +
  154 + // 实验/流量
  155 + string abtest_id = 10; // 实验ID、流量组标识
  156 +}
  157 +
  158 +message ContextProfile {
  159 + // 业务自定义来源(如 "shopify-web", "app", "mini-program")
  160 + string source = 1;
  161 +}
  162 +
  163 +message DeviceProfile {
  164 + string os = 1; // e.g. "Windows", "macOS", "iOS", "Android"
  165 + string user_agent = 2; // 浏览器UA
  166 + string cookie_id = 3; // 首次访问生成的持久化Cookie ID
  167 + int32 viewport_width = 4;
  168 + int32 viewport_height = 5;
  169 +}
  170 +
  171 +// 商品/内容基础信息(埋点侧尽量带齐,便于离线特征构建)
  172 +message Item {
  173 + string spu_id = 1;
  174 + string sku_id = 2;
  175 + string snapshot_id = 3; // 特征快照ID(可选)
  176 + string category_id = 4;
  177 + string brand_id = 5;
  178 + string title = 6;
  179 +
  180 + // 可选:价格与属性(若能拿到)
  181 + string currency = 20; // e.g. "USD"
  182 + double price = 21; // 单价
  183 + map<string, string> properties = 30; // 颜色/尺码等扩展属性
  184 +}
  185 +
  186 +// 搜索上下文:既可作为 SearchEvent 的主体,也可挂载在 exposure/click 上
  187 +message SearchContext {
  188 + string search_query = 1;
  189 + string suggestion_used = 2;
  190 + int32 result_count = 3;
  191 + int32 page_number = 4; // 从1开始
  192 + SortType sort_type = 5;
  193 + string sort_key = 6; // sort_type=CUSTOM 时使用
  194 + repeated FilterParam filters = 7;
  195 +}
  196 +
  197 +message FilterParam {
  198 + string key = 1; // e.g. "color", "price"
  199 + repeated string values = 2; // e.g. ["red","blue"]
  200 + string op = 3; // e.g. "in", "range"
  201 +}
  202 +
  203 +// Pageview:建议可携带“本次渲染曝光的商品列表”(用于特征与归因)
  204 +message PageViewEvent {
  205 + int64 dwell_time_ms = 1; // 停留时长(如无法计算可缺省)
  206 + repeated ExposedItem exposed_items = 2; // 可选:首屏/本次渲染曝光
  207 + SearchContext search_context = 3; // 若该 pageview 属于搜索结果页,可填
  208 +}
  209 +
  210 +// 曝光:可用于列表页/推荐位/活动页等
  211 +message ExposureEvent {
  212 + repeated ExposedItem items = 1; // 一次曝光可批量上报多商品
  213 + SearchContext search_context = 2; // 搜索流量曝光需填(推荐流量可不填)
  214 +}
  215 +
  216 +message ExposedItem {
  217 + Item item = 1;
  218 + int32 position = 2; // 从0开始
  219 + string module_id = 3; // e.g. "search_result"
  220 +}
  221 +
  222 +// 点击:用于列表/推荐位点击商品等
  223 +message ClickEvent {
  224 + Item item = 1;
  225 + int32 position = 2;
  226 + string module_id = 3;
  227 + SearchContext search_context = 4; // 若点击发生在搜索结果中,需填
  228 +}
  229 +
  230 +// 详情页浏览:建议与 Pageview 区分,便于训练“商品级浏览”序列
  231 +message ViewItemEvent {
  232 + Item item = 1;
  233 + int64 dwell_time_ms = 2; // 在详情页停留(建议)
  234 +}
  235 +
  236 +// 搜索:提交/改词/使用建议词等
  237 +message SearchEvent {
  238 + SearchContext search_context = 1;
  239 +}
  240 +
  241 +// 筛选:筛选条件变更(也可与搜索事件合并;这里单独提供便于实时系统消费)
  242 +message FilterEvent {
  243 + SearchContext search_context = 1;
  244 +}
  245 +
  246 +// 购物车:加购/移除/查看等,建议尽量携带快照
  247 +message CartEvent {
  248 + // 动作相关商品(对 add/remove 有意义)
  249 + Item item = 1;
  250 + int32 quantity = 2; // 加/减数量(可选)
  251 +
  252 + CartSnapshot cart_snapshot = 10; // 当前购物车快照(强烈建议)
  253 +}
  254 +
  255 +message CartSnapshot {
  256 + repeated CartItem items = 1;
  257 + string currency = 2;
  258 + double cart_total_value = 3; // 购物车总价(可选)
  259 +}
  260 +
  261 +message CartItem {
  262 + Item item = 1;
  263 + int32 quantity = 2;
  264 + double line_total_value = 3; // 行总价(可选)
  265 +}
  266 +
  267 +// 结账:shipping/payment 等阶段状态
  268 +message CheckoutEvent {
  269 + CheckoutStep step = 1;
  270 + string shipping_country = 2; // 用于跨境/税费/配送推荐
  271 + string payment_method = 3; // 可选
  272 + CartSnapshot cart_snapshot = 10;
  273 +}
  274 +
  275 +// 购买:订单完成/支付成功等
  276 +message PurchaseEvent {
  277 + string order_id = 1;
  278 + string currency = 2;
  279 + double order_total_value = 3;
  280 + repeated PurchasedItem items = 4;
  281 +
  282 + // 若能保留主要来源 trace,用于归因(可选)
  283 + string attribution_trace_id = 10;
  284 +}
  285 +
  286 +message PurchasedItem {
  287 + Item item = 1;
  288 + int32 quantity = 2;
  289 + double paid_price = 3; // 实付单价(可选)
  290 +}
  291 +
  292 +message Extra {
  293 + map<string, string> debug_info = 1;
  294 +}
  295 +
  296 +
... ...