通过 Singular 网站 SDK,您可以将网站活动归因于营销接触点,并跟踪网站内的用户事件。它也是 Singular 跨设备归因解决方案的关键组件,使分析用户旅程、计算跨平台 LTV 和 ROAS 成为可能。
要了解更多信息,请参阅我们的跨设备归因常见问题和网络归因常见问题。
浏览器兼容性:
Chrome: 15+ | 边缘浏览器:15+ | Internet Explorer10+ |
Safari5.1+ | 火狐浏览器6+ | Opera: 15+ |
本指南介绍如何使用 Google 标签管理器实施方法,在网站 SDK 中添加支持 Singular Web-to-App 横幅广告的横幅广告。
如果您没有使用谷歌标签管理器,可以按照我们的《如何启用奇异横幅广告(开发人员指南)》直接在本地实施中添加横幅广告。
如果您不使用 Singular 横幅广告,可以按照此处的标准指南进行操作:
Singular 网站 SDK 是一项企业功能。如果您有兴趣使用该功能,请联系您的客户成功经理。
重要事项
Singular 横幅功能需要特殊配置,与集成谷歌标签管理器(GTM)模板不兼容。由于这一限制,所有标签类型的 Singular GTM 模板都不能与此实施一起使用。
如果您已经使用 GTM Singular 模板实施了 Singular WebSDK,则需要过渡到自定义 HTML 模板。这种过渡可确保与 Singular 平台兼容,并为集成提供更大的灵活性和控制力。
前提条件
在集成 Singular 网站 SDK 之前,请确保满足以下前提条件:
- 已在网站上配置Google Tag Manager。
- 您已根据需要为要发送到 Singular 的事件(转换事件和任何自定义事件)设置了Google Tag Manager 触发器。
- 您已根据需要为要发送到 Singular 的事件设置了Google Tag Manager 变量。例如,如果要发送交易事件并包含交易收入,就需要为交易金额和货币设置变量。
标签 1 - 添加 SDK 库
在初始化 Singular SDK 或触发任何 Singular 函数之前,必须在网站上加载或注入 Singular JavaScript 库。为确保这一点,将使用 Google 标签管理器(GTM)中的自定义 HTML 标签选项注入该库。
为保持正常功能,网站的所有页面都必须包含该库。我们将使用 GTM 中的 "窗口已加载 "触发器来控制库注入的时间,确保库在页面内容完全加载后加载。
- 创建一个自定义 HTML 标签来加载 SDK 库,并添加获取客户端提示数据的权限。
- 将标记命名为 "Singular - SDK Loader
- 在 HTML 窗口中插入以下代码
<script> (function() { // Check if singularSdk is already loaded if (window.singularSdk) { return; // SDK already loaded, no need to load again } // Inject the meta tag for client hints delegation var metaTag = document.createElement('meta'); metaTag.setAttribute('http-equiv', 'delegate-ch'); metaTag.setAttribute('content', 'sec-ch-ua-model https://sdk-api-v1.singular.net; sec-ch-ua-platform-version https://sdk-api-v1.singular.net; sec-ch-ua-full-version-list https://sdk-api-v1.singular.net'); document.head.appendChild(metaTag); // Create and load the Singular SDK script var script = document.createElement('script'); script.src = 'https://web-sdk-cdn.singular.net/singular-sdk/latest/singular-sdk.js'; script.async = true; // Once the script is loaded, push to dataLayer script.addEventListener('load', function() { window.dataLayer = window.dataLayer || []; // Ensure dataLayer is initialized window.dataLayer.push({ event: 'singularSDKLibraryLoaded' }); }); // Append the script tag to the head of the document document.head.appendChild(script); })(); </script>
- 在 "高级设置 "下,将标签启动优先级设为99
- 在 "触发 "部分,为"窗口已加载"添加触发器
- 保存标签
标签 2 - SDK 初始化标签
Singular SDK 初始化代码必须在每次加载页面时执行,但只能在 Singular - SDK Loader 标签触发后执行。为确保这一点,我们将使用 Singular - SDK Loader 标签创建的数据层事件作为触发器。
初始化 Singular SDK 是所有 Singular 归属功能的先决条件。它有两个关键目的:
- 当用户使用新的广告数据进入网站或会话超时时,创建新的用户会话。
- 向 Singular 发送 "页面访问 "事件。
这些 "页面访问 "事件和用户会话对于计算用户保留率和实现再参与归因至关重要。
配置 GTM 用户定义变量
要初始化 Singular SDK 并使其能够向 Singular 发送数据,必须向 SingularConfig 对象提供 SDK Key、SDK Secret 和 Product ID。下面的代码片段旨在从 GTM 用户定义变量中获取这些值。在执行代码之前,请确保在 Google Tag Manager 中创建了这些变量并分配了正确的值。
检索 SDK 密钥和 SDK 秘密
- 登录 Singular 帐户。
- 导航至开发人员工具 > SDK 集成 > SDK 密钥。
- 复制 SDK 密钥和 SDK Secret,以便在配置中使用。
定义产品 ID
- 产品 ID 在 Singular 中代表您的网站。我们建议使用主网域的反向 DNS 符号,如 com.example。
- 该值将在整个 Singular 平台上标识您的网站,并且必须与 Singular 中 "应用程序 "页面上定义的 "应用程序捆绑包 ID "相匹配。
对于有多个子域名的网站
如果您的网站跨越多个子域名(例如,www.example.com 和 shop.example.com),这些子域名在 Singular 平台中将被视为单个应用程序。在这种情况下,请对所有子域名使用统一的产品 ID,如 com.example。
添加 GTM 用户定义变量
在 Google Tag Manager 中,您应该创建用户定义变量来存储这些值,然后在需要时在代码片段中引用它们:
创建变量
- 单击变量
- 单击用户定义变量部分中的"新建
- 为变量命名,然后单击变量配置框。注意:变量名称是代码片段中引用该值的方式。
- 选择实用工具下的"常量"选项。
- 在值表单字段中,为变量添加相应的值。
按照上述过程,创建 3 个用户定义变量:"奇异 SDK密钥"、"奇异秘钥"和"奇异产品 ID"。
创建初始化标签
- 创建一个自定义 HTML 标签来处理 SDK 初始化
- 将标签命名为"Singular - SDK Initialization
- 在 HTML 窗口中插入以下代码
<script> (function() { // Check if singularSdk is available before proceeding if (window.singularSdk) { var sdkKey = {{Singular SDK Key}}; var secretKey = {{Singular Secret Key}}; var productId = {{Singular Product ID}}; // Create Singular Banners config object & enable web-to-app support var bannersOptions = new BannersOptions().withWebToAppSupport(); // Create SDK config object with Singular Banners support var config = new SingularConfig(sdkKey, secretKey, productId) .withBannersSupport(bannersOptions); //Add additional option here try { // Initialize the SDK singularSdk.init(config); // Display the banner singularSdk.showBanner(); // Push event to dataLayer after initialization window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'singularSDKInitialized' }); } catch (error) { console.error('Error initializing Singular SDK:', error); } } else { console.warn('Singular SDK not loaded or available.'); } })(); </script>
上述代码是在初始化时激活 Singular 横幅的基本示例。根据需要更新Singular 配置选项。
- 在高级设置下,将标签触发优先级设为98。
- 在 "触发 "部分,为自定义事件添加一个触发器。
- 将触发器命名为"singularSDKLoaded
- 指定触发器事件名称:"singularSDKLibraryLoaded
- 保存标签
在 GTM 预览中测试时,标签顺序应如下:
- 在窗口加载事件中:Singular - SDK Loader 标签被触发。
- singularSDKLibraryLoaded事件被推送到数据层。
- Singular -SDK 初始化标签被触发
- singularSDKInitialized事件被推送到数据层。
SingularConfig 选项
你可能想要添加设置,以启用 Singular 提供的各种功能。要添加设置,需要使用SingularConfig对象的".with"方法。例如
// Configure the SDK to pass the user ID to Singular
const config = new SingularConfig(sdkKey, sdkSecret, productId)
.withCustomUserId(userId);
SingularConfig 方法参考
以下是所有可用的".with "方法。
方法 | 方法描述 | 了解更多 |
.withCustomUserId(customId) | 向 Singular 发送用户 ID | 设置用户 ID |
.withProductName(productName) | 产品的可选显示名称 | |
.withLogLevel(logLevel) | 配置日志级别:0 - 无(默认);1 - 警告;2 - 信息;3 - 调试。 | |
.withSessionTimeoutInMinutes (超时) | 以分钟为单位设置会话超时(默认:30 分钟) |
|
.withAutoPersistentSingularDeviceId(域) | 启用自动跨子域跟踪 | 使用 Cookie 自动持续 |
.withPersistentSingularDeviceId(singularDeviceId) |
启用手动跨子域跟踪 | 手动设置奇异设备 ID |
.withInitFinishedCallback(callback) | 在 SDK 初始化完成时调用回调函数 | 初始化完成时调用回调函数 |
支持单页面应用程序(SPA)
对于单页面应用程序 (SPA)(页面内容会动态更改,无需重新加载整个页面),Google Tag Manager (GTM) 中的历史更改触发器是检测路由更改的绝佳选择。配置第 3 个自定义 HTML 标签可确保仅在路由更改时调用相应的 Singular SDK 方法,如 pageVisit()、hideBanner() 和 showBanner(),而不是在初始页面加载时。
GTM 配置:
创建历史更改触发器
- 在 GTM 中,创建一个新触发器
- 选择触发器类型:历史更改
为历史更改创建自定义 HTML 标签
- 将标签命名为 "Singular - SPA 路由更改
- 在 HTML 窗口中插入以下代码
<script> (function () { try { // Ensure Singular SDK is loaded if (window.singularSdk) { // Check if this is the first page load if (!window.singularFirstLoad) { // Mark the first page as processed window.singularFirstLoad = true; console.log('First page load detected. Singular pageVisit skipped.'); } else { // Call Singular's pageVisit for subsequent route changes singularSdk.pageVisit(); console.log('Singular pageVisit triggered for SPA route change.'); } // Hide the current banner singularSdk.hideBanner(); // Delay to ensure route change completion var delay = 200; // Delay in milliseconds setTimeout(function () { // Show the new banner for the current route singularSdk.showBanner(); console.log('Singular banner updated for new route.'); }, delay); } else { console.warn('Singular SDK is not defined. Ensure the SDK is loaded before using this script.'); } } catch (error) { console.error('Error during Singular SPA navigation:', error); } })(); </script>
- 将历史更改触发器分配给标签。
- 保存并测试
将用户 ID 发送至 Singular(可选)
您可以使用 Singular SDK 方法向 Singular 发送内部用户 ID。
注:如果使用Singular 的跨设备解决方案,则必须在所有平台上收集用户 ID。
- 用户 ID 可以是任何标识符,但不应暴露 PII(个人身份信息)。例如,不应使用用户的电子邮件地址、用户名或电话号码。Singular 建议使用仅对第一方数据唯一的哈希值。
- 传递给Singular的用户ID值也应该是你在所有平台(Web/移动/PC/控制台/离线)上获取的相同的内部用户ID。
- Singular 将在用户级导出、ETL 和内部 BI 回传(如果配置)中包含用户 ID。用户 ID 是第一方数据,Singular 不会与其他方共享。
- 使用 Singular SDK 方法设置的用户 ID 值将一直存在,直到使用logout() 方法取消设置或删除浏览器本地存储。关闭或刷新网站不会取消设置用户 ID。
- 在私人/隐身模式下,SDK 无法持续设置用户 ID,因为浏览器会在关闭时自动删除本地存储。
要设置用户 ID,请使用login() 方法。要取消设置(例如,如果用户 "注销 "账户),请调用logout() 方法。
注意:如果多个用户使用一台设备,我们建议实施注销流程,为每次登录和注销设置和取消设置用户 ID。
如果在网站上初始化 Singular SDK 时已经知道用户 ID,则在配置对象中设置用户 ID。这样,Singular 就能从第一次会话中获得用户 ID。不过,在用户注册或登录之前,用户 ID 通常是不可用的。在这种情况下,请在注册流程完成后调用login() 。建议在用户执行身份验证流程时推送一个数据层事件,该事件可与 GTM 自定义事件触发器一起使用,以触发 Singular 登录功能。
- 创建自定义 HTML 标签来处理身份验证
- 将标签命名为 "Singular - 身份验证标签
- 在 HTML 窗口中插入以下代码
<script> (function() { // Ensure sessionStorage is available if (typeof sessionStorage === 'undefined') { console.warn('sessionStorage is not supported in this environment.'); return; } // Check if the event has already been triggered in this session if (sessionStorage.getItem('sng_login_triggered')) { console.log('Singular SDK event already triggered this session.'); return; // Exit if the event was triggered before in this session } // Check if singularSdk is available and initialized if (window.singularSdk && typeof singularSdk.login === 'function' && typeof singularSdk.event === 'function') { // Dynamically fetch UserID if available (replace with actual method if applicable) var userID = window.userID || "User123456789"; // Example fallback value for userID try { // After Authentication, Pass the UserID as the Singular Custom User ID Value singularSdk.login(userID); // Send the Registration_Completed event (or similar event) singularSdk.event("sng_login"); // Set a flag in sessionStorage to indicate that the event was triggered sessionStorage.setItem('sng_login_triggered', 'true'); console.log('Singular SDK event triggered successfully.'); } catch (error) { console.error('Error triggering Singular SDK event:', error); } } else { console.warn('Singular SDK is not loaded or required methods are unavailable.'); } })(); </script>
- 在 "触发 "部分,为自定义事件添加一个触发器。
- 将触发器命名为"奇异身份验证
- 指定触发器事件名称,与用户在网站上进行身份验证后可用的数据层事件名称相对应。
- 保存标签
上面的代码片段演示了如何使用 GTM 自定义 HTML 标签实现 Singular Native JavaScript WebSDK,以支持横幅广告。如需进一步定制,如发送事件和跟踪收入,请参阅本地 SDK 文档了解详细的函数定义。然后,您可以根据需要构建其他自定义 HTML 标签,以扩展您的实施。