概括来讲,Cookie 匹配是广告客户或供应商将其网域中的 Cookie 与 Google 网域中的 Cookie 相关联的过程。通过匹配这些 Cookie,您可以将自己拥有的第一方数据与同一用户的 Google 广告数据(通过 Display & Video 360 和 Campaign Manager 360 进行跟踪)相关联,从而整合 CRM 数据和更好地了解用户行为。通过使用注重隐私保护的联接来合并这些数据,您可以:
- 根据购物车中放弃的特定商品来定位受众群体,前提是这些用户与您的广告和网域互动过。
- 确定哪些广告能够在您的网域中带来较长的会话。
- 分析与广告系列投放后的数据相联接的交易记录。
限制和最终用户的隐私
尽管 Cookie 匹配功能强大,但仍具有一些限制:
- 禁止在
*_match
表与非*_match
表之间建立联接。 - 进行 Cookie 匹配时,您与 Google 都需要完成工程工作。
- 您不太可能能够匹配自己的所有 Google 广告数据。匹配率取决于多种因素,而且会因使用情形和客户端设置而异。匹配率通常低于用户的预期。用户只有在与您的网域和您的广告有过互动时,才符合 Cookie 匹配的条件。
- 匹配表设置完毕后,Google 便开始在其中填充数据。根据用户访问您网站和接收匹配像素的频率,您的匹配表可能需要数月的时间才会包含全面且可靠的用户数据。
- 您无法将单个用户与多部设备相关联,除非您能够通过某种方式跨设备关联用户。
- 您无法使用多个 Cookie 来匹配单个用户,如果用户清除其 Cookie,就会出现这种情况。
- 针对匹配表运行的作业需要遵守与广告数据中心内其他作业相同的汇总要求。匹配率和网域访问频率较低可能会导致难以获取数据。这是匹配率和汇总要求共同产生的影响1。
- Google 关于最终用户隐私的政策规定:
- 您不得匹配具体用户的登录数据和退出账号数据。
- 您不能将数据与已选择停用广告个性化功能的用户相匹配。
- 对于 iOS 事件,所匹配的数据只能来自搭载 iOS 14.5 以上版本且用户已按照 Apple 应用跟踪透明度框架授予了权限的应用。
确认第一方用户同意情况
为确保您能够在广告数据中心内使用您的第一方数据,您必须根据欧盟地区用户意见征求政策和广告数据中心政策,确认您已征得用户同意,可以与 Google 分享从欧洲经济区 (EEA) 最终用户那里收集的数据。这项要求适用于每个广告数据中心账号,且每次上传新的第一方数据时都必须进行更新。任何一个用户都可以代表整个账号进行这种确认。
请注意,适用于分析查询的 Google 服务查询规则同样也适用于 Cookie 匹配查询。例如,创建匹配表时,您不能对 EEA 境内用户运行跨服务查询。
若要了解如何在广告数据中心内确认用户同意情况,请参阅欧洲经济区用户意见征求要求。
Cookie 匹配的运作方式
为了让 Google 填充您的匹配表,您必须在您网域中您有意匹配广告数据的每个网页上都放置匹配代码。该像素的放置位置取决于您的广告目标。例如,您可能想要尝试匹配访问您网域的每位用户(需要在几乎所有网页上都放置像素),或者您也可以匹配完成转化的用户(需要在转化页上放置像素)。一般来说,像素的覆盖范围越广,匹配率就越高。
匹配代码是透明的 1x1 像素,其中包含您的 Cookie 匹配配置文件 ID,以及经过编码的用户 ID 或 Cookie ID:
<img src="https://cm.g.doubleclick.net/pixel?google_nid=adh_customername&google_hm=Q29va2llIG51bWJlciAxIQ" />
此匹配代码用于在您与 Google Cookie 匹配服务之间发起通信。
分步概览
- 某位用户访问包含匹配代码的网页。
- 匹配代码启动一系列重定向,分别重定向到 Google Marketing Platform、Google Ads 和 YouTube 匹配服务。这些请求包含该用户的 ID 或来自您网站的 Cookie,以及每项匹配服务的 ID 空间中的 Google Cookie。
- 系统会向浏览器返回透明的 1x1 像素,以确认请求是否已执行。
此流程如下图所示:
设置
在广告数据中心内设置 Cookie 匹配的流程如下:
- 与您的客户代表联系,告知其您对 Cookie 匹配感兴趣。对方会讨论您的目标,并为您提供有关如何在网域上部署跟踪像素的更多信息。
- 广告数据中心专家将发起另一对话,讨论相关技术要求和应用场景。
- 在您部署跟踪像素和错误端点时,Google 会为您创建匹配表。
完成上述步骤后,您无需立即采取行动。Google 每天会填充一次您的匹配表2,因此,您需要等待足够的时间,让匹配表包含足够的数据以提供有意义的匹配项并满足汇总要求。具体等待的时长取决于用户访问您网站的频率;与每月才有访问者的网站相比,每日都有访问者的网站能够更快达到此时间点。随着净新匹配项数量减少,匹配表中包含的数据将会更加全面。
查询匹配表
如果匹配表包含的数据足以满足隐私权检查要求,就可以针对该表运行查询。
广告数据中心架构中包含 user_id
字段的每个表都附带一个 *_match
表。例如,对于 adh.google_ads_impressions
表,广告数据中心还会生成一个名为 adh.google_ads_impressions_match
的匹配表,其中包含您的用户 ID。对于因政策而隔离的表,系统会创建单独的匹配表。例如,对于 adh.google_ads_impressions_policy_isolated_youtube
表,广告数据中心还会生成一个名为 adh.google_ads_impressions_policy_isolated_youtube_match
的匹配表,其中包含您的用户 ID。
这些表都包含原始表中在 user_id
方面匹配的一部分用户。例如,如果原始表包含用户 A 和用户 B 的数据,但只有用户 A 是匹配项,那么用户 B 将不会出现在匹配表中。
匹配表包含一个额外的列,名为 external_cookie
,该列会以字节形式存储 Cookie。
编写查询时,请务必考虑字段的类型。SQL 比较运算符会认为您要比较的字面量属于同一类型。根据 user_id
在第一方数据表中的存储方式,您可能需要先对该表中的值进行编码,然后才能匹配数据。您需要将联接键转换为字节形式,才能实现成功匹配。
JOIN ON
adh.google_ads_impressions_match.external_cookie = CAST(my_data.user_id AS BYTES)
此外,通过 SQL 比较字符串时会区分大小写,因此您可能需要对您比较的两个字符串进行编码,以确保准确进行比较。
对用户 ID 进行编码
在客户端对用户 ID 进行编码
为确保不同的 ID 格式可通过网址安全传输,所有 ID 都需要成为可在网址中安全使用的 Base64 编码 ID,然后才能发送出去。可在网址中安全使用的 Base64 解码 ID 将显示在广告数据中心的 external_cookie
字段中,因此您需要先撤消已应用的任何转换,然后再进行编码,以便获取原始 ID。
如果您的 ID 始终不超过 24 个字符(或字节),您可以在像素中添加可在网址中安全使用的 Base64 编码 ID,如示例 1 所示。如果您的 ID 超过 24 个字符(或字节),则您需要将其转换为不超过 24 个字节的表示形式。在某些情况下(例如示例 2 中的 GUID),这是指转换为字节表示形式。在其他情况下,您可能需要向 Google 发送您的 ID 的子集(或哈希值)。请注意,在任何情况下,您都需要确保自己可以编写 SQL JOIN,以相同的方式转换第一方表数据中的 ID。
示例 1
您的用户 ID 值始终不超过 24 个字节的长度限制。广告数据中心建议您只需直接将用户 ID 发送到广告数据中心(在出于网址传输目的而将其编码为可在网址中安全使用的 Base64 后)。
var userId = 'abcdef123456789';
// Encode the string (or number) in normal base64.
var userIdBase64 = btoa(userId);
// Ensure that the uploaded user IDs use web-safe Base64 encoding.
userIdBase64 = userIdBase64.replace(/\+/g, '-').replace(/\//g, '_')
.replace(/=+$/, '');
// After encoding the UUID correctly, you can create the request tag and
// insert it into the DOM.
var imgElement = Document.createElement('img');
imgElement.src =
'https://cm.g.doubleclick.net/pixel?google_nid=adh_customername&google_hm='
+ userIdBase64;
document.body.appendChild(imgElement);
示例 2
您将一个通用唯一标识符 (UUID) 值指定为用户 ID,例如 123e4567-e89b-12d3-a456-426655440000
。
广告数据中心建议在匹配时进行以下转换:
- 将 UUID 的格式设置为由 36 个字符组成的字符串。
- 对 UUID 进行十六进制解码。
- 将 UUID 的格式设置为字节。
- 对字节进行可在网址中安全使用的 Base64 编码。
- 将 UUID 的格式设置为字符串。
这可以使用以下代码来实现:
JavaScript
var userId = '123e4567-e89b-12d3-a456-426655440000';
// A helper function for converting a hex string to a byte array.
function strToBytes(str) {
for (var bytes = [], i = 0; i < str.length; i += 2) {
bytes.push(parseInt(str.substr(i, 2), 16));
}
return bytes;
}
// Remove the formatting dashes from the UUID.
userId = userId.replace(/-/g, '');
// Encode the hex string as a byte array.
var userIdBytes = strToBytes(userId);
// Encode the byte array in normal base64.
var userIdBase64 = btoa(String.fromCharCode(...new Uint8Array(userIdBytes)));
// Ensure that the uploaded user IDs use web-safe Base64 encoding.
userIdBase64 = userIdBase64.replace(/\+/g, '-').replace(/\//g, '_').replace(
/=+$/, '');
// After encoding the UUID correctly, you can create the request tag and
// insert it into the DOM.
var imgElement = Document.createElement('img');
imgElement.src =
'https://cm.g.doubleclick.net/pixel?google_nid=adh_customername&google_hm='
+ userIdBase64;
document.body.appendChild(imgElement);
Python
import base64
user_id = '123e4567-e89b-12d3-a456-426655440000'
user_id_as_bytes = bytes.fromhex(user_id.replace('-', ''))
base64.urlsafe_b64encode(user_id_as_bytes)
如果存在 Google 用户 ID 的匹配项,external_cookie
字段就会包含以字节值表示的 ID。若要重新构建原始 ID,需要进行以下转换:
- 将
external_cookie
的格式设置为字节。 - 对
external_cookie
进行十六进制编码。 - 将
external_cookie
的格式设置为字符串。
在广告数据中心内对用户 ID 进行编码
如果您将 UUID 字符串存储在第一方数据内的字段中,则需要将其转换为字节(如上例所示),才能成功联接数据。
以下示例展示了如何对 UUID 进行编码并将其联接到外部 Cookie 字段:
JOIN my_data ON imp.external_cookie = FROM_HEX(REPLACE(my_data.uuid, '-', ''))
请注意,您不能将整数转换为字节。如果您的用户 ID 是一个整数(如上述示例 1 所示),您需要先将其转换为字符串:
JOIN my_data ON imp.external_cookie = CAST(CAST(my_data.user_id AS STRING) AS BYTES)
请注意,匹配数据所需的编码取决于您如何存储数据,以及您在将数据发送到广告数据中心之前如何对其进行编码。
示例查询
以下示例将第一方数据与 google_ads_impressions_match
相联接,然后在第二个查询中将这些结果与 adh_google_ads_impressions
相联接。
SELECT
imp.campaign_id as campaign_id,
sum(my_data.recent_orders) as orders,
average(my_data.lifetime_value) as ltv
FROM
adh.google_ads_impressions_match as imp
LEFT JOIN
my_data ON imp.external_cookie = my_data.company_guest_id_bytes
GROUP BY
campaign_id
将上一个查询的结果另存为 previous_results
后,您现在可以联接 google_ads_impressions
。这样一来,系统就会将展示次数为零的广告系列的相关数据添加到结果中。
SELECT
campaign_id,
COALESCE(orders, 0) as orders,
COALESCE(ltv, 0) as ltv,
FROM (SELECT DISTINCT campaign_id
FROM adh.google_ads_impressions)
LEFT JOIN previous_results USING (campaign_id)