PAYATHON 2026

Google Analytics Enhanced Ecommerce 结账步骤跟踪

支付小周

结论

不要省略 step 来表示同一页面内的其他操作。建议这样实现:

  • 即使发生在同一个 URL,也应把“地址填写完成”“配送方式已选择”“支付方式已选择”定义为独立的虚拟 checkout steps。
  • 使用 Enhanced Ecommerce 的 checkout action 记录这些阶段。
  • 使用 checkout_option 记录具体选择,如配送方式或支付方式。
  • 普通 Event Tracking 用来分析更细的交互,如开始填写地址、表单验证失败、展开支付方式等,不应取代核心结账漏斗。
  • 不得向 Google Analytics 发送姓名、详细地址、邮箱、电话号码、银行卡信息等个人身份信息。

Checkout step 与 URL 无关。同一个页面可以按顺序发送多个结账步骤。

推荐的漏斗设计

现有流程可以重新划分为:

  1. Basket
  2. Address completed
  3. Shipping selected
  4. Payment selected
  5. Payment gateway

Thank you page 通常发送 purchase action,不再作为 checkout step。

还需要在 Universal Analytics 后台的 Enhanced Ecommerce checkout funnel 中按相同顺序配置这些步骤。否则,即使成功发送了 step 数字,漏斗报告也无法正确显示对应名称。

应在用户真正完成某个阶段时发送相应步骤,不要在页面加载时一次性发送所有步骤。

为什么不应省略 step

文档将 step 标为可选,是为了兼容未配置 checkout funnel,或者把整个 checkout 当成单一步骤处理的情况。

省略 step 不会自动生成更细的漏斗数据,Analytics 也无法据此判断当前操作属于地址、配送还是支付阶段。如果需要分析具体的流失位置,就应明确发送 step。

Analytics 不要求每个 step 对应不同页面。Enhanced Ecommerce 的结账步骤表示业务状态,不表示 URL 或 pageview。

使用 checkout 记录阶段完成

以下示例使用 analytics.js 和 Enhanced Ecommerce 插件。实际项目应复用页面中已有的商品数据,不要直接套用示例里的价格和 SKU。

ga('require', 'ec');

function addCheckoutProducts() {
  ga('ec:addProduct', {
    id: 'SKU-123',
    name: 'Example product',
    category: 'Body care',
    price: '299.00',
    quantity: 1
  });
}

用户完成地址部分后,发送第 2 步:

function trackAddressCompleted() {
  addCheckoutProducts();

  ga('ec:setAction', 'checkout', {
    step: 2
  });

  ga('send', 'event', 'Checkout', 'Address completed', {
    nonInteraction: true
  });
}

这里的事件 hit 用来承载 Enhanced Ecommerce 数据。ec:setAction 不会立即发送数据,之后必须调用 ga('send', ...)。

是否设置 nonInteraction: true,取决于站点如何统计跳出率。该设置可以避免事件影响 bounce rate,但不会阻止 Enhanced Ecommerce 数据随 hit 一起发送。

使用 checkout_option 记录具体选择

用户选择配送方式时,可以先用 checkout step 记录用户进入或完成了配送阶段,再将具体的配送方式关联到这一步。

function trackShippingStep() {
  addCheckoutProducts();

  ga('ec:setAction', 'checkout', {
    step: 3
  });

  ga('send', 'event', 'Checkout', 'Shipping step reached', {
    nonInteraction: true
  });
}

然后记录用户选择的配送方式:

function trackShippingOption(optionName) {
  ga('ec:setAction', 'checkout_option', {
    step: 3,
    option: optionName
  });

  ga('send', 'event', 'Checkout', 'Shipping option selected', optionName, {
    nonInteraction: true
  });
}

例如:

trackShippingOption('DAO Parcel Shop');

支付方式可以使用相同的结构:

function trackPaymentStep() {
  addCheckoutProducts();

  ga('ec:setAction', 'checkout', {
    step: 4
  });

  ga('send', 'event', 'Checkout', 'Payment step reached', {
    nonInteraction: true
  });
}

function trackPaymentOption(optionName) {
  ga('ec:setAction', 'checkout_option', {
    step: 4,
    option: optionName
  });

  ga('send', 'event', 'Checkout', 'Payment option selected', optionName, {
    nonInteraction: true
  });
}

调用示例:

trackPaymentOption('Visa');

option 应使用稳定且便于归类的名称,如 Visa、MobilePay、Home Delivery。不要发送银行卡号、持卡人姓名、账单地址或其他敏感信息。

普通事件适合记录哪些操作

不是每次点击都应成为 checkout step。以下行为更适合用普通事件记录:

  • 用户开始填写地址;
  • 地址验证失败;
  • 邮政编码不合法;
  • 用户打开配送方式列表;
  • 用户修改已经选定的配送方式;
  • 支付组件加载失败;
  • 用户点击继续,但表单未通过验证。

例如,记录地址验证错误:

ga('send', 'event', 'Checkout Form', 'Validation error', 'Postal code', {
  nonInteraction: true
});

事件标签只记录字段名称或错误类型,不要记录用户实际输入的内容。

可以按以下方式划分:

  • 改变用户所处结账阶段的行为,使用 checkout。
  • 记录用户在该阶段选择了什么,使用 checkout_option。
  • 分析页面交互、错误或犹豫行为,使用普通 event。

防止重复发送

单页 checkout 常会因为 change、blur、表单重新渲染或组件状态更新而重复触发事件。应确保同一用户会话中的每个步骤只发送一次,选项也只在值确实发生变化时发送。

const trackedCheckoutSteps = new Set();
const trackedOptions = new Map();

function trackStepOnce(step, eventLabel) {
  if (trackedCheckoutSteps.has(step)) {
    return;
  }

  trackedCheckoutSteps.add(step);
  addCheckoutProducts();

  ga('ec:setAction', 'checkout', {
    step: step
  });

  ga('send', 'event', 'Checkout', eventLabel, {
    nonInteraction: true
  });
}

function trackOptionChange(step, optionName, eventAction) {
  if (trackedOptions.get(step) === optionName) {
    return;
  }

  trackedOptions.set(step, optionName);

  ga('ec:setAction', 'checkout_option', {
    step: step,
    option: optionName
  });

  ga('send', 'event', 'Checkout', eventAction, optionName, {
    nonInteraction: true
  });
}

如果页面重新加载后仍需去重,可以将完成状态保存在应用自身的 checkout state、sessionStorage 或数据层中。不过,过度去重可能掩盖用户返回上一步重新选择的行为,因此 checkout step 和 option change 最好使用不同的去重策略。

实施时的注意事项

步骤应代表“完成”,而不是“碰过字段”

“用户聚焦了地址输入框”和“用户完成了有效地址”是两种不同的状态。前者适合记录为普通事件,后者才适合作为漏斗步骤。否则,漏斗显示的完成率会高于实际情况。

不要一次发送多个 Ecommerce action

一个 hit 应对应一个明确的 Enhanced Ecommerce action。不要连续调用多个 ec:setAction,最后只发送一个事件,因为后设置的 action 可能覆盖之前的状态。每个 checkout 或 checkout_option action 后都应发送独立的 hit。

后台步骤配置必须一致

代码中的 step: 3 必须与 Analytics 后台配置的第三个 checkout step 含义一致。如果代码将第 3 步定义为 Shipping,后台却将其命名为 Payment,报告就会产生误导。

注意个人信息限制

地址页面的风险最高。即使是为了排查问题,也不能将以下内容写入事件名称、标签、自定义维度或页面 URL:

  • 姓名;
  • 街道和门牌号;
  • 邮箱;
  • 电话号码;
  • 完整邮政地址;
  • 银行卡或支付账户信息。

如果用户输入可能出现在 URL query string 中,还应在采集前删除或屏蔽这些参数。

Universal Analytics 已停止常规数据处理

Universal Analytics 已结束服务。上述方案主要适用于维护历史实现,或仍在使用特殊存续环境的场景。新实施应迁移到 GA4,并使用 begin_checkout、add_shipping_info、add_payment_info 和 purchase 等推荐事件来表示相同流程。GA4 与 Universal Analytics Enhanced Ecommerce 使用不同的数据模型,不能直接将上述 analytics.js 代码原样改成 gtag 调用。

备注:内容仅供参考。