TikTok / Shopee 订单归因与接口调用说明
这份文档解释一笔三方平台订单如何回到 BeeX:用户点击/转链时我们写入什么标识,平台订单接口会回传什么字段,
BeeX 如何把订单匹配到 affiliate_clicks、用户、商品图片和返佣记录。
1. 先讲清楚:什么叫订单归因
BeeX 的“订单归因”不是单纯“订单同步到了”。真正完整的归因要同时完成三件事:
| 层级 | 代表字段 | 说明 | 缺失时的影响 |
|---|---|---|---|
| 订单同步 | affiliate_orders.platform_order_id |
从 TikTok / Shopee 订单接口拉到了订单,订单进入 BeeX。 | 没有订单,后续佣金、钱包都不会产生。 |
| 用户归因 | affiliate_orders.user_id |
知道这笔订单属于哪个 BeeX 用户。 | 不能给用户生成返佣记录。 |
| 点击归因 | affiliate_orders.click_id |
知道订单来自哪一次转链/点击,能关联商品图、商品链接、渠道、设备和分享来源。 | 订单可存在,但商品图可能变占位图,点击来源和商品级统计会不准。 |
affiliate_orders.click_id IS NOT NULL 才算“完整归因”。
如果 click_id = NULL,说明平台订单已经同步,但没有匹配到 BeeX 的具体点击记录。
核心数据流
sequenceDiagram
participant U as 用户 App/H5
participant B as BeeX 服务端
participant C as affiliate_clicks
participant P as TikTok/Shopee
participant O as affiliate_orders
U->>B: 生成返佣链接 /api/v1/affiliate-links/generate
B->>C: 写入 click_id、tracking_tag、tracking_code、商品图、商品链接
B->>P: 调平台转链接口,写入平台可回传的归因字段
P-->>U: 返回可购买链接
U->>P: 点击链接并下单
B->>P: 定时拉订单报表
P-->>B: 返回订单 raw payload + 平台归因字段
B->>C: 从回传字段提取 tracking_code 并精确匹配
alt TikTok 未回传 tracking_code
B->>C: 按同商品 + 下单前时间窗口匹配最近点击
end
B->>O: 写入订单,click_id 不为空则完整归因
2. TikTok Shop 订单归因
生成链接时 BeeX 写入什么
用户在 App/H5 点击“去 TikTok 购买”前,BeeX 先写一条 affiliate_clicks。
然后调用 TikTok Creator 分享链接接口,body 中带 tags,并在返回链接上追加 BeeX 参数。
同步订单时 BeeX 用什么匹配
订单同步服务会扫描 TikTok raw payload 里的文本字段,提取 BeeX 短 tracking_code,并按国家、平台、环境精确匹配点击。
当前代码没有直接用解析出的长 click_id 或 tracking_tag 查询点击;短码匹配失败后,才按同商品 + 下单前时间窗口匹配最近点击。
2.1 App/H5 调 BeeX 生成链接
POST https://api-id-test.beexofficial.com/api/v1/affiliate-links/generate
Content-Type: application/json
Authorization: Bearer {BeeX access token}
{
"countryCode": "ID",
"platform": "TIKTOK",
"userId": "usr_xxx",
"referralCode": "BXH6G4QAHC",
"deviceId": "AVPHuSdhJDxyq7WEqDYlihI",
"channel": "h5",
"productUrl": "https://vt.tokopedia.com/t/...",
"platformProductId": "1733045523587827027"
}
2.2 BeeX 调 TikTok Creator 生成分享链接
| 项 | 当前配置 / 代码 | 说明 |
|---|---|---|
| 接口 | SEAHUB_TIKTOK_CREATOR_SHARING_LINK_PATH 指定的 Creator 分享链接接口 |
代码默认是 /affiliate_creator/202501/affiliate_sharing_links/generate_batch;配置为 /affiliate_creator/202505/affiliate_sharing_links/general_publishers/generate_batch 时会自动使用新版 body。判断实际环境必须查看部署变量,不能只看默认值。 |
| Access Token | Creator 授权账号 token | 从平台账号配置读取。没有 Creator 授权或接口失败时当前生成链路会直接失败,不会静默返回原始链接。 |
| 请求 body | material.id / material.type / channel / tags |
tags 写入 BeeX 的 tracking_tag,用于平台回传时归因。 |
{
"material": {
"ids": ["1733045523587827027"],
"type": "PRODUCT"
},
"channel": "h5",
"tags": [
"sx_id_test_usr_mqrvovngf8ofkk2ctnlr_BXH6G4QAHC_063hygm7"
]
}
上面是 general_publishers 路径的 body。经典 202501 路径使用 material.id 和 material.type="1"。两种格式由客户端根据配置路径自动选择。
如果 TikTok 返回的分享链接没有内嵌归因字段,BeeX 还会追加这些参数:
event_id={clickId}
publisher_id={userId}
publisher_name={referralCode}
device_type=1
device_id={deviceId}
referrer_src={channel}
beex_env={idtest/idprod/...}
2.3 BeeX 同步 TikTok 订单
| 订单来源 | 接口 | 当前用途 | 归因字段来源 |
|---|---|---|---|
| CAP / MCN 维度 | POST /affiliate_partner/202603/cap_order/search |
优先用于同步 CAP 下所有 Creator 的订单。 | 扫描返回 raw payload 中的 click_id、event_id、tracking、tag、publisher_id 等文本。 |
| Creator 自己订单 | POST /affiliate_creator/202410/orders/search |
Creator token 只能查自己账号订单,可作为补充链路。 | 同样由 TiktokOrderAttributionParser 从 raw payload 提取。 |
POST https://open-api.tiktokglobalshop.com/affiliate_partner/202603/cap_order/search
Headers:
x-tts-access-token: {CAP access token}
Query:
app_key={app_key}
timestamp={unix_seconds}
sign={signature}
category_asset_cipher={Creator Management cipher}
Body:
{
"create_time_ge": 1780000000,
"create_time_lt": 1780003600,
"page_size": 50,
"page_token": "..."
}
2.4 TikTok 匹配顺序
| 优先级 | 匹配方式 | 代码含义 | 风险 |
|---|---|---|---|
| 1 | 订单 raw payload 中提取 BeeX 短码 | 收集 tags、publisher/event 等字段里的 c<平台><环境><10位尾码>,按 affiliate_clicks.tracking_code 精确匹配。 |
当前主路径,平台完整回传短码时最准确。 |
| 2 | 商品 ID + 下单时间窗口 | 短码缺失或无法命中时,按同商品、下单前时间窗口匹配最近点击。 | 当前 TikTok 兜底路径,存在同商品多次点击时需结合日志核对。 |
tracking_code。
如果平台没有回传可识别短码,当前代码不会再直接按旧的长 click_id/tracking_tag 查询,而是进入商品与时间窗口兜底。
3. Shopee 订单归因
Shopee 和 TikTok 不一样:Shopee 的订单报表主要通过 conversionReport.utmContent 回传 BeeX 放进去的 subIds。
之前 BeeX 把 userId、邀请码、click 尾巴都塞进去,字段太长且段数多,实际回传可能截断。现在改为短码方案。
3.1 旧方案的问题
| 旧 subIds | Shopee 实际回传 | 结果 |
|---|---|---|
sx / id / test / userId / referralCode / clickId尾缀 |
sx-id-test-usrmqrvovngf8ofkk2ctnlr-BXH6G4QAHC |
第 6 段 click 尾缀丢失,无法精确匹配 affiliate_clicks。 |
3.2 新方案:短 tracking_code
当前生成 Shopee 短链时,BeeX 只传一个短 tracking_code。平台和环境信息已经编码在短码内部,不再额外占用一个 subId:
| 字段 | 示例 | 作用 |
|---|---|---|
| 点击短码 | cstxxxxxxxxxx |
c 是 BeeX 命名空间,s 表示 Shopee,t/p 表示测试/正式,后 10 位来自 clickId。该值保存到 affiliate_clicks.tracking_code。 |
tracking_code 生成规则:
1. 固定前缀 c
2. 平台字符:t=TikTok、s=Shopee、l=Lazada
3. 环境字符:t=test、p=prod
4. clickId 去掉非字母数字后取最后 10 位
格式:c<platform><env><last10>
3.3 BeeX 调 Shopee 生成短链
POST https://open-api.affiliate.shopee.co.id/graphql
Headers:
Content-Type: application/json
Authorization: SHA256 Credential={AppID}, Timestamp={timestamp}, Signature={sha256Signature}
mutation {
generateShortLink(input: {
originUrl: "https://shopee.co.id/product/1582467379/49112548266",
subIds: ["cstxxxxxxxxxx"]
}) {
shortLink
longLink
}
}
BeeX 会把返回值保存为:
| 字段 | 说明 |
|---|---|
affiliate_clicks.affiliate_url | Shopee shortLink,给用户打开。 |
affiliate_clicks.product_url | 原始 Shopee 商品链接。 |
affiliate_clicks.tracking_code | 统一短码,例如 cstxxxxxxxxxx。 |
affiliate_clicks.image_url | 商品图;订单详情页依赖它补图。 |
3.4 BeeX 同步 Shopee 订单
POST https://open-api.affiliate.shopee.co.id/graphql
Headers:
Content-Type: application/json
Authorization: SHA256 Credential={AppID}, Timestamp={timestamp}, Signature={sha256Signature}
{
conversionReport(
purchaseTimeStart: 1780000000,
purchaseTimeEnd: 1780003600,
orderStatus: PENDING,
limit: 50,
scrollId: "..."
) {
nodes {
clickTime
purchaseTime
conversionId
conversionStatus
totalCommission
netCommission
utmContent
device
orders {
orderId
orderStatus
items {
itemId
itemName
shopId
shopName
actualAmount
itemTotalCommission
completeTime
fraudStatus
}
}
}
pageInfo {
scrollId
hasNextPage
}
}
}
3.5 Shopee 匹配顺序
| 步骤 | 字段 | 处理 | 结果 |
|---|---|---|---|
| 1 | conversionReport.nodes[].utmContent |
URL decode 后按非字母数字拆分 token。 | 得到候选字段列表。 |
| 2 | c[a-z][tp][0-9a-z]{8,18} |
找到包含平台和环境标识的统一短码。 | 作为 tracking_code。 |
| 3 | affiliate_clicks.tracking_code |
findByTrackingCode(country, SHOPEE, trackingCode)。 |
匹配到 click_id,完整归因。 |
| 4 | 无短码 | 不再依赖长 userId/referral/click 尾巴。 | 无法完整点击归因,需要排查短链生成或 Shopee 回传。 |
subIds。
当前只传一个内含平台和环境标识的短 tracking_code。订单回传只要保留这个短码,就可以精确关联点击并阻止测试/正式串单。
4. 排查手册:订单同步了但 click_id 为空怎么办
4.1 先区分问题类型
| 现象 | 判断 | 下一步 |
|---|---|---|
| 订单在 App 订单列表里能看到,但商品图是占位图。 | 大概率 affiliate_orders.click_id = NULL。 |
查平台 raw payload 是否带回 BeeX 归因字段。 |
| 订单完全看不到。 | 可能平台订单报表未同步,或订单状态/时间窗口未命中。 | 先查平台原始订单接口,再查同步任务日志。 |
| 订单归属用户对,但点击记录为空。 | 用户归因成功,点击归因失败。 | Shopee 看 utmContent,TikTok 看 raw 里的 click/event/tag 字段。 |
| 订单归属用户也不对。 | 不能靠商品 + 时间强行归因。 | 需要重新验证平台回传字段,必要时联系平台技术支持。 |
4.2 SQL 检查模板
-- 1. 看订单是否有 click_id,以及原始平台返回
select id,
platform,
platform_order_id,
user_id,
click_id,
ordered_at,
status,
raw_payload
from affiliate_orders
where platform_order_id = '260701GQ5Y2TH5';
-- 2. 如果知道 click_id,查点击记录
select id,
country_code,
platform,
user_id,
referral_code,
tracking_tag,
tracking_code,
product_url,
affiliate_url,
product_name,
image_url,
clicked_at
from affiliate_clicks
where id = 'clk_mr1hvv0jynii063hygm7';
-- 3. Shopee 新归因:用短码反查
select id,
user_id,
tracking_code,
product_url,
affiliate_url,
image_url,
clicked_at
from affiliate_clicks
where country_code = 'ID'
and platform = 'SHOPEE'
and tracking_code = 'cstxxxxxxxxxx';
4.3 平台 raw payload 重点字段
| 平台 | 重点字段 | 用于什么 | 如果没有 |
|---|---|---|---|
| TikTok | 任意文本字段中的统一 tracking_code;同时保留 tag/event_id/publisher_id 供排查 |
提取短码后匹配 affiliate_clicks.tracking_code。 |
当前会按同商品 + 下单前时间窗口兜底,准确度低于短码精确归因。 |
| Shopee | utmContent |
提取 tracking_code,精确匹配 affiliate_clicks.tracking_code。 |
不能完整归因到点击,商品图和点击统计会缺失。 |
4.4 开发约束
- Shopee 的
subIds只传统一短tracking_code,不要恢复成长 userId 方案,也不要再单独传环境段。 - TikTok 的订单 raw payload 必须完整保存,平台回传字段不稳定时,raw 是唯一排查依据。
affiliate_orders.click_id为空时,不要在对外接口暴露平台佣金细节,只能展示用户应得返佣。- 商品图缺失时,先查
click_id,不要先怀疑前端图片组件。 - 所有新平台都要先设计“生成链接字段”和“订单回传字段”的闭环,再上线订单同步。
4.5 给平台技术支持的验证问题
| 平台 | 需要问清楚的问题 |
|---|---|
| TikTok | Creator 分享链接接口里的 tags、链接 query 参数 event_id / publisher_id 是否会在 CAP order / Creator order 接口中稳定回传?字段名是什么? |
| Shopee | generateShortLink(input.subIds) 的段数、长度限制是什么?conversionReport.utmContent 是否完整回传所有 subIds?是否会按长度截断? |