博客
Google Ads 与服务器端跟踪:每次转化如何找到它的广告点击
发布于 · 阅读约 6 分钟
在 Google Ads 中设置转化跟踪,最后会有两个请求:关联您现有的 Google 代码,以及在购买页面上粘贴一段事件代码段。使用服务器端跟踪时,前者没有问题,后者却是个错误。本文跟随一次广告点击,从着陆页一直到 Google Ads 中的转化:哪些请求经过您的跟踪服务器,哪些直接发给 Google,以及 SignalHost 在途中替您处理了什么。我们自己也在为 signalhost.io 投放 Google Ads,所以这里的一切都是在我们自己的网站上实测的。
关联 Google 代码后会发生什么变化
创建转化操作时,Google Ads 会在您的网站上查找 Google 代码,并提议使用它。接受之后,您的 Google 代码(带有 G- 衡量 ID 的那个)会把您的 Ads 账号(AW-…)添加为第二个目标。Google 会提示这会更新代码的设置。改动发生在 Google 那边的代码设置里,而不是您的 Tag Manager 容器中,但从此以后,每个加载该代码的页面也会与 Google Ads 通信。
现在每次页面浏览都会从访问者的浏览器直接向 Google(googleads.g.doubleclick.net 和 www.google.com)发送几个请求,用于您的再营销列表和 Google 自己的衡量。它们不经过您的跟踪服务器,这是有意为之:如果通过服务器转发,它们都会来自服务器的地址,而不是访问者自己的地址,这不是您想让广告平台看到的。您的 GA4 数据仍像以前一样经由您自己的域名传输。
刚接触服务器端跟踪?请看服务器端 Google Tag Manager 分步设置指南。
不要把 Google 的转化代码段放到您的页面上
接下来,Google Ads 会为您的购买页面提供一段事件代码段。它会从浏览器直接把转化发送给 Google Ads,绕过您的跟踪服务器;而且只要没人填写,价值就是 1.0,交易 ID 为空。
// Google's event snippet: not for your page.
// Paste it into the Conversion ID box in SignalHost instead.
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efGh12_34',
'value': 1.0,
'currency': 'EUR',
'transaction_id': ''
});使用 SignalHost 时,转化改由您的服务器容器发送。打开您的容器,展开“转化目标”,在 Google Ads 下填入转化 ID 和转化标签。从此,您的网站已经上报的每一笔购买(GA4 的 purchase 事件)都会从服务器发送到 Google Ads,并带上价值、币种和交易 ID。您的 Tag Manager 无需任何改动。
不要再额外添加代码段。两者同时存在时,每笔购买都会被记录两次:只有当两次转化带有相同的交易 ID 时,Google 才会把它们合并,而代码段里的交易 ID 通常是空的。
您不必自己从代码段里找出 ID 和标签。把整段代码或其中的 send_to 值粘贴到“转化 ID”栏中,两个栏位都会自动填好。ID 两种写法都可以:AW-123456789 或 123456789。
广告点击如何保留到购买发生
只有当转化能与促成它的那次点击关联起来时,它对 Google Ads 才有用。关联的纽带是点击 ID:Google 会以 gclid=… 的形式把它加到着陆页的地址上,而访问者再点击一次,它就从地址中消失了。
为此,每个 SignalHost 容器都包含一个服务器端的 Conversion Linker。它从着陆页的请求中读取点击 ID,并把它保存在您域名下一个名为 FPGCLAW 的第一方 Cookie 中。当购买到来时——无论是三个页面之后还是三天之后——您服务器容器中的 Google Ads 代码会读取这个 Cookie,把转化连同点击一起发送出去。
这需要满足两个条件。访问者必须在您的 Cookie 横幅中允许广告:没有这项同意,Linker 什么都不保存,Ads 代码也什么都不发送。另外,浏览器必须接受这个 Cookie,而这取决于您的跟踪服务器运行在哪个地址上。
为什么 Google Ads 需要您自己的域名
点击 Cookie 由您的跟踪服务器设置,而浏览器只有在该服务器属于您自己的网站时才会接受它——也就是像 metrics.yoursite.com 这样的子域名。每个容器起初使用的地址是 signalhost.io 的子域名,对浏览器来说那是别人的网站,所以 Cookie 会在那里被拒绝。
这种差别不会有任何提示。转化仍然会到达 Google Ads,但没有带上对应的点击,因此 Google Ads 无法把它们归到任何广告系列——看起来就和广告没有效果一模一样。在根据数字评判广告系列之前,请先关联您自己的域名:只需要一条 CNAME 记录,证书会自动签发。在域名生效之前,您容器的 Google Ads 设置中会给出提示。如何把自己的域名指向跟踪服务器。
当购买发生在几天之后
试用和订阅打破了常规路径:付款发生在访问几天之后,那时没有人在您的网站上,所以购买必须由您的服务器发送——通常来自支付服务商的 Webhook,正如我们的自建结账指南所介绍的那样。
对 Google Ads 来说,这笔购买还需要在结账时、趁访问者还在的时候取得另外两样东西。保存结账请求中携带的广告 Cookie——FPGCLAW、FPAU 以及 Google 的 _gcl_ Cookie,它们只有在访问者允许广告之后才存在——并在发送购买时把它们作为 Cookie 一并发回,同时把广告同意标记为已授予。没有它们,Google Ads 既无法接受这次转化,也无法为其归因。
// At checkout: keep the advertising cookies with the order.
// They only exist once the visitor allowed advertising.
const AD_COOKIES = ['FPGCLAW', 'FPAU', '_gcl_aw', '_gcl_au'];
order.adCookies = pick(req.cookies, AD_COOKIES);
// In the payment webhook: send them back with the purchase.
// gcs=G111 in the params: advertising and analytics consent granted.
await fetch(`https://metrics.yoursite.com/g/collect?${params}`, {
method: 'POST',
headers: { cookie: serialize(order.adCookies) },
});signalhost.io 正是这样上报自己的订阅的:当第一张账单支付成功时,Stripe 的 Webhook 发送购买事件,并带上结账时的广告点击。
SignalHost 替您处理的事情
您只需填写两个值,其余的都已内置在每个容器中:
- Conversion Linker 和 Google Ads 转化代码。填入 ID 和标签后,它们从下一次请求起生效。
- Ads 代码只在购买时触发,其他情况一概不触发。如果一个代码响应所有事件,就会把每次页面浏览都记录成一笔销售。
- 广告同意在服务器上强制执行:拒绝广告的访问者不会在 Google Ads 中产生任何转化。
- 您的跟踪服务器设置的每个 Cookie 都会到达浏览器——点击 ID、第一方访问者 ID 和广告用户 ID。
- 无论您怎样输入,转化 ID 都会以代码所需的格式发送。
- 当 Google Ads 缺少您自己的域名时,容器页面会提示您。
signalhost.io 正是采用这套配置,并使用我们自己的 Google Ads 账号。我们依赖的检查方法是一次带点击 ID 的测试访问:最后,点击 Cookie 必须出现在浏览器中。
如何检查您自己的配置
- 在地址末尾加上 ?gclid=test 打开您的网站,并在 Cookie 横幅中允许广告。现在,在浏览器中属于您域名的 Cookie 里应该能找到 FPGCLAW。
- 在容器的“开发者工具”中开始预览会话,在 Tag Manager 中为您的服务器容器点击“预览”,然后完成一次测试购买。Google Ads 转化代码应当随之触发,并带有价值、币种和交易 ID。
- 确认您的购买页面上没有 Google 的事件代码段,并且网页容器中没有任何 Google Ads 转化代码在同一笔购买上触发。
- 给 Google Ads 一天时间:新的转化操作可能需要这么久才会显示为有效。
如果转化到达了,却从未归因到任何广告系列,说明点击在途中丢失了:请先检查同意设置和您自己的域名。
