> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 购物车放弃教程

> 使用 OneSignal 的购物车放弃通知挽回流失的销售。了解如何跟踪购物车活动、构建正确的细分，以及使用 Journeys 发送及时提醒。

## 概述

购物车放弃是挽回流失收入的最高影响力机会之一。大多数放弃购物车的用户仍有购买意向 — 他们只是需要一个及时的提醒。

本指南向您展示如何在 OneSignal 中构建一个**自动化购物车放弃 Journey**，它可以：

* 检测购物车活动
* 等待一段短暂的非活跃期
* 发送个性化提醒
* 在购买或清空购物车后立即停止消息发送

您可以使用以下任一方式实现：

* 自定义事件（推荐用于大多数实现）
* 标签（更简单，适用场景有限）

正确的选择取决于您希望在消息中展示的数据以及该数据的来源。

**您将构建的内容**

完成本指南后，您将拥有：

* 发送到 OneSignal 的购物车活动（通过标签或自定义事件）
* 一个清晰的、**代码定义的**放弃信号
* 个性化购物车数据的消息模板
* 一个 Journey，它可以：
  * 在收到放弃信号时启动
  * 在发送前等待
  * 发送购物车放弃消息
  * 在购物车被清空或完成购买时立即退出
* 用于衡量消息和收入表现的分析

**购物车放弃的建模方式**

本指南假设您正在跟踪"购物车更新"事件，即每次用户在购物车中添加或删除商品时。这可以是单个商品（如内容订阅）或多个商品（如购物车）。

一旦 OneSignal 收到 `cart_updated` 事件：

* 用户将有资格进入 Journey
* 等待期给他们时间自然返回
* 仅在他们未退出时才发送消息
* 当购物车被清空时，用户立即退出

***

## 设置

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

决定**您想展示哪些购物车信息**以及**该数据来自哪里**。

常见的购物车数据包括：

* 产品名称、图片、价格和数量
* 购物车中的商品数量
* 返回购物车的深度链接

您的数据来源决定了您如何发送事件：

| 数据来源   | 推荐方法               |
| ------ | ------------------ |
| 应用或网站  | OneSignal 前端 SDK   |
| 后端或数据库 | OneSignal REST API |
| 第三方平台  | 基于集成的自定义事件         |

<Check>
  完成此步骤后，您将知道**要发送什么数据**以及**如何发送它**。
</Check>

### 步骤 2. 向 OneSignal 发送购物车活动

当购物车状态发生变化时，将更新后的购物车数据发送给 OneSignal，以便跟踪活动。

本指南使用 `cart_updated` 事件或标签来跟踪购物车活动，并至少包含一个属性。

选择您在步骤 1 中选择的方法：

<Tabs>
  <Tab title="自定义事件">
    每次购物车发生变化时发送一个 `cart_updated` 自定义事件。当购物车中有商品时包含产品属性，购物车清空时省略。

    | 参考                                           | 描述                                                                                                           |
    | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
    | `trackEvent` 方法                              | 通过前端 SDK 发送（[Mobile SDK](./mobile-sdk-reference#custom-events)、[Web SDK](./web-sdk-reference#custom-events)） |
    | [自定义事件 API](/reference/create-custom-events) | 通过 REST API 发送                                                                                               |
    | [集成](./integrations)                         | 通过集成发送                                                                                                       |

    **前端 SDK `trackEvent` 方法示例**

    <CodeGroup>
      ```javascript Cart Updated theme={null}
      OneSignal.User.trackEvent("cart_updated", {
        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"
      });
      ```

      ```javascript Cart Emptied theme={null}
      OneSignal.User.trackEvent("cart_updated");
      ```
    </CodeGroup>

    **自定义事件 API 示例**

    <CodeGroup>
      ```json Cart Updated theme={null}
      {
        "events": [
          {
            "name": "cart_updated",
            "properties": {
              "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"
            },
            "external_id": "ID_OF_THE_USER"
          }
        ]
      }
      ```

      ```json Cart Emptied theme={null}
      {
        "events": [
          {
            "name": "cart_updated",
            "external_id": "ID_OF_THE_USER"
          }
        ]
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="标签">
    当购物车中有商品时设置标签，购物车清空时删除标签。

    <Info>
      此示例将 `cart_updated` 标签设置为表示购物车上次更新时间的 Unix 时间戳（以秒为单位）。您也可以使用布尔值（true/false），但时间戳通过 [Time Operators](./time-operators) 提供更大的灵活性。
    </Info>

    | 参考                                 | 描述                                                                                                   |
    | ---------------------------------- | ---------------------------------------------------------------------------------------------------- |
    | `addTags` / `removeTags`           | 通过前端 SDK 发送（[Mobile SDK](./mobile-sdk-reference#data-tags)、[Web SDK](./web-sdk-reference#data-tags)） |
    | [更新用户 API](/reference/update-user) | 通过 REST API 发送                                                                                       |

    **前端 SDK `addTags` / `removeTags` 方法示例**

    <CodeGroup>
      ```javascript Cart Updated theme={null}
      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"
      })
      ```

      ```javascript Cart Emptied (remove tags) theme={null}
      OneSignal.User.removeTags([
        "cart_updated", "product_name", "product_image", "product_price", "product_quantity", "cart_url"
      ])
      ```
    </CodeGroup>

    **更新用户 API 示例**

    <CodeGroup>
      ```json Cart Updated theme={null}
      {
        "properties": {
          "tags": {
            "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"
          }
        }
      }
      ```

      ```json Cart Emptied (remove tags) theme={null}
      {
        "properties": {
          "tags": {
            "cart_updated": "",
            "product_name": "",
            "product_image": "",
            "product_price": "",
            "product_quantity": "",
            "cart_url": ""
          }
        }
      }
      ```
    </CodeGroup>
  </Tab>
</Tabs>

<Check>
  购物车活动现在正在发送到 OneSignal。每次购物车发生变化时，OneSignal 都会收到触发和个性化消息所需的更新数据。
</Check>

***

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

创建动态引用购物车数据的消息模板。

有关本节中使用的概念的更多详情，请参阅：

* [Liquid 语法](./using-liquid-syntax)
* [消息个性化](./message-personalization)
* [模板](./templates)

<Tabs>
  <Tab title="自定义事件推送模板">
    使用 Liquid 语法格式引用事件属性：

    ```liquid Liquid theme={null}
    {{journey.event.name.properties.property_name | default: "fallback_value"}}
    ```

    **消息**：

    ```liquid Liquid theme={null}
    You left {{journey.event.cart_updated.properties.product_name | default: "items"}} in your cart.
    ```

    **图片**：

    ```liquid Liquid theme={null}
    {{journey.event.cart_updated.properties.product_image | default: "https://i.imgur.com/ssPCfbC.png"}}
    ```

    **启动 URL**：

    ```liquid Liquid theme={null}
    {{journey.event.cart_updated.properties.cart_url | default: "https://yourdomain.com/cart"}}
    ```

    <Warning>
      如果 `product_image` 不是**直接的**、**公开可访问的**图片 URL，图片将不会显示。

      如果您的 `product_image` 是在线可用的图片文件名称，您可以使用以下格式引用图片：
      `https://yourdomain.com/images/{{journey.event.cart_updated.properties.product_image | default: "stock_image"}}.png`
    </Warning>

    <Frame caption="使用自定义事件的购物车放弃模板示例">
      <img src="https://mintcdn.com/onesignal/i980ujIG34-OaGfp/images/abandoned-cart/abandoned_cart_custom_event.png?fit=max&auto=format&n=i980ujIG34-OaGfp&q=85&s=30545021f3e1b12cdc741b3112540234" alt="使用自定义事件的购物车放弃模板示例" width="2526" height="2104" data-path="images/abandoned-cart/abandoned_cart_custom_event.png" />
    </Frame>
  </Tab>

  <Tab title="标签推送模板">
    使用 Liquid 语法格式引用标签属性：

    ```liquid Liquid theme={null}
    {{tag_key | default: "fallback_value"}}
    ```

    **消息**：

    ```liquid Liquid theme={null}
    You left {{product_name | default: "items"}} in your cart.
    ```

    **图片**：

    ```liquid Liquid theme={null}
    {{product_image | default: "https://i.imgur.com/ssPCfbC.png"}}
    ```

    **启动 URL**：

    ```liquid Liquid theme={null}
    {{cart_url | default: "https://yourdomain.com/cart"}}
    ```

    <Warning>
      如果 `product_image` 不是**直接的**、**公开可访问的**图片 URL，图片将不会显示。

      如果您的 `product_image` 是在线可用的图片文件名称，您可以使用以下格式引用图片：
      `https://yourdomain.com/images/{{product_image | default: "stock_image"}}.png`
    </Warning>

    <Frame caption="使用标签的购物车放弃模板示例">
      <img src="https://mintcdn.com/onesignal/i980ujIG34-OaGfp/images/abandoned-cart/abandoned_cart_tags.png?fit=max&auto=format&n=i980ujIG34-OaGfp&q=85&s=00ed42a9890a824c8c201415b8260bba" alt="使用标签的购物车放弃模板示例" width="2526" height="2104" data-path="images/abandoned-cart/abandoned_cart_tags.png" />
    </Frame>
  </Tab>
</Tabs>

**需要邮件示例、帮助或更多灵感？**

<Columns cols={2}>
  <Card title="使用自定义事件个性化消息" icon="bolt" href="./personalization-custom-event">
    在 Journeys 中使用自定义事件的完整指南。包括事件存储、Journey 配置、购物车放弃示例、最佳实践和故障排除。
  </Card>

  <Card title="使用属性个性化消息" icon="tags" href="./personalization-properties-and-tags">
    在 Journeys 中使用属性和标签的完整指南。包括事件存储、Journey 配置、购物车放弃示例、最佳实践和故障排除。
  </Card>
</Columns>

### 步骤 4. 创建购物车放弃细分（仅限标签）

<Warning>
  此步骤仅在使用标签跟踪购物车活动时才需要。如果您使用的是自定义事件，可以跳过此步骤。
</Warning>

细分将决定谁可以进入 Journey。有关更多详情，请参阅[细分](./segmentation)。

向细分添加两个筛选器：

1. **User Tag** — `cart_updated` `exists`
2. **Last Session** — `less than` `7` `days ago`

<Frame caption="购物车放弃细分，使用标签筛选器，其中 cart_updated 标签存在且最后一次会话在 7 天以内">
  <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/tag-filter-cart-updated.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=e77eb5ae599ff365cc908524648342b5" alt="购物车放弃细分，使用标签筛选器，其中 cart_updated 标签存在且最后一次会话在 7 天以内" width="1300" height="656" data-path="images/segments/tag-filter-cart-updated.png" />
</Frame>

<Check>
  现在我们可以跟踪更新了购物车且在过去 7 天内访问过应用或网站的用户。

  当满足以下任一条件时，用户将自动从细分中移除：

  * 距离他们上次访问应用/网站已超过 7 天
  * 当 `cart_updated` 标签被移除时
</Check>

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

创建一个对购物车活动做出反应的 Journey。有关更多详情，请参阅 [Journeys](./journeys-overview)。

<Frame caption="新建购物车放弃 Journey 创建页面">
  <img src="https://mintcdn.com/onesignal/nGF0iEnzRCJ61U4u/images/journeys/new-journey-screen.png?fit=max&auto=format&n=nGF0iEnzRCJ61U4u&q=85&s=373c8bea9b7f399af4623fe18eb50f9b" alt="新建购物车放弃 Journey 创建页面" width="2234" height="930" data-path="images/journeys/new-journey-screen.png" />
</Frame>

#### Journey 设置

查看 [Journey 设置](./journeys-settings)指南，了解有关进入、退出和重新进入规则的更多详情。

**进入规则**:

<Tabs>
  <Tab title="自定义事件: 进入规则">
    * 选择 **Custom Event**
    * Custom Event Name：`cart_updated`
    * 按属性筛选：包含以下**所有**属性：`product_name` **exists**

    <Warning>
      使用自定义事件允许单个用户多次进入 Journey。

      使用属性筛选用户，使其仅在特定属性存在时才进入。
    </Warning>

    <Frame caption="购物车放弃 Journey 自定义事件进入规则">
      <img src="https://mintcdn.com/onesignal/QYQXG0jQYRHKKzOd/images/journeys/journey-entry-rules-custom-event.png?fit=max&auto=format&n=QYQXG0jQYRHKKzOd&q=85&s=6b36bbedce35c4286ecd9d154ab4c9db" alt="购物车放弃 Journey 自定义事件进入规则" width="2478" height="1772" data-path="images/journeys/journey-entry-rules-custom-event.png" />
    </Frame>
  </Tab>

  <Tab title="标签: 进入规则">
    * 选择 **Audience Segment**
    * Include Segment: **Abandoned Cart - cart\_updated**

    <Frame caption="购物车放弃 Journey 进入规则">
      <img src="https://mintcdn.com/onesignal/nGF0iEnzRCJ61U4u/images/journeys/journey-entry-rules-audience-segment.png?fit=max&auto=format&n=nGF0iEnzRCJ61U4u&q=85&s=d3f3cbd94f91fa80aaa293c5beb44ade" alt="购物车放弃 Journey 进入规则" width="2672" height="1586" data-path="images/journeys/journey-entry-rules-audience-segment.png" />
    </Frame>
  </Tab>
</Tabs>

**退出规则**：

<Tabs>
  <Tab title="自定义事件: 退出规则">
    当用户清空购物车或完成 Journey 时，他们应退出 Journey。

    * 选择 **Meet a certain condition**
    * 勾选 **Exit when custom event condition occurs**
    * Custom Event Name：`cart_updated`

    <Frame caption="购物车放弃 Journey 自定义事件退出规则">
      <img src="https://mintcdn.com/onesignal/QYQXG0jQYRHKKzOd/images/journeys/journey-exit-rules-meet-certain-condition-custom-event.png?fit=max&auto=format&n=QYQXG0jQYRHKKzOd&q=85&s=f2e5cff1e3f76307e8ac9f30e5fa189f" alt="购物车放弃 Journey 自定义事件退出规则" width="2478" height="1772" data-path="images/journeys/journey-exit-rules-meet-certain-condition-custom-event.png" />
    </Frame>

    <Note>
      此配置对进入和退出规则均使用相同的自定义事件名称（`cart_updated`）。

      这允许用户在同一时间只处于一个 Journey 实例中。每次他们更新购物车，该用户实例将退出，同一用户的新实例将进入 Journey。**这就是为什么在进入规则中使用属性筛选用户非常重要。**
    </Note>
  </Tab>

  <Tab title="标签: 退出规则">
    * 选择 **Meet a certain condition**
    * 勾选 **Exit when a user no longer matches the audience conditions**

    <Frame caption="购物车放弃 Journey 标签退出规则">
      <img src="https://mintcdn.com/onesignal/nGF0iEnzRCJ61U4u/images/journeys/journey-exit-rules-meet-certain-condition-tag.png?fit=max&auto=format&n=nGF0iEnzRCJ61U4u&q=85&s=e54a4770bccb5ad096602a2d2f826cc1" alt="购物车放弃 Journey 标签退出规则" width="2672" height="1586" data-path="images/journeys/journey-exit-rules-meet-certain-condition-tag.png" />
    </Frame>

    <Info>
      用户将在以下任一情况下退出 Journey：

      * 离开细分。
      * 完成了 Journey。
    </Info>
  </Tab>
</Tabs>

**重新进入规则**（仅限标签）：

* 选择 **Yes, after a certain amount of time**
* 将重新进入时间设置为 `1` `day`

<Frame caption="购物车放弃 Journey 重新进入规则">
  <img src="https://mintcdn.com/onesignal/Ed71xMP1FaC70n24/images/journeys/journey-re-entry-rules-after-certain-amount-of-time.png?fit=max&auto=format&n=Ed71xMP1FaC70n24&q=85&s=a3333faba5fb02f4f12fca0a3828ebc8" alt="购物车放弃 Journey 重新进入规则" width="945" height="400" data-path="images/journeys/journey-re-entry-rules-after-certain-amount-of-time.png" />
</Frame>

<Check>
  如果您已完整按照本指南操作到此处，那么用户将：

  1. 在放弃/更新购物车时进入 Journey
  2. 在清空购物车或完成 Journey 时退出 Journey。
  3. 有资格重新进入 Journey：
     * **自定义事件**：每次执行 `cart_updated` 事件时
     * **标签**：在上次退出 Journey 后经过 1 天且仍在细分中时。

  保存 Journey 设置。
</Check>

#### Journey 步骤

用户将根据进入规则进入 Journey。这通常在收到事件/标签后几分钟内发生。

用户将逐步完成 Journey 中的各个步骤，直到到达终点或满足退出规则。

对于基本的购物车放弃 Journey，我们需要做 2 件事：

1. 给用户足够的时间来清空购物车（进行购买或手动清空购物车）
2. 如果他们没有清空购物车，向他们发送一条关于购物车中商品的提醒消息

首先向 Journey 添加一个 **Wait** 步骤来实现这一点。

* 将等待时间设置为您想要的时长。我们建议设置为 `1` `hour`，这样您可以在他们仍有购买意向时发送消息。

添加一个 **Message** 步骤。

* 选择您在步骤 3 中创建的 **Abandoned Cart** 推送通知模板。

<Frame caption="基本购物车放弃 Journey 步骤">
  <img src="https://mintcdn.com/onesignal/FtxZDfbFgMsm3lF9/images/journeys/journey-steps-basic-abandoned-cart.png?fit=max&auto=format&n=FtxZDfbFgMsm3lF9&q=85&s=8af2e8a35043af3b053fda36f251c2c4" alt="基本购物车放弃 Journey 步骤" width="2526" height="2104" data-path="images/journeys/journey-steps-basic-abandoned-cart.png" />
</Frame>

<Check>
  基本购物车放弃 Journey 现已配置完成。

  当用户进入 Journey 时，他们将等待 1 小时。如果他们没有退出 Journey，将收到购物车放弃推送通知。
</Check>

## 高级 Journey 设置

扩展 Journey 以在更长的时间内发送更多消息，以获得更高的挽回率。

### 消息序列

一个常见的高效节奏是：

1. 在 1 小时后发送第一条消息（在本指南中已完成）。
2. 添加另一个 **Wait** 步骤等待 1 天，然后发送第二条消息（自更新购物车起约 24 小时）。
3. 添加另一个 **Wait** 步骤等待 2 天，然后发送第三条消息（自更新购物车起约 72 小时）。

#### 消息类型和内容

根据您在 OneSignal 中设置的渠道，使用全渠道方法将获得更好的效果。

1. 本指南展示了如何在第一个小时后发送推送通知消息。这用作一个有用的提醒，在用户可能仍在线时尝试促成销售。
2. 考虑在第二条消息中同时使用推送和邮件。使用第二条消息来突出好处和社会认同，配合适度的紧迫感来鼓励他们购买。
3. 对于序列中的最后一条消息，使用邮件或短信（取决于使用场景）作为"最后通知"。考虑使用折扣码或其他激励措施来鼓励他们购买。

### 备用消息

OneSignal 的 Journeys 提供 **Wait Until** 分支逻辑，您可以使用它来检查消息是否已确认送达、被点击或被打开，如果在一定时间内未执行，则发送备用消息。

这对于可能已取消订阅特定消息渠道的用户非常有用。有关如何设置备用消息的更多详情，请参阅我们的[备用消息](./push-fallback-method)指南。

### 跟踪表现

[Journey 分析](./journeys-analytics)可用于跟踪 Journey 整体的表现。您还可以使用[模板分析](./template-analytics)来跟踪每条消息的表现。

#### 使用 Outcomes 跟踪收入

要跟踪此 Journey 的收入，您可以使用[自定义 Outcomes](./custom-outcomes)。

当完成购买时，您可以将事件作为 "Custom Outcome" 发送，以跟踪与发送的特定消息相关的收入。

Custom Outcomes 可通过 [Mobile SDK](./mobile-sdk-reference#outcomes) 或 [Web SDK](./web-sdk-reference#outcomes) 发送。

```javascript Example: Send purchase outcome via frontend SDK theme={null}
// 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);
  });
}
```

<Info>
  Outcomes 可以在定义的归因窗口内将收入归因于用户点击或受影响的消息。
</Info>

<Check>
  您已成功实现了购物车放弃 Journey。当您准备好开始发送消息时，选择 **Set Live**。
</Check>

## 常见问题

### 购物车跟踪应该使用自定义事件还是标签？

自定义事件推荐用于大多数实现。它们支持更丰富的数据，允许在 Journey 进入规则中进行基于属性的筛选，并在同一事件再次触发时自动处理重新进入。标签适用于只需跟踪购物车是否存在的更简单场景，但需要手动创建细分和配置重新进入。

### 发送第一条提醒前应该等待多长时间？

一到两小时是常见的起点。这给用户足够的时间在购买意向仍然新鲜时自然返回。测试不同的等待时间，并使用 [Journey 分析](./journeys-analytics)找到最适合您受众的方式。

### 如果用户在 Journey 中更新了购物车会发生什么？

使用自定义事件时，用户会退出当前 Journey 实例（因为 `cart_updated` 作为退出条件触发），并立即以更新后的事件数据重新进入。使用标签时，由于标签仍然存在，用户保持在同一 Journey 实例中——他们只有在退出并等待重新进入期后才会重新进入。

<Info>
  需要帮助？

  与我们的支持团队聊天或发送邮件至 `support@onesignal.com`

  请包含以下信息：

  * 您遇到的问题详情以及复现步骤（如有）
  * 您的 OneSignal 应用 ID
  * 外部 ID 或订阅 ID（如适用）
  * 您在 OneSignal 控制台中测试的消息 URL（如适用）
  * 任何相关的[日志或错误信息](/docs/cn/capturing-a-debug-log)

  我们很乐意为您提供帮助！
</Info>
