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

# 构建策略

> 在 Aftersell 控制台中创建、配置和管理策略（Strategies）— 无需编写代码。

<div id="overview">
  ## 概览
</div>

Aftersell 控制台提供了一个可视化界面，用于构建和管理策略（Strategies）。你可以创建策略、通过触发条件定义定向规则、指定要推荐的产品，以及配置 catch all 行为 — 全程无需编写任何代码。

本指南将带你完整了解在界面中创建策略的端到端流程。

***

<div id="navigating-to-strategies">
  ## 进入 Strategies
</div>

1. 登录 Aftersell。
2. 点击左侧边栏导航中的 **Strategies**。
3. 你会看到现有策略的列表，或者一个提示你创建第一个策略的空状态页面。

***

<div id="creating-a-new-strategy">
  ## 创建新策略
</div>

1. 点击 **Add Strategy**。
2. 你会进入策略编辑器，在这里可以添加规则。

<Tip>
  点击策略编辑器左上角的**铅笔图标**，为你的策略取一个描述性的名称。清晰的名称能让你之后在控制台中更容易识别各个策略。
</Tip>

***

<div id="adding-rules">
  ## 添加规则
</div>

每个策略包含一条或多条**规则**。一条规则由以下部分组成：

* **触发条件（Triggers）** — 即"何时"— 规则匹配所需满足的条件。
* **动作（Actions）** — 即"然后"— 规则匹配时返回的体验。

<div id="defining-triggers">
  ### 定义触发条件
</div>

触发条件决定规则何时生效。你可以在单条规则中组合最多五个触发条件。一个 **AND** / **OR** 切换开关作用于整个条件集：使用 **AND** 时，所有触发条件都必须匹配；使用 **OR** 时，任意一个触发条件匹配即可。可用的触发条件类型包括：

<div id="product-triggers">
  #### 产品触发条件
</div>

基于上下文中的产品（购物者的购物车、刚完成的订单或正在浏览的产品）进行定向：

* **Specific product(s)** — 按 ID 匹配特定的 Shopify 产品
* **Collection** — 匹配属于特定系列的产品
* **Tag(s)** — 匹配带有特定标签的产品（例如 "sale"、"summer"）
* **Title** — 匹配产品标题
* **Vendor** — 匹配供应商/品牌名称
* **Type** — 匹配产品类型字段（例如 "Apparel"、"Electronics"）
* **Handle** — 匹配产品 URL slug
* **Metafield** — 按自定义元字段的命名空间/键/值组合进行匹配
* **Selling plan** — 匹配"订阅"或"一次性购买"产品。仅当请求上下文为产品提供了销售计划时才会被评估 — Aftersell 的 checkout 和购后 upsell 场景不会发送此信息，因此除非自定义集成明确提供，否则该触发条件在这些场景中不会匹配

<div id="customer-triggers">
  #### 客户触发条件
</div>

基于购物者的身份进行定向：

* **Customer tag** — 例如 "VIP"、"loyalty-gold"
* **Country code** — 账单国家/地区
* **Province code** — 账单省份/州
* **Locale** — 客户区域设置（例如 "en-US"）
* **Accepts marketing** — 营销订阅状态
* **Order count** — 历史订单数量
* **Total spent** — 累计消费金额

<div id="cart-triggers">
  #### 购物车触发条件
</div>

基于购物车的整体状态进行定向：

* **Cart subtotal** — 例如小计大于 \$50
* **Item count** — 购物车中商品的总数量
* **Line count** — 不同商品行的数量
* **Cart attribute** — 通过 Shopify 购物车 API 设置的自定义购物车属性
* **Cart note** — 购物车备注字段

<div id="location-triggers">
  #### 位置触发条件
</div>

基于购物者的收货地点和商店货币进行定向：

* **Shipping country** — 收货目的地国家/地区
* **Shipping province** — 收货目的地省份/州
* **Shipping method** — 所选配送方式
* **Store currency** — 当前商店的货币代码

<div id="marketing-triggers">
  #### 营销触发条件
</div>

基于购物者到达时的页面 URL 进行定向：

* **URL** — 匹配着陆 URL 的子字符串，因此你可以通过匹配嵌入在 URL 中的参数（例如 `utm_source=newsletter`）来定向特定的营销活动或渠道

<div id="time-triggers">
  #### 时间触发条件
</div>

基于请求被评估的时间（按商店时间）进行定向：

* **Day of week** — 当前星期几
* **Hour of day** — 当前小时

<div id="dynamic-triggers">
  #### 动态触发条件
</div>

* **Always match** — 一个没有条件、始终生效的触发条件。使用它可以让规则在每个请求上运行（这与策略级别的 [Catch all](#configuring-a-catch-all) 不同，后者仅在没有其他规则匹配时才生效）。

<Note>
  并非每个触发条件在每个场景中都有数据。例如，checkout 只发送产品和购物车上下文 — 客户、位置和营销触发条件在该场景中不会匹配。有关每个场景发送哪些数据，请参阅[实现策略](/zh/aftersell/implementing_strategies_post_purchase_upsells)指南。
</Note>

<div id="operators">
  #### 运算符
</div>

每个触发条件使用一个**运算符**来定义值的匹配方式。可用的运算符取决于触发条件的类型。

| 运算符                          | 说明                                                     |
| ---------------------------- | ------------------------------------------------------ |
| **Equals**                   | 当字段与你指定的值完全相同时匹配 — 例如 vendor 等于 "Nike"。                |
| **Does not equal**           | 当字段是你指定值以外的任何值时匹配 — 适合用来排除特定的产品类型或供应商。                 |
| **Contains any**             | 当多值字段包含你列表中的至少一个值时匹配 — 例如产品属于多个系列中的任意一个。               |
| **Does not contain any**     | 当多值字段不包含你列表中的任何值时匹配 — 例如排除带有 "final-sale" 标签的产品。       |
| **Contains all**             | 当多值字段包含你列表中的每一个值时匹配 — 例如产品必须同时带有 "sale" 和 "summer" 标签。 |
| **Does not contain all**     | 当多值字段至少缺少你列表中的一个值时匹配。                                  |
| **Contains**                 | 当文本字段包含你的值作为子字符串时匹配 — 例如标题包含 "Gift"。                   |
| **Does not contain**         | 当文本字段不包含你的值时匹配。                                        |
| **Greater than**             | 当数值字段超过你的值时匹配 — 例如购物车小计大于 \$75。                        |
| **Less than**                | 当数值字段低于你的值时匹配 — 例如订单数量小于 2（首次购买者）。                     |
| **Greater than or equal to** | 当数值字段达到或超过你的值时匹配 — 例如累计消费至少 \$500。                     |
| **Less than or equal to**    | 当数值字段等于或低于你的值时匹配 — 例如购物车商品数量不超过 3。                     |

并非每个运算符都适用于每个触发条件：

* **列表运算符**（**Contains any / all** 及其否定形式）适用于多值字段，如标签、系列、客户标签和特定产品。
* **文本运算符**（**Equals**、**Contains** 及其否定形式）适用于单值文本字段，如标题、供应商、handle、区域设置、国家/地区和 URL。
* **数值运算符**适用于购物车小计、商品数量、商品行数、订单数量、累计消费和当前小时等字段。数值运算符没有"否定"变体。
* 少数字段仅支持 **Equals** 和 **Does not equal** — selling plan、day of week 和 accepts marketing。

<div id="defining-actions">
  ### 定义动作
</div>

动作用来创建你希望向客户呈现的体验。你可以在这里决定展示哪些产品、如何展示，以及随之传递的任何附加数据。一条规则可以配置多个动作，共同构建完整的体验。

在每条规则中，所有配置的动作会汇入同一个组合产品池。例如，一条规则同时包含特定产品动作、系列动作和基于标签的动作时，会一起返回来自这三个来源的产品。如果某个产品匹配多个来源，则会被去重。

<div id="product-actions">
  #### 产品动作
</div>

触发条件端可用的产品属性在定义动作时同样可用。你可以基于以下方式返回产品：

* **Specific products** — 从你的 Shopify 目录中手动挑选单个产品。
* **Collection** — 返回属于特定系列的所有产品。
* **Product attributes** — 返回符合标签、供应商、产品类型或元字段等条件的产品 — 与触发条件中使用的属性类型相同。

<div id="dynamic-actions">
  #### 动态动作
</div>

动态动作根据实时信号而非固定产品列表来改变返回内容。可用的动态动作类型包括：

* **Most popular** — 按销量计算的商店最畅销产品，可以是全店范围，也可以限定在某个系列内。
* **Recently purchased** — 全店近期被购买的产品。
* **Inherit from when** — 复用规则自身的触发条件（即"何时"）作为产品选择器，使返回的产品符合触发该规则的相同条件。
* **AI Recommendations** — 由 Aftersell 推荐模型生成的个性化建议。

<div id="filtering-actions">
  #### 筛选动作
</div>

产品池组装完成后，你可以配置返回多少个产品以及排序方式：

* **Sort** — 控制选取哪些产品：
  * **Random** — 随机选取。
  * **Price: high → low** — 优先返回价格最高的产品。
  * **Price: low → high** — 优先返回价格最低的产品。
* **Amount/Limit** — 设置返回产品的最大数量。

<Info>
  先应用 Sort，再应用 Amount/Limit。例如，如果你的排序设置为 **Random**，系统会先将整个产品池随机打乱，然后再应用数量限制 — 因此你得到的始终是随机的一部分产品，而不是同一批产品的随机排序。
</Info>

<div id="key-value-actions">
  #### 键值动作
</div>

你还可以选择为规则附加键值对。当规则匹配时，这些键值对会随产品结果一起在 API 响应的 `meta.data` 中返回。常见用途包括：

* 促销横幅文案
* 用于分析的营销活动标签

<Note>
  如果多条规则同时匹配并发出相同的键，则以第一条匹配规则的值为准 — 后续规则无法覆盖它。
</Note>

***

<div id="rule-priority-and-evaluation-order">
  ## 规则优先级与评估顺序
</div>

策略中的规则按层级顺序依次评估。第 1 步最先评估，依此类推。你可以在策略编辑器中通过拖放来重新排列规则。评估引擎会：

1. 根据提供的上下文评估每条规则的触发条件。
2. 收集所有匹配规则的产品。
3. 去重并将结果限制在配置的最大数量内（默认：20 个产品）。

***

<div id="configuring-a-catch-all">
  ## 配置 Catch all
</div>

Catch all 是一条特殊规则，作为每次策略评估的最后一步。它没有触发条件，当策略中没有其他规则匹配当前请求时会自动生效。

启用后，Catch all 可确保你的推荐位永远不会为空。它的动作可以使用与常规规则相同的任何动作类型进行配置 — 特定产品、系列、动态动作等。

* **启用/禁用** — 为该策略打开或关闭 Catch all 规则。禁用后，没有匹配任何规则的请求将返回空结果。
* **配置动作** — 使用任意可用动作类型的组合来定义返回内容，与其他规则相同。

当 Catch all 生效时，API 响应中会显示 `resolution.fallbackUsed: true`。

***

<div id="global-filters">
  ## 全局筛选器
</div>

全局筛选器会在策略的每条规则中将产品从可选范围中移除。你可以通过策略编辑器左上角策略名称旁边的**筛选器图标**访问它们。

可用的全局筛选器：

* **Exclude out of stock** — 自动排除当前不可购买的任何产品。
* **Exclude input products** — 排除触发规则的产品（例如购物者当前正在 PDP 上浏览的产品），确保你永远不会推荐购物者正在查看的同一产品。
* **Exclude by product tag** — 排除带有特定标签的产品。
* **Exclude by metafield** — 排除匹配特定元字段命名空间/键/值的产品。
* **Exclude by product ID** — 按 ID 排除特定产品。
* **Require stock at location** — 仅保留在所选地点有可用库存的产品（需要库存和地点的读取权限）。

***

<div id="validation-and-error-states">
  ## 验证与错误状态
</div>

如果任何规则不完整，策略将无法保存。每条规则至少需要一个条件（或 **Always match** 触发条件）和至少一个动作；缺少任何一项时，错误会直接显示在相应规则上，标明需要解决的问题。

要清除错误并保存策略，可以：

* **补全规则** — 添加缺少的触发条件和/或动作。
* **删除规则** — 如果不再需要，将其完全移除。

在所有规则均有效之前，策略编辑器不允许保存。
