# Shopify 事件与营销活动

在您连接应用并批准 Shopify 请求的订单、购物车和结账跟踪权限（`read_orders`、`write_pixels`、`read_customer_events`）后，订单、结账和结账步骤事件将开始到达，无需单独的 Pushwoosh 跟踪界面。批准步骤请参阅[前提条件](/zh/product/integrations/shopify/#prerequisites)和[第一部分](/zh/product/integrations/shopify/#part-1-installation)。店面浏览（产品浏览和加入购物车）还需要开启 [**Push Init Embed**](/zh/product/integrations/shopify/#part-4-enable-web-push-and-storefront-browsing-events)。

跟踪涵盖三个独立的事件组。每个都需要不同的权限，因此关闭一个不会暂停其他的：

* **订单支付和结账：** 即使[主题嵌入代码](/zh/product/integrations/shopify/#part-4-enable-web-push-and-storefront-browsing-events)已关闭，也会从 Shopify 到达
* **店面浏览**（产品浏览和加入购物车）：需要主题嵌入代码处于**开启**状态
* **结账步骤：** 需要来自[第一部分](/zh/product/integrations/shopify/#part-1-installation)的 Shopify 结账跟踪权限（`write_pixels` 和 `read_customer_events`），需与上面的订单跟踪权限（`read_orders`）分别批准

在连接应用之前，请查看 [Pushwoosh 如何处理 `PW_OrderCreated` 和 `PW_AbandonedCart` 的金额和日期属性类型](#order-paid-and-checkout-events)。在您发现之前发送的错误类型，事后无法修正。

<span id="order-paid-and-checkout-events" />
## 订单支付和结账事件

将这些用于购买后消息（`PW_OrderCreated`）、放弃结账的 journey 或细分（`PW_AbandonedCart` / `PW_AbandonedCartUpdate`）以及购买转化映射。即使购物者阻止了浏览器跟踪，它们也会从 Shopify 到达：

<Aside type="caution" title="需要已连接应用并已批准 read_orders">
除此之外无需额外开关：在[第一部分](/zh/product/integrations/shopify/#part-1-installation)中连接应用，并批准 Shopify 的订单跟踪权限（`read_orders`）。与店面浏览不同，这些事件不依赖于主题嵌入代码是否开启。
</Aside>

| Pushwoosh 中的事件名称 | 触发时机 |
| ----- | ----- |
| `PW_OrderCreated` | 订单已支付 |
| `PW_AbandonedCart` | 购物者开始结账 |
| `PW_AbandonedCartUpdate` | 购物者在现有结账过程中添加、移除或更改商品 |

这些事件对应于 Shopify 自动发送给 Pushwoosh 的订单和结账通知（`orders/paid`、`checkouts/create` 和 `checkouts/update` webhook，列在[同步的实体](/zh/product/integrations/shopify/#synchronized-entities)下）。

Shopify 自身的 Flow 条件、`checkouts/create` webhook，以及 Products 模块的 Cart 来源，是三种不同的东西，但都被称为**购物车放弃**。请使用下表选择与您要构建的内容相匹配的那个。

| 您想构建什么 | 应该使用什么 |
| ----- | ----- |
| 来自 Shopify Flow 的提醒（Shopify 自身的 **Cart abandonment** 条件） | Shopify Flow + **Pushwoosh send notification** 操作。不是 `PW_AbandonedCart` 事件名称。 |
| Pushwoosh 中基于结账开始或购物车变化的提醒或细分 | 基于 `PW_AbandonedCart` / `PW_AbandonedCartUpdate` 的 Customer Journey 或细分 |
| 在 email 中展示购物者的购物车商品 | Products 模块的 [Cart 来源](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#show-items-from-the-cart)（在发送时使用 `PW_AbandonedCartID` 标签）。与启动 journey 的触发器无关。 |

**这些事件的行为方式。** `checkouts/create` 仅表示已开始结账。Shopify 尚未判定其为放弃状态，也没有订单被确认。

当购物者继续编辑结账时，`PW_AbandonedCartUpdate` 会再次为同一结账触发，并覆盖从 `PW_AbandonedCart` 存储的购物车。使用 Cart 来源的提醒邮件会在发送时获取最新的商品。您不需要为了刷新购物车而设置第二个 journey 触发器。

`PW_AbandonedCart` 和 `PW_AbandonedCartUpdate` 会在购物者身上设置 `PW_AbandonedCartID` 标签，这正是 Cart 来源在发送时读取的内容。`PW_OrderCreated` 会立即清除该标签，因此已完成结账的购物者会跳过该模块，而不是收到一个他们已不再拥有的购物车的提醒。有关确切的清除行为，请参阅[发送 PW_OrderCreated 时会发生什么](/zh/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/#what-happens-when-you-send-pw_ordercreated)。

<Aside type="note" title="两次开始结账的购物者只有在您允许的情况下才会重新进入 journey">
默认情况下，Customer Journey 不允许已在其中的人重新进入，因此当同一购物者的第一个放弃购物车 journey 仍在运行时，来自该购物者的第二个 `checkouts/create` 会被忽略，而不是重新启动。如果您希望每次新的结账都重置其提醒计时，请在触发器上开启 **Allow re-entry**。请参阅[控制用户是否可以重新进入营销活动](/zh/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/#control-whether-users-can-re-enter-the-campaign)。
</Aside>

### 订单和结账事件的属性

`PW_OrderCreated` 和 `PW_AbandonedCart` 包含：

| 属性 | 描述 |
| ----- | ----- |
| `orderId` | 订单或结账的标识符 |
| `email` | 购物者的 email |
| `totalPrice` | 订单或购物车总额 |
| `shippingAmount` | 运费 |
| `taxAmount` | 税额 |
| `discountAmount` | 折扣金额 |
| `currency` | 货币代码 |
| `items` | 购物车的商品项 |
| `customerId` | 仅适用于已注册客户，访客结账时不存在 |
| `orderUrl` | `PW_OrderCreated` 的订单状态页面，或 `PW_AbandonedCart` 和 `PW_AbandonedCartUpdate` 的放弃结账恢复 URL。可用它来构建「完成购买」链接或按钮。 |
| `createdDate` | 订单或结账的创建时间 |
| `abandonedDate` | 仅适用于 `PW_AbandonedCart` 和 `PW_AbandonedCartUpdate`。购物车最后一次被操作的时间，而非首次创建的时间 |

<Aside type="caution" title="正确设置金额和日期属性类型">
Pushwoosh 会根据它看到的第一个事件推断每个属性的类型，而这种推断对于诸如 `totalPrice`、`shippingAmount`、`taxAmount`、`discountAmount` 以及上面的 `createdDate`/`abandonedDate` 等金额和日期字段来说并不可靠。像 `129` 这样的整数价格会被推断为整数类型，这会在后续每个事件中将 `129.90` 截断为 `129`。

**还未连接应用？** 在连接之前，使用[在您的 Control Panel 中创建事件](/zh/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/#create-the-events-in-your-control-panel)中的表格，以正确的类型声明 `PW_AbandonedCart` 和 `PW_OrderCreated`。跳过该指南中的 **Send the events from your backend** 步骤。Shopify 集成已经为您发送这些事件。

**已经连接？** 现在检查类型：在 Control Panel 中前往 **Audience → Events**，打开 `PW_AbandonedCart` 和 `PW_OrderCreated`，并将每个属性与同一表格进行比较。在那里修正错误的类型会从今以后予以纠正，但任何已经以错误类型发送的值都将永久丢失。
</Aside>

访客结账仍然可以发送订单和购物车事件，但事件中不会带有已注册的客户 ID。

`PW_AbandonedCartUpdate` 携带相同的属性。如果您的账户还连接了 [Magento](/zh/product/integrations/magento-integration/) 集成，其订单和放弃的购物车会发布到相同的事件名称，因此基于 `PW_OrderCreated` / `PW_AbandonedCart` 构建的细分或 journey 会同时捕获两个店铺，上述属性类型也同样适用于两者。Magento 没有与 `PW_AbandonedCartUpdate` 对应的事件，因为它不跟踪正在进行中的结账编辑。

特别是 `items`，从 Shopify 到达时只填充了少数几个字段。

<Aside type="note" title="购物车商品会从您的产品目录中得到丰富">
Shopify 在 `PW_AbandonedCart` 和 `PW_AbandonedCartUpdate` 上发送的 `items` 只携带 `productId`、`name`、`sku`、`quantity` 和 `price`。每当 `productId` 匹配时，Pushwoosh 会从您已连接的[产品目录](/zh/product/content/product-catalog/)中匹配的产品补全该商品仍然缺失的其他内容，例如 `description`、`imageUrl`、`productUrl`、`category` 及其他目录字段（参阅[自动产品目录连接](/zh/product/integrations/shopify/#connect-your-pushwoosh-app)）。为此无需额外发送任何内容。目录中缺失的产品只会继续显示 Shopify 发送的那些字段。
</Aside>

## 店面浏览事件

将这些用于浏览放弃细分或 journey，以及需要产品浏览数据的 email 推荐策略（例如 **Based on what they viewed**）。请参阅[如何在 email 中设置产品推荐](/zh/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-product-recommendations-in-email/)。

<Aside type="caution" title="需要开启 Push Init Embed">
在[第四部分](/zh/product/integrations/shopify/#part-4-enable-web-push-and-storefront-browsing-events)中将 **Push Init Embed** 设置为**开启**。与 web push 使用的是同一个主题嵌入代码。无需在主题中添加其他任何内容。

如果嵌入代码关闭，或购物者阻止了其脚本，您只会丢失产品浏览和加入购物车数据。`PW_OrderCreated` 和 `PW_AbandonedCart` 仍会从 Shopify 到达。
</Aside>

两个事件都由同一个主题嵌入代码收集。一旦 **Push Init Embed** 开启，无需在主题中添加其他任何内容：

* `PW_ProductViewed`：购物者打开一个产品页面。
* `PW_AddToCart`：购物者在不重新加载页面的情况下将商品加入购物车，这是大多数 Shopify 主题的做法。

<Aside type="note" title="在基于这些事件构建之前需要检查的两件事">
* `PW_ProductViewed` 会计算每一次页面加载，不做任何过滤。重新加载、同一次访问中的重复浏览，甚至机器人流量，都会与真实的产品浏览一样被计入。基于此事件构建的推荐策略也会继承这种噪声。
* 只有当您店铺的 **Add to cart** 按钮不会重新加载页面时，`PW_AddToCart` 才会触发。请自行测试：在您的店铺中点击 **Add to cart** 并观察发生了什么。是只有购物车计数器更新，还是整个页面都刷新了？大多数 Shopify 主题采用前者，在不重新加载的情况下更新计数器（向 `/cart/add` 发送后台请求）。如果您的主题改为重新加载页面，`PW_AddToCart` 将永远不会触发，但 `PW_ProductViewed` 以及订单/结账事件无论如何都能正常工作。
</Aside>

### 店面浏览事件的属性

两个事件都包含：

| 属性 | 描述 |
| ----- | ----- |
| `items` | 被浏览或添加的产品，每个都带有 `productId`、`name`、`sku`、`quantity`、`price` |
| `totalPrice` | `items` 的合计价格 |
| `productUrl` | 购物者所在的页面 |
| `currency` | 仅当店面提供该信息时才有 |

显示 `totalPrice` 的消息需要在 `currency` 缺失时有一个后备方案，因为数字本身并不能说明它是哪种货币。

这两个事件都不携带 `email` 或 `customerId` 作为属性。购物者的识别方式与主题嵌入代码其余部分相同——通过绑定到元字段 User ID 的 SDK 会话（参阅[第二部分](/zh/product/integrations/shopify/#part-2-setup-customer-user-id-via-metafields)），而不是通过事件负载。

`PW_ProductViewed` 和 `PW_AddToCart` 的 `items` 携带的字段与 Shopify 在丰富化之前发送的字段相同：`productId`、`name`、`sku`、`quantity`、`price`。与 `PW_AbandonedCart` 的 `items`（参阅上文的[购物车商品会从您的产品目录中得到丰富](#order-paid-and-checkout-events)）不同，Pushwoosh 不会为这两个事件补全其余的目录字段。

需要完整产品详情的推荐策略，例如 **Based on what they viewed**，会在消息渲染时通过 `productId` 从您的[产品目录](/zh/product/content/product-catalog/)中查找这些详情。请参阅[如何在 email 中设置产品推荐](/zh/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-product-recommendations-in-email/)，了解每种策略所需的内容。

## 结账步骤事件

将这些用于查看人们在购买前于哪个环节流失，并向已开始结账但未完成付费订单的人发送消息。

<Aside type="caution" title="需要与 pixel 相关的应用权限">
批准 Shopify 在连接应用时请求的结账跟踪权限（`write_pixels` 和 `read_customer_events`）。该步骤请参阅[第一部分](/zh/product/integrations/shopify/#part-1-installation)。无需设置主题嵌入代码。一旦这些权限获得批准，Shopify 会自动报告这些里程碑事件（技术上是通过 Shopify 的 [Web Pixel](https://shopify.dev/docs/api/web-pixels-api)）。
</Aside>

* `PW_CheckoutContactInfo`：购物者输入了联系信息。
* `PW_PaymentInfoSubmitted`：购物者提交了支付信息。

完成的销售是上文中的 `PW_OrderCreated`，而不是这两个事件。

`PW_AbandonedCart` 只能告诉您结账已经开始。这两个事件按顺序标记同一结账中稍后的两个节点：先是联系信息，然后是支付信息。到达 `PW_PaymentInfoSubmitted` 但从未获得后续 `PW_OrderCreated` 的购物者，比只触发了 `PW_AbandonedCart` 的购物者走得更远，因此基于这一阶段构建的消息可以专门针对停滞的支付进行处理，而不是发送通用的购物车提醒。

### 结账步骤事件的属性

两个事件都包含：

| 属性 | 描述 |
| ----- | ----- |
| `items` | 结账的商品项，每个都带有 `productId`、`name`、`sku`、`quantity`、`price` |
| `orderId` | 结账 token，一旦结账拥有 Shopify 订单 ID，则为该 ID |
| `totalPrice` | 结账总额 |
| `email` | 仅当结账拥有该信息时才有。基于电话的结账（未输入 email）发送事件时不带该字段。 |
| `currency` | 仅当结账拥有该信息时才有 |

## 检查是否正常工作

在店铺中执行相应的操作，然后确认该事件名称出现在 Pushwoosh 中。事件本身是实时处理的，但您可以检查的两个位置对 Pushwoosh 尚未见过的名称反应不同：

* 在[按事件创建细分](/zh/product/audience-data-and-segmentation/segmentation/create-segments/by-events/)时的 **Event** 下拉菜单中，新名称会立即出现。
* 在添加 [Customer Journey](/zh/product/customer-journey/pushwoosh-journey-overview/) 触发器时的 **Event** 下拉菜单中，新名称最多可能需要 10 分钟才会出现（该下拉菜单有缓存）。如果您还未看到它，请耐心等待，而不要认为集成出了问题。

| 测试操作 | 事件 |
| ----- | ----- |
| 支付一个测试订单 | `PW_OrderCreated` |
| 开始一次结账 | `PW_AbandonedCart` |
| 在该结账中更改商品 | `PW_AbandonedCartUpdate` |
| 打开一个产品页面（**Push Init Embed** 开启） | `PW_ProductViewed` |
| 将商品加入购物车 | `PW_AddToCart` |
| 在结账时输入联系信息 | `PW_CheckoutContactInfo` |
| 在结账时提交支付信息 | `PW_PaymentInfoSubmitted` |

## 使用这些事件

在您知道需要哪个事件后，可在两个地方使用它：

* 作为触发器或细分条件：在[按事件创建细分](/zh/product/audience-data-and-segmentation/segmentation/create-segments/by-events/)或添加 [Customer Journey](/zh/product/customer-journey/pushwoosh-journey-overview/) 触发器时，在 **Event** 下拉菜单中选择它。
* 在消息文本中：在消息步骤中开启 **Personalize message with event attributes** 并选择属性（例如来自 `PW_OrderCreated` 的订单总额）。您也可以使用 Liquid 占位符插入该属性。请参阅 [journey 中的动态内容和 Liquid 模板](/zh/product/customer-journey/journey-elements/dynamic-content-and-liquid-templates-in-journeys/)。

对于已支付的订单，您还可以将 `PW_OrderCreated` 映射为[转化事件](/zh/product/audience-data-and-segmentation/events/conversion-events/)，以便 Shopify 的购买行为纳入 RFM 细分、journey 归因以及 [Product 模块统计数据](/zh/product/statistics-and-analytics/messaging-statistics/email-statistics/)。

### 营销活动示例

每种活动都在购物者路径的不同节点触发，因此覆盖不同的受众：某人在流失前走了多远，或是否到达了结账环节，决定了哪种活动适用。

* **放弃购物车提醒。** 捕获所有开始结账的购物者，无论他们走了多远——这是这里覆盖面最广的受众。将其构建为 Customer Journey：以 `PW_AbandonedCart` 触发，等待 `PW_OrderCreated`，然后向尚未付款的人发送带有 [Cart 来源](/zh/product/content/email-content/drag-and-drop-email-editor/blocks/#show-items-from-the-cart) 模块的 email。完整设置请参阅[如何设置放弃购物车营销活动](/zh/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-an-abandoned-cart-campaign/)。
* **停滞结账的跟进消息。** 仅捕获输入了联系信息但从未付款的购物者，这是上述受众中更窄的一部分。按 `PW_CheckoutContactInfo` 建立细分，然后排除同时拥有 `PW_PaymentInfoSubmitted` 或 `PW_OrderCreated` 的人。
* **停滞支付的挽回消息。** 捕获到达支付环节但从未完成订单的购物者，比上述跟进消息走得更远，且与其互斥。按 `PW_PaymentInfoSubmitted` 建立细分，然后排除同时拥有 `PW_OrderCreated` 的人。
* **浏览推荐邮件。** 捕获浏览过产品但从未开始结账的购物者，这与上述提醒的受众不同。将 `PW_ProductViewed` 与 Products 模块的 **Based on what they viewed** 策略配合使用。请参阅[如何在 email 中设置产品推荐](/zh/tutorials/product-guides/email-marketing-campaigns/how-to-set-up-product-recommendations-in-email/)。