# 如何设置废弃购物车营销活动

将商品添加到购物车但未购买就离开的购物者，是最容易挽回的转化之一。他们已经表现出了购买意图。

本指南将介绍如何在 Pushwoosh 中向他们发送废弃购物车电子邮件：从您的商店触发 `PW_AbandonedCart` 事件，使用 [产品](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#products) 块在电子邮件中显示遗留的商品，并从 Customer Journey 中触发发送。

## 什么是 PW_AbandonedCart

`PW_AbandonedCart` 标记用户在购物车中留下了商品但未购买。它不是内置的[默认事件](/zh/product/audience-data-and-segmentation/events/default-events/)。它是一个在 Pushwoosh 电子商务集成中共享的事件名称，以便旅程、产品块和细分都以相同的方式工作。

*   **[Magento 集成](/zh/product/integrations/magento-integration/)：** 会自动为您发送 `PW_AbandonedCart` 和 `PW_OrderCreated`。
*   **[Shopify 集成](/zh/product/integrations/shopify-integration/)：** 会自动为您发送 `PW_AbandonedCart`、`PW_OrderCreated` 和 `PW_AbandonedCartUpdate`（当购物者继续编辑同一结账流程时会再次触发），并使用您的产品目录中的信息丰富购物车商品。
*   **任何其他商店或自定义后端：** 您的团队通过 [postEvent](/zh/developer/api-reference/user-centric-api/#postevent) 发送这两个事件，其名称和属性见[如何发送废弃购物车提醒](#how-to-send-abandoned-cart-reminders)。

### 发送 PW_AbandonedCart 时会发生什么

发送 `PW_AbandonedCart` 会在 Pushwoosh 端执行两项操作：

1.  它会像任何其他自定义事件一样被记录下来，因此您可以在[事件统计](/zh/product/audience-data-and-segmentation/events/)中看到它，并在[细分](/zh/product/audience-data-and-segmentation/segmentation/create-segments/by-events/)中使用它。
2.  Pushwoosh 会存储购物车内容，并为用户添加以下标签：
    *   **PW_AbandonedCartID：** 当前购物车的标识符，用于在发送时获取其内容。
    *   **PW_AbandonedCartDate：** 事件有效负载中的 `abandonedDate` 值。

### 发送 PW_OrderCreated 时会发生什么

当购物者下单时，发送 `PW_OrderCreated`（或 `PW_OrderUpdated`）。Pushwoosh 会立即为该用户清除 `PW_AbandonedCartID` 和 `PW_AbandonedCartDate`。它不匹配 `orderId` 值：来自该用户的任何订单都会移除这两个标签，即使购买的是不同的购物车。

**示例：** 购物者放弃了购物车 `ORDER-100`，然后在提醒发出前购买了 `ORDER-200`。Pushwoosh 会清除标签，因此他们不会收到关于 `ORDER-100` 的提醒。

<Aside type="note" title="提醒电子邮件中显示什么内容">
产品块在发送时读取存储在用户个人资料中的购物车。它不使用启动旅程的 `PW_AbandonedCart` 事件中的商品列表。

*   **相同的 `orderId`：** 每个新的 `PW_AbandonedCart` 都会覆盖存储的购物车。提醒会显示最新的商品。
*   **不同的 `orderId`：** Pushwoosh 会存储一个单独的购物车。商品不会被合并。
</Aside>

## 如何发送废弃购物车提醒

请按照以下步骤创建事件、从您的商店发送事件、构建电子邮件并启动 Customer Journey。

### 在您的 Control Panel 中创建事件

[Pushwoosh 会根据第一次 `postEvent` 调用中一个它不认识的名称来自动创建](/zh/product/audience-data-and-segmentation/events/#1-create-events-in-pushwoosh-control-panel)一个事件及其属性，并根据发送的值推断每个属性的类型。对于 `PW_AbandonedCart` 中的金额字段，这种推断并不可靠。请明确声明这两个事件，以确保类型设置正确：

1.  在您的 Pushwoosh Control Panel 中，转到 **Audience → Events**，然后点击 **Create Event**。
2.  创建一个名为 `PW_AbandonedCart` 的自定义事件，并包含以下属性：

| 属性 | 类型 |
| :---- | :---- |
| `email` | string |
| `orderId` | string |
| `customerId` | string |
| `orderUrl` | string |
| `abandonedDate` | date |
| `createdDate` | date |
| `totalPrice` | decimal (price) |
| `shippingAmount` | decimal (price) |
| `taxAmount` | decimal (price) |
| `discountAmount` | decimal (price) |
| `currency` | string |

3.  对 `PW_OrderCreated` 重复此操作，只需一个 `orderId` 属性。

<Aside type="caution" title="使用正确的属性类型">
Pushwoosh 仅以其设定的类型存储每个属性值，无论是在此处声明的还是为自动创建的属性推断的。与类型不匹配的值将被静默丢弃，而 `postEvent` 仍会返回成功，因此您不会在响应中看到数据丢失。您稍后可以在 Control Panel 中编辑事件来修复错误的类型，但在修复之前发送的任何数据都已丢失。

为确保废弃购物车功能正常工作，请匹配上表中的类型：

*   **金额字段**（`totalPrice`、`shippingAmount`、`taxAmount`、`discountAmount`）：使用 **decimal (price)**。如果未声明，像 `129` 这样的整数值会被推断为 **integer**。如果声明为 **string**，购物车将不会被存储，也不会设置标签。如果声明为 **integer**，`129.90` 会变成 `129`。
*   **日期**（`abandonedDate`、`createdDate`）：使用 **date**。
*   **`items`：** 不要将其添加到事件定义中。在 JSON 有效负载中将其作为对象数组发送。对 `price` 和 `quantity` 使用真实的 JSON 数字，而不是带引号的字符串。
</Aside>

[了解有关创建自定义事件的更多信息](/zh/product/audience-data-and-segmentation/events/custom-events/#creating-custom-events)。

### 从您的后端发送事件

<Aside type="caution" icon="setting" title="需要开发人员协助">
您需要开发团队的帮助才能从您的商店或后端发送事件。请与他们分享本指南。
</Aside>

请您的开发团队在购物车被放弃时调用 [postEvent](/zh/developer/api-reference/user-centric-api/#postevent)，并使用以下属性模式：

```json
{
  "request": {
    "hwid": "8f65b16df378e7a6bece9614e1530fb2",
    "application": "XXXXX-XXXXX",
    "event": "PW_AbandonedCart",
    "attributes": {
      "email": "shopper@example.com",
      "orderId": "ORDER-10293",
      "customerId": "CUST-4471",
      "orderUrl": "https://yourstore.com/cart/restore/ORDER-10293",
      "abandonedDate": "2026-07-28T10:15:00Z",
      "createdDate": "2026-07-28T09:40:00Z",
      "totalPrice": 129.90,
      "shippingAmount": 9.90,
      "taxAmount": 0,
      "discountAmount": 0,
      "currency": "USD",
      "items": [
        {
          "productId": "SKU-4821",
          "name": "Wireless headphones",
          "quantity": 1,
          "price": 119.90,
          "sku": "SKU-4821",
          "description": "Over-ear, noise-cancelling",
          "imageUrl": "https://yourstore.com/media/sku-4821.jpg",
          "productUrl": "https://yourstore.com/products/sku-4821",
          "category": "Audio"
        }
      ]
    },
    "userId": "shopper@example.com"
  }
}
```

当购物车转化为订单时，发送 `PW_OrderCreated` 并仅附带 `orderId` 以清除购物车标签：

```json
{
  "request": {
    "hwid": "8f65b16df378e7a6bece9614e1530fb2",
    "application": "XXXXX-XXXXX",
    "event": "PW_OrderCreated",
    "attributes": {
      "orderId": "ORDER-10293"
    },
    "userId": "shopper@example.com"
  }
}
```

<Aside type="tip">
如果您使用 [Magento 集成](/zh/product/integrations/magento-integration/#abandoned-cart-sync-configuration) 或 [Shopify 集成](/zh/product/integrations/shopify-integration/#part-5-track-orders-carts-and-checkout-steps)，则无需从后端发送这些事件。Magento 会按计划为您发送 `PW_AbandonedCart` 和 `PW_OrderCreated`；Shopify 会通过 webhooks 实时发送它们（以及用于进行中结账编辑的 `PW_AbandonedCartUpdate`）。
</Aside>

### 在您的电子邮件中添加产品块

1.  打开[电子邮件内容编辑器](/zh/product/content/email-content/drag-and-drop-email-editor/)，并将一个[产品](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#products)块添加到画布中。
2.  在设置面板中，将 **Source** 设置为[购物车](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#show-items-from-the-cart)。

<Aside type="note">
产品块的 **Cart** 源需要在您的套餐中包含 **Content Templates** 功能，并需要一个 [API access token](/zh/developer/api-reference/api-access-token/)。请参阅[产品块](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#products)。
</Aside>

3.  设置 **Max products shown** 以限制电子邮件中显示的购物车商品数量。

<img src="/lifecycle-marketing-campaigns-how-to-set-up-an-abandoned-cart-campaign-1.webp" alt="产品块设置，其中 Source 设置为 Cart，并显示了 Max products shown"/>

4.  根据需要设置网格和卡片模板的样式。请参阅[设置网格样式](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#style-the-grid)。

<img src="/lifecycle-marketing-campaigns-how-to-set-up-an-abandoned-cart-campaign-2.webp" alt="电子邮件画布上的产品块，带有卡片模板和网格样式设置" width="580"/>

当电子邮件发送时，产品块会使用每个收件人的 `PW_AbandonedCartID` 标签查找其存储的购物车。然后，它会用当前的购物车商品填充该块：图片、标题、价格以及返回购物车的链接。布局来自您在编辑器中设置的卡片模板。没有该标签的收件人（没有放弃任何商品，或已经下单）会跳过该块，而不会显示空内容，因此在更广泛的营销活动中也可以安全使用。

<Aside type="tip">
Cart 源在电子邮件内容编辑器中可用。要改为使用推送提醒购物者，请使用带有[个性化](/zh/product/personalization/dynamic-content/)的 [Push](/zh/product/customer-journey/journey-elements/channels/push/) 步骤，该个性化引用事件中的购物车详情。
</Aside>

### 构建 Customer Journey

1.  使用 `PW_AbandonedCart` 事件添加一个[基于触发器的入口](/zh/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/)。
2.  添加一个[等待触发器](/zh/product/customer-journey/journey-elements/flow-controls/wait-for-trigger/)步骤。将其等待时间设置为一到两个小时。将分支命名为 **Order placed**，并向其添加 `PW_OrderCreated` 事件。

<Aside type="caution">
在 **Wait for Trigger** 本身上设置等待时间。不要在它之前添加一个单独的 **Time Delay** 步骤。

**Wait for Trigger** 只有在购物者到达该步骤时才开始监听 `PW_OrderCreated`。如果 **Time Delay** 在前，而购物者在该延迟期间下单，则订单事件将不会被检测到。购物者会进入 **Not triggered** 分支，但 `PW_OrderCreated` 已经清除了 `PW_AbandonedCartID`。产品块找不到购物车并会跳过它。即使购物者已经完成了购买，他们仍然会收到一封没有产品的废弃购物车电子邮件。
</Aside>

3.  将 **Order placed** 分支路由到[退出](/zh/product/customer-journey/journey-elements/flow-controls/exit/)。用户已经购买，所以不要提醒他们。
4.  将 **Not triggered** 分支路由到[电子邮件](/zh/product/customer-journey/journey-elements/channels/email/)步骤。将在[在您的电子邮件中添加产品块](#add-a-products-block-to-your-email)中构建的电子邮件保存为[电子邮件内容](/zh/product/content/email-content/)，然后选择它作为此步骤的内容。

<img src="/lifecycle-marketing-campaigns-how-to-set-up-an-abandoned-cart-campaign-3.webp" alt="Customer Journey 画布，包含基于触发器的入口、带有“已下单”和“未触发”分支的等待触发器、电子邮件和退出步骤，并且没有时间延迟"/>

### 发布前进行测试

1.  为测试设备发送一个测试 `PW_AbandonedCart` 事件。不要手动设置 `PW_AbandonedCartID` 标签：产品块从事件创建的已存储购物车中加载内容，而不是从标签值中加载。没有真实的事件，该块将呈现为空。
2.  在向真实购物者发送之前，预览电子邮件并确认布局和产品内容。