前端埋点需求
基于当前
cash_center、wp_h5、roovault已实现埋点链路整理。本期为全新上线,不考虑旧版本兼容;目标是建立统一事件模型、统一字段、敏感信息治理和验收口径。
1. 目标
- 还原用户在借款、提现、还款、绑卡、KYC、登录、补件等核心路径中的行为漏斗。
- 支持按产品、渠道、用户、设备、页面、订单、支付方式、绑卡方式等维度分析转化和失败原因。
- 统一 H5 与 Android 原生埋点语义,避免同一行为多套命名。
- 禁止将卡号、CVV、手机号、BVN/NIN、姓名、地址、收入等敏感值拼进
event_name。 - 埋点失败不能影响业务流程,但需要具备调试和抽样校验能力。
2. 当前实现约束
| 端 | 当前通道 | 当前字段 | 主要问题 |
|---|---|---|---|
cash_center | /dc/buriedPointBatch | 公共上下文、事件名、页面名、事件自定义属性 | 缺 bvn/channel 时不上报;大量字段拼进 event_name;路由自动进出页被注释 |
wp_h5 | /dc/buriedPointBatch/v2 | 公共上下文、事件名、页面名、事件自定义属性 | 字段会被改成 <eventName>_<field>;与 cash_center 协议不完全一致 |
roovault | SensorsDataAPI / DataHub | page, eventName, SDK公共字段 | 原生主要上报 page + eventName,自定义字段弱;业务值也存在拼接进事件名 |
3. 统一上报模型
所有埋点统一按事件名、页面名、事件类型、公共上下文和事件自定义属性定义。本期不并行上报旧事件,也不保留旧事件兼容字段。具体由神策 SDK、H5 SDK、Bridge 或现有 HTTP 封装决定如何序列化和发送。
3.1 事件类型
| event_type | 含义 | 触发时机 |
|---|---|---|
view | 页面或模块曝光 | 页面进入、弹窗展示、模块进入视口 |
leave | 页面或模块离开 | 路由离开、WebView 关闭、页面失活 |
click | 点击行为 | 用户主动点击按钮、列表项、Tab、选择项、清空、协议、关闭按钮;提交按钮也属于点击 |
input | 输入行为 | 文本或数字输入框聚焦、失焦及填写状态变化,不上报输入原文 |
result | 业务结果 | 接口成功/失败、客户端校验成功/失败、页面状态结果、第三方回调结果 |
popup_view | 弹窗曝光 | 弹窗展示 |
popup_click | 弹窗点击 | 弹窗主按钮、关闭、取消 |
performance | 性能指标 | 页面加载后、关键资源完成后 |
3.2 命名规则
事件名格式:
<scene>_<page_or_module>_<action>示例:
| 推荐事件 | 不推荐事件 |
|---|---|
bank_card_card_number_focus | BankCard_CardNumber_5399**** |
bank_card_submit_click | BankCard_submit |
withdraw_result_popup_click | service_evaluation_pop_submit_click |
kyc_bvn_confirm_click | BVNVerify_confirm_12345678901 |
规则:
- 全部小写,下划线分隔。
event_name只描述行为,不携带运行时值。- 运行时值作为事件自定义属性传入,且必须脱敏或枚举化。
- 同一行为在 H5 和 Android 使用同一个事件名。
- 本期为全新上线,不考虑旧事件名兼容;所有研发、测试和数据验收均以新事件名为准。
3.3 最新代码页面埋点基线
以下结论以本次刷新后的分支为准:cash_center/dev 提交 2bf88f2、wp_h5/dev 提交 2381724、Android roovault/origin/develop 提交 3ae2c97。本表用于区分“代码中已经出现的事件”和“本需求要求统一实现的事件”,不代表旧事件名继续保留。
| 代码模块 | 当前页面/模块 | 当前代码中的事件形态 | 当前实现状态 | 本期处理原则 |
|---|---|---|---|---|
cash_center | payMethod | enter_payMethod、leave_payMethod、pay_confirm、pay_method_{repayType} | 页面中仍有调用,但 src/assets/js/report.js 的 HTTP、Native、SDK 上报逻辑已注释,实际不会形成统一数据 | 迁移为还款方式页、支付方式选择、确认提交和结果事件,支付方式放入字段 |
cash_center | payResult、virtualAccount | enter_payResult、leave_payResult、结果操作、enter_virtualAccount、leave_virtualAccount | 仍是旧 reportApi 模型 | 迁移为结果页、结果操作、虚拟账户页统一事件 |
cash_center | 绑卡流程 | BankCard_*、bindCard_*、BankCardPin_*、BankCardCode_*、BankCardProcessing_*、BankCardSuccess/Fail_* | 事件名中混有卡号、CVV、手机号、错误文案等动态值,存在敏感信息风险 | 统一为绑卡页、输入、校验、OTP、处理中、结果事件;业务值作为自定义属性传入,禁止拼事件名 |
cash_center | 绑银行账户 | BankCardAccount_*、addBankAccountQueryResult、addBankAccountResultSteps | 旧事件名和步骤事件并存 | 统一为 bank_account_* 事件,并使用 step_name/step_index/status |
wp_h5 | withdraw-refactor | withdraw_page 下的金额、期限、优惠券、用途、合同、账户、提交、弹窗等事件 | 已有 reportTracking、useTracking、数据就绪等待和进入/离开去重 | 保留页面覆盖范围,统一事件名、公共字段和 content 取值 |
wp_h5 | 提现结果、绑账户、绑卡、人脸、PIN、合同、优惠券 | withdraw_result_page_*、withdraw_bank_account_page、withdraw_face_verify_page、withdraw_pin_*、withdraw_contract_page_view 等 | 已有部分新模型事件,字段仍按事件名前缀展开 | 改为统一字段结构;不再生成 eventName_fieldName 形式的散落字段 |
wp_h5 | 还款及历史页面 | 路由包含 repaymentIndex、afterRepayment、loanDetail、termDetail、earlyRepay、repaymentHistory 等 | 当前 dev 路由存在,未见与统一模型完全一致的全链路事件 | 按 5.1 的还款/支付事件补齐页面、选择、提交、结果和历史事件 |
roovault | 登录、启动、首页、个人中心、授信资料、KYC、人脸、绑账户 | DataRecordConstant 中的 *_view、*_click,通过 SensorsDataAPI.trackView/trackClick 上报 | 原生 SDK 已接入;公共字段和自定义业务字段没有统一封装 | 统一封装为 track(eventName, properties),页面名和业务字段进入标准属性 |
roovault | MineFragment 个人中心 | 旧 account_page_view、account_loan_history_click、account_repayment_history_click | 仅覆盖个人中心曝光和两类历史入口,其他真实入口缺少事件;旧名称把个人中心误称为账户页 | 页面统一改为 mine_page_view,历史入口改为 mine_*_click,并补齐全部真实入口及目标页面事件 |
roovault | BVN/NIN/人脸 | BVNVerify_*、NINVerify_*、BVNandNINVerify_*、face_guide_*、face_reg_* | 已有曝光和点击,但字段治理不足 | 保留业务语义,删除动态身份证明值和输入值,改传脱敏状态/长度/结果 |
实施时必须以源码实际触发点为准:页面曝光只在页面真实展示且初始化数据就绪后上报;点击事件在动作确认前上报;接口结果事件在接口返回后上报;页面离开事件只上报一次并带 duration_ms。
4. 公共字段需求
4.1 本期统一公共字段(开发执行版)
以下规则为本期唯一字段口径。本文只约定字段名称、业务含义、采集责任和取值规则,不约定事件在 SDK、Bridge、HTTP 或数据库中的序列化结构。具体结构由对应 SDK 和现有上报封装决定。
| 字段 | 类型 | 必填 | 来源 | 说明 |
|---|---|---|---|---|
event_name | string | 是 | 统一埋点封装 | 事件字典中的稳定英文名;禁止拼接业务值、用户输入、错误文案 |
event_page | string | 是 | 页面字典 | 统一页面编码;取当前实际页面,不取中文标题、URL 或组件名 |
event_type | string | 是 | 统一埋点封装 | 只能取 view/click/input/result/leave/popup_view/popup_click/performance;提交按钮属于 click,接口或系统回调属于 result |
event_time | number | 是 | 统一埋点封装 | 客户端产生事件时的 Unix 毫秒时间戳 |
uid | string | 登录后必填 | 登录态/App bridge | 登录用户 ID;未登录事件不传,不得用手机号替代 |
cust_id | string | 有值必传 | 登录态/App bridge | 客户主数据 ID;没有稳定值时不传,不得用手机号替代 |
channel | string | 是 | H5 配置、Native 入参或运行时上下文 | 获客/投放渠道编码;没有渠道时固定传 organic |
biz_code | string | 是 | App 配置/H5 构建配置 | 业务线编码;必须与服务端业务线一致 |
country | string | 是 | 产品配置 | ISO 3166-1 alpha-2 大写编码;本期固定为 NG |
platform | string | 是 | 运行环境 | 只能取 android、ios、h5;App 内 H5 也传 h5 |
app_name | string | 是 | Native 宿主配置/H5 运行时配置 | 实际品牌或宿主 App 名称,如 rocketcash、cashnaija;不得传 channel |
app_version_code | string | Android/App 内 H5 必填;普通浏览器不传 | Android 原生版本能力;H5 通过 bridge getCurrentAppVersion() | 取不到时阻断该运行形态的埋点初始化并记录错误,不填 unknown |
app_version_name | string | Android/App 内 H5 必填;普通浏览器不传 | Android 原生版本能力;H5 通过 bridge getCurrentAppVersionName() | 取不到时阻断该运行形态的埋点初始化并记录错误 |
h5_version | string | H5 必填;纯原生不传 | H5 构建变量 VUE_APP_VERSION | 直接取构建注入值;wp_h5 和 cash_center 均必须注入,不得用 App 版本替代 |
device_id | string | Android/App 内 H5 的 SDK 身份必须具备;普通浏览器不传 | Android/神策 SDK;H5 通过 bridge | 由 SDK/Bridge 管理并用于身份串联;业务代码不得手动生成、覆盖或重复作为自定义属性传入 |
session_id | string | 是 | 统一埋点上下文 | 首个页面初始化时生成 UUID,并在本次会话内复用;App 重启或会话超时重新生成 |
trace_id | string | 关联接口事件时必填;其他事件不传 | 接口请求上下文 | 只传真实链路 ID;没有真实链路 ID 时不生成、不传 |
自定义字段由业务埋点封装作为事件属性传给 SDK 或 Bridge;不得因为不同端的传输结构不同而改名。字段统一使用 snake_case,空字符串、null、undefined 均视为未传。
4.1.1 三种运行形态的固定取值
| 运行形态 | platform | app_name | app_version_code/name | h5_version | device_id | is_app_webview |
|---|---|---|---|---|---|---|
| Android 原生 | android | 原生宿主配置 | 原生版本能力 | 不传 | 原生稳定设备 ID | false |
| App 内 H5 | h5 | Native bridge 下发的宿主 App 名称 | bridge getCurrentAppVersion*() | H5 构建版本 | bridge/神策稳定设备 ID | true |
| 普通浏览器 H5 | h5 | H5 运行时配置 | 不传 | H5 构建版本 | 不传 | false |
is_app_webview 作为自定义公共属性传递;H5 所有事件必传,Android 原生事件固定传 false。普通浏览器不得伪造 App 版本或设备 ID。
4.1.2 代码改造落点:版本字段
当前代码实现:
| 项 | wp_h5 当前实现 | cash_center 当前实现 | Android 当前实现 |
|---|---|---|---|
app_version_code | 已有 bridge 方法 getCurrentAppVersion(),在 App.vue 中用于 rocketcash 请求头 X-APP-VERSION;但当前埋点没有统一带上 | 当前 native.js/report.js 未取 App 版本 | H5JsInterface.getCurrentAppVersion() 返回 AppUtils.getAppVersionCode() |
app_version_name | 已有 bridge 方法 getCurrentAppVersionName();当前埋点没有统一带上 | 当前未取 | H5JsInterface.getCurrentAppVersionName() 返回 AppUtils.getAppVersionName() |
h5_version | vue.config.js 已将 `process.env.VUE_APP_VERSION | package.json.version |
开发必须实现:
wp_h5的h5_version直接取process.env.VUE_APP_VERSION。cash_center必须在vue.config.js中读取package.json.version并写入process.env.VUE_APP_VERSION,埋点统一取process.env.VUE_APP_VERSION。- App 内 H5 初始化埋点上下文时调用:
getCurrentAppVersion()->app_version_codegetCurrentAppVersionName()->app_version_name
- 普通浏览器 H5 没有 App bridge 时:
app_version_code/app_version_name不传h5_version仍必须传
- Android 原生埋点直接从原生能力取:
AppUtils.getAppVersionCode()->app_version_codeAppUtils.getAppVersionName()->app_version_name
4.1.3 代码现状参考:设备信息
原生和 App 内 H5 上报时可以补充更多设备信息,但必须遵守最小必要原则;不得上传通讯录、WiFi 列表、GPS 明细、安装应用列表等高敏原始数据作为普通行为埋点字段。
以下内容仅用于说明现有代码能力,不改变 4.1 和 4.1.3 的本期字段契约:
| 能力 | 当前实现 |
|---|---|
device_id | wp_h5 有 getDeviceId();cash_center 有 getDeviceId();Android 原生可用 DeviceIdRuntime.getDeviceId() |
phone_model | Android H5JsInterface.getDeviceInfo() 当前只返回 deviceId 和 phoneModel |
os_name | wp_h5 有 getOsName();Android 返回固定 Android |
os_version | wp_h5 有 getOsVersion();Android 返回 Build.VERSION.RELEASE |
os_version_code | wp_h5 有 getOsVersionCode();Android 返回 Build.VERSION.SDK_INT |
network_type | wp_h5 有 getNetwork();Android 返回 PhoneUtils.getNetworkState(...) |
timezone | wp_h5 有 getDefaultTimezone();Android 返回 TimeZone.getDefault().getID() |
4.1.3.1 设备字段(本期执行范围)
本期业务事件只验收 device_id。以下设备扩展信息不进入本期公共字段契约,不作为埋点完整率验收项;如神策 SDK 自动采集,按 SDK 默认属性保存,不得由 H5 自行拼装完整设备指纹。
| 字段 | 类型 | 来源 | 是否必传 | 说明 |
|---|---|---|---|---|
device_id | string | App bridge/SDK | 按 4.1 规则 | App 内 H5、Android 原生必传;普通浏览器不传 |
device_model | string | getDeviceInfo().phoneModel / 原生 Build.MODEL | 本期不纳入事件契约 | 不作为研发必接字段;如 SDK 自动采集,不得覆盖为业务字段 |
device_brand | string | 原生 Build.BRAND | 本期不纳入事件契约 | 不要求 H5 bridge 本期新增返回 |
device_manufacturer | string | 原生 Build.MANUFACTURER | 本期不纳入事件契约 | 不要求 H5 bridge 本期新增返回 |
os_name、os_version、os_version_code | string | SDK/bridge/运行环境 | 本期不纳入事件契约 | 由 SDK 默认采集即可,不作为业务事件必传字段 |
network_type、timezone | string | SDK/bridge/运行环境 | 本期不纳入事件契约 | 不作为自定义业务属性重复上报 |
user_agent_hash、screen_width、screen_height | string/number | H5 运行环境 | 本期不纳入事件契约 | 不上传完整 User-Agent,不作为本期验收项 |
4.2 自定义公共字段(按事件类型执行)
| 字段 | 类型 | 是否必传 | 说明 |
|---|---|---|---|
scene | string | 非必传 | 只能取 login/home/repayment/withdraw/bind_card/bind_account/kyc/complaint/operation |
content | string | click、popup_click 必传;其他事件不传 | 被点击或操作对象的稳定编码,如 paystack、retry、loan_history;不得传按钮中文全文 |
source_page | string | view、leave、跨页点击必传;无来源的 App 首屏传 app_launch | 当前事件发生前的页面编码;取路由 from.name、Native 入参或入口映射;禁止传 unknown |
target_page | string | 产生页面、Native 或外链跳转的点击事件必传;无跳转不传 | 点击动作实际要去的页面编码;外链固定传 external_url,跳 Native 传 Native 页面编码 |
duration_ms | number | leave 必传;其他事件不传 | 当前页面从 view 到 leave 的客户端停留毫秒数,必须为非负整数 |
loan_id | string | 已关联稳定贷款 ID 时必传;无贷款关联时不传 | 贷款生命周期 ID;不得用订单 ID、申请 ID 或用户 ID 替代 |
payment_method | string | 支付方式选择、还款提交、支付结果事件必传;其他事件不传 | 只能取 flutterwave/paystack/interswitch/opay/bank_transfer/token/bank_account/card |
status | string | 状态页、处理中页、审核页、列表状态曝光必传;其他事件不传 | 只能取 processing/verify/success/fail/active/expired |
result | string | result、接口返回、结果页事件必传;其他事件不传 | 只能取 success/fail/pending/cancel/timeout |
error_code | string | result=fail 或接口/校验失败时必传;成功事件不传 | 错误码;没有错误码时固定传 client_validation_error |
error_msg | string | result=fail 或接口/校验失败时必传;成功事件不传 | 脱敏后的固定错误摘要;禁止手机号、卡号、证件号、原始响应或堆栈 |
is_app_webview | boolean | 所有 H5 事件必传;Android 原生固定传 false | App 内 H5 为 true,普通浏览器 H5 为 false |
loan_id 仅在事件明确关联某笔贷款时传入,例如还款、贷后详情和还款历史详情;没有稳定贷款 ID 时不传,不用订单 ID、申请 ID 或用户 ID 替代。
4.3 点击内容 content 的实现方式
如果要记录“用户点击了什么内容”,由业务埋点封装将 content 作为事件自定义属性传给 SDK 或 Bridge,不允许把点击内容拼到 event_name。本例只表达字段和值,不规定 SDK 或接口的序列化结构:event_name=withdraw_result_page_click、event_page=withdraw_result_page、event_type=click、scene=withdraw、content=go_home、target_page=home_page。
取值规则:
| 点击对象 | content 取值 | 说明 |
|---|---|---|
| 主按钮 | submit_button, confirm_button, continue_button | 不使用按钮文案,避免多语言或 UI 文案变更影响数据 |
| 关闭按钮 | close_button | 弹窗右上角关闭、页面关闭 |
| 返回按钮 | back_button | 导航返回 |
| 协议 | agreement, privacy_policy, contract | 可额外传 agreement_type 或 contract_type |
| 列表项 | list_item | 具体项用 item_type/item_id/item_index |
| Tab | tab | 具体 tab 用 tab_name |
| 支付方式 | payment_method | 具体方式用 payment_method 字段 |
| 银行/账户项 | bank_item, account_item | 银行用 bank_code,账户只传类型或脱敏标识 |
| 弹窗按钮 | popup_primary_button, popup_secondary_button, popup_close_button | 配合 popup_type、action_type |
| 帮助入口 | help, customer_service | 帮助中心、客服入口 |
研发实现要求:
- 每个可点击控件在代码中显式传入稳定枚举值,例如
trackClick('withdraw_result_page_click', { content: 'go_home' });对象参数仅为代码调用示例,不是本文规定的传输结构。 content使用英文枚举,不使用 UI 文案,不使用接口返回文案。- 同一控件在不同页面点击,
content可以相同,通过event_page区分。 - 同一页面多个同类控件,补充
content_index或业务字段,如item_index/banner_position/payment_method。 - 禁止把手机号、卡号、账号、用户姓名、错误详情等动态内容放入
content。
4.4 source_page 与 target_page 取值规则
source_page 和 target_page 用于分析页面流转、入口来源和跳转去向。按照 4.2 的事件类型规则执行:需要传的字段必须传真实页面编码或规定入口编码;没有适用场景的字段不传;禁止传空字符串、unknown 或临时拼接值。
| 字段 | 取值来源 | 取值示例 | 需要上报的情况 |
|---|---|---|---|
source_page | 路由 from.name、打开 H5 的 query 参数、App Native 传参、当前业务上下文 | home_page, withdraw_page, repayment_result_page, push_notification, sms_link | 页面进入、弹窗曝光、跨页面跳转、从 App 原生进入 H5、从短信/Push/运营位进入 |
target_page | 路由 to.name、点击动作配置、Native 跳转方法参数、H5 跳转 URL 映射 | home_page, bank_card_page, contract_page, customer_service_page, google_play | 点击会产生跳转、关闭后返回指定页面、打开外部链接、跳到 Native 页面 |
字段示例(仅表达字段和值,不表达传输结构):
- 页面进入:
event_name=bank_card_page_view、event_page=bank_card_page、event_type=view、source_page=withdraw_page。 - 跳转点击:
event_name=withdraw_result_page_click、event_page=withdraw_result_page、event_type=click、content=link_card、source_page=withdraw_result_page、target_page=bank_card_page。
取值优先级:
- SPA 路由跳转:
source_page = from.name,target_page = to.name。 - 当前页按钮跳转:
source_page = 当前 event_page,target_page = 按钮配置的目标页面。 - Native 打开 H5:
source_page = Native 传入的 sourcePage;没有传参时按入口类型取native_home/native_account/push_notification/sms_link。 - H5 关闭或返回 Native:首页用
target_page = home_page,个人中心用target_page = mine_page,外部跳转用target_page = external_url或具体渠道名。 - 弹窗:弹窗曝光时
source_page = 弹窗所属页面;弹窗按钮点击时source_page = 弹窗所属页面,只有发生页面、Native 或外链跳转时才传target_page;仅关闭不传target_page。
4.5 SDK 自动采集字段(不属于自定义公共字段)
SDK 字段由神策 SDK 按平台自动生成,通常使用 $ 前缀。业务代码不得重复创建、改名、覆盖或把 SDK 字段当作业务字段使用。本节只说明采集责任,不规定 SDK 事件的底层序列化结构。
4.5.1 Android 原生
基于当前 sa-sdk-android 源码,Android SDK 默认可采集以下字段:
| SDK 字段 | 采集方式 | 本期处理规则 |
|---|---|---|
distinct_id | 神策 SDK 身份系统 | 由 SDK 管理;登录成功调用 login(uid),不得由业务事件属性重复传 |
$device_id | SDK 设备标识 | 由 SDK 管理;不得自行生成或覆盖 |
$os、$os_version | SDK/Android 系统 | SDK 自动采集,不改名为 os_name、os_version |
$manufacturer、$model | Android Build 信息 | SDK 自动采集,不作为本期自定义字段必传 |
$app_version | Android 应用版本名 | SDK 自动采集;业务侧如需版本号分析,另按本文 app_version_code/app_version_name 取值 |
$screen_width、$screen_height | Android 屏幕信息 | SDK 自动采集,不在业务事件中重复传 |
$timezone_offset | Android 默认时区偏移 | SDK 自动采集,不在业务事件中重复传 |
$network_type、$wifi | SDK 网络状态 | SDK 自动采集,不在业务事件中重复传 |
$lib_version | 神策 SDK 版本 | SDK 自动采集,不由业务代码传入 |
4.5.2 App 内 H5
App 内 H5 分为两部分:
- H5 业务事件的自定义字段,按 4.1 和 4.2 由 H5 埋点封装负责;SDK 不会替业务自动推断
scene、content、source_page、target_page、订单、贷款和业务结果。 - 设备、身份和 SDK 元数据,优先由 App 原生 SDK 及当前 WebView Bridge 提供。神策 Bridge 可提供
distinct_id、登录状态以及原生 SDK 侧的预置属性;H5 不得重复生成device_id或覆盖$device_id。
App 内 H5 必须由 Bridge/原生提供并由业务上下文使用的运行时字段为:app_name、app_version_code、app_version_name、platform=h5、is_app_webview=true;device_id 由 SDK/Bridge 作为身份字段管理,不由业务事件重复传入。H5 自己提供 h5_version;其余 SDK $ 字段由 SDK 管理。
4.5.3 普通浏览器 H5
普通浏览器 H5 不接入 Android 原生 SDK 字段,不伪造 app_version_code、app_version_name 或 device_id。H5 SDK 若自动产生浏览器、页面、屏幕或 SDK 元数据,保留 SDK 原字段;本期不把这些字段转换为自定义公共字段,也不以其作为业务埋点完整率验收项。普通浏览器 H5 只需按本文自定义字段规则提供 platform=h5、app_name、h5_version、session_id 及适用的业务字段。
4.5.4 字段归属判断
| 字段类型 | 负责方 | 研发是否手动传入 |
|---|---|---|
event_name、event_page、event_type、event_time | 业务埋点封装 | 是 |
scene、content、source_page、target_page、loan_id、result 等 | 业务页面/业务接口上下文 | 是,按事件适用条件传 |
app_name、biz_code、channel、country、platform、版本字段 | App/H5 运行时配置与 Bridge | 是,由统一上下文注入 |
distinct_id、$device_id、$os、$model、$network_type 等 $ 字段 | 神策 SDK/原生能力 | 否,禁止业务重复创建 |
4.6 各端公共字段总表
下表是本期研发和测试使用的总表。必传表示该端初始化并上报事件时必须具备;按事件表示仅在 4.2 规定的事件场景传;SDK 自动表示由神策 SDK 采集,业务代码不重复传;不传表示该端不生成、不补默认值。
| 字段 | 字段归属 | Android 原生 | App 内 H5 | 普通浏览器 H5 | 采集/提供方 |
|---|---|---|---|---|---|
event_name | 业务自定义 | 必传 | 必传 | 必传 | 业务埋点封装 |
event_page | 业务自定义 | 必传 | 必传 | 必传 | 页面字典/业务埋点封装 |
event_type | 业务自定义 | 必传 | 必传 | 必传 | 业务埋点封装 |
event_time | 业务自定义 | 必传 | 必传 | 必传 | 各端埋点封装生成客户端毫秒时间 |
scene | 业务自定义 | 必传 | 必传 | 必传 | 页面/业务上下文 |
content | 业务自定义 | 按事件 | 按事件 | 按事件 | 点击控件显式传稳定枚举 |
source_page | 业务自定义 | 按事件 | 按事件 | 按事件 | 路由、Native 入参或入口映射 |
target_page | 业务自定义 | 按事件 | 按事件 | 按事件 | 跳转动作配置、Native 参数或 URL 映射 |
loan_id | 业务自定义 | 有贷款关联时传 | 有贷款关联时传 | 有贷款关联时传 | 业务接口响应/页面上下文 |
result、status、error_code、error_msg | 业务自定义 | 按事件 | 按事件 | 按事件 | 接口结果/页面状态 |
payment_method | 业务自定义 | 支付事件传 | 支付事件传 | 支付事件传 | 支付方式选择或接口上下文 |
bind_method | 业务自定义 | 绑卡/绑账户事件传 | 绑卡/绑账户事件传 | 绑卡/绑账户事件传 | 业务流程上下文 |
duration_ms | 业务自定义 | leave 事件传 | leave 事件传 | leave 事件传 | 页面进入和离开时间计算 |
app_name | 运行时公共字段 | 必传 | 必传 | 必传 | Native 宿主配置或 H5 运行时配置 |
biz_code | 运行时公共字段 | 必传 | 必传 | 必传 | App/H5 产品配置 |
channel | 运行时公共字段 | 必传 | 必传 | 必传 | Native 入参、H5 配置;无渠道传 organic |
country | 运行时公共字段 | 必传 | 必传 | 必传 | 产品配置,本期为 NG |
platform | 运行时公共字段 | 固定 android | 固定 h5 | 固定 h5 | 运行环境识别 |
app_version_code | 运行时公共字段 | 必传 | Bridge 必传 | 不传 | Android 版本能力或 H5 Bridge |
app_version_name | 运行时公共字段 | 必传 | Bridge 必传 | 不传 | Android 版本能力或 H5 Bridge |
h5_version | 运行时公共字段 | 不传 | 必传 | 必传 | H5 构建变量 VUE_APP_VERSION |
session_id | 业务会话字段 | 必传 | 必传 | 必传 | 各端统一埋点上下文生成并复用 |
trace_id | 链路字段 | 关联接口时传 | 关联接口时传 | 关联接口时传 | 接口请求链路上下文 |
is_app_webview | 运行时公共字段 | 固定 false | 固定 true | 固定 false | 运行环境判断 |
distinct_id | SDK 身份字段 | SDK 自动 | SDK/Bridge 复用 | H5 SDK 自动或匿名 | 神策身份系统 |
$device_id | SDK 身份字段 | SDK 自动 | SDK/Bridge 复用 | 不传原生设备 ID | 神策 SDK/Native Bridge |
$os、$os_version | SDK 预置字段 | SDK 自动 | Native SDK 自动或 H5 SDK 默认 | H5 SDK 默认 | 神策 SDK |
$manufacturer、$model | SDK 预置字段 | SDK 自动 | Native SDK 自动或 H5 SDK 默认 | H5 SDK 默认或不提供 | 神策 SDK |
$app_version、$lib_version | SDK 预置字段 | SDK 自动 | SDK 自动 | H5 SDK 自动 | 神策 SDK |
$screen_width、$screen_height、$timezone_offset | SDK 预置字段 | SDK 自动 | Native SDK 自动或 H5 SDK 默认 | H5 SDK 默认或不提供 | 神策 SDK |
$network_type、$wifi | SDK 预置字段 | SDK 自动 | Native SDK 自动或 H5 SDK 默认 | H5 SDK 默认或不提供 | 神策 SDK |
执行边界:业务自定义字段必须由业务埋点封装按事件传入;SDK 字段只验证 SDK 是否正常采集,不要求业务代码再次传递;同名但带 $ 的 SDK 字段与不带 $ 的业务字段不是同一个字段,不得互相替代。
4.7 BNS/IMS 后端字段来源闭环
本节用于把事件字段和当前后端实现对应起来。前端不能从按钮文案、默认值或接口地址猜业务字段;凡是后端已返回的业务事实,以上一次成功接口响应为准;接口没有返回或当前页面没有业务关联时,字段按“省略”处理,不补空字符串、不补 unknown。
4.7.1 BNS 字段来源
| 埋点字段 | BNS 接口/对象来源 | 前端取值和标准化逻辑 | 上报边界 |
|---|---|---|---|
loan_id | /query/queryLoanList、/query/queryLoanDetail、/query/queryCustLoanInfo、还款计划查询;请求/业务对象字段为 loanId | 取当前页面所展示或提交的借据 loanId,统一转字符串;列表页只有在事件明确针对某一笔借据时传 | 借款申请尚未生成借据、首页无具体借据、绑卡通用入口不传 |
product_id | BNS 产品查询返回的 QuerySimpleProductResp/产品列表;申请请求使用 productFeeId | 本期将产品子项标识统一映射为事件字段 product_id=productFeeId;不得用产品名称代替 | 产品列表选择、提现试算、借款提交相关事件传;没有产品响应时不传 |
loan_amount、repay_amount | /apply/loanCalculate、/apply/loanApply 的 LoanApplyReq.loanAmt,以及还款查询返回的应还/本次支付金额 | 取用户最终确认或接口最终确认的数值,使用数字类型;页面展示金额和接口金额不一致时,结果事件以接口确认值为准 | 金额相关事件传;页面浏览事件只有事件字典明确要求时传 |
selected_tenor、term_days | LoanApplyReq.loanTerm、loanSpan;还款计划返回的期数/期限字段 | selected_tenor 取用户最终选择的 loanTerm;term_days 仅在接口明确返回天数时传,不由前端用日期自行推算 | 产品选择、提现确认、借款提交相关事件传 |
loan_type、payment_method | LoanApplyReq.loanType、accountType、channel;账户类型代码明确区分 bankAccount 和 wallet | loan_type 传后端贷款类型枚举;payment_method 传用户选择且实际提交的标准支付方式;渠道字段另按公共字段规则传 | 借款提交、还款提交和支付方式选择事件传;不把 accountType 直接当作 payment_method,需按事件字典映射 |
result、status、error_code | BNS 外层 Response 结果、ApplyExclusionRuleResp、借据/还款计划状态 | 结果事件先读取接口成功标识,再读取业务状态;失败只传稳定错误码或错误分类,禁止透传原始错误文案 | 接口返回、页面状态变化和结果页事件传;成功事件不传失败字段 |
bank_code、bank_name | /query/queryBankList、/query/queryBankAcct、QueryBankAcctResp.bankCode/bankName | 银行选择事件取用户选中的标准银行编码和标准名称;已绑定账户展示取 BNS 返回值 | 绑银行账户、虚拟账户和需要展示收款账户的事件传;不传账号原文 |
account_created、expire_time | BNS 提现/收款账户查询或 /apply/generatePlutusWebOrder 返回的收款信息 | account_created 由接口是否返回有效账户判断;expire_time 只取接口明确返回的过期时间并统一为 ISO-8601 或约定时间格式 | 虚拟账户页面和账户结果事件传;接口没有该字段时省略 |
bind_method | BNS /bank/routeRedirect、/bank/queryBindCardStatus 以及账户流程上下文 | 卡流程固定为 card,银行账户流程固定为 bank_account;不要根据页面标题猜 | 绑卡/绑账户事件必传;普通贷款和还款事件不传 |
4.7.2 IMS 字段来源
| 埋点字段 | IMS 接口/对象来源 | 前端取值和标准化逻辑 | 上报边界 |
|---|---|---|---|
provider | /user/v1/bindCardQuery 返回的 paymentChannel,以及路由返回的 RouteRedirectResp.bindCardType;IMS 内部按 PayChannelEnum 路由到 Paystack、Monnify 等实现 | 优先取接口最终返回的 paymentChannel;路由阶段取 bindCardType 并映射为统一 provider 枚举;不得把前端猜测的渠道当最终值 | 绑卡结果、OTP、处理中、结果页事件传;未完成路由且接口无渠道时省略 |
status、result | /user/v1/bindCardQuery 的 status、/user/v1/accountInfoResult 的 status、CardInfoQueryResp.status | IMS 渠道状态先映射为统一的 processing/success/failed;PENDING、pending 等仅作为输入,不直接混入埋点枚举 | 绑卡/绑账户接口结果和结果页传;前端按钮点击不伪造接口结果 |
bind_method | /user/v1/routeRedirect、/user/v1/routeAccountRedirect 的业务路径;RouteRedirectReq.isAccount、scene | 卡路由统一传 card,账户路由统一传 bank_account;scene 只作为渠道流程上下文,不替代 bind_method | 绑卡和绑账户所有结果链路传 |
bank_code、bank_name | /user/v1/bankNameQuery、CardInfoQueryResp.bankCode/bankName、账户绑定查询结果 | 取 IMS 标准银行编码/名称;银行名称只使用接口返回或本地银行字典标准名称 | 银行选择、卡结果、账户结果事件传;卡号和账号原文不传 |
card_type | BindCardQueryResp.cardType、CardInfoQueryResp.cardType | 取接口返回的卡类型并映射为统一枚举;无返回值时省略 | 卡信息展示和绑卡结果事件传 |
card_status | CardStatusQueryResp.isValid/detailInfo、CardInfoQueryResp.status/isInvalid | isValid=Y 映射为有效;detailInfo 仅映射为业务可读状态,不把原始内部说明直接上报 | 卡状态页、绑卡跳过确认和结果页传 |
is_card_finish、is_account_finish | BindCardQueryResp.isCardFinish/isAccountFinish、BNS BindCardStatusResp 同名字段 | 保持布尔语义,统一为 true/false;只有接口返回明确值时传 | 绑卡/绑账户完成状态和总状态页传 |
error_code、error_msg | IMS 外层响应和渠道结果;IMS 内部会按渠道将失败状态归一 | error_code 传稳定业务错误码;error_msg 仅传脱敏后的固定分类,禁止传渠道原文、卡号、账号、证件号或堆栈 | 失败结果事件必传 error_code;error_msg 按敏感信息规则处理 |
reference、token、transfer_id | IMS BindCardQueryResp.reference/token、RouteRedirectResp.transferId | 这些是绑卡/跳转链路技术关联值,不纳入本期前端业务公共字段,不得转成 content 或事件名;如需排障由日志链路关联 | 本期埋点不传;仅保留在接口日志和 trace_id 关联链路 |
4.7.3 前后端字段闭环规则
- 前端在发起 BNS/IMS 请求时保存本次页面上下文;接口成功返回后,用响应中的业务字段刷新事件上下文,再上报
result、status、provider、loan_id等结果字段。 - 前端提交参数和后端最终结果不一致时,点击事件记录“用户提交值”,结果事件记录“接口确认值”;两者不能覆盖。
- BNS 的
loanId、productFeeId和 IMS 的reference、token属于不同标识体系。本期埋点只保留业务需要的loan_id和product_id,不把 IMS 技术关联值伪装成业务 ID。 source_page、target_page、content、duration_ms、session_id、event_time由前端埋点上下文生成,BNS/IMS 不负责补齐;trace_id由请求链路生成,只有事件与接口有关联时传。- 后端字段为空、接口失败或字段未在当前接口返回时,事件按字段适用性省略;不以空字符串、
null、unknown或上一笔业务数据补值。
4.7.4 首页状态字段闭环(home_page_view)
home_page_view 不再使用含义不明确的 user_status。本期只上报以下三个事件特有状态字段,字段名称和枚举固定,便于按用户状态分层、计算转化漏斗和定位不可借原因。三个字段均在首页状态接口返回并完成加工后取值;接口失败或字段缺失时不补默认值、不把空值当作业务状态。
| 埋点字段 | 业务含义 | 允许值 | 当前接口来源 | 加工逻辑 |
|---|---|---|---|---|
borrow_eligibility_status | 当前是否具备发起借款的资格 | can_borrow、cannot_borrow | queryloanapplyauthority.isCanloanApply;首页用户未达到已获额或存在在途借款时使用 BNS 状态结果判断 | isCanloanApply=true 映射为 can_borrow;false 映射为 cannot_borrow。当 credit_status 不是 credited,或 loan_status 为 under_review/repaying/overdue 时,业务上固定为 cannot_borrow,不等待前端按钮表现推断。接口未返回或请求失败时不默认为 cannot_borrow,应等待重试或不补发状态快照 |
credit_status | 当前授信/获额阶段 | not_applied、submitted、under_review、credited、rejected | BNS queryCustInfo 返回的 custInfo.creditStage | creditStage=0/1 映射为 not_applied;10 映射为 submitted;8 映射为 under_review;9 映射为 credited。7 映射为rejected |
loan_status | 当前借款生命周期状态 | not_borrowed、under_review、repaying、overdue | BNS queryCustInfo.blcQueryLoanStageResp.stage、queryCustLoanInfo.queryPreviousLoanResp.loanStatus、还款计划 isOverDue | 按“逾期 > 还款中 > 审批中 > 未借款”优先级加工:loanStatus=O 或有效还款计划 isOverDue=true 为 overdue;loanStatus=N/P 或 loanStage=22 为 repaying;loanStatus=A/U 或 BNS loanStage=19/20 为 under_review;无有效在途借款,或 loanStatus=F/C/IV 为 not_borrowed。未知状态不得猜测,进入状态映射监控 |
首页事件上报时序:先等待 BNS queryCustInfo;已获额用户再等待 BNS queryCustLoanInfo 和 queryloanapplyauthority 的成功结果;全部状态加工完成后上报一次 home_page_view。状态接口失败时不使用上一次缓存、空值或前端按钮是否可点击结果替代后端状态;可在重试成功后补发一次状态快照,重试仍失败则只记录埋点错误日志,不伪造三个状态字段。
当前不支持项及建议:
- BNS
getLoanStage当前返回19/20/22,其中19是 BNS 在途提现申请、20是 FCS 待放款/未激活借据、22是存在在线借款;Android 当前只在部分分支把20/22覆盖到页面状态,19没有完整进入页面状态。推荐前端埋点加工直接读取接口原始loanStage,不要读取最终 UI 文案;长期由 BNS 直接返回归一化的loanStatus。 queryloanapplyauthority的当前本地后端实现未在本次代码范围内找到对应的 BNS 归一化字段,Android 已有isCanloanApply响应模型。推荐保留该接口作为可借资格唯一事实来源,并由 BNS 明确接口成功、失败和字段缺失语义;失败不可转成“不可借”。IMS 只负责绑卡/账户渠道,不提供上述三类首页状态,本期不得用 IMS 状态推断首页状态。
4.8 事件上报时的敏感信息处理
当前代码存在敏感值进入事件的路径:cash_center 旧代码曾将卡号、CVV、手机号、账号等拼入事件名,但当前 report.js 上报逻辑已注释;wp_h5 的旧 reportTracking 会透传调用方传入的属性;roovault 部分原生事件会把输入值拼接到事件名后再调用 SDK。因此本期统一封装必须在调用 SDK、H5 SDK、Bridge 或 HTTP 发送前执行以下处理,不能只依赖后端脱敏。
| 输入内容 | 本期事件中允许保留 | 处理逻辑 |
|---|---|---|
| 卡号 | card_number_filled、card_number_length、card_brand | 删除原始卡号;不得进入事件名、content、自定义属性、日志或 URL |
| CVV/有效期 | cvv_filled、expiry_filled | 删除原始值;不得记录长度、明文或拼接值 |
| 银行账号 | account_number_filled、account_number_length、bank_code | 删除原始账号;银行只传稳定银行编码 |
| 手机号 | phone_filled、phone_length;5.6 明确例外的 contact_phone | 申请人手机号仍删除原文;仅 5.6 的通讯录联系人选择结果和授信资料提交事件,按事件表明确传联系人手机号明文;不得进入事件名、日志或 URL |
| BVN/NIN/证件号 | identity_type、identity_filled、verify_result | 删除证件号原文;不得进入事件名或错误信息 |
| 姓名、地址、联系人 | field_filled、address_completed、relation_type;5.6 明确例外的 contact_name、contact_phone | 地址和申请人信息删除原文;仅 5.6 事件表明确的联系人姓名、手机号允许作为明文字段传入埋点;不得进入事件名、日志或 URL |
| 收入/金额等敏感业务值 | income_bucket、规定的金额区间或业务金额字段 | 仅按对应事件字典要求传;未经事件字典定义不得新增原值字段 |
| 接口错误信息 | error_code、固定 error_category | 删除原始响应、堆栈和带用户数据的 error_msg |
统一封装执行顺序:先校验事件名和自定义属性白名单,再按本表处理敏感字段,最后才调用 SDK/Bridge/HTTP;除 5.6 事件表明确允许的 contact_name、contact_phone 外,命中禁止字段时开发环境报错并阻止该字段发送,生产环境静默丢弃该字段但不阻断业务流程。5.6 的联系人明文仅允许出现在规定事件属性中,不得复制到事件名、日志、缓存、URL 或其他事件。敏感字段处理结果纳入相关事件验收。
5. 场景埋点需求
本章各事件表的“事件特有必传字段”只列该事件新增的业务属性。第 4 章定义的公共字段由统一埋点上下文按事件类型自动注入,不在各事件中重复定义或重复列出,包括 event_name、event_page、event_type、event_time、身份/版本字段,以及 scene、content、source_page、target_page、duration_ms、loan_id、payment_method、bind_method、status、result、error_code、error_msg。表中以 — 表示该事件除公共字段外没有额外必传属性。
5.1 还款/支付
覆盖端:
cash_center:payMethod,payResult,virtualAccountwp_h5:repayment,earlyRepay,repaymentHistory,afterRepayment
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| 还款方式页 | repayment_method_page_view | view | 页面进入 | repay_amount, available_methods | 金额取页面展示的应还金额;支付方式取接口返回的可用方式编码列表 |
| 还款方式页 | repayment_method_page_leave | leave | 页面离开 | — | 已选择支付方式时由公共字段 payment_method记录;未选择时不传该公共字段 |
| 还款方式列表 | repayment_method_click | click | 选择支付方式 | — | 具体方式由公共字段 payment_method 记录 |
| 确认还款 | repayment_confirm_click | click | 点击确认 | repay_amount | 取用户最终确认金额,使用数值,不传格式化文案 |
| 还款接口 | repayment_submit_result | result | 还款提交接口返回 | repay_amount | 取接口确认的本次还款金额;结果、支付方式和错误字段按公共字段规则注入 |
| 支付结果页 | repayment_result_page_view | view | 结果页展示 | repay_amount | 取本次还款金额;结果和实际支付方式按公共字段规则注入 |
| 支付结果页 | repayment_result_action_click | click | 点击完成/重试/查看详情 | — | 点击对象和跳转目标分别由公共字段 content、target_page 记录 |
| 虚拟账户页 | virtual_account_page_view | view | 页面进入 | bank_code, account_created, expire_time | bank_code取银行编码;account_created为是否已生成账户;expire_time取接口给出的过期时间 |
| 还款历史 | repayment_history_page_view | view | 页面进入 | loan_count, has_overdue | loan_count取列表总贷款数;has_overdue取列表是否存在逾期记录 |
| 还款历史详情 | repayment_history_detail_view | view | 详情展示 | repay_status | 取页面展示的还款状态编码;贷款 ID 按公共字段规则注入 |
5.2 绑银行卡
覆盖端:
cash_center:bindCard,addCard,checkCode,checkPhone,checkBirth,checkPin,bindCardWaiting,bindCardResultwp_h5:cardStatus,checkCardStatus
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| 绑卡页 | bank_card_page_view | view | 页面进入 | — | 页面来源和绑定方式按公共字段规则注入 |
| 卡号输入框 | bank_card_number_focus | input | 聚焦 | — | 不上报卡号原文 |
| 卡号输入框 | bank_card_number_blur | input | 失焦 | card_number_filled, card_number_length, card_brand | 只传是否填写、长度和卡组织编码;不得传卡号原文 |
| 有效期输入框 | bank_card_expiry_focus | input | 聚焦 | — | 不上报有效期原文 |
| 有效期输入框 | bank_card_expiry_blur | input | 失焦 | expiry_filled | 是否填写完整有效期,布尔值 |
| CVV 输入框 | bank_card_cvv_focus | input | 聚焦 | — | 不上报 CVV 原文 |
| CVV 输入框 | bank_card_cvv_blur | input | 失焦 | cvv_filled | 是否填写 CVV,布尔值,不传长度和原文 |
| 协议勾选 | bank_card_agreement_click | click | 勾选/取消 | checked | 取点击完成后的勾选状态 |
| 提交绑卡 | bank_card_submit_click | click | 点击提交 | card_number_filled, expiry_filled, cvv_filled | 取提交瞬间三个字段的完成状态 |
| 前端校验失败 | bank_card_validate_fail | result | 表单校验失败 | field_name | 取失败字段编码;错误码和脱敏错误摘要按公共字段规则注入 |
| 绑卡接口结果 | bank_card_submit_result | result | 接口返回 | provider | 取接口最终返回的实际通道;结果和错误字段按公共字段规则注入 |
| OTP 页 | bank_card_otp_page_view | view | OTP页展示 | provider, send_type | provider取实际绑卡通道;send_type取短信/语音等发送方式 |
| OTP 重发 | bank_card_otp_resend_click | click | 点击重发 | provider, resend_count | resend_count为本次绑卡流程已重发次数,首次重发为 1 |
| OTP 提交 | bank_card_otp_submit_click | click | 点击提交 | code_filled | 是否填写完整验证码,布尔值,不传验证码 |
| 处理中页 | bank_card_processing_view | view | 处理中展示 | provider | 取当前实际通道;处理状态按公共字段规则注入 |
| 结果页 | bank_card_result_page_view | view | 成功/失败页展示 | provider | 取最终实际通道;结果和错误码按公共字段规则注入 |
| 结果页操作 | bank_card_result_action_click | click | 确认/重试/返回首页 | — | 点击对象和跳转目标按公共字段规则注入 |
5.3 绑银行账户(H5)
覆盖端:
cash_center:addBankAccount,addBankAccountResultSteps,addBankAccountQueryResult,addBankAccountResult
页面编码由公共上下文注入,不放入事件特有属性。
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| 绑账户页 | bank_account_page_view | view | 页面进入 | verify_bvn_enabled | 取当前流程是否启用 BVN 校验;页面来源和绑定方式按公共字段规则注入 |
| 银行选择 | bank_account_bank_select_click | click | 选择银行 | bank_code, bank_name | bank_code取标准银行编码;bank_name仅传标准化名称,不传用户输入 |
| 账号输入框 | bank_account_number_focus | input | 聚焦 | — | 不上报账号原文 |
| 账号输入框 | bank_account_number_blur | input | 失焦 | account_number_filled, account_number_length | 只传是否填写和长度,不传账号原文 |
| BVN 校验勾选 | bank_account_verify_bvn_click | click | 勾选/取消 | checked | 取点击完成后的勾选状态 |
| 提交账户 | bank_account_submit_click | click | 点击提交 | bank_code, account_number_filled | 取当前银行编码和账号完成状态 |
| 前端校验失败 | bank_account_validate_fail | result | 表单校验失败 | field_name | 取失败字段固定编码;错误码和脱敏错误摘要按公共字段规则注入 |
| 绑账户接口结果 | bank_account_submit_result | result | 接口返回 | provider | 取接口最终返回的实际通道;结果和错误字段按公共字段规则注入 |
| 阶段处理中 | bank_account_step_view | view | Processing/Verify/Success/Fail 阶段展示 | step_name, step_index | step_name取固定阶段名;step_index从 1 开始;状态按公共字段规则注入 |
| 阶段离开 | bank_account_step_leave | leave | 阶段切换或页面离开 | step_name | 取离开的阶段;停留时长和离开前状态按公共字段规则注入 |
| 结果操作 | bank_account_result_action_click | click | 确认/重试/返回 | — | 点击对象和跳转目标按公共字段规则注入 |
| BVN 银行账户验证页 | bvn_bank_account_page_view | view | BvnBankAccountActivity 页面展示 | is_first_bvn, has_prefilled_bank_account | is_first_bvn取 Activity 入参;has_prefilled_bank_account仅判断是否已有银行及账号,不传原文 |
| BVN 银行账户验证结果 | bvn_bank_account_submit_result | result | findBvnInfo 成功或失败回调 | verification_stage | 固定传 find_bvn;结果和错误字段按公共字段规则注入,成功和失败回调各上报一次 |
5.4 提现/提现结果
覆盖端:
wp_h5:withdraw,withdraw-refactor,withdrawStatus
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| 提现页 | withdraw_page_view | view | 页面进入并拿到初始化数据 | product_id | 取 BNS 产品响应中的 productFeeId;贷款 ID 按公共字段规则注入 |
| 提现页 | withdraw_page_leave | leave | 页面离开/失活 | loan_amount, selected_tenor | 取离开前最终金额和期限;停留时长按公共字段规则注入 |
| 借款金额 | withdraw_amount_blur | input | 金额框失焦 | loan_amount, amount_valid | 金额取当前输入数值;amount_valid传前端校验结果,失败错误字段按公共规则注入 |
| 借款期限 | withdraw_loan_terms_click | click | 选择期限 | term_index, term_days, product_id | term_index:传事件发生时的整数值;term_days:取事件触发时页面或接口的实际值;product_id:取事件触发时页面或接口的实际值 |
| 优惠券 | withdraw_coupon_click | click | 点击优惠券入口 | coupon_available, coupon_selected | coupon_available:取事件触发时页面或接口的实际值;coupon_selected:传 true/false,表示事件发生时的实际状态 |
| 借款用途 | withdraw_loan_purpose_click | click | 点击/选择用途 | purpose_code | purpose_code:取稳定业务编码,不传展示文案 |
| 放款账户 | withdraw_disbursement_account_click | click | 点击/切换账户 | account_type, has_bound_account | account_type:取稳定业务编码,不传展示文案;has_bound_account:传 true/false,表示事件发生时的实际状态 |
| 合同 | withdraw_contract_click | click | 点击合同 | contract_type | contract_type:取稳定业务编码,不传展示文案 |
| 提交提现 | withdraw_submit_click | click | 点击提交 | loan_amount, term_days, account_type, coupon_selected | 取提交瞬间的最终金额、期限、账户类型和优惠券状态 |
| 提现接口结果 | withdraw_submit_result | result | 接口返回 | — | 结果和错误字段按公共字段规则注入 |
| 提现结果页 | withdraw_result_page_view | view | 结果页展示 | disbursement_status | 取放款状态业务枚举;页面结果按公共字段规则注入 |
| 结果页操作 | withdraw_result_page_click | click | 返回首页/查看合同/帮助/绑卡 | — | 点击对象、当前结果和跳转目标按公共字段规则注入 |
| 结果页弹窗曝光 | withdraw_result_popup_view | popup_view | 评价/提额/邀请/活动弹窗展示 | popup_type | popup_type:取稳定业务编码,不传展示文案 |
| 结果页弹窗点击 | withdraw_result_popup_click | popup_click | 弹窗按钮/关闭 | popup_type, action_type | popup_type:取稳定业务编码,不传展示文案;action_type:取稳定业务编码,不传展示文案 |
5.5 KYC/BVN/NIN/人脸
覆盖端:
roovault:BVNVerify,NINVerify,BVNandNINVerify,face_guide,face_regwp_h5:faceVerificationcash_center:verifyOtp,thirdBankAuth中的第三方身份/OTP 授权
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| BVN 页 | kyc_bvn_page_view | view | 页面展示 | — | 页面来源按公共字段规则注入 |
| BVN 输入 | kyc_bvn_input_focus | input | 聚焦 | — | 不上报 BVN 原文 |
| BVN 输入失焦 | kyc_bvn_input_blur | input | 失焦 | identity_filled, identity_length | identity_filled:传 true/false,长度与格式正则校验;identity_length:只传长度,不传原文 |
| BVN 清空 | kyc_bvn_input_clear_click | click | 点击清空 | — | 点击对象按公共字段规则注入 |
| 拨号说明 | kyc_identity_dial_click | click | 点击拨号说明 | identity_type | 取 bvn 或 nin,不传拨号码 |
| BVN 提交 | kyc_bvn_confirm_click | click | 点击确认 | identity_filled | 传 true/false,表示 BVN 是否完整且通过前端格式校验 |
| BVN 提交结果 | kyc_bvn_submit_result | result | BVN 校验接口回调 | verification_mode | 取 direct 或 bank_account;结果和错误字段按公共字段规则注入,每次请求只上报一次 |
| 人脸引导页 | face_guide_page_view | view | 引导页展示 | — | 页面来源按公共字段规则注入 |
| 人脸采集页 | face_capture_page_view | view | 采集页展示 | liveness_provider | liveness_provider:取事件触发时页面或接口的实际值 |
| 活体校验结果 | face_liveness_result | result | 活体 SDK 成功/失败回调 | liveness_provider, attempt_no | provider 取实际活体通道;attempt_no从 1 开始;结果和错误字段按公共字段规则注入 |
| 人脸上传结果 | face_upload_result | result | 上传完成 | liveness_provider, upload_stage | upload_stage固定为 face_image;耗时、结果和错误字段按公共字段规则注入 |
| 人脸识别结果 | face_verify_result | result | BNS 人脸识别接口返回 | liveness_provider | 取实际活体通道;结果和错误字段按公共字段规则注入 |
5.6 授信申请资料
覆盖端:
roovault:Work_info,Person_Info,Emergency_Contact,BankAccount
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| 工作信息页 | apply_work_info_page_view | view | 页面展示 | — | 页面来源按公共字段规则注入 |
| 工作信息选择项 | apply_work_info_field_click | click | 点击就业状态、行业、职位、日期、用途等选择项 | field_name, selected_value | field_name取稳定字段编码;selected_value只传字典编码或规定区间,不传展示文案和收入原值 |
| 工作信息输入项 | apply_work_info_field_input | input | 文本或金额输入框失焦 | field_name, filled, value_bucket | filled传布尔值;value_bucket仅用于需求已定义的金额区间,无区间定义时不传 |
| 工作信息提交 | apply_work_info_submit_click | click | 点击下一步 | completed_field_count, missing_field_count, unfilled_fields | unfilled_fields传未填写字段稳定编码数组,按页面顺序排列;不得传中文标题、用户输入值或错误文案 |
| 个人信息页 | apply_person_info_page_view | view | 页面展示 | — | 页面来源按公共字段规则注入 |
| 个人信息选择项 | apply_person_info_field_click | click | 点击教育、婚姻、居住、语言、宗教等选择项 | field_name, selected_value | 只传稳定字段编码和字典编码,不传展示文案 |
| 个人信息输入项 | apply_person_info_field_input | input | 地址等输入框失焦 | field_name, filled, address_completed | 只传填写状态;地址不得上传原文 |
| 个人信息提交 | apply_person_info_submit_click | click | 点击下一步 | completed_field_count, missing_field_count | 传提交时已完成字段数和未完成字段数 |
| 紧急联系人页 | apply_emergency_contact_page_view | view | 页面展示 | — | 页面来源按公共字段规则注入 |
| 联系人关系选择 | apply_emergency_contact_relation_click | click | 选择关系 | contact_role, relation_type | contact_role取 family/other;relation_type取关系字典编码; |
| 点击 Contact | apply_emergency_contact_contact_click | click | 点击联系人图标或联系人输入区域,准备打开系统通讯录 | contact_role | contact_role取 family/other;本事件不传联系人姓名、手机号或通讯录记录标识 |
| 通讯录联系人选择结果 | apply_emergency_contact_contact_select_result | result | 从系统通讯录选择联系人并成功回填姓名、手机号 | contact_role, contact_name, contact_phone | contact_role取 family/other;contact_name取通讯录返回并经页面现有姓名校验后的最终姓名;contact_phone取通讯录返回并经现有号码清洗、格式校验后的最终手机号,按本次需求传明文;仅在联系人选择成功且手机号校验通过后上报一次 |
| 联系人字段输入 | apply_emergency_contact_field_input | input | 姓名或手机号输入框失焦 | contact_role, field_name, filled, value_length | 姓名只传填写状态;手机号可传长度,不传原文 |
| 联系人提交 | apply_emergency_contact_submit_click | click | 点击完成 | completed_field_count, missing_field_count, family_contact_name, family_contact_phone, family_contact_phone_changed, other_contact_name, other_contact_phone, other_contact_phone_changed | 以上联系人属性取点击提交瞬间页面中的最终值;姓名、手机号按本次需求传明文,未填写传空字符串;*_contact_phone_changed 为布尔值:当前手机号与最近一次通讯录回填手机号不同传 true,相同传 false,从未通过通讯录选择时固定传 false;不得传通讯录记录标识 |
| SIM 卡校验失败 | apply_emergency_contact_submit_sim_error_result | result | 点击完成后,客户端未检测到 SIM 卡 | — | 仅在 PhoneUtils.ishasSimCard 返回 false 时上报一次;公共字段 result 固定为 fail,error_code 固定为 client_validation_error,error_msg 固定为 sim_card_missing |
| 申请资料结果 | apply_profile_submit_result | result | 接口返回 | step_name | step_name取 work_info/person_info/emergency_contact;结果和错误字段按公共字段规则注入 |
注意:当前存在把收入、地址、联系人手机号、姓名拼到事件名的实现,必须改为稳定事件名和事件属性。5.6 仅按本表两个事件允许联系人姓名、手机号明文,其他事件仍按第 4.8 节处理。最后一步点击完成时,当前 Android 实现会先执行 SIM 卡存在性校验;未检测到 SIM 卡时只上报 apply_emergency_contact_submit_sim_error_result,不触发 apply_profile_submit_result,也不应将 no_sim 展示文案直接作为 error_msg。
apply_work_info_submit_click.unfilled_fields 为未填写字段的多值枚举,按页面顺序输出,候选编码固定为:employment_status、company_industry、job_title、start_work_time、monthly_income、salary_date、desired_loan_amount、loan_purpose。只包含提交时未填写或未通过前端必填校验的字段编码;全部已填写时固定传 none。具体序列化形式由统一埋点封装按 SDK 能力处理,本文不约定 JSON 结构。
5.7 启动/登录/权限
覆盖端:
roovault:startup,register,VerifyCode,PrivacyPolicy,PermissionsAuth
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| 启动页 | startup_page_view | view | App 启动页展示 | — | 无事件特有属性;公共字段按第 4 章注入 |
| 启动页离开 | startup_page_leave | leave | 跳转下一页 | — | 停留时长和目标页面按公共字段规则注入 |
| 注册登录页 | login_page_view | view | 页面展示 | — | 页面来源按公共字段规则注入 |
| 手机号输入 | login_phone_blur | input | 失焦 | phone_filled, phone_length | phone_filled:传 true/false,表示事件发生时的实际状态;phone_length:只传长度,不传原文 |
| 获取验证码 | login_get_otp_click | click | 点击获取验证码 | — | 无事件特有属性;点击对象按公共字段规则注入 |
| 语音验证码 | login_voice_otp_click | click | 点击语音验证码 | — | 无事件特有属性;点击对象按公共字段规则注入 |
| OTP 页 | login_otp_page_view | view | OTP 页展示 | — | 无事件特有属性;公共字段按第 4 章注入 |
| OTP 提交结果 | login_otp_submit_result | result | 登录接口返回 | — | 结果和错误字段按公共字段规则注入 |
| 隐私协议页 | privacy_policy_page_view | view | 协议展示 | — | 无事件特有属性;公共字段按第 4 章注入 |
| 同意隐私协议 | privacy_policy_agree_click | click | 点击同意 | — | 无事件特有属性;点击对象按公共字段规则注入 |
| 权限页 | permissions_auth_page_view | view | 权限页展示 | permission_list | permission_list:取事件触发时页面或接口的实际值 |
| 权限同意/拒绝 | permissions_auth_action_click | click | 点击同意/拒绝 | permission_list | 取本次申请的权限编码列表;同意或拒绝由公共字段 content 记录 |
| 权限申请结果 | permissions_auth_result | result | 系统权限回调完成 | permission_list, granted_count, denied_count, permanently_denied | 权限列表取实际请求项;计数取本次回调结果;permanently_denied表示是否存在“不再询问”的拒绝项;结果按公共字段规则注入 |
5.8 首页/个人中心/运营位
覆盖端:
roovault:MainActivity,MineFragment, banner/operator/message
个人中心范围以当前 Settings 页面实际展示的入口为准:覆盖 MineFragment 直接入口,以及 OptionsActivity 中的 Check for Updates、Terms & Conditions、Privacy Policy、Contact Us 和 Log Out。Settings 页面中的 Terms/Privacy 事件与 5.7 登录/权限流程中的隐私协议事件分开,分别用于设置页入口和协议同意流程;版本号展示不作为本期业务点击事件。
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| 首页 | home_page_view | view | 首页状态接口返回并完成加工后上报 | borrow_eligibility_status, credit_status, loan_status | 三个状态字段均按第 4.7.4 节从 BNS/可借资格接口真实返回值加工;不传 UI 文案,不使用缓存或按钮可点击状态替代接口结果 |
| 底部 Tab | home_tab_click | click | 点击 tab | tab_name | tab_name:取稳定业务编码,不传展示文案 |
| 个人中心 | mine_page_view | view | MineFragment 展示 | loan_status | 取页面接口已返回的贷款状态;无值时不补默认值 |
| 个人资料入口 | mine_profile_click | click | 点击已登录用户信息区域 | — | 点击对象和目标页面按公共字段规则注入 |
| 个人资料页 | mine_profile_page_view | view | MineAppInfoActivity 展示 | profile_completion_status | 取 complete/incomplete;页面无该状态时不传 |
| 优惠券入口 | mine_coupon_click | click | 点击 My Coupons | — | 点击对象和目标页面按公共字段规则注入 |
| 优惠券页 | mine_coupon_page_view | view | 优惠券 H5/Native 页面展示 | available_coupon_count | 取接口返回的可用优惠券数量 |
| 银行卡入口 | mine_bank_card_click | click | 点击 My Cards | — | 点击对象和目标页面按公共字段规则注入 |
| 银行卡页 | mine_bank_card_page_view | view | 银行卡列表展示 | bound_card_count | 取接口返回的已绑定卡数量 |
| 贷款历史入口 | mine_loan_history_click | click | 点击 Loan History | — | 点击对象和目标页面按公共字段规则注入 |
| 贷款历史页 | mine_loan_history_page_view | view | 贷款历史页面展示 | loan_count | 取当前接口返回的贷款记录数量 |
| FAQ 入口 | mine_faq_click | click | 点击 FAQ | — | 点击对象和目标页面按公共字段规则注入 |
| FAQ 页 | mine_faq_page_view | view | FAQ 页面展示 | — | 页面来源按公共字段规则注入 |
| 设置入口 | mine_settings_click | click | 点击 Settings | — | 点击对象和目标页面按公共字段规则注入 |
| 设置页 | mine_settings_page_view | view | OptionsActivity 展示 | — | 页面来源按公共字段规则注入 |
| Terms & Conditions 入口 | mine_terms_conditions_click | click | 设置页点击 Terms & Conditions | — | 点击对象和目标页面按公共字段规则注入 |
| Terms & Conditions 页 | mine_terms_conditions_page_view | view | Terms & Conditions 页面展示 | — | 页面来源按公共字段规则注入 |
| Privacy Policy 入口 | mine_privacy_policy_click | click | 设置页点击 Privacy Policy | — | 点击对象和目标页面按公共字段规则注入;与 5.7 的隐私协议同意流程事件区分 |
| Privacy Policy 页 | mine_privacy_policy_page_view | view | Privacy Policy 页面展示 | — | 页面来源按公共字段规则注入;与 5.7 的 privacy_policy_page_view 区分页面入口场景 |
| 检查更新 | mine_check_update_click | click | 设置页点击 Check Update | — | 点击对象按公共字段规则注入 |
| 检查更新结果 | mine_check_update_result | result | 版本检查接口返回 | has_new_version | 传是否存在新版本;结果和错误字段按公共字段规则注入 |
| Contact Us 入口 | mine_contact_us_click | click | 设置页点击 Contact Us | — | 点击对象和目标页面按公共字段规则注入;未登录或资料未完成时仍记录用户点击,后续跳转结果按业务流程处理 |
| Contact Us 页 | mine_contact_us_page_view | view | 客服聊天/WebContainer 页面展示 | — | 页面真实展示后上报;页面来源和目标页面按公共字段规则注入 |
| 退出登录 | mine_logout_click | click | 设置页点击 Logout 并确认 | — | 点击对象按公共字段规则注入 |
| 退出登录结果 | mine_logout_result | result | 退出登录处理完成 | — | 结果和错误字段按公共字段规则注入 |
| 投诉反馈入口 | mine_complaint_click | click | 点击 Complaint Feedback | — | 点击对象和目标页面按公共字段规则注入 |
| 投诉反馈页 | mine_complaint_page_view | view | 投诉反馈 H5 展示 | — | 页面来源按公共字段规则注入 |
5.9 补件/客诉/增信(忽略)
覆盖端:
wp_h5:uploadDocuments,complaint,increaseLimit,recredit
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| 补件页 | upload_documents_page_view | view | 页面展示 | document_type, required_count | document_type:取稳定业务编码,不传展示文案;required_count:传事件发生时的整数值 |
| 选择文件 | upload_documents_choose_file_click | click | 点击选择文件 | document_type, file_type | document_type:取稳定业务编码,不传展示文案;file_type:取稳定业务编码,不传展示文案 |
| 上传结果 | upload_documents_file_result | result | 上传成功/失败 | document_type | document_type取稳定业务编码;结果和错误字段按公共字段规则注入 |
| 提交补件 | upload_documents_submit_click | click | 点击提交 | uploaded_count, required_count | 传已上传数量和要求数量 |
| 客诉页 | complaint_page_view | view | 页面展示 | — | 页面来源按公共字段规则注入 |
| 客诉提交 | complaint_submit_click | click | 点击提交 | complaint_type, has_attachment | complaint_type取稳定业务编码;has_attachment传布尔值 |
| 客诉结果 | complaint_submit_result | result | 接口返回 | — | 结果和错误字段按公共字段规则注入 |
| 增信页 | increase_limit_page_view | view | 页面展示 | material_required | 取当前流程是否要求补充材料 |
| 增信提交 | increase_limit_submit_click | click | 点击提交 | material_count | 传本次提交的材料数量 |
| 增信结果 | increase_limit_submit_result | result | 接口返回 | — | 结果和错误字段按公共字段规则注入 |
5.10 浏览器/性能监控
覆盖端:
wp_h5:browser_info,web_performance_metrics
| 页面/模块 | 事件名 | 类型 | 触发时机 | 事件特有必传字段 | 字段取值逻辑 |
|---|---|---|---|---|---|
| 浏览器信息 | browser_info | result | 页面初始化后 | browser_name, browser_version, os, user_agent_hash | browser_name:取事件触发时页面或接口的实际值;browser_version:取事件触发时页面或接口的实际值;os:取事件触发时页面或接口的实际值;user_agent_hash:取事件触发时页面或接口的实际值 |
| 页面性能 | web_performance_metrics | performance | 页面加载完成 | dns_ms, tcp_ms, request_ms, response_ms, dom_ready_ms, load_ms, resource_count | dns_ms:传客户端计算的毫秒数;tcp_ms:传客户端计算的毫秒数;request_ms:传客户端计算的毫秒数;response_ms:传客户端计算的毫秒数;dom_ready_ms:传客户端计算的毫秒数;load_ms:传客户端计算的毫秒数;resource_count:传事件发生时的整数值 |
| 接口性能 | api_response_time | performance | 关键接口完成 | api_name | api_name取接口字典中的稳定编码;耗时、结果和错误码按公共字段规则注入 |
5.11 Android 原生场景事件名和必传字段匹配分析
分析基线:roovault origin/develop,提交 3ae2c97。仅检查未被注释且存在实际调用的 SensorsApiHelper.trackView/trackClick 和 AnalyticsTracker.trackView/trackClick。DataRecordConstant 中只声明但未调用的常量、注释代码和 H5 Bridge 转发事件不作为 Android 原生覆盖证据。
5.11.1 场景级覆盖结论
| 场景 | Android 当前实际调用证据 | 事件名合理性 | 必传字段合理性与完整性 | 结论 |
|---|---|---|---|---|
| 5.1 还款/支付 | 未发现还款方式、支付确认、还款结果、虚拟账户或还款历史的原生埋点调用 | 当前事件名适用于 cash_center/wp_h5,但不能称为 Android 已有事件 | loan_id、金额、支付方式和结果字段在当前原生调用中没有来源 | Android 原生不纳入本场景覆盖;保留 H5/业务中心事件,不能用原生埋点验收 |
| 5.2 绑银行卡 | 当前 roovault 未发现银行卡输入、OTP、绑卡处理或绑卡结果的原生调用;BvnBankAccountActivity 是银行账户流程,不是银行卡流程 | 事件名与银行卡流程语义一致,但不是当前 Android 代码事件名 | 卡号完成状态、卡组织、provider、结果等字段当前没有原生调用点 | 移除 Android 覆盖声明;本场景仅按 cash_center/wp_h5 和实际绑卡模块验收 |
| 5.3 绑银行账户 | BvnBankAccountActivity 有页面展示/离开、银行选择、账号聚焦/失焦、BVN 勾选、性别选择、提交点击,以及 onFindBvnInfoSuccess/onFindBvnInfoError 回调 | 通用控件使用 bank_account_*;Activity 独立页面使用 bvn_bank_account_page_view,避免继续沿用含义不清的旧 BankAccount_* | 银行编码、账号完成状态和页面入参可直接取得;BVN 查询结果可在 findBvnInfo 成功/失败回调取得;provider 和后续阶段状态仍需各自接口返回 | 页面事件和 bvn_bank_account_submit_result 本期必须补齐;provider/阶段事件只在对应接口真实返回时上报 |
| 5.4 提现/提现结果 | 未发现原生提现页面、金额、期限、提交或结果事件调用 | 事件名适用于提现 H5,当前 Android 无对应页面事件 | loan_id、product_id、金额、期限、账户类型和结果字段均无原生触发点 | Android 原生不纳入本场景覆盖;字段只对 H5/业务中心生效 |
| 5.5 KYC/BVN/NIN/人脸 | BVN、NIN、BVN+NIN 有页面、输入和确认调用;BaseFaceIdentifyActivity 有活体通道、上传成功/失败和识别结果回调 | 用户提交统一使用 click,输入聚焦/失焦使用 input;新增 kyc_bvn_submit_result、face_liveness_result,保留服务端人脸结果 face_verify_result | BVN 填写状态、活体 provider 和回调结果可取得;证件原文、图片地址和原始错误禁止上报 | 三类结果事件必须分别落在 BVN 接口、活体 SDK、BNS 人脸接口回调,不得用页面跳转推断成功 |
| 5.6 授信申请资料 | 工作和个人信息页同时存在选择控件与输入控件;紧急联系人页明确有系统 Contact 点击入口、通讯录选择回调、字段输入和提交点击 | 选择行为使用 *_field_click,输入失焦使用 *_field_input;Contact 入口独立为 apply_emergency_contact_contact_click;通讯录回填结果使用 apply_emergency_contact_contact_select_result | 字段编码、填写状态、通讯录回填后的姓名/手机号及最近一次回填值可取得;unfilled_fields 需要提交时按页面字段顺序实时计算 | 开发需补完成数、缺失数和 unfilled_fields;Contact 点击只传 contact_role;通讯录选择结果和提交点击按 5.6 表传联系人姓名、手机号明文及手机号变更标识,禁止扩散到其他事件 |
| 5.7 启动/登录/权限 | 启动、注册、OTP、隐私协议、权限页有调用;权限实际结果在 AcpListener.onGranted/onDenied 回调产生 | 点击同意/拒绝为 permissions_auth_action_click;系统授权结果独立为 permissions_auth_result | 权限列表、授权/拒绝数量和永久拒绝状态可在回调计算;公共版本、渠道和结果字段不在事件特有属性中重复列出 | 补登录接口结果和权限系统回调结果;不能把“点击同意”视为“已授权成功” |
| 5.8 首页/个人中心/运营位 | MineFragment 有个人中心曝光和个人资料、优惠券、银行卡、贷款/还款历史、FAQ、设置、客服、信用报告、投诉反馈、银行转账等真实点击分支;当前仅少数分支已有埋点 | 旧 account_page_view 统一改为 mine_page_view;个人中心各入口使用 mine_*_click,目标页面使用 mine_*_page_view | 点击分支可确定入口和目标页;数量、状态类事件特有字段只在目标页接口已返回时传 | 本期补齐个人中心全部真实入口和目标页面事件;旧 account_* 仅作代码迁移来源,不并行上报 |
| 5.9 补件/客诉/增信 | 未发现 Android 原生补件、客诉、增信事件调用 | 事件名适用于 H5,不能作为 Android 原生事件 | 文件类型、投诉类型、材料数量和结果字段没有原生触发点 | Android 原生不纳入本场景覆盖 |
| 5.10 浏览器/性能监控 | 仅定义为 wp_h5 场景,未发现 Android 原生对应调用 | 事件名适用于浏览器/H5 | 浏览器和 Web 性能字段不属于当前 Android 原生事件必传字段 | 保持 H5 专属,不向 Android 公共事件扩展 |
5.11.2 Android 当前有调用场景的字段审查
| Android 页面/事件组 | 当前代码能确定的字段 | 当前必传字段中不成立或缺失的字段 | 本期落地要求 |
|---|---|---|---|
BvnBankAccountActivity / BankAccount | 页面进入/离开、当前是否勾选 BVN、银行对象、账号是否为空/长度、页面入参,以及 findBvnInfo 成功/失败回调 | 旧事件只拼接银行名或账号;缺少独立页面事件和结构化结果事件 | 新增 bvn_bank_account_page_view;通用控件复用 bank_account_*;在 onFindBvnInfoSuccess/onFindBvnInfoError 上报 bvn_bank_account_submit_result |
BVNVerify / NINVerify / BVNandNINVerify | identity_type、字段名称、聚焦/失焦/清除、切换目标、拨号类型、确认动作和接口回调 | 当前确认事件把 inputVerficationCode 拼入事件名,且没有独立 BVN 结果事件 | 确认点击只传填写状态;BVN 接口回调新增 kyc_bvn_submit_result,公共结果/错误字段由统一上下文注入 |
face_guide / face_reg | 引导页、识别页、活体通道、上传和识别成功/失败回调 | 当前成功/失败散落在 AnalyticsTracker,上传耗时拼入事件名 | 活体 SDK 回调上报 face_liveness_result;图片上传回调上报 face_upload_result;BNS 人脸接口回调上报 face_verify_result |
Work_info | 页面展示/离开;月收入输入;就业、行业、职位、工作时间、发薪日、期望金额和用途选择;下一步点击 | 当前字段事件混用 trackView/trackClick;提交时没有完成数、缺失数和未填写字段列表 | 选择事件使用 apply_work_info_field_click,输入事件使用 apply_work_info_field_input;提交点击实时计算 completed_field_count、missing_field_count、unfilled_fields |
Person_Info | 页面展示/离开;教育、婚姻、子女、居住、语言、宗教等当前值;提交点击 | 地址和详细地址被拼入事件名;完成数、缺失数、提交结果没有调用 | 地址只传 address_completed;其余字段传枚举/区间;提交结果必须由接口回调触发 |
Emergency_Contact | 页面展示/离开;家庭/其他联系人关系、姓名/手机号输入、系统通讯录 Contact 点击和提交点击;提交前执行 PhoneUtils.ishasSimCard 校验 | 当前动态事件名包含姓名、手机号和关系文本;系统 Contact 点击未单独上报;未检测到 SIM 卡时当前只有提示,没有结果事件 | 新增 apply_emergency_contact_contact_click,只传 contact_role;关系选择与字段输入分开,提交只传完成数和缺失数;SIM 校验返回 false 时新增 apply_emergency_contact_submit_sim_error_result,公共结果/错误字段按第 4 章注入 |
startup / register / VerifyCode | 启动/注册/OTP 页面展示和离开;获取验证码、语音验证码展示/点击 | app_version、channel、otp_type 当前没有在调用参数中传入;手机号被拼入事件名;登录结果缺失 | 版本和渠道由公共上下文注入;手机号只传填写状态/长度;OTP 事件传 otp_type;登录接口返回后新增 login_otp_submit_result |
PrivacyPolicy / PermissionsAuth | 协议页面展示/离开、同意;权限页展示/离开、同意/拒绝;AcpListener 提供授权结果回调 | 当前只记录用户点击,没有区分系统最终授权结果 | 点击事件记录用户动作;onGranted/onDenied 上报 permissions_auth_result,传权限列表、授权/拒绝数量和永久拒绝状态 |
MainActivity / MineFragment | Tab 分支和 MineFragment 全部可点击入口均可从 switch(v.getId()) 确定;目标页由 Intent/H5 URL 明确 | 当前常量仍为 account_*,且只有贷款历史、还款历史已有点击埋点 | 统一迁移到 mine_page_view、mine_*_click、mine_*_page_view;公共 content/source_page/target_page不在事件特有字段中重复定义 |
MainFragment / HomeMainPresenter | queryCustInfo 返回 custInfo.creditStage、queryCustLmtResp、blcQueryLoanStageResp.stage;queryCustLoanInfo 返回 queryPreviousLoanResp.loanStatus 和还款计划;queryloanapplyauthority 返回 isCanloanApply | 当前首页没有结构化的三状态事件;Android 仅部分把 loanStage=20/22覆盖到页面状态,19未完整透传;可借资格接口失败时模型还可能返回空对象 | home_page_view 等待状态查询完成后,按 4.7.4 映射 borrow_eligibility_status/credit_status/loan_status;不能用 UI 展示状态或失败默认值替代后端结果 |
5.11.3 事件名和必传字段的统一判定标准
- 事件名必须描述当前调用的用户行为或页面状态,不能把手机号、证件号、账号、金额、选择值、验证码或耗时拼在事件名后。
- “必传字段”只有在该事件触发点能够从当前页面状态、真实接口响应或统一运行时上下文直接取得时才成立;仅靠后续接口才能取得的字段,必须放到结果事件,不得强加到点击事件。
view、click、input、result必须按实际触发动作区分:按钮和选择项为click,文本/数字输入状态为input,接口、客户端校验或系统 SDK 回调结果为result;不再使用混合类型或submit类型。- 各事件表只定义事件特有属性。第 4 章公共字段由统一上下文按事件类型自动注入,禁止在事件特有属性中重复声明。
- Android 当前没有调用证据的 5.1、5.2、5.4、5.9、5.10 事件,不纳入 Android 原生完成率;5.3、5.5、5.6、5.7、5.8 按本节列出的当前覆盖与新增改造点分别验收。
- 当前
SensorsApiHelper/AnalyticsTracker调用没有业务 properties;以上字段分析是结构化改造后的落地要求,不代表当前线上已经采集。结构化入口接通神策 SDK 后,才按本节验收字段完整性。
6. 全新上线要求
本期为全新上线,不考虑旧版本兼容,不要求新旧事件并行上报。
- 全部埋点按本需求的新事件名、新字段、新触发规则实现。
- 不新增
legacy_event_name、old_event_name等兼容字段。 - 当前代码里已有的旧事件可作为实现参考,但不能作为验收口径。
- 数据验收只校验新事件是否到达、字段是否完整、值是否符合枚举。
- 上线前需要冻结一版埋点字典,研发、测试、数据看板均以该字典为准。
7. 技术改造要求
8. 验收标准
8.1 功能验收
| 项 | 标准 |
|---|---|
| 页面进入 | 核心页面 100% 有 *_page_view |
| 页面离开 | 核心页面 100% 有 *_page_leave 或可靠替代 |
| 点击行为 | 核心 CTA 100% 有 click 事件 |
| 结果行为 | 所有提交类接口 100% 有 result |
| 字段完整性 | 公共字段完整率不低于 99% |
| 敏感信息 | 除 5.6 明确允许的 contact_name、contact_phone 外,event_name 和事件自定义属性中不出现明文敏感信息;5.6 明文字段仅出现在规定事件中 |
| 失败隔离 | 埋点接口失败不影响业务 |
| 去重 | 同一页面进入不重复上报,KeepAlive 场景需明确规则 |
8.2 数据验收
| 场景 | 核对方式 |
|---|---|
| 还款漏斗 | repayment_method_page_view -> repayment_confirm_click -> repayment_submit_result -> repayment_result_page_view |
| 绑卡漏斗 | bank_card_page_view -> bank_card_submit_click -> bank_card_submit_result -> bank_card_result_page_view |
| 提现漏斗 | withdraw_page_view -> withdraw_submit_click -> withdraw_submit_result -> withdraw_result_page_view |
| BVN 漏斗 | kyc_bvn_page_view -> kyc_bvn_confirm_click -> kyc_bvn_submit_result |
| BVN 银行账户验证 | bvn_bank_account_page_view -> bank_account_submit_click -> bvn_bank_account_submit_result |
| 活体/人脸漏斗 | face_capture_page_view -> face_liveness_result -> face_upload_result -> face_verify_result |
| 授信资料提交 | apply_emergency_contact_submit_click -> apply_emergency_contact_submit_sim_error_result(未检测到 SIM 卡);通过 SIM 校验后再按实际接口结果进入 apply_profile_submit_result |
| 登录漏斗 | login_page_view -> login_get_otp_click -> login_otp_submit_result |
| 权限漏斗 | permissions_auth_page_view -> permissions_auth_action_click -> permissions_auth_result |
| 个人中心 | mine_page_view -> mine_*_click -> mine_*_page_view,逐一核对当前有效入口 |
8.3 抽样验收
- 每个端至少抽 5 个真实用户会话。
- 每个核心场景至少覆盖成功、失败、取消/返回 3 类路径。
- 对比前端调试日志、大数据接收日志和分析报表,事件数差异不得超过 2%。
9. 优先级
P0
- 去除所有拼进
event_name的敏感明文。 - 统一新增事件的公共字段。
- 为还款、绑卡、提现、KYC、登录补齐 page_view/click/result。
- 建立验收查询和开发调试能力。
P1
cash_center升级到/dc/buriedPointBatch/v2。- H5 路由级 page_view/page_leave 统一。
- Android
SensorsApiHelper支持结构化字段。 - 补齐补件、客诉、增信、运营位字段。
P2
- 建立埋点字典和版本管理。
- 建立新事件的数据看板和口径说明。
- 性能和接口耗时统一埋点。
10. 交付物
- 埋点字典:事件名、页面、场景、字段、枚举、触发时机。
- 技术改造:H5 统一 SDK、Android 结构化事件、后端敏感字段校验。
- 验收用例:按场景覆盖成功/失败/取消路径。
- 数据看板:核心漏斗、失败原因、页面停留、渠道维度、版本维度。