PC 与主机游戏集成指南
本指南全面介绍如何使用 Singular 实现 PC 与主机游戏的归因,帮助您在桌面和游戏平台上实现精准的广告系列衡量与分析。
企业版功能: PC 与主机游戏归因是一项企业版功能。如需了解更多信息,请阅读 PC 与主机游戏归因常见问题 ,或联系您的客户成功经理。
共享的 S2S 参考资料: 本指南介绍 PC 与主机的专属内容。有关共享的服务器到服务器基础组件(端点、身份验证和通用参数),请参阅 S2S 基础知识中心 。 有关完整的会话和事件参数参考,请参阅 PC 与主机 API 端点参考 。
概述
集成方式
Singular 为 PC 与主机游戏归因提供两种方式。请选择最符合您实现需求和归因需求的方式。
| 方式 | 说明 | 适用场景 |
|---|---|---|
| PC/主机 Singular Links |
推荐: 使用 Singular 追踪链接进行概率归因的简化集成。无需 Web SDK。 归因方式: 概率归因(基于 IP 的匹配) |
实现最快、集成工作量较低。适用于将用户引导至第三方商店(Steam、Epic 等)的广告系列,或在无法进行 Web SDK 集成时使用。 |
| Web SDK + Match ID |
高级: 在着陆页上使用 Singular Web SDK,通过 Match ID 进行确定性匹配的增强归因。 归因方式: 概率归因(基于 IP)和确定性归因(Match ID) |
当用户在着陆页上进行身份验证时可实现最高的归因准确性。使用 Singular Web 归因功能和确定性归因时必需。 |
实现说明: 两种方式都需要实现 PC/主机服务器到服务器(S2S)API 集成,以上报游戏会话和事件。区别在于如何追踪 Web 广告系列点击并将其与游戏安装进行匹配。
归因流程对比
PC/主机 Singular Links 流程:
- 用户点击 Singular Link: 用户在营销广告系列中点击 Singular 追踪链接
- 重定向到着陆页: 用户被重定向到着陆页或商店(无需 Web SDK)
- 下载并安装: 用户下载并安装游戏
- 首次启动: 用户首次启动游戏
- S2S 上报: 游戏通过 S2S API 上报会话
- 概率归因: Singular 根据 IP 地址将游戏安装与 Singular Link 点击进行匹配
Web SDK + Match ID 流程:
- 用户点击广告系列链接: 用户点击营销广告系列的广告或链接
- 带有 Web SDK 的着陆页: 用户进入已实现 Singular Web SDK 的着陆页
- 点击捕获: Web SDK 捕获点击数据并生成 Match ID
- 用户身份验证(可选): 如果用户登录,可将 Match ID 传递给游戏以进行确定性归因
- 下载并安装: 用户下载并安装游戏
- 首次启动: 用户启动游戏并可选择获取 Match ID
- 带 Match ID 的 S2S 上报: 游戏通过 S2S API 上报会话(可带或不带 Match ID)
- 归因匹配: Singular 执行确定性匹配(如果提供了 Match ID)或概率匹配(基于 IP)
服务器到服务器集成
无论选择哪种归因方式,所有 PC 与主机游戏归因都必须实现 S2S API 集成。
集成能力:
- 游戏会话追踪: 上报跨游戏启动的用户会话和活动
- 安装归因: 将新的游戏安装归因到营销广告系列
- 事件分析: 追踪游戏内事件和用户交互,用于漏斗分析
- 收入衡量: 衡量游戏内购买和变现表现
- 跨平台支持: 在 PC、Xbox、PlayStation、Nintendo 和 Meta Quest 上进行统一追踪
前提条件
在实现 PC 与主机集成之前,请确保满足以下要求。
| 组件 | 要求 |
|---|---|
| SDK Key |
从 Dashboard → Developer Tools → SDK Integration → SDK Keys 获取 Singular SDK Key |
| 应用配置 |
在 Singular 应用页面中添加 PC 或主机游戏。对于同一款游戏的多个平台,请将它们全部添加到同一个 Singular "App" 下。 |
| 归因方式选择 |
根据实现需求选择归因方式:
|
文档资源
PC 与主机集成的完整 API 参考和实现指南。
集成文档:
- S2S API 参考: PC 与主机 S2S 端点参考
- 归因常见问题: PC 与主机游戏归因常见问题
- Web SDK(可选): Web SDK 概述与入门
- Singular Links: Singular Links 概述
方式 1:PC/主机 Singular Links(推荐)
简化的集成方式,使用 Singular 追踪链接进行概率归因,无需在着陆页上实现 Web SDK。
推荐实现: 此方式以最少的集成工作量提供实现 PC/主机归因的最快路径。适用于大多数场景。
概述
工作原理
PC/主机 Singular Links 通过直接在追踪链接中捕获点击数据来实现归因,无需在着陆页上实现 Web SDK。
主要优势:
- 无需 Web SDK: 可将用户重定向到任意着陆页,包括第三方商店(Steam、Epic 等)
- 简化集成: 仅需在游戏端实现 S2S API
- 快速部署: 无需修改着陆页即可快速创建和启动广告系列
- 灵活的目标地址: 支持单一重定向到任意目标 URL
归因方式:
- 概率归因(基于 IP): Singular 根据 IP 地址和设备特征将游戏安装与 Singular Link 点击进行匹配
实现步骤
步骤 1:前提条件
在创建 PC/主机 Singular Links 之前,请确保满足以下要求。
必需: 必须在 Singular 的 Apps 页面中配置 PC/主机应用站点,并且至少通过 S2S API 发送过一次游戏会话,该应用站点才有资格创建 PC/主机 Singular Link。
步骤 2:创建 PC/主机 Singular Link
在 Singular dashboard 中创建 PC/主机 Singular Links,以追踪广告系列点击并实现归因。
配置步骤:
- 进入 Manage Links: 在 Singular dashboard 中,转到 Attribution → Manage Links
- 选择 App: 选择已配置 PC/主机应用站点的 App
- 创建新链接: 点击 Create New Link 按钮
- 选择平台类型: 在 Platform Tracking Type 字段下选择 "PC/Console"
- 配置目标: 选择特定的 PC/主机应用站点,或选择 "Track all app sites under this app" 选项
- 设置目标 URL: 配置重定向 URL(着陆页、商店页面等)
- 配置归因设置: 根据需要设置归因窗口和追踪参数
- 生成链接: 保存并生成 Singular 追踪链接
链接类型: PC/主机 Links 支持 Custom Sources 和部分 Partner Integrations。同时支持点击链接和展示链接。
步骤 3:实现 S2S 集成
实现服务器到服务器 API 集成,以上报游戏会话和事件。有关完整的 S2S 实现细节,请参阅下方的 集成概念 部分。
必需的实现:
- 会话通知: 使用 Session Notification Endpoint 上报游戏启动
- 事件追踪: 使用 Event Notification Endpoint 上报游戏内事件和收入
- 设备识别: 生成并持久化唯一设备标识符(SDID)
步骤 4:启动广告系列
在营销广告系列中使用生成的 PC/主机 Singular Links,以启用归因追踪。
广告系列设置:
- 复制追踪链接: 从 Manage Links 复制生成的 Singular Link
- 配置广告系列: 将 Singular Link 用作广告系列的目标 URL
- 启动广告系列: 使用 Singular Link 激活广告系列
- 监控归因: 当用户点击链接并启动游戏时,在 Singular 报告中查看归因数据
归因匹配
归因工作原理
使用 PC/主机 Singular Links 时,Singular 会根据 IP 地址和时间执行概率归因匹配。
归因流程:
- 用户点击 Singular Link: Singular 捕获点击数据,包括 IP 地址和时间戳
- 用户下载游戏: 用户继续下载并安装游戏
- 游戏启动: 用户首次启动游戏
- S2S 上报: 游戏通过 S2S API 向 Singular 上报会话,包括用户 IP 地址
- 概率匹配: Singular 在归因窗口内根据 IP 地址将游戏安装与 Singular Link 点击进行匹配
- 归因完成: 安装被归因到广告系列来源
归因准确性: 概率归因在大多数场景中都能提供可靠的匹配。如需通过确定性匹配获得更高的归因准确性,请考虑实现 Web SDK + Match ID 方式。
方式 2:Web SDK + Match ID(高级)
高级集成方式,在着陆页上使用 Singular Web SDK,并在用户进行身份验证时选择性地使用 Match ID 进行确定性归因。
高级功能: 此方式需要在着陆页上实现 Web SDK,并需要额外的集成工作。如果您需要 Singular Web 归因功能或通过 Match ID 进行确定性归因,请考虑此方式。
概述
何时使用此方式
当您的场景需要超出基本概率匹配的增强归因能力时,请实现 Web SDK + Match ID 方式。
适用场景:
- Web 归因: 您需要 Singular Web 归因功能和 Web 分析
- 确定性归因: 用户在着陆页上进行身份验证,并且您希望获得最高的归因准确性
- 跨设备追踪: 用户可能在与访问着陆页不同的设备上下载游戏
- 高级分析: 您需要在游戏安装之前获得详细的 Web 互动指标
归因方式:
- 概率归因(基于 IP): 根据 IP 地址自动匹配(与 PC/主机 Singular Links 相同)
- 确定性归因(Match ID): 使用用户进行身份验证时从着陆页传递到游戏的唯一标识符进行精确匹配
实现步骤
步骤 1:实现 Web SDK
在营销着陆页上实现 Singular Web SDK,以捕获点击数据并实现归因。
Web SDK 要求: 使用此方式进行 PC 与主机归因需要在营销着陆页上实现 Singular Web SDK。Web SDK 捕获点击数据,并在用户安装并启动您的游戏时实现归因匹配。
Web SDK 实现:
- 遵循 Web SDK 指南: Web SDK 概述与入门
-
Product ID 配置:
Web SDK 的 Product ID 必须与 S2S 集成中使用的游戏标识符(
i参数)一致 - 着陆页部署: 将 Web SDK 部署到所有营销着陆页
配置一致性: Web SDK 的 Product ID 必须与 S2S 集成中的游戏标识符完全一致,归因才能生效。这种一致性使 Singular 能够将 Web 点击与游戏安装关联起来。
步骤 2:实现 S2S 集成
实现服务器到服务器 API 集成,以上报游戏会话和事件。有关完整的 S2S 实现细节,请参阅下方的 集成概念 部分。
必需的实现:
- 会话通知: 使用 Session Notification Endpoint 上报游戏启动
- 事件追踪: 使用 Event Notification Endpoint 上报游戏内事件和收入
- 设备识别: 生成并持久化唯一设备标识符(SDID)
步骤 3:实现 Match ID(可选)
对于确定性归因,请实现 Match ID,以便在用户进行身份验证时将唯一标识符从着陆页传递到游戏。
可选功能: 仅当您需要确定性归因时才需要实现 Match ID。仅使用 Web SDK(不带 Match ID)即可提供概率归因。
Match ID 实现:
-
获取 Match ID:
在用户身份验证后使用 Web SDK 的
getMatchID()方法 - 传递给游戏: 实现将 Match ID 从 Web 传递到游戏的机制(查询参数、API 等)
-
包含在首次会话中:
通过
match_id参数在首次游戏会话中上报 Match ID
有关详细的 Match ID 集成步骤,请参阅下方的 Match ID 实现 部分。
归因匹配
归因工作原理
使用 Web SDK 时,Singular 会根据是否提供 Match ID,使用概率或确定性方式执行归因匹配。
概率归因(无 Match ID):
- 用户点击广告系列: 用户点击营销广告系列链接
- 访问着陆页: Web SDK 捕获包括 IP 地址在内的点击数据
- 用户下载游戏: 用户下载并安装游戏
- 游戏启动: 用户首次启动游戏
- S2S 上报: 游戏通过 S2S API 向 Singular 上报会话
- IP 匹配: Singular 根据 IP 地址将游戏安装与 Web 点击进行匹配
确定性归因(带 Match ID):
- 用户点击广告系列: 用户点击营销广告系列链接
- 访问着陆页: Web SDK 生成唯一的 Match ID
- 用户身份验证: 用户在着陆页上登录
- 获取 Match ID: 实现从 Web SDK 获取 Match ID
- 将 Match ID 传递给游戏: 通过查询参数、API 或其他机制将 Match ID 传递给游戏
- 用户下载游戏: 用户下载并安装游戏
- 带 Match ID 启动游戏: 用户启动游戏,获取存储的 Match ID
-
带 Match ID 的 S2S 上报:
游戏上报首次会话,包含
match_id参数 - 确定性匹配: Singular 使用 Match ID 将游戏安装与 Web 点击进行匹配,以实现精确归因
集成概念
使用 Singular 实现 PC 与主机 S2S 集成的核心概念和要求。这些概念适用于两种归因方式。
身份验证
向 Singular 的 PC 与主机 S2S API 发出的所有请求都需要在
a
参数中进行 SDK key 身份验证。有关共享的身份验证机制(在何处查找您的 SDK Key 以及如何传递),请参阅
S2S 基础知识中的身份验证
。
用户隐私
Singular 建议为终端用户提供选择加入或退出追踪的能力。有关共享的隐私参数,包括
data_sharing_options
和 Limit Data Sharing,请参阅
S2S 基础知识中的隐私参数
。
支持的平台
平台定义
平台表示用户玩游戏的位置,必须在所有 S2S API 请求的
p
参数中传递。
支持的平台值:
-
pc- 个人电脑平台 -
xbox- Microsoft Xbox 游戏主机 -
playstation- Sony PlayStation 游戏主机 -
nintendo- Nintendo 游戏主机 -
metaquest- Meta Quest VR 头显
操作系统和商店
除平台外,还需通过
os
参数指定操作系统/游戏系统,并通过
install_source
参数指定分发商店。
|
平台
(
p
)
|
操作系统/游戏系统
(
os
)
|
商店
(
install_source
)
|
|---|---|---|
| pc |
|
|
| xbox |
|
|
| playstation |
|
|
| nintendo |
|
|
| metaquest |
|
|
自定义值: 操作系统和商店参数支持自定义值,但 Singular 建议使用上述标准值,以保证一致性和报告清晰度。
游戏标识符
应用识别
游戏标识符将游戏事件与特定游戏关联起来,必须在每个请求的
i
参数中传递。
标识符要求:
-
格式:
支持任意值,但 Singular 建议使用反向 DNS 表示法(例如
com.singular.game) - 跨平台一致性: 同一款游戏在所有支持的平台上必须使用相同的游戏标识符
- Web SDK 一致性(仅方式 2): 如果使用 Web SDK + Match ID 方式,游戏标识符必须与着陆页上配置的 Web SDK Product ID 一致,归因才能生效
Web SDK 一致性: 如果使用 Web SDK + Match ID 归因方式,S2S 集成中使用的游戏标识符 必须完全匹配 您的 Singular Web SDK 实现中配置的 Product ID。这种一致性对于 Singular 将游戏安装归因到 Web 广告系列点击至关重要。此要求不适用于 PC/主机 Singular Links 方式。
配置示例:
| 实现 | 配置 |
|---|---|
| Web SDK(方式 2) |
|
| S2S API(PC) |
|
| S2S API(Xbox) |
|
| S2S API(PlayStation) |
|
设备识别
唯一游戏安装追踪
安装/设备标识符将同一游戏安装在多个游戏会话中的游戏事件关联起来,必须在每个请求的
sdid
参数中传递。
标识符规范:
- 格式: 建议使用 UUID Version 4 格式
- 生成: 该值由游戏/服务器在首次游戏启动(安装)时生成
- 持久化: 必须在游戏安装的整个生命周期内持久保留
- 唯一性: 每次游戏安装都需要唯一的标识符
示例:
sdid=40009df0-d618-4d81-9da1-cbb3337b8dec
Match ID 实现
Match ID 通过将唯一标识符从 Web SDK 传递到游戏安装,实现 Web 广告系列的确定性归因。此功能仅在使用 Web SDK + Match ID 归因方式时可用。
可选的高级功能: 仅当您使用 Web SDK + Match ID 归因方式并希望进行确定性归因时才需要实现 Match ID。PC/主机 Singular Links 方式不支持 Match ID。
Match ID 的工作原理:
- Web SDK 生成 Match ID: Singular Web SDK 在用户访问着陆页时创建唯一的 Match ID
- 获取 Match ID: 在用户身份验证后使用 Web SDK 方法从着陆页获取 Match ID
- 传递给游戏: 您的实现在下载/安装过程中将 Match ID 从 Web 页面传递给游戏(例如查询参数、深度链接、cookie)
-
随首次启动上报:
游戏通过
match_id参数在首次会话通知中向 Singular 包含 Match ID - 确定性匹配: Singular 使用 Match ID 进行精确的归因匹配
Web SDK Match ID 方法
原生实现
Singular Web SDK 提供了在着陆页上获取、设置和清除 Match ID 值的原生方法。
可用方法:
| 参数 | 详情 |
|---|---|
getMatchID()
|
获取由 Singular Web SDK 为当前 Web 会话生成的唯一 Match ID。 返回值: 包含 Match ID 值的字符串 |
setMatchID(matchId)
|
为当前 Web 会话设置自定义 Match ID,而不是使用 Singular 生成的值。
参数:
|
clearMatchID()
|
清除通过
|
实现示例
原生 Web SDK 实现
在 Singular Web SDK 初始化后直接使用这些方法来获取和管理 Match ID 值。
获取 Match ID
// Get the Singular-generated Match ID
const matchId = window.singularSdk.getMatchID();
console.log('Match ID:', matchId);
// Store Match ID for passing to game
localStorage.setItem('singular_match_id', matchId);
设置自定义 Match ID
// Set your own Match ID value
const customMatchId = 'your-custom-match-id-123';
window.singularSdk.setMatchID(customMatchId);
console.log('Custom Match ID set:', customMatchId);
清除 Match ID
// Clear custom Match ID and revert to default
window.singularSdk.clearMatchID();
// Get the new default Match ID
const defaultMatchId = window.singularSdk.getMatchID();
console.log('Default Match ID restored:', defaultMatchId);
带下载按钮的完整示例
// Initialize Web SDK
const config = new SingularConfig(sdkKey, sdkSecret, productId)
.withInitFinishedCallback(() => {
console.log('Singular SDK initialized');
});
singularSdk.init(config);
// Handle download button click
document.getElementById('download-button').addEventListener('click', function() {
// Get Match ID before redirecting to download
const matchId = window.singularSdk.getMatchID();
// Pass Match ID to download page via query parameter
const downloadUrl = `https://example.com/download?match_id=${matchId}`;
// Redirect to download page
window.location.href = downloadUrl;
});
Google Tag Manager 实现
在 Google Tag Manager 中使用 Singular 官方的 Singular Web Tracking 代码模板来获取 Match ID。请勿手动编写直接调用 SDK 的 Custom HTML 代码;该模板会为您加载并初始化 Web SDK,并通过 Track Type 公开 Match ID。
- 在 GTM 中,创建一个新代码并选择 Singular Web Tracking 模板(by Singular Labs)作为 Tag Type。如果您的容器中尚未包含该模板,请从 Community Template Gallery 中添加。
- 将 Track Type 设置为 Get Match ID 。
-
将
Data Layer Key
设置为您选择的名称,例如
getMatchIDValue。该模板会将当前的 Match ID 写入此 dataLayer key。 -
创建一个读取
getMatchIDValue的 GTM Data Layer Variable 。 -
将该变量的值传递给您的游戏,例如在用于将用户移交给游戏的商店或下载 URL 上追加为
match_id。
在移交给游戏之前触发的触发器(例如下载或 "Play on PC" 按钮点击)上触发 Get Match ID 代码,以便在重定向之前填充 Match ID。
在您自己的容器中验证连线:在重定向触发之前,确认 Data Layer Variable 返回非空的 Match ID。空值表示 Singular Web Tracking 基础代码尚未在页面上初始化。
将 Match ID 传递给游戏
实现策略
从 Web SDK 获取 Match ID 后,实现将该值从着陆页传递到游戏安装的机制。
常见方法:
| 方式 | 实现 | 适用场景 |
|---|---|---|
| 查询参数 |
将 Match ID 作为查询参数附加到下载 URL。
|
下载页面可以提取参数并将其传递给游戏安装程序的直接下载场景 |
| Cookie 存储 |
将 Match ID 存储在游戏下载页面可访问的第一方 cookie 中。
|
Match ID 需要在页面导航之间持久保留的多页面流程 |
| Local Storage |
将 Match ID 存储在浏览器的 local storage 中。
|
着陆页和下载页面共享存储的同域场景 |
| 深度链接 |
将 Match ID 嵌入自定义深度链接方案,以直接启动游戏。
|
使用自定义协议处理程序的高级实现 |
| 服务器端 API |
将 Match ID 发送到服务器 API,游戏通过经过身份验证的请求获取。 |
需要服务器端验证和用户身份验证的安全实现 |
S2S API 实现
上报 Match ID
一旦游戏从 Web 实现中获取到 Match ID,请将其包含在向 Singular 发出的首次会话通知中,以进行归因匹配。
关键时机: 必须在首次游戏会话(安装)通知中包含 Match ID,归因才能生效。在后续会话中发送 Match ID 无法实现归因匹配。
带 Match ID 的会话请求:
import requests
def report_first_session_with_match_id(sdk_key, game_id, device_id, platform, match_id):
"""
Report first game session with Match ID for attribution
"""
session_url = "https://s2s.singular.net/api/v1/launch"
params = {
'a': sdk_key,
'i': game_id,
'sdid': device_id,
'p': platform,
'os': 'windows',
'install_source': 'steam',
'ip': get_user_ip(),
'match_id': match_id # Include Match ID for attribution
}
response = requests.get(session_url, params=params)
return response.json()
# Example: First launch with Match ID
report_first_session_with_match_id(
sdk_key='your_sdk_key_here',
game_id='com.singular.game',
device_id='40009df0-d618-4d81-9da1-cbb3337b8dec',
platform='pc',
match_id='abc123def456' # Retrieved from landing page
)
curl -G "https://s2s.singular.net/api/v1/launch" \
--data-urlencode "a=your_sdk_key_here" \
--data-urlencode "i=com.singular.game" \
--data-urlencode "sdid=40009df0-d618-4d81-9da1-cbb3337b8dec" \
--data-urlencode "p=pc" \
--data-urlencode "os=windows" \
--data-urlencode "install_source=steam" \
--data-urlencode "ip=172.58.29.235" \
--data-urlencode "match_id=abc123def456"
async function reportFirstSessionWithMatchId(config) {
const sessionUrl = 'https://s2s.singular.net/api/v1/launch';
const params = new URLSearchParams({
'a': config.sdkKey,
'i': config.gameId,
'sdid': config.deviceId,
'p': config.platform,
'os': config.osVersion,
'install_source': config.store,
'ip': await getUserIP(),
'match_id': config.matchId // Include Match ID
});
const response = await fetch(`${sessionUrl}?${params.toString()}`);
return await response.json();
}
// Example: First launch with Match ID
reportFirstSessionWithMatchId({
sdkKey: 'your_sdk_key_here',
gameId: 'com.singular.game',
deviceId: '40009df0-d618-4d81-9da1-cbb3337b8dec',
platform: 'pc',
osVersion: 'windows',
store: 'steam',
matchId: 'abc123def456' // Retrieved from landing page
});
Match ID 最佳实践
实现清单
完整的实现要求:
- Web SDK 集成: 在着陆页上实现 Singular Web SDK 并使用匹配的 Product ID
-
Match ID 获取:
在用户身份验证后使用
getMatchID()获取该值 - 值传输: 实现将 Match ID 从 Web 传递到游戏的安全机制
- 游戏存储: 在游戏中存储 Match ID,直到首次启动/会话上报
-
仅首次会话:
仅在首次会话通知中包含
match_id参数 - 值验证: 验证 Web 和游戏实现之间的 Match ID 值是否匹配
- 测试: 测试从着陆页点击到游戏安装和归因的完整流程
有关完整的归因方法细节和故障排除,请参阅 PC 与主机游戏归因常见问题 。
游戏会话追踪
在 PC 与主机集成中,必须向 Singular 上报游戏会话,这样才能实现安装归因、再互动追踪和用户留存分析。
会话通知端点
实现要求
每次游戏启动时都调用 Session Notification Endpoint,以通知 Singular 有关游戏会话的信息。
API 参考: 有关完整的端点规范,请参阅 Session Notification Endpoint 文档。
会话处理
归因工作流
会话通知使 Singular 能够根据会话上下文执行多种归因和分析功能。
处理逻辑:
- 首次会话(安装): 如果是唯一安装后的首次游戏会话,Singular 会识别新安装并触发安装归因流程
- 再互动会话: 如果会话符合再互动条件(即将推出),Singular 会触发再互动归因流程(请参阅 再互动常见问题 )
- 常规会话: 否则,将其标记为用于用户活动和留存追踪的游戏会话
实现最佳实践
异步数据收集
在收集数据以上报游戏会话时,请等待异步函数返回并处理各种功能,然后再发送会话通知。
关键时机考量:
- Match ID 归因(方式 2): 使用 Web SDK + Match ID 方式时,仅在 Match ID 可能已可用之后上报首次游戏会话
- 用户同意: 如果游戏提供选择加入 Singular 营销和分析的选项,请等到收集到同意后再上报游戏会话
- 设备标识符: 确保在首次会话通知之前已生成并存储 SDID
会话请求示例
示例实现
import requests
def report_game_session(sdk_key, game_id, device_id, platform, os_version, store):
"""
Report game session to Singular
"""
session_url = "https://s2s.singular.net/api/v1/launch"
params = {
'a': sdk_key,
'i': game_id,
'sdid': device_id,
'p': platform,
'os': os_version,
'install_source': store,
'ip': get_user_ip()
}
try:
response = requests.get(session_url, params=params, timeout=10)
if response.status_code == 200:
data = response.json()
if data.get('status') == 'ok':
print("Session reported successfully")
return True
else:
print(f"Session error: {data.get('reason')}")
return False
else:
print(f"HTTP error: {response.status_code}")
return False
except Exception as e:
print(f"Exception reporting session: {e}")
return False
# Example usage
report_game_session(
sdk_key='your_sdk_key_here',
game_id='com.singular.game',
device_id='40009df0-d618-4d81-9da1-cbb3337b8dec',
platform='pc',
os_version='windows',
store='steam'
)
curl -G "https://s2s.singular.net/api/v1/launch" \
--data-urlencode "a=your_sdk_key_here" \
--data-urlencode "i=com.singular.game" \
--data-urlencode "sdid=40009df0-d618-4d81-9da1-cbb3337b8dec" \
--data-urlencode "p=pc" \
--data-urlencode "os=windows" \
--data-urlencode "install_source=steam" \
--data-urlencode "ip=172.58.29.235"
async function reportGameSession(config) {
const sessionUrl = 'https://s2s.singular.net/api/v1/launch';
const params = new URLSearchParams({
'a': config.sdkKey,
'i': config.gameId,
'sdid': config.deviceId,
'p': config.platform,
'os': config.osVersion,
'install_source': config.store,
'ip': await getUserIP()
});
try {
const response = await fetch(`${sessionUrl}?${params.toString()}`);
const data = await response.json();
if (data.status === 'ok') {
console.log('Session reported successfully');
return true;
} else {
console.error('Session error:', data.reason);
return false;
}
} catch (error) {
console.error('Exception reporting session:', error);
return false;
}
}
// Example usage
reportGameSession({
sdkKey: 'your_sdk_key_here',
gameId: 'com.singular.game',
deviceId: '40009df0-d618-4d81-9da1-cbb3337b8dec',
platform: 'pc',
osVersion: 'windows',
store: 'steam'
});
游戏内事件追踪
合作伙伴 Conversion API 支持:如需通过 Singular 的 Conversion API 集成将这些事件转发给广告网络合作伙伴,请包含标准的可选事件属性(经过哈希处理的第一方数据,例如 eventId 和 ehash)。请参阅Conversion API 集成的标准事件属性。
追踪游戏内事件和用户交互,以分析营销广告系列表现、优化用户漏斗,并衡量玩家旅程中的互动。
事件规划
事件定义
在实现 S2S 集成之前,请定义您的组织希望追踪的事件,用于广告系列分析和用户行为衡量。
事件规划指南: 定义游戏内事件
事件通知端点
事件上报
当游戏中发生事件时调用 Event Notification Endpoint,以通知 Singular 进行归因分析和广告系列优化。
API 参考: 有关完整的端点规范,请参阅 Event Notification Endpoint 文档。
API 调用中包含的事件名称决定了该事件在 Singular 报告、导出和 postback 中的识别方式。
事件命名最佳实践
标准事件
Singular 建议使用标准的事件和属性命名约定,以简化 partner integration 并提高分析兼容性。
实现指南:
- 标准事件: 使用 Singular 的标准事件命名约定 以实现自动 partner 映射并简化集成
- 英语: 使用英语传递自定义事件名称和属性,以便与第三方合作伙伴和分析解决方案兼容
- 字符限制: 事件名称限制为 32 个 ASCII 字符(转换为 UTF-8 时为 32 字节)
- 属性限制: 事件属性和值限制为 500 个 ASCII 字符
收入事件追踪
收入衡量
追踪游戏内购买产生的收入,以分析广告系列表现和 ROI,数据可在报告、日志导出和 postback 中获取。
收入事件实现: 使用带有额外收入参数的 Event Notification Endpoint 来标记收入事件。
必需的收入参数:
-
is_revenue_event=true- 将事件标记为收入事件(如果事件名称为__iap__或金额大于零,则为可选) -
amt=1.99- 收入金额 -
cur=USD- ISO 4217 货币代码
事件请求示例
示例实现
标准事件
import requests
def report_game_event(sdk_key, game_id, device_id, platform, event_name, event_attributes=None):
"""
Report in-game event to Singular
"""
event_url = "https://s2s.singular.net/api/v1/evt"
params = {
'a': sdk_key,
'i': game_id,
'sdid': device_id,
'p': platform,
'n': event_name,
'ip': get_user_ip()
}
if event_attributes:
import json
params['e'] = json.dumps(event_attributes)
response = requests.get(event_url, params=params)
return response.json()
# Example: Level complete event
report_game_event(
sdk_key='your_sdk_key_here',
game_id='com.singular.game',
device_id='40009df0-d618-4d81-9da1-cbb3337b8dec',
platform='pc',
event_name='sng_level_achieved',
event_attributes={
'level': '5',
'score': '1250'
}
)
收入事件
def report_revenue_event(sdk_key, game_id, device_id, platform, amount, currency):
"""
Report revenue event to Singular
"""
event_url = "https://s2s.singular.net/api/v1/evt"
params = {
'a': sdk_key,
'i': game_id,
'sdid': device_id,
'p': platform,
'n': '__iap__',
'is_revenue_event': 'true',
'amt': amount,
'cur': currency,
'ip': get_user_ip()
}
response = requests.get(event_url, params=params)
return response.json()
# Example: $9.99 purchase
report_revenue_event(
sdk_key='your_sdk_key_here',
game_id='com.singular.game',
device_id='40009df0-d618-4d81-9da1-cbb3337b8dec',
platform='pc',
amount=9.99,
currency='USD'
)
标准事件
curl -G "https://s2s.singular.net/api/v1/evt" \
--data-urlencode "a=your_sdk_key_here" \
--data-urlencode "i=com.singular.game" \
--data-urlencode "sdid=40009df0-d618-4d81-9da1-cbb3337b8dec" \
--data-urlencode "p=pc" \
--data-urlencode "n=sng_level_achieved" \
--data-urlencode 'e={"level":"5","score":"1250"}' \
--data-urlencode "ip=172.58.29.235"
收入事件
curl -G "https://s2s.singular.net/api/v1/evt" \
--data-urlencode "a=your_sdk_key_here" \
--data-urlencode "i=com.singular.game" \
--data-urlencode "sdid=40009df0-d618-4d81-9da1-cbb3337b8dec" \
--data-urlencode "p=pc" \
--data-urlencode "n=__iap__" \
--data-urlencode "is_revenue_event=true" \
--data-urlencode "amt=9.99" \
--data-urlencode "cur=USD" \
--data-urlencode "ip=172.58.29.235"
标准事件
async function reportGameEvent(config) {
const eventUrl = 'https://s2s.singular.net/api/v1/evt';
const params = new URLSearchParams({
'a': config.sdkKey,
'i': config.gameId,
'sdid': config.deviceId,
'p': config.platform,
'n': config.eventName,
'ip': await getUserIP()
});
if (config.attributes) {
params.append('e', JSON.stringify(config.attributes));
}
const response = await fetch(`${eventUrl}?${params.toString()}`);
return await response.json();
}
// Example: Level complete
reportGameEvent({
sdkKey: 'your_sdk_key_here',
gameId: 'com.singular.game',
deviceId: '40009df0-d618-4d81-9da1-cbb3337b8dec',
platform: 'pc',
eventName: 'sng_level_achieved',
attributes: {
level: '5',
score: '1250'
}
});
收入事件
async function reportRevenueEvent(config) {
const eventUrl = 'https://s2s.singular.net/api/v1/evt';
const params = new URLSearchParams({
'a': config.sdkKey,
'i': config.gameId,
'sdid': config.deviceId,
'p': config.platform,
'n': '__iap__',
'is_revenue_event': 'true',
'amt': config.amount,
'cur': config.currency,
'ip': await getUserIP()
});
const response = await fetch(`${eventUrl}?${params.toString()}`);
return await response.json();
}
// Example: $9.99 purchase
reportRevenueEvent({
sdkKey: 'your_sdk_key_here',
gameId: 'com.singular.game',
deviceId: '40009df0-d618-4d81-9da1-cbb3337b8dec',
platform: 'pc',
amount: 9.99,
currency: 'USD'
});
后续步骤
通过其他资源和支持完成您的 PC 与主机集成。
其他资源
文档与支持
- API 参考: PC 与主机 S2S 端点参考
- 归因常见问题: PC 与主机游戏归因常见问题
- Web SDK(可选): Web SDK 概述与入门
- 事件规划: 定义游戏内事件
- 标准事件: Singular 标准事件参考
- 响应代码: S2S 响应代码与错误处理
支持渠道
获取帮助
联系 Singular 团队获取实现协助和技术支持。
- 解决方案工程师: 咨询 Singular 解决方案工程师,了解高级功能和集成规划
- 客户成功经理: 联系 CSM 以启用企业版功能和进行账户配置
- 支持团队: 提交支持工单以解决技术问题并获得故障排除协助