我在第三方捐赠处理系统上有一个 GTM 容器,当成功处理捐赠时,该容器会传递带有电子商务数据的 GA4 购买事件。问题在于,他们传递的购买物品信息对于最终报告用户来说基本上是无法读取的。
我想将一些特定值(例如 item_id、item_name、item_brand 等)更改为更易读的格式,同时保留要传递到 GA4 的其他值作为一个整体。
我最终创建了一个自定义 HTML 标记,该标记在触发购买事件时更新值,然后触发一个新的 Final_purchase 事件,该事件触发 GA 事件标记以将所有内容发送到 GA4:
<script type="text/javascript">
(function() {
dataLayer.push({
'ecommerce': {
'affiliation': 'POS company',
'items': [{
'item_id': '{{donation ID}}',
'item_name': '{{donation type name}}',
'item_brand': 'Recipient Org',
'item_category': 'Donations'
}]
},
'event': 'final_purchase'
});
})();
</script>
这最初似乎工作正常,GTM 的调试视图将 dataLayer 值显示为原始数据 + 我的更新的组合,如预期的那样:
ecommerce: {
transaction_id: "12345678",
affiliation: "POS company",
value: 10,
currency: "USD",
items: [
{
item_id: "DON_1234",
item_name: "One-Time General Donation",
price: "10",
item_brand: "Recipient Org",
quantity: 1,
item_category: "Donations"
}
]
}
但是在 GA4 中,debugView 仅显示我覆盖的信息(表现得好像 DLV 是 v1 并且所有原始数据都被覆盖;注意丢失的价格,并且 transaction_id、value 和currency 参数也没有显示)收到):
所以我认为,我需要获取 DLV 的 ecomm 部分,更新我想要的值,然后将整个部分推回,否则 GA4 将无法获取原始值,而不是仅仅将更改推送到选择性值。
我尝试将整个 dataLayer 转换为名为 fullDataLayer 的自定义 JS 变量,然后尝试这样做:
<script type="text/javascript">
(function() {
dataLayer.push({
'ecommerce': {
'affiliation': 'POS company',
'items': [{
'item_id': '{{donation ID}}',
'item_name': '{{donation type name}}',
'item_brand': 'Recipient Org',
'item_category': 'Donations'
}]
}});
dataLayer.push({
{{fullDataLayer}},
'event': 'final_purchase'
});
})();
</script>
但是 GTM 给了我错误“此语言功能仅支持 ECMASCRIPT_2015 模式或更好:扩展对象文字。”我尝试搜索错误,但我无法真正理解我发现的结果,因为它们是完全不同类型的函数(我尝试将
{{fullDataLayer}}
替换为 function () { {{fullDataLayer}} }
,并且还尝试将其在推送之外转换为 var newDLV = function () { {{fullDataLayer}} }
但是都不起作用)。
我只需要找到一种方法来解决我遇到的错误,还是有更好的方法来解决这个问题?
本想尝试将电子商务数据作为本地 JS 对象获取,并像 @darreltw 建议的那样更新它,但我的尝试最终以某种方式阻止了 Final_purchase 事件的推送。
我没有尝试通过 JS 挑选所有内容,而是为每个项目创建自定义 GTM 数据层变量并在函数中引用它们。它很丑陋,但似乎按预期工作,GA4 接收了所有相关值:
<script type="text/javascript">
(function() {
dataLayer.push({
ecommerce: {
transaction_id: {{DLV - ecommerce.transaction_id}},
affiliation: 'POS Company',
value: {{DLV - ecommerce.value}},
currency: {{DLV - ecommerce.currency}},
items: [
{
item_id: '{{donation ID}}',
item_name: '{{donation type name}}',
price: {{DLV - ecommerce.items.0.price}},
item_brand: 'Recipient Org',
quantity: {{DLV - ecommerce.items.0.quantity}},
item_category: 'Donations'
}
]
}
});
dataLayer.push({
'event': 'final_purchase'
});
})();
</script>
我确实弄清楚了如何推送数组的迭代更新,这在这个特定的实例中是多余的,因为每笔交易只有一个捐赠“产品”,但我想我会将它包含在这里,以防其他人发现它有用:
function updateObjArray(objArray, key, value) {
for (var element in objArray) {
dataLayer.push({ objArray[element][key]: value });
}
}
updateObjArray({{DLV - ecommerce.items}}, 'item_category', 'Donations');