Commit 323a720b91999f92f157f423ec65c781aa36245c
1 parent
fbc7f114
docs
Showing
11 changed files
with
476 additions
and
9 deletions
Show diff stats
| @@ -0,0 +1,105 @@ | @@ -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,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,4 +291,14 @@ | ||
| 291 | - Shopify Help Center(Audiences/隐私/营销报告等):`https://help.shopify.com/` | 291 | - Shopify Help Center(Audiences/隐私/营销报告等):`https://help.shopify.com/` |
| 292 | - Shopify Audiences(受众类型说明等,help center 页面为准):`https://help.shopify.com/` | 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,4 +406,19 @@ SA360 çš„å…³é”®ä¸æ˜¯â€œå¤šæ‹¿åˆ°ä»€ä¹ˆç”¨æˆ·è¡Œä¸ºâ€ï¼Œè€Œæ˜¯â€œå¤šä¸€å¥—ä¼ä¸ | ||
| 406 | - **哈希规则**:邮箱/手机å·å¿…é¡»æ ‡å‡†åŒ–åŽå†å“ˆå¸Œï¼ˆSHA-256 ç‰ï¼‰ï¼Œåªåœ¨â€œç”¨äºŽåŒ¹é…â€çš„å¿…è¦èŒƒå›´å†…ä¼ è¾“ | 406 | - **哈希规则**:邮箱/手机å·å¿…é¡»æ ‡å‡†åŒ–åŽå†å“ˆå¸Œï¼ˆSHA-256 ç‰ï¼‰ï¼Œåªåœ¨â€œç”¨äºŽåŒ¹é…â€çš„å¿…è¦èŒƒå›´å†…ä¼ è¾“ |
| 407 | - **æ•°æ®æœ€å°åŒ–**ï¼šä¸æ”¶é›†ä¸å¿…è¦çš„ PII;对 `referrer/landing_url` åšè„±æ•ä¸Žå‚æ•°ç™½åå• | 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,4 +278,19 @@ TikTok 场景下最常见的串联信号: | ||
| 278 | - 全量 S2S 闭环、归因标签字段、端到端案例(更偏“怎么接入平台”):`docs/全渠道数据整合-广告平台S2S对接手册.md` | 278 | - 全量 S2S 闭环、归因标签字段、端到端案例(更偏“怎么接入平台”):`docs/全渠道数据整合-广告平台S2S对接手册.md` |
| 279 | - 本文(更偏“为什么这样能匹配、哪些字段/机制能提权匹配率、跨设备怎么做”):`docs/用户匹配与外部数据打通-平台官方机制提权.md` | 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,4 +132,16 @@ Engagement 类平台通常会: | ||
| 132 | - 身份合并:匿名 → email/phone/customer_id(确定性优先) | 132 | - 身份合并:匿名 → email/phone/customer_id(确定性优先) |
| 133 | - 触达互动回流(open/click/退订)是“营销型个性化”的关键外部信号 | 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,4 +133,14 @@ DY 的 A/B 测试与个性化要成立,必须同时拥有: | ||
| 133 | - purchase 必须 S2S 幂等回传(order_id) | 133 | - purchase 必须 S2S 幂等回传(order_id) |
| 134 | - 广告平台闭环:click id + S2S 回传 + 报表富化(见 `docs/用户匹配与外部数据打通-平台官方机制提权.md`) | 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,4 +195,17 @@ Nosto 邀サ莠ァ蜩∝シコ隹噪窶懆★蜷域頗邏「荳守、セ莠、蟷ウ蜿ー謨ー謐ョ窶晢シ悟キ・遞倶ク企壼ク | ||
| 195 | - **霄ォ莉ス蜷亥ケカ荳サ體セ霍ッ**啾nonymous_id 竊 customer_id/email/phone育。ョ螳壽ァ莨伜 | 195 | - **霄ォ莉ス蜷亥ケカ荳サ體セ霍ッ**啾nonymous_id 竊 customer_id/email/phone育。ョ螳壽ァ莨伜 |
| 196 | - **蟷ソ蜻雁ケウ蜿ー髣ュ邇ッ**喞lick id + S2S 蝗樔シ + 謚・陦ィ蟇悟喧井ク崎ヲ∽セ晁オ問懷ケウ蜿ー蝗樔シ逕ィ謌キ陦御クコ窶晢シ | 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
| @@ -0,0 +1,296 @@ | @@ -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 | + |