> ## 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.

# 策略规则参考

> 应用内策略编辑器背后完整的策略触发条件、运算符、动作、筛选器和评估机制目录。

本页是策略编辑器背后的完整目录：每个触发条件及其接受的运算符、每个动作、全局筛选器，以及策略的评估方式。它是[构建策略](/zh/aftersell/strategies_building_in_app)演练的配套页面——当你需要某个特定选项的详尽细节时可以查阅。

一条**规则**将**触发条件**（*何时*）与**动作**（*然后*）配对，你可以在一个 **AND** / **OR** 开关下组合最多五个触发条件：选择 **AND** 时每个触发条件都必须匹配，选择 **OR** 时任意一个匹配即可。下面的各部分遵循这一结构——先介绍[触发条件](#triggers)和[动作](#actions)，然后介绍适用于所有规则的策略级控制：[规则顺序](#rule-priority-and-evaluation-order)、[全局筛选器](#global-filters)和 [Catch all](#catch-all)。

<div id="triggers">
  ## 触发条件
</div>

触发条件决定规则何时触发。可用的触发条件类型：

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

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

* **Specific product(s)** - 按 ID 匹配特定的 Shopify 产品
* **Collection** - 匹配属于特定系列的产品
* **Tag(s)** - 匹配带有特定标签的产品（例如 "sale"、"summer"）
* **Title** - 匹配产品标题
* **Vendor** - 匹配供应商/品牌名称
* **Type** - 匹配产品类型字段（例如 "Apparel"、"Electronics"）
* **Handle** - 匹配产品 URL 别名
* **Metafield** - 匹配自定义元字段的 namespace/key/value 组合
* **Selling plan** - 匹配 "subscription" 或 "one-time" 产品。仅当请求上下文为该产品提供了销售计划时才会评估——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](#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。
* **数值运算符**适用于购物车小计、商品数量、行数、订单数量、累计消费和小时等字段。数值运算符没有 "does not" 变体。
* 少数字段仅支持 **Equals** 和 **Does not equal**——销售计划、星期几和营销订阅状态。

<div id="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** - 复用规则自身的触发条件（"when"）作为产品选择器，使返回的产品与规则触发时所依据的条件一致。
* **AI Recommendations** - 由 Aftersell 推荐模型生成的个性化建议。

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

产品池组装完成后，你可以配置返回多少产品以及按什么顺序返回：

* **Sort** - 控制选择哪些产品：
  * **Random** - 随机选择。
  * **Price: high → low** - 最贵的产品最先返回。
  * **Price: low → high** - 最便宜的产品最先返回。
* **Amount/Limit** - 设置返回产品的最大数量。
* **Type** - 将组装好的产品池缩小到单一 Shopify 产品类型。选择 **Equals** 进行精确匹配，或选择 **Contains** 进行子字符串匹配（两者都不区分大小写）。只保留产品类型与你输入的值匹配的产品；其余产品会在应用 Amount/Limit 之前被移除。

<Info>
  **Type** 筛选器会精简由你的产品动作组装出的产品池——它不同于 **Product type** 产品动作，后者会*返回*给定类型的产品。当你想限制更宽泛的动作（例如系列或动态动作）可以返回的内容时，请使用该筛选器。
</Info>

<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="global-filters">
  ## 全局筛选器
</div>

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

可用的全局筛选器：

* **Exclude out of stock** - 自动排除当前无法购买的任何产品。
* **Exclude input products** - 排除触发规则的产品（例如购物者当前在 PDP 上查看的产品），这样你就永远不会推荐购物者正在查看的同一产品。
* **Exclude by product tag** - 排除带有特定标签的产品。
* **Exclude by metafield** - 排除与特定元字段 namespace/key/value 匹配的产品。
* **Exclude by product ID** - 按 ID 排除特定产品。
* **Require stock at location** - 仅保留在所选位置有可用库存的产品（需要库存和位置读取权限）。

<div id="catch-all">
  ## Catch all
</div>

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

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

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

当 Catch all 触发时，API 响应会显示 `resolution.fallbackUsed: true`。
