dynamic-pricing について
dynamic-pricingは、需要、在庫、競合価格、業務ルールに応じた価格変更を行う事業者向けの実装ガイドです。プラットフォーム別の手法と、変更を管理するための制限や確認フローを説明します。
主な機能
- 01プラットフォーム別の価格改定ツール選定
- 02需要と在庫に応じた価格調整
- 03競合価格の監視と自動改定
- 04価格の上下限と変更幅の設定
- 05価格履歴の記録と確認フロー
活用シーン
- 01売れ行きの速い商品の競合価格追跡
- 02滞留在庫の計画的な値下げ
- 03顧客セグメント別の価格設定
- 04変更リスクを抑えた価格弾力性の検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill dynamic-pricingインストール後、Claude Code で/dynamic-pricingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/competitor-monitoring-price-history-sche/criteria.jsontask.mdevals/core-pricing-algorithm-with-demand-signa/criteria.jsontask.mdevals/guardrails-human-review-queue-and-oscill/criteria.jsontask.md詳細
動的価格設定
概要
動的価格設定では、需要のシグナル、在庫数、競合他社の価格、ビジネスルールに基づいて商品価格を自動調整します。目標は、販売単位あたりの収益を最大化することです。需要が旺盛なときや在庫が少ないときは価格を引き上げ、売れ行きの鈍い在庫を処分するために価格を引き下げます。ほとんどの Shopify および WooCommerce のマーチャントは、カスタムコードではなく価格改定アプリを利用しています。カスタム実装が必要になるのは、ヘッドレスストアフロントや、アプリでは対応できない独自の価格改定ロジックを持つマーチャントに限られます。
このスキルを使用するタイミング
- 回転率の高い SKU の価格が設定されたまま放置され、競合他社が時間単位で価格を調整しているために収益を逃している場合
- 売れ行きの鈍い在庫を、自動値下げスケジュールを通じて処分する必要がある場合
- 販売者の価格が競争圧力に応じて変動するマーケットプレイスを運営している場合
- 生鮮品や時間的制約のある在庫の収益管理システムを構築する場合
- 価格弾力性を大規模に A/B テストし、価格変更を安全に展開するためのフレームワークが必要な場合
基本的な手順
ステップ 1:マーチャントのプラットフォームを特定し、適切なツールを選択する
| プラットフォーム | 推奨ツール | 理由 |
|---|---|---|
| Shopify | Prisync、Wiser、または Skio Pricing | Prisync は競合他社の価格を監視し、Shopify Admin API 経由で価格の更新を反映します。Wiser は需要のシグナルと在庫数を利用します |
| Shopify Plus | Prisync + Shopify Flow の自動化 | Shopify Flow は、在庫や販売速度のシグナルに基づいて、Webhook 経由で価格変更をトリガーできます |
| WooCommerce | Prisync、Repricer.com(WooCommerce API 経由)、または WooCommerce REST API を使ったカスタム実装 | ほとんどの価格改定ツールは、商品 API 経由で WooCommerce に対応しています |
| BigCommerce | Prisync、Linnworks、または ChannelAdvisor | BigCommerce の Price Lists API は、セグメントに基づく動的価格設定向けに設計されています |
| Amazon/マルチチャネル | RepricerExpress、BQool、または Seller Snap | Buy Box の最適化を備えた、Amazon の価格改定専用ツールです |
| カスタム/ヘッドレス | プラットフォームの価格設定 API を呼び出す価格設定ジョブを構築する | 完全な制御が可能です。カスタムロジックがアプリの対応範囲を超える場合に必要です |
ステップ 2:ツールを設定する前に価格設定ルールを定義する
ツールを使い始める前に、安全策を文書化してください。これにより、価格改定アルゴリズムが利益率や顧客の信頼を損なう判断を下すのを防げます。
| ルール | 例 |
|---|---|
| 最低価格 | 原価 × 1.15 を下回らない(粗利益率を最低 15% にする) |
| 最高価格 | 希望小売価格または設定した上限を超えない |
| 1 サイクルあたりの最大変更幅 | 1 回の価格改定実行で 20% を超える変更を行わない |
| 変更しきい値 | 新価格との差が 2% を超える場合にのみ更新する(細かな価格変動を防止) |
| 変更禁止期間 | フラッシュセールやプロモーションの実施中は価格を改定しない |
| 人による確認のしきい値 | 10% を超える変更は、適用前に人の承認を得るためのキューに入れる |
ステップ 3:プラットフォーム固有の設定
Shopify
オプション A:Prisync(競合他社の価格に基づく価格改定)
- prisync.com でサインアップし、連携機能を使って Shopify ストアを接続します
- Prisync ダッシュボードで、追跡する競合他社の商品 URL を追加します
- 価格改定ルールを設定します:「競合他社の最安価格に合わせる」、「X%下回る価格にする」、「価格を合わせてさらに下回る」
- 商品ごとに最低価格と最高価格を設定します
- Prisync は、設定したスケジュール(1時間ごと、毎日など)に従って Shopify に価格の更新を自動的に反映します
オプション B:Shopify Flow(在庫/需要に基づく価格改定、Shopify Plus)
- Shopify 管理画面で、Apps → Flow に移動します
- Inventory level changed またはカスタム Webhook をトリガーとする新しいワークフローを作成します
- 条件を追加します。例:「在庫数が 10 未満」
- アクションを追加します:Update product variant を選び、価格をより高い値に設定します
- 在庫が回復したときに元の価格に戻す別のワークフローを追加します
元の価格は商品メタフィールド(product.metafields.pricing.original_price)に保存しておくと、いつでも復元できます。
オプション C:需要に基づく価格改定用のサードパーティ製アプリ
- Wiser(Shopify App Store):販売速度、カートへの追加率、在庫数を使って価格変更を提案し、適用します
- Bold Commerce's Pricing:価格変更のスケジュール設定と自動ルールに対応しています
WooCommerce
オプション A:Prisync + WooCommerce REST API
- REST API の認証情報を使って Prisync を WooCommerce に接続します(WooCommerce の Settings → Advanced → REST API → Add key)
- Prisync で商品と競合他社の URL を対応付けます
- Prisync で価格改定ルールとスケジュールを設定します
- Prisync は
PUT /wp-json/wc/v3/products/{id}/variations/{id}を呼び出して価格を更新します
オプション B:WP-Cron によるカスタムの定期価格改定
WooCommerce で需要に基づく価格改定を行うには、定期タスクを使用します。
- WooCommerce の注文履歴を使って、在庫数と販売速度を確認する PHP 関数を作成します
- WP-Cron またはサーバーの cron でスケジュールを設定します
wc_get_product()->set_price()とsave()を呼び出して、プログラムから価格を更新します- 監査とロールバックのために、価格変更をすべてカスタムテーブルに記録します
オプション C:YITH Dynamic Pricing プラグイン
期間限定の価格変更(スケジュール設定した値下げ)には、以下の手順を実行します。
- YITH WooCommerce Dynamic Pricing & Discounts をインストールします
- 特定の期間中に割引率を適用するルールを作成します
- 本格的な動的価格改定より簡単ですが、「シーズン終了時」の値下げに対応できます
BigCommerce
BigCommerce の Price Lists 機能は、顧客セグメントごとの動的な価格設定に最適です。
- Products → Price Lists に移動します
- 顧客グループごとに価格表を作成します(例:「需要が高く、在庫が少ない」)
- BigCommerce の Price Lists API を使って、価格設定ロジックに基づきプログラムから価格を更新します
- Customers → Customer Groups から価格表を顧客グループに割り当てます
顧客セグメントを使わずにサイト全体の動的な価格設定を行うには、価格改定スケジュールに基づいて BigCommerce の Catalog API を使い、商品の sale_price を更新します。
サードパーティ製ツール:Linnworks と ChannelAdvisor はどちらも BigCommerce と連携し、競合他社の監視と自動価格改定に対応しています。
カスタム/ヘッドレス
ヘッドレスストアフロントの場合は、定期的に実行される価格改定ジョブを実装します。
import { CronJob } from 'cron';
interface PricingContext {
productId: string;
currentPriceCents: number;
costCents: number;
inventoryLevel: number;
salesVelocity7d: number; // units/day rolling average
competitorLowestCents?: number; // from price intelligence feed
floorCents: number;
ceilingCents: number;
}
function computeNewPrice(ctx: PricingContext): { priceCents: number; reason: string } {
let price = ctx.currentPriceCents;
const reasons: string[] = [];
// Inventory pressure: near stockout → slow demand with a price increase
if (ctx.inventoryLevel <= 5 && ctx.salesVelocity7d > 0.5) {
price = Math.round(price * 1.08);
reasons.push('low_inventory');
}
// Slow mover: markdown if no meaningful sales in 7 days
if (ctx.salesVelocity7d < 0.1) {
price = Math.round(price * 0.95);
reasons.push('slow_mover_markdown');
}
// Competitor pricing: stay competitive
if (ctx.competitorLowestCents && price > ctx.competitorLowestCents * 1.05) {
price = Math.round(ctx.competitorLowestCents * 0.99); // undercut by 1%
reasons.push('competitor_undercut');
}
// Enforce guardrails
const marginFloor = Math.round(ctx.costCents * 1.15);
price = Math.max(price, marginFloor, ctx.floorCents);
price = Math.min(price, ctx.ceilingCents);
// Only apply if change exceeds 2% threshold
const changePct = Math.abs(price - ctx.currentPriceCents) / ctx.currentPriceCents;
if (changePct < 0.02) return { priceCents: ctx.currentPriceCents, reason: 'below_threshold' };
// Cap single-run change at 20%
if (changePct > 0.20) {
const direction = price > ctx.currentPriceCents ? 1 : -1;
price = Math.round(ctx.currentPriceCents * (1 + direction * 0.20));
reasons.push('capped_at_20pct');
}
return { priceCents: price, reason: reasons.join(',') || 'no_change' };
}
// Run every 30 minutes during business hours
new CronJob('*/30 6-22 * * *', async () => {
const products = await db.products.findAll({ dynamicPricingEnabled: true });
for (const product of products) {
const ctx = await buildPricingContext(product);
const { priceCents, reason } = computeNewPrice(ctx);
if (priceCents !== ctx.currentPriceCents) {
await platformApi.updatePrice(product.id, priceCents);
await db.priceHistory.insert({ productId: product.id, oldPrice: ctx.currentPriceCents, newPrice: priceCents, reason, changedAt: new Date() });
}
}
}, null, true, 'America/New_York');
ベストプラクティス
- コストに基づく最低価格を必ず設定する —
floor = cost × 1 + min_marginを計算して変更不可にし、コストを下回る価格へのアルゴリズムによる上書きを許可しないでください - 価格履歴をすべて保存する — ロールバック、監査、価格弾力性の分析に備えて、価格を変更するたびにタイムスタンプ、変更前の価格、変更後の価格、理由を記録した行が必要です
- 1回の実行での価格変更幅に上限を設ける — データの不備やバグによる価格の暴走を防ぐため、1回のジョブ実行での変更幅を±20%に制限してください
- 推奨と適用を分ける — エンジンが価格を提案し、別のステップで適用します。これにより、人によるレビュー待ちキューやドライランモードを利用できます
- 大幅な自動変更を通知する — エンジンが10%を超える変更を適用した場合は、Slack またはメールで通知し、人が確認できるようにしてください
- 価格変更を A/B テストする — 新しい価格をサイト全体に適用する前に、A/B テスト用の価格設定スキルを使って、訪問者の一部を対象にテストを実施してください
よくある落とし穴
| 問題 | 解決策 |
|---|---|
| 競合との価格競争中に価格がコストを下回る | アルゴリズムが回避できない絶対的な下限として、Math.max(newPrice, costCents * 1.15) を適用する |
| 競合他社の価格情報が古く、不適切な価格変更が行われる | 競合他社の価格レコードごとに fetched_at を保存し、4時間を超える価格情報は除外する |
| 価格が振動し、エンジンが値上げと値下げを繰り返す | 変更間に最低2時間のクールダウン期間を設け、2%のヒステリシス幅を追加する |
| フラッシュセール中に価格変更が実行される | アルゴリズムによる変更を適用する前に実施中のプロモーションを確認し、セール中の商品に is_price_locked フラグを追加する |
| 更新後も CDN や検索インデックスに古い価格が表示される | 価格変更のたびに商品ページのキャッシュを削除し、検索インデックスをすぐに更新する |
関連スキル
- @ab-testing-pricing
- @flash-sale-engine
- @price-rules-engine
- @volume-pricing
- @discount-engine