跳转到主要内容

概述

购物车放弃是挽回流失收入的最高影响力机会之一。大多数放弃购物车的用户仍有购买意向 — 他们只是需要一个及时的提醒。 本指南向您展示如何在 OneSignal 中构建一个自动化购物车放弃 Journey,它可以:
  • 检测购物车活动
  • 等待一段短暂的非活跃期
  • 发送个性化提醒
  • 在购买或清空购物车后立即停止消息发送
您可以使用以下任一方式实现:
  • 自定义事件(推荐用于大多数实现)
  • 标签(更简单,适用场景有限)
正确的选择取决于您希望在消息中展示的数据以及该数据的来源。

您将构建的内容

完成本指南后,您将拥有:
  • 发送到 OneSignal 的购物车活动(通过标签或自定义事件)
  • 一个清晰的、代码定义的放弃信号
  • 个性化购物车数据的消息模板
  • 一个 Journey,它可以:
    • 在收到放弃信号时启动
    • 在发送前等待
    • 发送购物车放弃消息
    • 在购物车被清空或完成购买时立即退出
  • 用于衡量消息和收入表现的分析

选择您的跟踪方法

您可以使用自定义事件标签来跟踪购物车活动。
  • 使用自定义事件,如果您:
    • 可以在一段非活跃期后检测到放弃
    • 需要丰富的购物车数据(商品、图片、价格)
    • 能够确保事件每次放弃只触发一次
  • 使用标签,如果您:
    • 希望默认具有基于状态的安全性
    • 只需要简单的购物车数据
    • 偏好通过细分控制进入和退出
本指南展示了两种方法。自定义事件提供更多灵活性,但需要更加小心。

购物车放弃的建模方式

OneSignal 不会自动判断购物车何时被放弃。您需要在自己的代码或系统中决定购物车何时被放弃,然后通知 OneSignal。
cart_abandoned 的含义 cart_abandoned 事件应代表一个状态转换 - 购物车处于活跃状态 → 用户停止交互 → 购物车现在被视为已放弃。 此事件应在以下情况下发送:
  • 在一段有意义的非活跃期之后(例如 1 小时)
  • 仅在购物车中仍有商品时
不要在每次购物车更新时发送 cart_abandoned重复发送此事件会导致用户多次重新进入 Journey,并可能对他们造成骚扰。

Journeys 如何使用放弃信号

一旦 OneSignal 收到 cart_abandoned
  • 用户将有资格进入 Journey
  • 等待期给他们时间自然返回
  • 仅在他们未退出时才发送消息
  • 当收到 cart_emptied 时,用户立即退出
Journeys 控制时间和重复 — 它们不决定放弃。

设置

步骤 1. 规划您的购物车数据和来源

决定您想展示哪些购物车信息以及该数据来自哪里 常见的购物车数据包括:
  • 产品名称、图片、价格和数量
  • 购物车中的商品数量
  • 返回购物车的深度链接
您的数据来源决定了您如何发送事件:
数据来源推荐方法
应用或网站OneSignal 前端 SDK
后端或数据库OneSignal REST API
第三方平台基于集成的自定义事件
完成此步骤后,您将知道要发送什么数据以及如何发送它

步骤 2. 向 OneSignal 发送购物车状态信号

您必须发送代表购物车状态变化的信号。
信号用途
cart_abandoned检测到购物车活动但未解决
cart_updated购物车内容发生变化
cart_emptied购物车已清空或完成购买
事件和标签名称必须在 SDK/API 调用、细分、Journey 规则和 Liquid 模板中完全匹配
使用 OneSignal Web 或 Mobile SDK 发送自定义事件或标签。
SDK 方法描述
trackEvent发送自定义事件(Mobile SDKWeb SDK
addTags添加标签(Mobile SDKWeb SDK
removeTags移除标签(Mobile SDKWeb SDK
自定义事件示例
cart_abandoned 事件应在购物车非活跃一段时间后发送,而不是在用户进入或更新购物车时发送。cart_emptied 事件应在购物车被清空或完成购买时立即发送。
OneSignal.User.trackEvent("cart_abandoned", {
  product_name: "24 Pack of Acorns",
  product_image: "https://i.imgur.com/ssPCfbC.png",
  product_price: 12.99,
  product_quantity: 1,
  cart_url: "https://yourdomain.com/cart"
});
标签示例
此示例将 cart_updated 标签设置为表示购物车上次更新时间的 Unix 时间戳(以秒为单位)。您也可以使用布尔值(true/false),但时间戳通过 Time Operators 提供更大的灵活性。
OneSignal.User.addTags({
  cart_updated: unix_timestamp_seconds,
  product_name: "24 Pack of Acorns",
  product_image: "https://i.imgur.com/ssPCfbC.png",
  product_price: "$12.99",
  product_quantity: "1",
  cart_url: "https://yourdomain.com/username/cart"
})
如果您不发送 cart_emptied 信号,用户在购买后可能会继续收到购物车放弃消息。

步骤 3. 创建购物车放弃消息模板

创建动态引用购物车数据的消息模板。 有关本节中使用的概念的更多详情,请参阅:
使用 Liquid 语法格式引用事件属性:
Liquid
{{journey.event.name.properties.property_name | default: "fallback_value"}}
消息
Liquid
You left {{journey.event.cart_abandoned.properties.product_name | default: "items"}} in your cart.
图片
Liquid
{{journey.event.cart_abandoned.properties.product_image | default: "https://i.imgur.com/ssPCfbC.png"}}
启动 URL
Liquid
{{journey.event.cart_abandoned.properties.cart_url | default: "https://yourdomain.com/cart"}}
如果 product_image 不是直接的公开可访问的图片 URL,图片将不会显示。如果您的 product_image 是在线可用的图片文件名称,您可以使用以下格式引用图片: https://yourdomain.com/images/{{journey.event.cart_abandoned.properties.product_image | default: "stock_image"}}.png
使用自定义事件的购物车放弃模板示例
需要邮件示例、帮助或更多灵感?

步骤 4. 创建购物车放弃细分(仅限标签)

此步骤仅在使用标签跟踪购物车活动时才需要。如果您使用的是自定义事件,可以跳过此步骤。
细分将决定谁可以进入 Journey。有关更多详情,请参阅细分 选择 User Tag 筛选器来跟踪 cart_updated 标签 exists 的用户,并且选择 Last Session 筛选器为 less than 7 days ago
购物车放弃细分,使用标签筛选器,其中 cart_updated 标签存在且最后一次会话在 7 天以内
现在我们可以跟踪更新了购物车且在过去 7 天内访问过应用或网站的用户。当满足以下任一条件时,用户将自动从细分中移除:
  • 距离他们上次访问应用/网站已超过 7 天
  • cart_updated 标签被移除时

步骤 5. 创建购物车放弃 Journey

创建一个对购物车活动做出反应的 Journey。有关更多详情,请参阅 Journeys
新建购物车放弃 Journey 创建页面

Journey 设置

查看 Journey 设置指南,了解有关进入、退出和重新进入规则的更多详情。 进入规则:
  • 选择 Custom Event
  • Custom Event Name:cart_abandoned
每次发送 cart_abandoned 事件时,用户都会进入 Journey。仅在有意义的非活跃期之后发送此事件。
购物车放弃 Journey 自定义事件进入规则
退出规则
  • 选择 Meet a certain condition
  • 勾选 Exit when custom event condition occurs
  • Custom Event Name:cart_emptied
购物车放弃 Journey 自定义事件退出规则
用户将在以下任一情况下退出 Journey:
  • 执行了 cart_emptied 事件(来自步骤 3)。
  • 完成了 Journey。
重新进入规则(仅限标签):
  • 选择 Yes, after a certain amount of time
  • 将重新进入时间设置为 1 day
购物车放弃 Journey 重新进入规则
如果您已完整按照本指南操作到此处,那么用户将:
  1. 在放弃/更新购物车时进入 Journey
  2. 在清空购物车或完成 Journey 时退出 Journey。
  3. 有资格重新进入 Journey:
    • 自定义事件:每次执行 cart_abandoned 事件时
    • 标签:在上次退出 Journey 后经过 1 天且仍在细分中时。
保存 Journey 设置。

Journey 步骤

当用户匹配细分时,他们将进入 Journey。这通常在收到事件/标签后几分钟内发生。 用户将逐步完成 Journey 中的各个步骤,直到到达终点或满足退出规则。 对于基本的购物车放弃 Journey,我们需要做 2 件事:
  1. 给用户足够的时间来清空购物车(进行购买或手动清空购物车)
  2. 如果他们没有清空购物车,向他们发送一条关于购物车中商品的提醒消息
首先向 Journey 添加一个 Wait 步骤来实现这一点。
  • 将等待时间设置为您想要的时长。我们建议设置为 1 hour,这样您可以在他们仍有购买意向时发送消息。
添加一个 Message 步骤。
  • 选择您在步骤 4 中创建的 Abandoned Cart 推送通知模板。
基本购物车放弃 Journey 步骤
基本购物车放弃 Journey 现已配置完成。当用户进入 Journey 时,他们将等待 1 小时。如果他们没有退出 Journey,将收到购物车放弃推送通知。

高级 Journey 设置

利用您从本指南中获得的知识,您现在可以扩展 Journey 以在更长的时间内发送更多消息。

消息序列

一个非常常见的高效节奏的最佳实践时间序列是:
  1. 在 1 小时后发送第一条消息(在本指南中已完成)。
  2. 添加另一个 Wait 步骤等待 1 天,然后发送第二条消息(自更新购物车起约 24 小时)。
  3. 添加另一个 Wait 步骤等待 2 天,然后发送第三条消息(自更新购物车起约 72 小时)。
消息类型和内容: 根据您在 OneSignal 中设置的渠道,使用全渠道方法将获得更好的效果。
  1. 本指南展示了如何在第一个小时后发送推送通知消息。这用作一个有用的提醒,在用户可能仍在线时尝试促成销售。
  2. 考虑在第二条消息中同时使用推送和邮件。使用第二条消息来突出好处和社会认同,配合适度的紧迫感来鼓励他们购买。
  3. 对于序列中的最后一条消息,使用邮件或短信(取决于使用场景)作为”最后通知”。考虑使用折扣码或其他激励措施来鼓励他们购买。

备用消息

OneSignal 的 Journeys 提供 Wait Until 分支逻辑,您可以使用它来检查消息是否已确认送达、被点击或被打开,如果在一定时间内未执行,则发送备用消息。 这对于可能已取消订阅特定消息渠道的用户非常有用。有关如何设置备用消息的更多详情,请参阅我们的备用消息指南。

跟踪表现

Journey 分析可用于跟踪 Journey 整体的表现。您还可以使用模板分析来跟踪每条消息的表现。

使用 Outcomes 跟踪收入

要跟踪此 Journey 的收入,您可以使用自定义 Outcomes 当完成购买时,您可以将事件作为 “Custom Outcome” 发送,以跟踪与发送的特定消息相关的收入。 Custom Outcomes 可通过 Mobile SDKWeb SDK 发送。
Example: Send purchase outcome via frontend SDK
// Example: capture total price and item count at checkout
const checkoutPriceTotal = document.querySelector(".checkout-price-total").innerText;
const checkoutItemsTotal = document.querySelector(".checkout-items-total").innerText;

function updateOSOnCartPurchase(checkoutPriceTotal, checkoutItemsTotal) {
  const purchasePriceTotal = parseFloat(checkoutPriceTotal);
  const purchasedItemCount = parseInt(checkoutItemsTotal);

  OneSignalDeferred.push(function (OneSignal) {
    OneSignal.Session.sendOutcome("Purchase", purchasePriceTotal);
    OneSignal.Session.sendOutcome("Purchased Item Count", purchasedItemCount);
  });
}

const submitPurchaseButton = document.querySelector(".submit-payment");
if (submitPurchaseButton) {
  submitPurchaseButton.addEventListener("click", () => {
    updateOSOnCartPurchase(checkoutPriceTotal, checkoutItemsTotal);
  });
}
Outcomes 可以在定义的归因窗口内将收入归因于用户点击或受影响的消息。
您已成功实现了购物车放弃 Journey。当您准备好开始发送消息时,选择 Set Live
需要帮助?与我们的支持团队聊天或发送邮件至 support@onesignal.com请包含以下信息:
  • 您遇到的问题详情以及复现步骤(如有)
  • 您的 OneSignal 应用 ID
  • 外部 ID 或订阅 ID(如适用)
  • 您在 OneSignal 控制台中测试的消息 URL(如适用)
  • 任何相关的日志或错误信息
我们很乐意为您提供帮助!