博客
Shopify 或 WooCommerce 店铺的服务器端跟踪:什么会触发、什么不会、该安装什么
发布于 · 更新于 · 阅读约 6 分钟
服务器容器不会让店铺自动上报购买。它只是把浏览器发送的内容,从你自己的主机名而不是 Google 的主机名转发出去——这件事值得做:广告拦截器和 Safari 加在一起,会丢掉店铺相当一部分转化。但购买必须先被发送出来,而在大多数店铺运行的两个平台上,开箱即用时没有任何东西会发送它。这是我们希望在第一天就能交到每位客户手上的文章。
九个事件,以及它们唯一的共同点
GA4 为购买漏斗定义了九个事件:view_item_list、view_item、add_to_cart、remove_from_cart、view_cart、begin_checkout、add_shipping_info、add_payment_info 和 purchase。名称是 GA4 的,不属于任何平台——同样的九个事件适用于 Shopify、WooCommerce 和你自己搭建的店铺。
它们共享的是一套机制。每一个都是向页面 dataLayer 的一次推送,名称一字不差,携带一个符合 GA4 格式的 ecommerce 对象。Tag Manager 的触发器监听这个名称;GA4 事件代码读取 ecommerce 对象并发送。名称拼错、对象多嵌套了一层、或者推送在了错误的页面上,代码就会永远停在那里,没有任何报错。购买推送长这样:
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'ORD-10442',
value: 89.90,
currency: 'EUR',
items: [
{ item_id: 'SKU-118', item_name: 'Trail jacket', price: 89.90, quantity: 1 }
]
}
});先推送 ecommerce: null 不是装饰。没有它,上一个事件的商品可能会渗入下一个事件,三页之前的 view_item 就会出现在 purchase 里。
Shopify:主题看不到结账页
安装在 Shopify 主题里的容器会在店面加载——商品页、系列页、购物车。它不会在结账页和感谢页加载,这些页面由 Shopify 用自己的域名和自己的模板提供。所以安装在主题里的容器可以发送 view_item 和 add_to_cart,但无论怎么配置,都永远不会发送 begin_checkout、add_shipping_info、add_payment_info 或 purchase。
这四个来自 Custom Pixel。Shopify 的像素沙盒公开了结账事件(checkout_started、checkout_shipping_info_submitted、payment_info_submitted、checkout_completed),并允许像素推送到它自己的 dataLayer——一小段脚本把每个事件映射到上面的 GA4 事件名和格式。店面事件仍然来自主题,所以完整的配置需要两部分:浏览一侧用 dataLayer 应用或主题代码片段,结账一侧用 Custom Pixel。
还有一个决定要做。Shopify 的 Google 与 YouTube 渠道可以在任何容器之外直接发送 GA4 事件。如果你在那里连接了一个 GA4 媒体资源,同时又让同一个媒体资源经过你的容器,每次购买都会被计两次。选一条路。如果目标是第一方收集,容器就是那条路,渠道里的 Analytics 连接保持关闭。
WooCommerce:核心什么都不推送
WooCommerce 本身不写任何 dataLayer。写的是插件——GTM4WP 是大多数人的选择——它的 GA4 电商选项会在正确的页面以正确的格式生成这些事件:商品页上的 view_item、按钮上的 add_to_cart、结账页上的 begin_checkout、订单完成页上的 purchase。
WooCommerce 的经典故障是购买被重复计算,原因很明确:订单完成页被重新加载了。访客刷新了它,从支付服务商跳回了它,或者主题两次重定向经过了它,于是 purchase 带着同一个 transaction_id 再次推送。GA4 在同一会话内按 transaction_id 对购买去重,能挡住大部分情况,但挡不住第二天的重新加载。插件的「每个订单只触发一次」设置值得打开;它把标记保存在服务器端,重新加载无法重置它。
SignalHost 为你构建什么
每个 SignalHost 容器的网页容器里,都为这九个事件各准备了一个自定义事件触发器和一个 GA4 事件代码——没有店铺的网站同样需要的那七个事件(注册、试用和潜在客户线索)也一样。它们全部带 SH 前缀,永远不会与你已有的东西冲突。每个代码直接从 dataLayer 发送 ecommerce 对象,所以 items、value、currency 和 transaction_id 无需逐字段设变量就能通过,并且每个代码都显式写明你的衡量 ID 而不是继承它。
你的店铺上不会安装任何东西。触发器只是监听;推送来自插件或像素。如果你的容器已经用你自己的代码把其中某个事件发送给 GA4——比如某个插件自带了 purchase 代码——SignalHost 会把这个事件留给它,不再构建第二个代码,因此没有任何订单会被计两次。每个代码还会把你随事件推送的 event_id 一并传递,所以一个也从自己的像素收到同一事件的广告平台,只会把它计一次。
服务器端没有任何按事件的配置。服务器容器的 GA4 代码会转发收到的每一个事件,不管它叫什么,所以你网站上的新事件不需要我们这边做任何改动。你连接的广告平台——Google Ads、Meta、TikTok、Reddit、Pinterest、Snapchat、LinkedIn——收到的也是同样的事件:purchase 在 Meta 和 TikTok 那里变成 Purchase,并带上它的商品和价值;每个平台都从同一次推送中收到它用得上的事件。
用一笔测试订单验证
在测试模式下下一笔真实订单,或者下一笔便宜的、之后退款的订单,然后观察容器页面的事件清单。你应该依次看到 view_item、add_to_cart、begin_checkout、add_payment_info 和 purchase——各一次;如果你的配置也推送 view_cart 和 add_shipping_info,它们会出现在这些事件之间。Shopify 上缺少 purchase,意味着 Custom Pixel 没有安装或没有推送;WooCommerce 上缺少 begin_checkout,通常意味着插件的结账事件被禁用了。
如果你让 Google Ads 转化经过容器,purchase 就是转化事件(除非你另选其他事件),它的价值、货币和交易 ID 都从同一个 ecommerce 对象读取。没有 value 的购买推送会记录一次价值为零的转化——在报告里那是一个真实的数字,而且是错的。
如果之后 GA4 统计的订单仍少于店铺,请看 GA4 为何少计,以及哪些可以找回。

