在简易用户关联方案中,所有的用户 ID 会被分为两类,一类是设备 ID(匿名 ID),一类是登录 ID。
在实际业务中,很多触点的用户标识,会介于上述二者之间,比如微信生态的 OpenID 和 UnionID。
为了彻底解决用户关联的问题,我们采用了新的标识用户方案,该方案与过往最大的区别在于所有的 ID 都有了明确的含义。
请注意,项目部署后,默认是使用简易用户关联的一对一关联方案,若需要更换到全域用户关联方案,可联系神策值班同学。
用户关联方案可升级方式:简易用户关联一对一关联方案→简易用户关联多对一关联方案→全域用户关联,只允许从前到后单向升级(可从一对一直接升级到全域用户关联),不支持反向升级。
项目重置后,默认会回退到简易用户关联一对一关联方案,若需要更换到全域用户关联方案,可联系神策值班同学。
典型场景
概述 | 使用场景 |
---|---|
单业务线中存在多个触点 | 业务触点包含 App、Web、微信小程序、微信公众号、企业微信等多触点,需要尽快打通用户在不同触点的数据。 |
跨业务线数据打通 | 多业务线用户没有打通(例如一个手机号登录不同业务线,获取到的用户登录标识不一样),现需要做跨业务线用户打通。 |
基本概念
神策 ID
神策分析使用神策 ID (即 events 表里的 user_id 和 users 表里的 id )来对每个产品的用户进行唯一的标识,而神策 ID 是基于业务 ID 按照一定规则生成的。
业务 ID
概述
一个用户在不同的触点、不同的业务阶段,都可以获取到不同 ID 来标识用户行为,例如设备 ID、邮箱地址、微信的 OpenID 和 UnionID,用户登录标识等,这些我们统称为业务 ID。
这些业务 ID 的区别主要是生命周期和精度的不同。
分类
业务 ID 可以大致分为设备 ID、特定生态的 ID、业务相关的标识三类;
分类 | 描述 | 代表 |
---|---|---|
设备 ID | 这类 ID 指的是神策客户端 SDK 在首次初始化后,默认生成的设备 ID,例如 Web 端的 cookie_id,iOS 端的 IDFV。 这类业务 ID 的特征是不稳定、生命周期也比较短。 例如 Web 端的 Cookies 有可能被清空(比如各种安全卫士),iOS 端的 IDFV 在 App 卸载重新安装后会发生变化等。 | AndroidId、IDFV、cookie_id 等 |
特定生态的 ID | 这类 ID 指的是特定生态中标识用户的 ID,例如微信生态的 OpenID、UnionID,企业微信生态的外部联系人 ID。 这类业务 ID 相比于设备 ID,稳定性会大大提高,生命周期也相对较长,但是仍然会存在变化的可能。 例如 App 注册登录后,绑定了微信号,后续可能因为各种原因,解绑之前的微信号,重新绑定一个新的微信号。 | OpenID、UnionID 等 |
业务相关的标识 | 这类 ID 主要是实际业务系统中的用户 ID,通常是业务数据库里中用户表的主键。 相比于特定生态的 ID,这类 ID 主要是由业务系统生成,稳定性更高,生命周期更长。 | 用户登录 ID 等 |
语义明确
相比于过去只有匿名 ID 和登录 ID,在该方案中,所有的业务 ID 在事件上报以及神策系统中,都会标识明确的类型。
数据上报中,每条数据会有 identities 结构,里面会有明确类型的业务 ID:
{
"distinct_id":"123",
"login_id":"123",
"anonymous_id":"xxxxxxxx",
"identities":{
"identity_a_user_id":"123",
"$identity_mp_unionid":"aZxxxxxxxx",
"$identity_mobile":"131xxxxxxxx",
"$identity_android_id":"xxxxxxxx"
}
……
}
神策系统中,
关于 ID,神策系统内会预置常用的 ID,具体可以参考 预置 id key 清单
其中,$identity_login_id 是系统内优先级最高的 ID,每个用户有且只有一个该 ID(对应数量配置始终为 1),无法更改。
- 关于 $identity_login_id 对应业务中的哪一个 ID?
- 需要业务侧确定是否有一种 ID 能够唯一标识所有用户,如果有则使用 $identity_login_id 来承接,如果没有则可以不使用该 $identity_login_id。
- 没有 $identity_login_id,会有什么影响?
- 对于业务上没有影响,其他有数据的 ID 会按照给定的规则正常关联。
- 使用 $identity_login_id 的好处是什么?
- 当一个用户关联上 $identity_login_id 之后,其 user_id 会变得稳定,不会因为关联其他 ID 而发生变化。
- 使用 $identity_login_id 上报的事件数据,由于其 user_id 的稳定,不会触发事件回溯,在一定程度上可以减少回溯带来的事件变化。
- $identity_login_id 是否有什么额外的限制?
- 有,$identity_login_id 作为系统内优先级最高且唯一的 ID,是无法解绑的。
能力介绍
业务 ID 自由关联
得益于每个业务 ID 都有明确的类型,我们可以支持任意业务 ID 之间的自由关联,当然前提是需要将这些业务 ID 在同一条数据中上报上来。
例如,可以直接将用户的设备 ID 和对应的 OpenID 进行关联,也可以将用户微信生态的 UnionID 和 OpenID 进行关联,同样可以将一个用户不同业务线的登录 ID 进行关联。
支持业务 ID 解绑
过去,一个登录 ID 和一个匿名 ID 一旦关联,就不可改变。
但是实际业务会有很多需要更换 ID 的场景,例如最常见的手机号更换,银行卡解绑。
该方案可以实现已关联业务 ID 的解绑,只需要调用对应 SDK 的相关接口或者构建对应的解绑事件,即完成用户已关联业务 ID 的解绑。
解绑事件示例如下:
{
"identities":{
"$identity_mobile":"131xxxxxxxx"
},
"type":"track_id_unbind",
"event":"$UnbindID",
"project":"xxx",
……
}
关联原则
- 一个 ID 在同一时刻内,有且只有一个神策 ID。例如,同一个手机号,不可能同时是用户 A 和用户 B 的,同一个设备 ID 亦是如此;
- 完全孤立的 ID 是无法进行打通的;如果需要明确 A_ID=A1、B_ID=B1 是一个用户,那么必须有一条数据里同时有 A_ID=A1、B_ID=B1,这样知晓两个 ID 之间的关系,从而实现打通。
关键概念
用户业务 ID 的含义明确了,也会带来一个变化,就是业务 ID 的类型变多了。
(神策系统内会预置一些业务 ID,覆盖诸如微信公众号、微信小程序、企业微信、App 等主要场景;如果仍然不满足业务需求,则可以通过神策系统内「数据融合」→「用户表」→「配置用户关联」来新增。)
如果一条数据中上报了很多类型的业务 ID,这些业务 ID 能否成功关联,还需要看另外两个概念:数量和优先级。
关联约束
关联约束是业务 ID 级别的配置,其含义是一个用户可以拥有单个还是多个此类型的业务 ID;
比如手机号,一个人只能有一个,那么手机号的数量配置就是单值;
比如 AndroidId,一个人可能会更换手机、或者同时使用多个手机,那么 AndroidId 的数量配置就是多值;
当上报数据违反关联约束时,则新上报的业务 ID 会关联失败,无法写入用户表对应的业务 ID 中。
优先级
当上报数据的业务 ID 无法成功关联时,就需要使用业务 ID 优先级,来判断事件的归属用户。
假设,客户有两个ID,一个是 A_ID,一个是设备ID,ID 配置如下表格:
优先级 | 业务 ID | 关联约束 | 备注 |
---|---|---|---|
1 | A_ID | 单值 | A 业务线登录 ID |
2 | 设备 ID | 多值 | 普通设备 ID |
用户的操作如下:
- 当用户在小米手机上(AndroidID=小米 1)登录 A_ID=A1,小米 1 和 A1 成功关联;
- 当用户在该小米手机上,切换登录另一个账号 A_ID=A2,小米 1 和 A2 无法成功关联,如果 A1、A2、小米 1 关联为一个用户,则违反了 A_ID 数量为 1 的限制。
那么切换账号后,用户行为应该归属谁呢?
由于 A_ID 的优先级高于设备 ID,所以切换账号后的行为应该归属于 A2 对应的用户。
关联上限
关联约束为多值的用户标识可以设置关联上限,即:单个用户可以关联该标识的最大数量。
该数值只能输入大于 1 且小于 500 的整数。
超限策略
标识当单个用户关联对应标识超过关联上限时的处理策略。
滚动解绑:(默认策略)删除最早的标识,新的标识继续关联。
数据拦截:整条数据拦截,已关联的标识不会发生改变。
适用场景
该方案主要适用于 ID 来源复杂多样,ID 关系复杂的场景,举例如下:
- 业务触点多:需要打通微信生态、H5、App、电商平台、内部 CRM 等全渠道的数据,
- 拉通相互独立的多业务线的用户数据:例如同一手机号登录不同的业务线,获取到的业务线登录 ID 不一致,现在需要将不同业务线的同一个用户拉通;
实施方法
- 梳理各个触点的需要用于标识用户的业务 ID;
- 确定各个业务 ID 的数量以及优先级;
- 埋点侧将对应的业务 ID 都进行采集和上报。
案例
业务 ID 配置信息(以下配置仅表示示例,实际配置会有所差别)
优先级 | 业务 ID | 数量 |
---|---|---|
1 | login_id | 1 |
2 | mobile | 1 |
3 | UnionID | 1 |
4 | A_OpenID | 1 |
5 | B_OpenID | 1 |
6 | C_OpenID | 1 |
7 | AndroidId | N |
events 表
序列 | event (事件) | AndroidId (安卓设备 ID) | login_id (业务线登录 ID) | mobile (手机号) | A_OpenID (订阅号 OpenID) | B_OpenID (服务号 OpenID) | C_OpenID (小程序 OpenID) | UnionID (微信 UnionID) | user_id (神策 ID) |
---|---|---|---|---|---|---|---|---|---|
1 | 用户下载安装使用 App | AndroidId_x | 1 | ||||||
2 | 用户注册登录 App | AndroidId_x | login_id_1 | 1 | |||||
3 | 用户绑定了手机号 | AndroidId_x | login_id_1 | 131xxxxxxxx | 1 | ||||
4 | 用户在订阅号 A 产生交互 | A1 | U1 | 2 | |||||
5 | 用户在服务号 B 产生交互 | B1 | U1 | 2 | |||||
6 | 用户访问小程序 C 并授权手机号 | 131xxxxxxxx | C1 | U1 | 2→1 | ||||
7 | 用户在 App 上解绑了原先的手机号 | 131xxxxxxxx | 1 | ||||||
8 | 用户在 App 上绑定新手机号 | login_id_1 | 156xxxxxxxx | 1 |
users 表
id 神策 ID | AndroidId (安卓设备 ID) | login_id (业务线登录 ID) | mobile (手机号) | A_OpenID (订阅号 OpenID) | B_OpenID (服务号 OpenID) | C_OpenID (小程序 OpenID) | UnionID (微信 UnionID) |
---|---|---|---|---|---|---|---|
1 | AndroidId_x | login_id_1 |
156xxxxxxxx | A1 | B1 | C1 | U1 |
详细步骤说明如下:
- 用户下载安装 App,获取到 AndroidId=AndroidId_x,分配对应的神策 ID 为 1,同时将神策 ID 1、AndroidId_x 写入 users 表对应的字段中;
- 用户注册登录 App,获取到 login_id=login_id_1,AndroidId_x 和 login_id_1 关联成功,并将 login_id_1 写入 users 表对应的字段中;
- 用户绑定了手机号,获取到 mobile=131xxxxxxxx,AndroidId_x、login_id_1、131xxxxxxxx关联成功,同样将 131xxxxxxxx 写入 users 表对应的字段中;
- 用户在订阅号 A 有交互,获取到对应的订阅号 A_OpenID=A1 和 UnionID=U1,A1、U1 都是全新的业务 ID,所以新分配神策 ID 为 2,同时将策 ID 2、A1、U1 写入 users 表对应的字段中;
- 用户在服务号 B 有交互,获取到对应的 B_OpenID=B1 和 UnionID=U1,B1 和 U1 关联成功,并将 B1 写入 users 表对应的字段中;
- 用户访问小程序 C 并授权手机号,可以同时获取到 mobile=131xxxxxxxx 和 UnionID=U1,由于 mobile=131xxxxxxxx 与神策 ID 1 的手机号相同,且关联不违反原则,所以神策 ID 2 会合并到神策 ID 1 上,同时 users 表中删除神策 ID 2;
- 用户在 App 上解绑了原先的手机号 mobile=131xxxxxxx,解绑成功,131xxxxxxxx 会从 users 表中神策 ID 1 的 mobile 字段中删除;
- 用户在 App 上绑定新手机号 mobile=156xxxxxxxx,绑定成功,156xxxxxxxx 会写入 users 表中神策 ID 1 的 mobile 字段中;
后续修复:
- 由于用户访问小程序 C 并授权手机号,触发了神策 ID 1 和神策 ID 2 的合并,之后 users 表会将神策 ID 2 进行删除;
- 事件表中原先的神策 ID 2 ,也会被一并修复成神策 ID 1;
至此,用户在 App 端和微信生态的行为,全部拉通了。
局限性
不支持表达不同用户之间关系
全域用户关联可以完成单个用户在不同业务线、不同触点的用户标识打通,无法表达不同类型用户之间的关系。
例如学生和老师的关系,一个老师可以对应多个学生,一个学生也可以对应多个老师。