# 如何在电子邮件中设置产品推荐

将产品块的**源**设置为**推荐**，可以按**畅销商品**、**补货**、**降价**、**新品上架**、**组合购买**或**根据浏览记录**对产品进行排名，而无需您挑选产品或编写产品目录规则。请参阅[获取推荐产品](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#get-recommended-products)了解此源添加的每个字段。其中三种策略需要来自您产品目录之外的数据才能生效：**畅销商品**读取您的订单历史，而**组合购买**和**根据浏览记录**则读取购物者浏览和购买过的内容。本指南将介绍需要发送哪些数据，以便每种策略都有内容可供排名。

<Aside type="tip">
已经为[废弃购物车恢复](/zh/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/)发送 `PW_AbandonedCart` 和 `PW_OrderCreated` 事件了吗？请继续阅读。**畅销商品**策略需要在 `PW_OrderCreated` 事件上增加一个废弃购物车指南中未涵盖的字段。
</Aside>

## 开始之前

请确保您账户的产品目录中有产品。前往**内容 → 产品目录**，连接一个数据源、导入一个 CSV 文件或手动添加产品。[了解如何填充您的产品目录](/zh/product/content/product-catalog/#ways-to-populate-your-catalog)。

<Aside type="caution" icon="setting" title="需要开发人员协助">
发送以下事件需要您的开发团队协助，除非您的商店集成已为您发送这些事件。请与他们分享本指南。
</Aside>

<Aside type="note" title="新账户会首先看到常规产品目录">
以下每种策略都需要积累历史数据才能进行排名。在此之前，该块将显示常规产品目录。请参阅[获取推荐产品](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#get-recommended-products)下的说明。
</Aside>

## 哪些策略需要事件

六种策略中有三种是根据您发送的事件对产品进行排名；另外三种则直接根据您的产品目录进行排名，无需您提供任何额外信息。

| 策略 | 需要事件？ | 数据源 |
| :---- | :---- | :---- |
| **补货** | 否 | 产品目录库存变化 |
| **降价** | 否 | 产品目录价格变化 |
| **新品上架** | 否 | 产品目录“添加”日期 |
| **畅销商品** (7/30 天) | 是 | 带有 `items` 的 `PW_OrderCreated` / `PW_OrderUpdated` |
| **根据浏览记录** | 是 | 任何携带产品 ID 的事件 |
| **组合购买** | 是 | 任何携带产品 ID 的事件，外加一个设备标签 |

您的数据源中的库存或价格变化，或下一次计划的同步，都会自动更新**补货**、**降价**和**新品上架**。这三种策略无需发送任何事件。

## 畅销商品：将商品添加到您的订单事件中

**畅销商品 (7 天)** 和 **畅销商品 (30 天)** 根据在相应时间窗口内售出的单位数量对产品进行排名。它们会读取 `PW_OrderCreated` 和 `PW_OrderUpdated` 事件上的 `items` 数组，特别是每个商品的 `productId` 和 `quantity`。

如果您已经发送 `PW_OrderCreated` 来[清除废弃购物车标签](/zh/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/#what-happens-when-you-send-pw_ordercreated)，那个最小化的调用（仅含 `orderId`）仍然可以清除购物车，但它无法为“畅销商品”策略提供任何计数依据。请将订单的行项目添加到同一次调用中：

```json
{
  "request": {
    "hwid": "8f65b16df378e7a6bece9614e1530fb2",
    "application": "XXXXX-XXXXX",
    "event": "PW_OrderCreated",
    "attributes": {
      "orderId": "ORDER-10293",
      "items": [
        {
          "productId": "SKU-4821",
          "quantity": 1
        },
        {
          "productId": "SKU-5190",
          "quantity": 2
        }
      ]
    },
    "userId": "shopper@example.com"
  }
}
```

`productId` 必须与您的[产品目录](/zh/product/content/product-catalog/)中该商品使用的 ID 相匹配，这样“畅销商品”策略才能查找并显示该产品。此策略会忽略额外的商品字段（如价格、名称等）。只有 `productId` 和 `quantity` 会计入排名。对于订单编辑、退款或部分取消，请在 `PW_OrderUpdated` 事件中发送相同的 `items` 数组，因为“畅销商品”策略会根据该订单的最新事件重新计数。

<Aside type="tip">
如果您使用 [Shopify 集成](/zh/product/integrations/shopify-integration/)，每个订单的 `PW_OrderCreated` 事件已经携带了包含 `productId` 和 `quantity` 的 `items`——您无需进行任何额外操作。不过，该集成不会发送 `PW_OrderUpdated`，因此“畅销商品”策略会按原始下单时的数据进行计数，不会扣除后续编辑、退款或取消的商品数量。
</Aside>

<Aside type="caution" title="将数量作为数字发送">
请为 `quantity` 使用真实的 JSON 数字，而不是带引号的字符串。Pushwoosh 仅以首次声明或推断的类型存储每个属性值；类型不匹配的值将被静默丢弃，而 `postEvent` 仍会返回成功。关于 `PW_AbandonedCart` 的相同警告，请参阅[使用正确的属性类型](/zh/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/#create-the-events-in-your-control-panel)。
</Aside>

<Aside type="note">
**畅销商品**策略专门根据订单历史进行排名，浏览和购物车活动不计入在内。如果需要一个包含浏览和购物车活动的排名，请改用**根据浏览记录**或**组合购买**。
</Aside>

## 根据浏览记录和组合购买：跟踪产品活动

这两种策略都基于相同的信号构建：携带产品 ID 的事件。您不需要专门的“产品已浏览”事件名称——任何通过 [postEvent](/zh/developer/api-reference/user-centric-api/#postevent) 发送的[自定义事件](/zh/product/audience-data-and-segmentation/events/custom-events/)都会被计入，只要其 `attributes` 包含以下键之一：

*   单个产品，作为顶级属性：`product_id`、`productId`、`productid`、`item_id` 或 `sku`。
*   多个产品，作为一个 `products` 数组，其中每个项目都有 `product_id`、`productId`、`id` 或 `sku`。

例如，触发您现有的产品浏览事件，并附带一个产品 ID 属性：

```json
{
  "request": {
    "hwid": "8f65b16df378e7a6bece9614e1530fb2",
    "application": "XXXXX-XXXXX",
    "event": "ProductViewed",
    "attributes": {
      "product_id": "SKU-4821",
      "category": "Audio"
    },
    "userId": "shopper@example.com"
  }
}
```

**根据浏览记录**策略会根据每个购物者自己最近互动过的产品进行排名——一旦上述事件开始流动，就无需进一步设置。

<Aside type="tip">
如果您使用 [Shopify 集成](/zh/product/integrations/shopify-integration/)，店面主题嵌入代码已在每次产品页面浏览时发送带有 `productId` 的 `PW_ProductViewed` 事件——您无需进行任何额外操作，只要 **Push Init Embed** 开关是打开的（默认为关闭）。请参阅[店面浏览事件](/zh/product/integrations/shopify-integration/#storefront-browsing-events)。
</Aside>

**组合购买**策略会根据您整个账户的历史记录，对经常与某个锚点产品一起购买的产品进行排名。它还需要一个额外的东西：一个**产品标签**，这是一个[设备标签](/zh/developer/api-reference/tags/)，用于保存当前锚点产品的 ID。在[产品块](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#get-recommended-products)中配置策略时设置该字段的名称（例如 `PW_LastViewedProductID`），然后在每个设备上保持该标签的更新。例如，每当购物者查看产品时，[将其设置为](/zh/developer/api-reference/tags/)该产品的 ID。如果收件人设备上未设置该标签，该块将为他们回退到显示常规产品目录。

<Aside type="caution" title="标签名称规则">
标签名称只接受字母、数字、下划线和空格，因为它必须能在 Liquid 中被寻址。请参阅[“组合购买”需要一个产品标签](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#get-recommended-products)。
</Aside>

## 确认您的事件已送达

在添加该块之前，请检查 Pushwoosh 是否确实收到了上述事件：前往**受众 → 事件**，打开您发送的事件（`PW_OrderCreated` 或携带产品 ID 的自定义事件），并确认最近的命中记录已显示。请参阅[事件统计](/zh/product/audience-data-and-segmentation/events/)。

<Aside type="note">
一个空的产品块可能意味着“事件从未到达”或“尚未积累足够的历史数据”（见上文说明）。事件统计可以帮助您在追查第二个原因之前排除第一个原因。
</Aside>

## 将该块添加到您的电子邮件中

将一个[产品](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#products)块添加到您的[电子邮件内容](/zh/product/content/email-content/drag-and-drop-email-editor/create-email-content-with-drag-and-drop-editor/)中，将**源**设置为**推荐**，并选择一个**策略**。有关设置面板中每个字段的说明，请参阅[获取推荐产品](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#get-recommended-products)。在发送前，点击**刷新预览**以检查画布是否已填充真实产品。