如何遍历GA4 items数组将dataLayer购买数据上报至Braze
GA4购买事件dataLayer数据同步至Braze实现方案
核心实现逻辑
GA4触发purchase事件时会将完整的交易、商品数据推入dataLayer,只需要在事件触发后提取最新的有效ecommerce数据,遍历items商品数组,按照字段映射规则逐个调用Braze的购买上报接口即可。
字段映射规则
按照要求两侧字段对应关系如下,额外补充兜底逻辑避免空值报错:
- Braze参数
productId→ 对应GA4商品字段item_id(必填) - Braze参数
price→ 对应GA4商品字段price(必填,需转为数值类型) - Braze参数
currency→ 优先取GA4商品字段currency,商品层级无值时兜底取交易层级的ecommerce.currency - Braze参数
quantity→ 对应GA4商品字段quantity(需转为整数类型,无值时默认传1)
可直接部署的代码示例
前端原生部署版本(无GTM场景)
直接将这段代码放在Braze SDK初始化代码之后即可,会自动监听dataLayer的purchase事件完成上报:
// 核心同步逻辑 function syncGa4PurchaseToBraze() { // 倒序查找dataLayer中最新的有效purchase事件,跳过清空ecommerce的null数据 const latestPurchase = window.dataLayer.slice().reverse().find(entry => { return entry.event === 'purchase' && entry.ecommerce && Array.isArray(entry.ecommerce.items) }); if (!latestPurchase) return; const ecommerce = latestPurchase.ecommerce; const fallbackCurrency = ecommerce.currency; // 遍历商品数组逐个上报 ecommerce.items.forEach(product => { const productId = product.item_id; const price = Number(product.price); const currency = product.currency || fallbackCurrency; const quantity = parseInt(product.quantity, 10) || 1; // 必要字段校验,缺值跳过避免接口报错 if (!productId || isNaN(price)) return; // 调用Braze标准购买上报接口 window.braze.logPurchase(productId, price, currency, quantity); }); } // 监听dataLayer的push事件,捕获purchase上报 const originalDataLayerPush = window.dataLayer.push; window.dataLayer.push = function (...args) { originalDataLayerPush.apply(this, args); const pushedContent = args[0]; if (pushedContent?.event === 'purchase') { // 加100ms延时确保dataLayer数据完全写入 setTimeout(syncGa4PurchaseToBraze, 100); } };
GTM部署版本
如果用Google Tag Manager管理代码,不需要自己写dataLayer监听逻辑:
- 新建自定义HTML标签
- 触发器选择「GA4事件 - purchase」,确保触发时机在GA4基础标签之后
- 标签内填入以下代码即可:
const ecommerce = {{ecommerce}}; // 直接调用GTM内置的ecommerce变量 if (!ecommerce || !Array.isArray(ecommerce.items)) return; const fallbackCurrency = ecommerce.currency; ecommerce.items.forEach(product => { const productId = product.item_id; const price = Number(product.price); const currency = product.currency || fallbackCurrency; const quantity = parseInt(product.quantity, 10) || 1; if (!productId || isNaN(price)) return; braze.logPurchase(productId, price, currency, quantity); });
注意事项
- 所有同步逻辑必须在Braze Web SDK初始化完成后执行,否则会出现
braze is not defined的报错 - 上报前必须做类型转换:部分GA4部署场景下price、quantity会被存为字符串,直接传递会导致Braze侧数据统计异常
- 如果需要额外上报订单号、优惠券、折扣等交易维度属性,可以在
logPurchase的第五个传参里传入自定义属性对象,Braze支持自定义属性扩展
内容的提问来源于stack exchange,提问作者marius
相关产品推荐
相关产品推荐

