price-rules-engine について
price-rules-engine は、優先順位、適用条件、併用ルールを定めて EC プロモーションを設計・実装するためのスキルです。Shopify、WooCommerce、BigCommerce と独自のヘッドレスストアを扱い、除外設定、監査記録、テストも説明します。
主な機能
- 01割引の優先順位と併用ルールの設定
- 02商品、顧客セグメント、期間の指定
- 03独自ストア向けルール評価の設計
- 04ルールのテストと適用割引の記録
- 05ルールの版管理と商品除外
活用シーン
- 01複数キャンペーンの割引順序を管理
- 02顧客セグメント別の特典を設定
- 03ハードコードされた販促をルール化
- 04注文に適用された割引を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill price-rules-engineインストール後、Claude Code で/price-rules-engineを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/order-persistence-and-rule-versioning/criteria.jsontask.mdevals/priority-stacking-evaluation/criteria.jsontask.mdevals/rule-schema-and-eligibility-filtering/criteria.jsontask.md詳細
価格ルールエンジン
概要
価格ルールエンジンを使うと、サイト全体のセール、クーポンコード、ロイヤルティ割引など、複数のプロモーションを同時に定義し、予測可能で制御された順序でカートに適用できます。主な検討事項は、どのルールをどの商品に適用するか、どのルールをほかのルールと併用できるか、複数のルールが同じ商品を対象とする場合にどう処理するかです。主要なプラットフォームにはいずれも何らかの形でこの機能が組み込まれていますが、高度な併用制御や顧客セグメントのターゲティングには対応できないことがよくあります。
このスキルを使う場面
- サイト全体のセール、クーポン、ロイヤルティ割引など、複数のプロモーションを同時に実施しており、決定的な併用動作が必要な場合
- マーケティング担当者が、エンジニアの関与なしに「Nike を除くすべての靴を 20%割引。ゴールド会員が対象」のような複雑なプロモーションを作成する必要がある場合
- コードベース内に散在するハードコードされたプロモーションロジックから、データ駆動型のルールシステムに移行する場合
- 設定した時刻にルールを有効化・無効化するプロモーションスケジューラーを構築する場合
- カスタマーサービスからの問い合わせに対し、どのルールが適用されたか、またその理由を正確に示す監査ログが必要な場合
コア手順
ステップ 1:マーチャントのプラットフォームを特定し、適切なツールを選択する
| プラットフォーム | 標準機能 | 拡張が必要な場合 |
|---|---|---|
| Shopify | ディスカウント管理画面の「組み合わせ」設定で基本的な併用に対応 | 高度なルール併用、顧客セグメントのターゲティング、条件付きロジックには Bold Discounts または Shopify Scripts(Plus)を使用します |
| WooCommerce | クーポンのコア機能と、条件付きルールに対応する Dynamic Pricing プラグイン | 複雑な優先順位付けやセグメントのターゲティングには、最も細かく制御できる YITH WooCommerce Dynamic Pricing & Discounts を使用します |
| BigCommerce | プロモーションエンジンが、優先順位付けと併用ルールを備えた複数同時プロモーションに対応 | BigCommerce の標準システムで、ほとんどのシナリオにネイティブ対応できます |
| カスタム/ヘッドレス | 構築が必要です | 上記のいずれもユースケースに適合しない場合に必要です |
ステップ 2:プラットフォームで併用ルールを含む価格ルールを設定する
Shopify
Shopify では、各ディスカウントの 組み合わせ 設定で割引の併用を管理します。
併用ルールの設定:
- ディスカウント に移動し、ディスカウントを作成または編集します
- 組み合わせ セクションまでスクロールします
- このディスカウントと併用できる種類を切り替えます:
- 商品ディスカウント — 商品単位のほかのディスカウントと併用できるかどうかを設定します
- 注文ディスカウント — 注文単位のディスカウントと併用できるかどうかを設定します
- 配送ディスカウント — 送料無料のディスカウントと併用できるかどうかを設定します
- 自動ディスカウントでは、デフォルトで最も割引額の大きいものが優先されます。併用を許可するには、「組み合わせ」を使用します
顧客セグメントのターゲティング:
- 顧客の適格性 で、特定の顧客セグメント を選択します
- 顧客 → セグメント で作成したセグメント(例:「VIP 顧客」「初回購入者」)を選択します
優先順位と除外:
- 開始日と終了日 を設定して、どのルールを有効にするかを管理します
- 商品 で、ディスカウントを適用する商品またはコレクションを設定します
- 「セール商品を除外」するか、除外する商品を指定します
Shopify Plus — Shopify Scripts: ディスカウント UI では表現できないルール(例:2 つ目の割引はカートがしきい値を超えた場合のみ適用する段階的な併用)には、以下の手順を使用します。
- アプリ → Script Editor に移動します(Scripts は Shopify Plus 専用の独立した機能です)
- Line Item Script または Shipping Script を作成します
- スクリプトはチェックアウト時に実行され、複雑な条件付き割引を適用できます。ほかのディスカウントより優先されます
Bold Discounts(App Store、約 20 ドル/月): Shopify 向けのビジュアルなルールビルダーで、以下に対応しています。
- プロモーションごとの併用可否
- プロモーション間の優先順位付け
- 複雑な条件(顧客タグ、コレクションへの所属、数量のしきい値)
WooCommerce
WooCommerce のクーポンは、単一ルールの基本的な割引に対応しています。優先順位の設定と併用制御を備えた完全な価格ルールエンジンを利用するには、Dynamic Pricing プラグインを使用します。
YITH WooCommerce Dynamic Pricing & Discounts のインストールと設定:
- YITH.com からプラグインをインストールします(年間約 $70)
- YITH → Dynamic Pricing → Pricing Rules に移動します
- ルールを作成して、次の項目を設定します:
- Type:カート、商品、またはカテゴリーの価格設定
- Discount:パーセンテージまたは固定額
- Conditions:カート小計、数量、顧客のロール、期間
- Products/categories:ルールを適用する商品。除外対象も設定します
- Priority:数字が小さいほど優先順位が高くなります(先に適用されます)
- Stacking:優先順位の低いルールとの併用を防ぐには、「Stop other rules」を設定します
WooCommerce での顧客セグメントのターゲティング:
- WooCommerce の Customer Roles を使用します(User Role Editor や WooCommerce B2B などのプラグインから利用できます):
- 顧客を「wholesale」、「vip」、「trade」などのロールに割り当てます
- Dynamic Pricing のルールで、各ルールの対象を特定の顧客ロールに限定します
- そのロールの顧客には割引価格が表示され、それ以外の顧客には通常価格が表示されます
例:在庫処分品を除くアパレル商品を、VIP 限定で 20% 割引:
- ルールを作成します:Type = Category pricing、Category = Apparel
- Discount = 20% off
- Customer Role = VIP
- 除外商品:[在庫処分商品の ID リスト]
- Priority = 10
BigCommerce
BigCommerce の Promotions エンジンは、優先順位の設定と併用制御に標準で対応しています。
- Marketing → Promotions → Create Promotion に移動します
- Conditions で次の項目を設定します:
- カートの金額、数量、または商品に関する条件を設定します
- Customer groups で、対象を特定のグループ(wholesale、VIP など)に限定します
- Actions で、割引の種類と金額を設定します
- 該当する場合は Shipping 条件を設定します
- Rules で次の項目を設定します:
- Can be combined with other promotions:はい/いいえ
- Priority:数字が小さいものから実行されます
- Active date range を設定します
BigCommerce は優先順位に従ってプロモーションを評価し、「Can be combined」の設定を適用します。併用できないプロモーションが複数ある場合、顧客には最もお得なものだけが適用されます。
Custom / Headless
カスタムのストアフロントでは、ルールを優先順位順に処理し、併用制約を適用して、対象となるカート明細にルールを適用する評価器を実装します:
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;
}
各注文に適用されたルールを保存しておけば、カスタマーサービスからの問い合わせ(「どの割引が適用されましたか?」)に回答し、プロモーションの ROI を追跡できます。
ベストプラクティス
- 優先順位が高いほど先に評価されます — マーケティング担当者がコードを変更せずに評価順を制御できるよう、明示的な
priority整数値を使用します - 併用可能なルールと併用不可のルールを分けます — 併用不可のルールが適用されたら、それ以降の併用不可ルールはすべてスキップします。併用可能なルールは常に上乗せで適用します
- 有効化する前に「dry run」モードでルールをテストします — プロモーションを開始する前に、サンプルカートで割引計算を確認します
- 除外リストを積極的に使用します — マーケティング担当者が除外商品やカテゴリーを指定できるようにします。プレミアム商品やすでに値下げされている商品に予期せず適用されると、利益率に問題が生じます
- 有効なルールを編集せず、バージョンを作成します — 古いルールを無効化して新しいバージョンを作成します。これにより、過去の注文の計算内容を保持できます
- 各注文に適用されたルールを記録します — カスタマーサービスと ROI 分析のために、注文にルール ID と割引額を保存します
よくある落とし穴
| 問題 | 解決策 |
|---|---|
| 重ねて適用できないルールが2つとも該当する | 優先度順に並べ、最も優先度の高い重ねて適用できないルールを先に適用してから、ほかの重ねて適用できないルールはすべてスキップします |
| 除外対象の商品にルールが適用される | 必ず適用対象より先に除外対象を確認します。どのような場合でも除外が優先されます |
| 合計割引額によって注文合計がマイナスになる | 合計割引額をカートの小計までに制限し、注文合計が0を下回らないようにします |
| キャンペーン中にマーケティング担当者が有効なルールを編集する | 有効なルールは変更不可として扱います。新しいルールを作成して古いルールを無効化し、有効なルールは決して編集しないでください |
| ルールの有効化または無効化が予定時刻から数秒ずれる | 開始時刻と終了時刻は余裕を持って設定し(予定時刻の数分前または後)、ステージング環境で確認します。タイミングが重要な場合は、Launchpad(Shopify Plus)またはスケジュール済みジョブを使用します |
関連スキル
- @coupon-management
- @discount-engine
- @dynamic-pricing
- @ab-testing-pricing
- @volume-pricing