mcpField
P
price-rules-engine

price-rules-engine

github.com/finsilabs营销与增长6082 次安装6 天前更新
代码仓库

关于 price-rules-engine

price-rules-engine 是面向电商促销设计与实施的技能,帮助团队按优先级、适用范围和叠加规则管理折扣。内容覆盖 Shopify、WooCommerce、BigCommerce 及自定义无头店铺,并强调排除项、审计记录与规则测试。

主要功能

  1. 01配置折扣优先级与叠加规则
  2. 02按商品、客群和日期设定条件
  3. 03为自定义店铺设计规则评估器
  4. 04测试规则并记录折扣应用
  5. 05管理规则版本与商品排除项

适用场景

  1. 01多个促销同时生效时控制折扣顺序
  2. 02营销人员创建客群专属优惠
  3. 03从硬编码促销逻辑迁移到规则系统
  4. 04核查订单中实际应用的折扣

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill price-rules-engine

安装后在 Claude Code 中输入/price-rules-engine确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

tile.json
evals/order-persistence-and-rule-versioning/
criteria.json
task.md
evals/priority-stacking-evaluation/
criteria.json
task.md
evals/rule-schema-and-eligibility-filtering/
criteria.json
task.md

详细介绍

价格规则引擎

概述

价格规则引擎可让你定义多个并行促销活动——全站促销、优惠码、忠诚度折扣——并以可预测、可控的顺序将其应用于购物车。关键问题包括:哪些规则适用于哪些商品、哪些规则可以与其他规则叠加,以及多个规则针对同一商品时会发生什么。所有主流平台都内置了某种形式的此类功能;通常缺少的是高级叠加控制和客户细分定位。

何时使用此技能

  • 当你有多个并行促销活动(全站促销 + 优惠码 + 忠诚度折扣),并且需要确定性的叠加行为时
  • 当营销团队需要创建复杂促销活动(例如“所有鞋款打 8 折,Nike 除外,仅限 Gold 忠诚度会员”),且不想依赖工程团队时
  • 当你要从散布在代码库中的硬编码促销逻辑迁移到数据驱动的规则系统时
  • 当你要构建促销计划程序,在配置的时间启用和停用规则时
  • 当你需要审计日志,准确显示应用了哪些规则及其原因,以便客服查询时

核心说明

步骤 1:确定商家的平台并选择合适的工具
平台内置功能何时扩展
Shopify折扣管理后台通过“组合”设置处理基本的叠加使用 Bold Discounts 或 Shopify Scripts(Plus)实现高级规则叠加、客户细分定位和条件逻辑
WooCommerce核心优惠券功能 + Dynamic Pricing 插件提供条件规则对于复杂的优先级排序和细分定位:YITH WooCommerce Dynamic Pricing & Discounts 提供了最全面的控制能力
BigCommerce促销引擎支持多个并行促销活动,并提供优先级排序和叠加规则BigCommerce 内置系统可原生处理大多数场景
自定义 / 无头必须自行构建以上方案都不符合使用场景时需要
步骤 2:在平台上配置可叠加的价格规则

Shopify

Shopify 通过每项折扣中的组合设置管理折扣叠加。

设置叠加规则:

  1. 前往折扣 → 创建或编辑折扣
  2. 滚动到组合部分
  3. 切换设置,选择此折扣可以与哪些类型组合:
    • 商品折扣 — 此折扣能否与其他商品级折扣叠加?
    • 订单折扣 — 此折扣能否与订单级折扣叠加?
    • 运费折扣 — 此折扣能否与免运费折扣叠加?
  4. 对于自动折扣,默认优先采用价值最高的自动折扣;使用“组合”设置允许叠加

客户细分定位:

  1. 在客户资格下,选择特定客户细分
  2. 选择在客户 → 细分中创建的细分(例如“VIP 客户”“首次购买者”)

优先级和排除项:

  • 设置开始和结束日期,以控制哪些规则处于启用状态
  • 在商品下,设置折扣适用的商品或系列
  • 添加排除项:“排除促销商品”或指定要排除的商品

Shopify Plus — Shopify Scripts: 对于无法通过折扣界面表达的规则(例如,只有当购物车金额超过门槛时才应用第二项折扣的分级叠加规则):

  1. 前往应用 → Script Editor(Scripts 是 Shopify Plus 的独立功能)
  2. 创建行项目脚本或配送脚本
  3. 脚本在结账时运行,可应用复杂的条件折扣;其优先级高于其他折扣

Bold Discounts(应用商店,约 20 美元/月): 适用于 Shopify 的可视化规则构建器,支持:

  • 按促销活动设置叠加 / 不叠加
  • 对促销活动进行优先级排序
  • 复杂条件(客户标签、系列成员身份、数量门槛)

WooCommerce

WooCommerce 优惠券支持基本的单规则折扣。若要使用具备优先级排序和叠加控制功能的完整价格规则引擎,请使用 Dynamic Pricing 插件。

安装和配置 YITH WooCommerce Dynamic Pricing & Discounts:

  1. 从 YITH.com 安装插件(约 $70/年)
  2. 前往 YITH → Dynamic Pricing → Pricing Rules
  3. 创建规则并进行配置:
    • 类型:购物车、商品或类别定价
    • 折扣:百分比或固定金额
    • 条件:购物车小计、数量、客户角色、日期范围
    • 商品/类别:规则适用的商品;设置排除项
    • 优先级:数字越小,优先级越高(越先应用)
    • 叠加:选择“停止其他规则”,以防止叠加优先级较低的规则

在 WooCommerce 中定位客户细分群体:

  1. 使用 WooCommerce 客户角色(可通过 User Role Editor 或 WooCommerce B2B 等插件获得):
    • 为客户分配“批发”“VIP”“贸易”等角色
  2. 在 Dynamic Pricing 规则中,将每条规则限制为特定客户角色
  3. 具有该角色的客户会看到折后价;其他客户则看到原价

示例:仅限 VIP 享受服饰 8 折,不包括清仓商品:

  1. 创建规则:类型 = 类别定价,类别 = Apparel
  2. 折扣 = 8 折
  3. 客户角色 = VIP
  4. 排除商品:[清仓商品 ID 列表]
  5. 优先级 = 10

BigCommerce

BigCommerce 的 Promotions 引擎原生支持优先级排序和叠加控制。

  1. 前往 Marketing → Promotions → Create Promotion
  2. 在 Conditions 下:
    • 设置购物车金额、数量或商品条件
    • 在 Customer groups 下:限制为特定群组(批发、VIP 等)
  3. 在 Actions 下:设置折扣类型和金额
  4. 如适用,设置 Shipping 条件
  5. 在 Rules 下:
    • Can be combined with other promotions:是/否
    • Priority:数字越小,执行越早
  6. 设置 Active date range

BigCommerce 会按优先级评估促销,并遵循“能否组合”的设置。多个不可组合的促销中,只会应用对客户最优惠的一项。


自定义 / 无头架构

对于自定义店面,请实现一个规则评估器,按优先级顺序处理规则、强制执行叠加限制,并将规则应用于符合条件的购物车商品行:

interface PriceRule {
  id: string;
  name: string;
  type: 'percentage_off' | 'fixed_off' | 'free_shipping' | 'buy_x_get_y';
  value: number;            // percentage or cents
  priority: number;         // higher = applied first
  isStackable: boolean;
  couponCode?: string;      // null = automatic (no code required)
  minCartCents?: number;
  customerSegments?: string[];
  applicableProducts?: string[];
  applicableCategories?: string[];
  excludedProducts?: string[];
  startsAt: Date;
  endsAt?: Date;
}

interface CartContext {
  lines: { lineId: string; productId: string; categoryIds: string[]; quantity: number; currentPriceCents: number }[];
  subtotalCents: number;
  customerSegments: string[];
  appliedCouponCode?: string;
}

function evaluateRules(cart: CartContext, rules: PriceRule[]): { ruleId: string; discountCents: number }[] {
  const now = new Date();
  const active = rules.filter(r =>
    r.startsAt <= now && (!r.endsAt || r.endsAt > now)
  ).sort((a, b) => b.priority - a.priority); // highest priority first

  const applications: { ruleId: string; discountCents: number }[] = [];
  let nonStackableApplied = false;

  for (const rule of active) {
    if (!rule.isStackable && nonStackableApplied) continue;

    // Coupon-linked rules require the code to be applied
    if (rule.couponCode && rule.couponCode !== cart.appliedCouponCode) continue;

    // Cart minimum check
    if (rule.minCartCents && cart.subtotalCents < rule.minCartCents) continue;

    // Customer segment check
    if (rule.customerSegments?.length && !rule.customerSegments.some(s => cart.customerSegments.includes(s))) continue;

    // Find eligible lines
    const eligibleLines = cart.lines.filter(line => {
      if (rule.excludedProducts?.includes(line.productId)) return false;
      if (rule.applicableProducts?.length) return rule.applicableProducts.includes(line.productId);
      if (rule.applicableCategories?.length) return rule.applicableCategories.some(c => line.categoryIds.includes(c));
      return true; // no scope restriction = all products
    });
    if (eligibleLines.length === 0) continue;

    let discountCents = 0;
    if (rule.type === 'percentage_off') {
      discountCents = Math.round(
        eligibleLines.reduce((s, l) => s + l.currentPriceCents * l.quantity, 0) * rule.value / 100
      );
    } else if (rule.type === 'fixed_off') {
      discountCents = Math.min(rule.value, cart.subtotalCents);
    }

    if (discountCents > 0) {
      applications.push({ ruleId: rule.id, discountCents });
      if (!rule.isStackable) nonStackableApplied = true;
    }
  }

  return applications;
}

请将规则应用情况与每笔订单一同持久化,以便回答客户服务问题(“应用了哪项折扣?”)并跟踪促销投资回报率。

最佳实践

  • 优先级越高,越先评估 — 使用明确的 priority 整数,让营销团队无需更改代码即可控制评估顺序
  • 将可叠加规则与互斥规则分开 — 一旦应用了不可叠加规则,就跳过后续所有不可叠加规则;可叠加规则始终叠加应用
  • 激活前以“dry run”模式测试规则 — 在促销上线前,检查样例购物车的折扣计算结果
  • 充分使用排除列表 — 始终允许营销团队指定排除商品/类别;意外应用于高端商品或已降价商品会造成利润问题
  • 创建规则新版本,而非编辑生效中的规则 — 停用旧规则并创建新版本;这样可以保留历史订单的计算记录
  • 记录每笔订单应用了哪些规则 — 将规则 ID 和折扣金额存储在订单中,供客户服务和投资回报率分析使用

常见陷阱

问题解决方案
两条不可叠加的规则同时适用按优先级排序,先应用优先级最高的不可叠加规则,然后跳过所有其他不可叠加规则
某条规则适用于被排除的商品始终先检查排除项,再检查包含项;任何情况下,排除项都优先
总折扣导致订单金额变为负数将总折扣上限设为购物车小计;订单总额不应低于零
营销人员在活动期间修改了生效中的规则将生效中的规则视为不可变——创建新规则并停用旧规则;切勿修改生效中的规则
规则的启用或停用时间与计划相差几秒谨慎设置开始和结束时间(比预定时间提前或延后几分钟),并在预发布环境中验证;对于关键时间安排,请使用 Launchpad(Shopify Plus)或计划任务

相关技能

  • @coupon-management
  • @discount-engine
  • @dynamic-pricing
  • @ab-testing-pricing
  • @volume-pricing

评论

支持 Markdown