flash-sale-engine について
EC 運営者向けに、期間限定セールの設定方法を案内するスキルです。割引の予約、販売数の制限、カウントダウン表示、高需要時の待合室を扱います。
主な機能
- 01プラットフォーム別セール設定
- 02割引の開始・終了予約
- 03セール数量の上限設定
- 04カウントダウン表示
- 05高需要商品の待機列
活用シーン
- 01季節限定セールの日時設定
- 02セール価格での販売数制限
- 03アクセス集中時の過剰販売抑制
- 04限定商品の発売待機列管理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill flash-sale-engineインストール後、Claude Code で/flash-sale-engineを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/atomic-stock-reservation-with-redis/criteria.jsontask.mdevals/real-time-countdown-timer-via-sse/criteria.jsontask.mdevals/sale-scheduling-and-virtual-queue-manage/criteria.jsontask.md詳細
フラッシュセールエンジン
概要
フラッシュセールとは、通常2〜24時間の期間限定割引のことで、購入を促す緊急性を生み、コンバージョンの急増につながります。安定して運用するには、購入者に表示するカウントダウンタイマー、過剰販売を防ぐセールごとの数量上限、セール終了時に価格を自動で元に戻す仕組みの3つが必要です。(商品発売、Black Fridayの目玉商品など)アクセスの多い販売開始時には、ボットによる買い占めを防ぐため、仮想待合室も欠かせません。ほとんどのプラットフォームには、カスタムコードなしでこれらを処理するアプリがあります。
このスキルを使用する場面
- 正確な時刻に終了する必要がある期間限定セール(例:24時間限定セール、Black Fridayの目玉商品)を開始するとき
- メイン在庫とは別に、フラッシュセール用の数量が限られている商品を販売するとき
- 単純な在庫確認では過剰販売が起こるほどのアクセス急増が予想されるとき
- 需要の高い販売開始時に、購入者を公平に受け入れる待合室やキューが必要なとき
- 複数の商品で複数のフラッシュセールを同時に実施する、お買い得商品プラットフォームを構築するとき
主な手順
ステップ1:マーチャントのプラットフォームを特定し、適切なツールを選ぶ
| プラットフォーム | 推奨ツール | 理由 |
|---|---|---|
| Shopify | Countdown Timer Bar、FOMO、またはHextom Flash Salesアプリ | これらのアプリでは、カスタムコードなしでカウントダウンタイマー、価格変更の予約、在庫表示に対応できます |
| Shopify Plus | Launchpad(Plusでは無料) | Shopify公式のフラッシュセールアプリです。価格変更の予約、割引コードの有効化/無効化、価格の自動復元ができます |
| WooCommerce | YITH WooCommerce Flash SalesまたはWooCommerce Sales Countdown | 商品ページにカウントダウンタイマーを直接表示し、セール価格を管理できます |
| BigCommerce | BigCommerce Promotionsとカウントダウンタイマー用のカスタムスクリプト | BigCommerceのプロモーションエンジンで割引を管理し、タイマーUIにはストアフロントのスクリプトを使用します |
| アクセスの多い販売開始(すべてのプラットフォーム) | Cloudflare Waiting Room | Cloudflareのマネージド待合室が訪問者を公平にキューへ案内し、ボットによる買い占めから限られた在庫を守ります |
| カスタム/ヘッドレス | Redisによるアトミックな在庫管理と、SSE/WebSocketによるタイマーで構築 | アプリが適用できないカスタムプラットフォームを細かく制御できます |
ステップ2:プラットフォームでフラッシュセールを設定する
Shopify
オプションA:Shopify Launchpad(Plusのみ、無料)
Launchpadは、プロモーションイベントを予約するためのShopify公式ツールです。
- Shopify管理画面で、Apps → Launchpadに移動します
- Create eventをクリックします
- イベント名(例:「Black Friday Flash Sale 2026」)、開始時刻、終了時刻を設定します
- Price changesで商品を選択し、それぞれのセール価格を設定します
- Publish/unpublish collectionsで、必要に応じてイベント中にセールコレクションを表示/非表示にします
- Discount codesで、イベント中に特定の割引コードを有効または無効にします
- Scheduleをクリックすると、Launchpadが開始時刻に変更を適用し、終了時刻に自動で元に戻します
重要:セール用の数量は、メイン在庫とは別に設定してください。フラッシュセール価格で100個だけ販売する場合は、セール前に商品の販売可能在庫を100個に減らし、セール後に補充します。Launchpadは、セール用数量を標準機能では管理しません。
オプションB:Hextom Flash Salesアプリ(Plus以外)
- Shopify App StoreからHextom Flash Salesをインストールします(月額約10ドル)
- 対象商品、割引率、期間を指定してセールを作成します
- アプリが商品ページにカウントダウンタイマーウィジェットを追加し、価格を自動で更新します
- アプリの設定でカウントダウンタイマーの外観を設定します
商品ごとの数量上限: Shopifyの組み込み在庫追跡機能を使って、フラッシュセールの数量を設定します。
- 商品バリエーションを編集し、在庫数量にフラッシュセールの上限を設定します
- Track quantityとStop selling when out of stockを有効にします
- セール終了後、在庫を実際の数量に補充します
WooCommerce
オプション A:YITH WooCommerce Flash Sales プラグイン
- プラグインディレクトリまたは YITH.com から YITH WooCommerce Flash Sales をインストールします
- YITH → Flash Sales → Add New Flash Sale に移動します
- 以下を設定します:
- セール対象の商品
- セール価格または割引率
- 開始日時と終了日時
- フラッシュセール価格で販売できる最大数量(通常在庫とは別に設定)
- プラグインが商品ページにカウントダウンタイマーを自動表示し、終了時刻になると価格を元に戻します
オプション B:WooCommerce 標準のセール価格とカウントダウン用アドオン
WooCommerce では、すべての商品に対して標準で Sale price と Schedule を利用できます:
- 商品を編集 → Pricing タブ
- Sale price を入力します
- Schedule をクリックして開始日と終了日を設定します
- セール価格は自動的に適用され、終了時に解除されます
Countdown Timer for WooCommerce(無料プラグイン)または WooCommerce Sales Countdown Timer を使ってカウントダウンタイマーを追加します。
商品ごとのフラッシュセール数量: セール開始前に商品の在庫数量をフラッシュセールの上限まで減らし、終了後に手動またはスケジュール済みスクリプトで元に戻します。
BigCommerce
- Marketing → Promotions → Create Promotion に移動します
- 以下を設定します:
- Promotion type:割引率、または割引額
- Applies to:特定の商品またはカテゴリー
- Active date range:開始時刻と終了時刻(BigCommerce が価格を自動的に元に戻します)
- カウントダウンタイマーを追加するには、カスタムスクリプトを追加します:
- Storefront → Script Manager → Create a Script に移動します
- Scope:Specific pages → Product pages
- プロモーション終了時刻までカウントダウンする JavaScript タイマーを追加します
BigCommerce の数量制限: プロモーションに Maximum uses の上限を設定してフラッシュセール割引を利用できる注文数を制限するか、商品の在庫管理機能を使って在庫を制限します。
高需要のドロップ向け待合室(すべてのプラットフォーム)
アクセス集中が予想される商品ドロップ(数量限定スニーカー、コンサートチケット、限定グッズなど)向け:
Cloudflare Waiting Room(推奨)
- Cloudflare ダッシュボードで Traffic → Waiting Room に移動します
- Create Waiting Room をクリックします
- 以下を設定します:
- Hostname と Path:商品ページの URL パターン(例:
/products/limited-edition-*) - Total active users:ページで許可する同時接続ユーザーの最大数
- New users per minute:待機中の顧客を入場させる速度
- Hostname と Path:商品ページの URL パターン(例:
- Cloudflare が待機中の訪問者にカスタマイズ可能な待合室ページを表示します
- 顧客は FIFO 順に入場します。ボットは Cloudflare のボット管理機能によって除外されます
この機能には Cloudflare Business または Enterprise プランが必要です。低コストの代替手段として、Queue-it または Fastly's Waiting Room をご検討ください。
カスタム/ヘッドレス
カスタムストアフロントでは、高い同時接続数に対応できるよう、Redis を使用したアトミックな在庫予約を実装します:
import { Redis } from 'ioredis';
const redis = new Redis(process.env.REDIS_URL);
// Atomically reserve one unit from the flash sale allocation
async function reserveFlashSaleUnit(saleId: string, customerId: string): Promise<boolean> {
const key = `flash_sale:${saleId}:sold`;
const maxKey = `flash_sale:${saleId}:max`;
const max = parseInt(await redis.get(maxKey) ?? '0');
if (max === 0) return false; // sale not configured
// Atomic increment — safe under high concurrency
const newCount = await redis.incr(key);
if (newCount > max) {
await redis.decr(key); // Undo the over-increment
return false; // Sold out
}
return true;
}
// Send countdown timer data to the client via Server-Sent Events
app.get('/api/sales/:saleId/timer', async (req, res) => {
const { endsAt, maxQuantity } = await db.flashSales.findById(req.params.saleId);
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
const interval = setInterval(async () => {
const remaining = Math.max(0, new Date(endsAt).getTime() - Date.now());
const sold = parseInt(await redis.get(`flash_sale:${req.params.saleId}:sold`) ?? '0');
res.write(`data: ${JSON.stringify({ remaining, stockLeft: maxQuantity - sold })}\n\n`);
if (remaining === 0) { clearInterval(interval); res.end(); }
}, 1000);
req.on('close', () => clearInterval(interval));
});
ベストプラクティス
- 終了時刻はサーバーを正とする — セール終了時刻の計算をクライアントに任せず、ブラウザー間でタイマーがずれないよう、常にサーバーから UTC の終了タイムスタンプを読み取ります
- セール用数量は通常在庫と分けて設定する — フラッシュセール用在庫は別枠です。注文が確定するまで、フラッシュセール数量分を総在庫から差し引かないでください
- アクセス集中が予想されるドロップの前にインフラを増強する — 大規模セールの 48 時間前に、予想されるピーク時のアクセス数でチェックアウトの負荷テストを行い、それに応じてホスティングをスケールします
- 在庫が少ない場合は「在庫限り」と表示する — 在庫数をリアルタイムで表示すると(例:「残り 8 点」)、購入意欲を高められます。ただし、在庫が多い場合に正確な数量を表示すると不自然に見えるため避けてください
- ステージング環境でセールの全サイクルをテストする — 本番環境で開始する前に、予定開始から価格の自動復元まで、セール全体を実行します
- Launchpad/アプリ管理のセール実施中は、価格を手動で変更しない — 手動変更によって、自動復元が正しく動作しなくなる場合があります
よくある落とし穴
| 問題 | 解決策 |
|---|---|
| セール終了後も価格が元に戻らない | Launchpad または価格を自動で元に戻すカウントダウンアプリを使用してください。手動でスケジュールを設定する場合は、カレンダーにリマインダーを設定して、価格が元に戻ったことを確認してください。また、「信頼できる唯一の情報源」となるテーブルと価格を照合するフォールバックチェックを構築してください |
| アクセス急増時の過剰販売 | 独自に構築する場合は、Redis のアトミックなインクリメントを使用してください。プラットフォームを使用する場合は、セール開始前に商品の在庫数をフラッシュセールの上限に設定してください |
| タイムゾーンによってカウントダウンタイマーに異なる時刻が表示される | 常にセールの終了時刻を UTC の絶対時刻として基準にしてください。クライアント側で remaining = endsAt - Date.now() を計算してください |
| 実際の顧客が購入する前に、ボットが在庫をすべて買い占める | Cloudflare Waiting Room などのキューシステムを使用してください。注文システムで顧客ごとの購入数を制限してください |
| アプリで管理するカウントダウンタイマーと手動の価格変更が競合する | Launchpad のイベントまたはカウントダウンアプリが有効な間は、Shopify 管理画面から価格を変更しないでください |
関連スキル
- @coupon-management
- @dynamic-pricing
- @price-rules-engine
- @bot-protection
- @order-management-system