BeeX Attribution Design

TikTok / Shopee 订单归因与接口调用说明

这份文档解释一笔三方平台订单如何回到 BeeX:用户点击/转链时我们写入什么标识,平台订单接口会回传什么字段, BeeX 如何把订单匹配到 affiliate_clicks、用户、商品图片和返佣记录。

版本:2026-07-13 范围:TikTok Shop / Shopee 核心表:affiliate_clicks / affiliate_orders 重点:click_id 不为空才是完整归因

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_idtracking_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.idmaterial.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_idevent_idtrackingtagpublisher_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 兜底路径,存在同商品多次点击时需结合日志核对。
TikTok 的关键点:BeeX 会从 TikTok 订单 raw payload 的多个可能字段中提取统一短 tracking_code。 如果平台没有回传可识别短码,当前代码不会再直接按旧的长 click_id/tracking_tag 查询,而是进入商品与时间窗口兜底。

3. Shopee 订单归因

Shopee 和 TikTok 不一样:Shopee 的订单报表主要通过 conversionReport.utmContent 回传 BeeX 放进去的 subIds。 之前 BeeX 把 userId、邀请码、click 尾巴都塞进去,字段太长且段数多,实际回传可能截断。现在改为短码方案。

3.1 旧方案的问题

旧 subIdsShopee 实际回传结果
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_urlShopee 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 回传。
Shopee 的关键点:现在不要再把长 userId、邀请码、click 尾缀塞进 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 开发约束

4.5 给平台技术支持的验证问题

平台需要问清楚的问题
TikTok Creator 分享链接接口里的 tags、链接 query 参数 event_id / publisher_id 是否会在 CAP order / Creator order 接口中稳定回传?字段名是什么?
Shopee generateShortLink(input.subIds) 的段数、长度限制是什么?conversionReport.utmContent 是否完整回传所有 subIds?是否会按长度截断?