Server-to-Server - Web S2S 实施指南

概述

Web 服务器到服务器(Web S2S)会直接从您的服务器将网页转化和互动事件发送到 Singular, 使用与移动端 V1 集成相同的 EVENT 端点。网页路径通过平台参数 p=Web 加以区分。

Web S2S 是一种 浏览器辅助的架构 。若干与归因相关的值 仅在浏览器中可用 — location.href document.referrer 以及浏览器 userAgent 无法在后端重建。必须由一段轻量的客户端代码片段来收集这些值, 然后直接调用该端点,或将它们转发给您的后端,再由后端发起 S2S 调用。

没有网页 SESSION 端点 。第一个 __PAGE_VISIT__ 转化事件会替代移动端的 launch 调用,并为该次访问建立归因基线。

Web S2S 与 S2S 套件的其余部分共享身份验证、编码和通用参数约定。请参阅 S2S 基础中心 EVENT 端点参考


端点

Web S2S 使用与移动端 V1 EVENT 端点相同的主机和路径。设置 p=Web 可将请求通过网页归因路径进行路由。

GET https://s2s.singular.net/api/v1/evt

SDID 的生成与持久化

Singular 设备 ID( sdid )将来自同一浏览器的所有事件关联到 单个网页设备。在首次加载页面时,如果 localStorage 中不存在 global_singular_id ,则生成一个 UUID v4 并将其存储。在该浏览器发送的每个事件上重复使用相同的值 作为 sdid ,直到 localStorage 被清除。

如果页面上存在 Web SDK,请重复使用它已在 global_singular_id 中设置的值,而不要生成新值。

function getOrCreateSDID() {
  var KEY = 'global_singular_id';
  var sdid = localStorage.getItem(KEY);
  if (!sdid) {
    sdid = crypto.randomUUID(); // UUID v4
    localStorage.setItem(KEY, sdid);
  }
  return sdid;
}

__PAGE_VISIT__ 模式

任何新访问的第一个事件必须是 __PAGE_VISIT__ ,且带有 conversion_event=true 。这将建立后续事件所继承的归因基线。

每当同一浏览器从一个 不同的广告系列 (不同的 UTM 或合作伙伴)返回时,请发送一个新的 __PAGE_VISIT__ ,且带有 conversion_event=true 。请重复使用相同的 sdid ,并在该次访问的 任何其他事件之前发送 __PAGE_VISIT__

非转化事件(例如 sng_registration_complete sng_purchase )使用 conversion_event=false ,并 省略 attribution_data 。它们从最近的 __PAGE_VISIT__ 继承归因。

在其转化事件之前到达的非转化事件会被延迟一分钟,同时后端等待匹配。

custom_user_id 规则

  • 在注册或登录后,以及在所有后续事件上,都包含 custom_user_id
  • 将其持久化到 localStorage 或第一方 cookie 中。
  • 在注销时删除它。
  • 切勿包含 PII。请使用哈希后的或内部的 ID。

参数

Web SDK 在 __PAGE_VISIT__ 上会发送大约 40 个参数,但其中大多数 是 SDK 内部遥测数据,S2S 开发者不应复制这些数据。下面的表格仅涵盖必需和推荐的参数集。

身份验证( a )和其他共享约定在中心处统一记录一次。请参阅 S2S 基础中的通用参数

必需参数

参数 详情
a

string

来自您控制台的 Singular API 密钥。请参阅 通用参数

示例: myapikey_123

p

string

平台。对于 Web S2S,始终为 Web 。此值会将请求 通过网页归因路径进行路由。

示例: Web

i

string

Singular 中网页应用/站点的 Bundle ID。必须与 Web SDK 的 Product ID 匹配。可在 Settings > Apps > 展开该网页应用 > Bundle ID 下找到。

示例: com.example.site

n

string

事件名称。一次访问的第一个事件必须是 __PAGE_VISIT__

示例: __PAGE_VISIT__

sdid

UUID

Singular 设备 ID。请使用 Web SDK 设置的相同值 ( global_singular_id )。如果您自行设置,请生成一个 UUID v4, 并为该浏览器的所有事件重复使用它。

示例: 3730aecb-47ba-4d13-bd17-52b4b700956f

conversion_event

boolean

仅对归因事件 ( __PAGE_VISIT__ )设置为 true 。在转化事件之前到达的 非转化事件会被延迟一分钟,同时后端等待匹配。

示例: true

attribution_data

JSON

来自广告网络的点击后(click-through)数据,采用 URL 编码的 JSON。在 __PAGE_VISIT__ 上为必需;在非转化事件上省略。请参阅 attribution_data

示例: %7B%22partner_name%22%3A%22Snapchat%22%2C%22is_attributed%22%3A%22true%22%7D

custom_user_id

string

您的内部用户 ID。不含 PII。在注册/登录后以及在后续事件上包含它; 在注销时删除。

示例: pid123abc

ip

string

事件发生时的设备 IP。

示例: 104.220.23.123

web_url

string

转化落地页 URL,包含其营销参数。这是最后一个包含营销参数的 URL, 像 SDID 一样存储并重复使用。后端使用它来 创建归因触点。与 web_page_url 不同。

示例: http://my.landing.page/?utm_campaign=test&utm_source=test

参数 详情
device_user_agent

string

浏览器用户代理( navigator.userAgent )。仅限浏览器; 在客户端收集。

示例: Mozilla/5.0 ...

web_page_referrer

string

当前页面的引荐来源( document.referrer )。会被摄取 并用于归因(自然量来源/类型分类)。仅限浏览器;在客户端 收集。与 document_referrer 不同,后者 仅用于事件日志记录。

示例: https://www.google.com/

timezone

string

设备时区。

示例: America/New_York

os

string

设备操作系统。

示例: iOS

screen_width

integer

屏幕宽度(像素)。

示例: 390

screen_height

integer

屏幕高度(像素)。

示例: 844

utime

integer

事件时间,采用 UNIX 时间(秒)。

示例: 1751500800

URL 和引荐来源参数 — 不要混淆。 web_url web_page_referrer 与归因相关,会被管道使用。 web_page_url (当前页面, window.location.href )和 document_referrer 仅用于事件日志记录 ,在归因中会被 静默丢弃。不要发送 web_page_url document_referrer 并指望它们影响归因。

对于上面未列出的设备身份和其他共享参数,请参阅 S2S 基础中的通用参数 ,而不要在此重复记录它们。


attribution_data

attribution_data 参数以 URL 编码的 JSON 形式携带来自广告网络的 点击后(click-through)数据。仅在 __PAGE_VISIT__ 转化事件上 发送它。

{
  "partner_name": "Snapchat",
  "is_attributed": "true",
  "touch_timestamp": "",
  "partner_campaign_id": "",
  "partner_campaign_name": "Snap_campaign_1234",
  "partner_creative_id": "",
  "partner_creative_name": "",
  "partner_keyword": "",
  "partner_site": "",
  "partner_site_id": "",
  "partner_site_name": "",
  "partner_sub_site": "",
  "partner_sub_site_name": "",
  "partner_subcampaign_id": "",
  "partner_subcampaign_name": "",
  "_p": ""
}

必需字段

字段 详情
partner_name

string

从网页参数 wpsrc utm_source 映射而来。

示例: Snapchat

is_attributed

string

对于已归因的事件,设置为 true

示例: true

partner_campaign_name

string

从网页参数 wpcn utm_campaign 映射而来。

示例: Snap_campaign_1234

可选字段

字段 详情
touch_timestamp

integer

触点时间,采用 UNIX 秒。

示例: 1751500800

partner_campaign_id

string

从网页参数 wpcid 映射而来。

partner_creative_id

string

从网页参数 wpcrid 映射而来。

partner_creative_name

string

从网页参数 wpcrn 映射而来。

partner_keyword

string

从网页参数 wpkwn 映射而来。

partner_site_id

string

从网页参数 wpsid 映射而来。

partner_site_name

string

从网页参数 wpsn 映射而来。

partner_sub_site_name

string

从网页参数 wpssn 映射而来。

partner_subcampaign_id

string

从网页参数 wpscid 映射而来。

partner_subcampaign_name

string

从网页参数 wpscn 映射而来。

e 参数中的网页点击 ID

合作伙伴 Conversion API 支持:如需通过 Singular 的 Conversion API 集成将这些事件转发给广告网络合作伙伴,请包含标准的可选事件属性(经过哈希处理的第一方数据,例如 eventIdehash)。请参阅Conversion API 集成的标准事件属性

使用每个合作伙伴所期望的 JSON 键,在事件的 e 负载中传递网络点击 ID:

合作伙伴 点击 ID 键
Snapchat ScCid
TikTok ttclid
Google gclid gbraid wbraid
DV360 dclid
Facebook fbclid
Reddit rdt_uuid

营销参数检测。 当落地 URL 包含以下任一项时,将其视为触点: utm_* ;Singular wp* wpsrc wpcn wpcid 等);Singular pc* / p* pcid pcn psrc 等); clid ;或 kw / an / ud 。匹配时,将完整 URL 存储为 web_url 并触发一个转化事件。


网页到应用归因

要将网页广告系列上下文带入移动端点击,请从您的落地页构建一个 Singular Link, 并附加已捕获的落地查询字符串。这会将营销参数转发到移动端点击, 以便可以对应用安装进行归因。

在落地时,当 window.location.search (及片段)包含营销参数时, 捕获它并持久化。在渲染应用商店或智能横幅链接时,构建:

function buildWebToAppLink(baseLink, webUrl, deeplink, passthrough, deferredDeeplink) {
  var url = new URL(baseLink); // preserves existing base-link params
  if (webUrl) {
    var q = new URL(webUrl);
    var captured = q.search.slice(1) + (q.hash || ''); // landing query string (+fragment)
    url.searchParams.set('_web_params', captured); // URL-encoded on serialization
  }
  if (deeplink)         url.searchParams.set('_dl', deeplink);
  if (passthrough)      url.searchParams.set('_p', passthrough);
  if (deferredDeeplink) url.searchParams.set('_ddl', deferredDeeplink);
  return url.toString();
}
附加的参数 详情
_web_params

已捕获落地 web_url 的 URL 编码查询字符串(及片段)。将 UTM / wp* / pc* / clid 广告系列参数转发到 移动端点击。

_dl

深度链接参数。可选。

_p

透传(passthrough)参数。可选。

_ddl

延迟深度链接参数。可选。

准确性: SDID 不会 附加到链接中(没有 _dsid _sdid )。这是 广告系列参数转发,而不是确定性的 SDID 设备拼接。


剪贴板归因(延迟深度链接)

剪贴板归因为延迟深度链接提供确定性匹配。网页代码片段 将一个唯一令牌写入剪贴板;刚安装的应用将其读回,并基于令牌 相等性进行匹配。

function openAppWithClipboardDdl(baseLink, deeplink, passthrough, deferredDeeplink) {
  // 1. Build the web-to-app link (see Web-to-App Attribution).
  var link = buildWebToAppLink(baseLink, capturedWebUrl, deeplink, passthrough, deferredDeeplink);

  // 2. Generate a UUID v4 and form the token.
  var uuid = crypto.randomUUID();
  var tokenUrl = location.protocol + '//' + location.hostname + '/__singular_ddl__/' + uuid;

  // 3. Write ONLY the token to the clipboard (execCommand fallback).
  copyToClipboard(tokenUrl);

  // 4. Append the token to the click as ecid.
  var url = new URL(link);
  url.searchParams.set('ecid', tokenUrl);

  // 5. Open the app / store.
  window.open(url.toString());
}

function copyToClipboard(text) {
  if (navigator.clipboard && navigator.clipboard.writeText) {
    navigator.clipboard.writeText(text);
    return;
  }
  var ta = document.createElement('textarea');
  ta.value = text;
  document.body.appendChild(ta);
  ta.select();
  document.execCommand('copy');
  document.body.removeChild(ta);
}

准确性: 剪贴板 保存令牌 — 不含 SDID, 不含 _web_params ,也不含深度链接。匹配基于令牌相等性 (点击上的 ecid 等于剪贴板令牌),因此刚安装的 应用会进行确定性匹配。

剪贴板写入必须在 用户手势处理程序 (一次点击)内运行,否则浏览器 会阻止它。请注意 iOS Safari 的剪贴板限制。

在首次启动时读取剪贴板是应用端的职责(其自身的移动端 SDK/S2S 集成),而不是此网页代码片段的职责。


事件序列示例

首次访问和注册

  1. 用户从 Google Ads 到达。发送初始的页面访问:

    • n=__PAGE_VISIT__
    • conversion_event=true
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f
    • attribution_data={ "partner_name": "googleadwords_int", "is_attributed": "true", "partner_campaign_name": "brand_us_en" }
  2. 用户注册。发送注册事件:

    • n=sng_registration_complete
    • conversion_event=false
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (相同的 SDID)
    • custom_user_id=user_12345abc
    • attribution_data

从新广告系列返回的用户

  1. 同一浏览器从一个不同的广告系列返回。发送一个新的页面访问:

    • n=__PAGE_VISIT__
    • conversion_event=true
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (相同的 SDID)
    • attribution_data={ "partner_name": "facebook", "is_attributed": "true", "partner_campaign_name": "retargeting_Q1" }
  2. 用户购买。发送购买事件:

    • n=sng_purchase
    • conversion_event=false
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (相同的 SDID)
    • 持久化的 custom_user_id
    • attribution_data