coupon-management について
EC プラットフォームや独自ストアでクーポンを管理するための、事業者と開発者向けスキルです。割引ルール、対象条件、利用制限、一括コード生成、安全な検証と引き換えを扱います。
主な機能
- 01主要 EC プラットフォームでの設定
- 02割引タイプと適用条件
- 03利用回数と有効期限の制限
- 04一意なコードの一括生成
- 05独自実装での検証と原子的な引き換え
活用シーン
- 01チェックアウト用プロモーションコードの設定
- 02メールキャンペーン用単回コードの生成
- 03商品や顧客によるクーポン対象の制限
- 04独自クーポンの検証・引き換え設計
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill coupon-managementインストール後、Claude Code で/coupon-managementを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/bulk-code-generation-and-atomic-redempti/criteria.jsontask.mdevals/coupon-database-schema-design/criteria.jsontask.mdevals/coupon-validation-logic-and-error-codes/criteria.jsontask.md詳細
クーポン管理
概要
クーポンシステムを使うと、加盟店は設定可能なルールに基づいてプロモーションコードを作成できます。ルールには、割引率または定額割引、最低注文金額、クーポン単位または顧客単位の使用上限、有効期限などがあります。主要な e コマースプラットフォームにはすべてクーポンシステムが組み込まれているため、ゼロから構築する必要はほとんどありません。このスキルでは、各プラットフォームでクーポン管理を設定する方法を説明し、大量のユニークコードやキャンペーンの追跡など、高度な要件に対応するためにアプリやプラグインを利用すべき場合について解説します。
このスキルを使用する場面
- チェックアウトのフローに初めてプロモーションコードを追加するとき
- シンプルな割引フィールドから、ルールベースのクーポンエンジンに移行するとき
- 受取人ごとに異なる、1回限りのユニークコードが必要なマーケティングキャンペーンを実施するとき
- クーポンの作成と効果測定を行う管理画面を構築するとき
- 商品やカテゴリーの除外、顧客セグメントの制限など、複雑なクーポンルールを適用するとき
主な手順
ステップ 1:加盟店のプラットフォームと適切なツールを特定する
| プラットフォーム | 標準機能 | アプリ/プラグインを追加する場面 |
|---|---|---|
| Shopify | Shopify Discounts — 割引率、定額割引、送料無料、BOGO に対応。使用上限、有効期限、最低購入金額も設定可能 | 大量のユニークコードが必要な場合(Shopify はインポートに対応)、顧客グループ別のクーポンやロイヤルティプログラムとの連携(Smile.io、LoyaltyLion)が必要な場合 |
| WooCommerce | WooCommerce Coupons — コア機能に組み込み済み。割引率、カート定額割引、商品定額割引、送料無料に対応 | 大量のユニークコードを生成する場合:WooCommerce Smart Coupons プラグイン。高度なルールが必要な場合:YITH WooCommerce Dynamic Pricing & Discounts |
| BigCommerce | クーポンコードが組み込み済み — 割引率、定額割引、送料無料、無料商品の各タイプに対応 | B2B 固有のコードや高度な制限が必要な場合。BigCommerce アプリマーケットプレイスには Coupon Manager Pro などの選択肢があります |
| カスタム/ヘッドレス | 構築が必要 — 以下のカスタムのセクションを参照 | 該当なし — システムを構築します |
ステップ 2:プラットフォームで標準的なクーポンを設定する
Shopify
- Shopify 管理画面のサイドバーで Discounts に移動します
- Create discount をクリックし、タイプを選択します:
- Amount off products — 特定の商品/コレクションを割引率または定額で割引
- Amount off order — カート全体を割引率または定額で割引
- Buy X get Y — BOGO やセット販売のオファー
- Free shipping — コードを適用すると配送料を無料にする
- コードを設定します:
- コード(例:
SUMMER20)を入力するか、Generate code をクリックしてランダムなコードを生成します - Minimum purchase requirements(最低小計または最低数量)を設定します
- Customer eligibility — すべての顧客、特定の顧客セグメント、または特定の顧客を選択します
- Maximum discount uses — 合計使用回数、および/または顧客ごとの使用回数を 1 回に設定します
- Active dates — 開始日と任意の終了日を設定します
- コード(例:
- Save discount をクリックします
Shopify で大量のユニークコードを生成する:
- 同じ Discounts 画面で、単一のコードを入力する代わりに Generate codes を選択します
- 数量を設定します(UI からは一度に最大 100 個まで。さらに大量に生成する場合は Shopify Admin API を使用します)
- 生成されるすべてのコードには、割引額、有効期限、使用上限など、同じルールが適用されます
- コードを CSV にエクスポートし、メールマーケティングプラットフォームで使用します
Shopify Plus — 高度な併用設定に対応する Shopify Scripts:
- Shopify Scripts(Shopify Plus 専用)を使って、顧客タグごとに異なる割引率を適用する、コードなしでクーポンを自動適用するなど、カスタムのクーポンロジックを実装します
- Shopify 管理画面で Apps → Script Editor からアクセスします
WooCommerce
- WooCommerce → Coupons → Add coupon に移動します
- Coupon code を設定します(顧客がチェックアウト時に入力する一意の識別子です)
- General タブで設定します:
- Discount type:割引率、カート全体への定額割引、商品ごとの定額割引
- Coupon amount:割引額
- Free shipping:このコードで送料無料にするには、有効にします
- Coupon expiry date:コードが無効になる日付
- Usage restriction タブで設定します:
- Minimum spend:カートの小計がこの金額を超える必要があります
- Maximum spend:カートの小計がこの金額を超えてはなりません
- Individual use only:ほかのクーポンと併用できません
- Exclude sale items:すでに値引きされている商品には適用しません
- Products および Exclude products:特定の商品を対象または対象外にします
- Product categories および Exclude categories:カテゴリーで対象または対象外を指定します
- Email restrictions:特定の顧客メールアドレスに限定します
- Usage limits タブで設定します:
- Usage limit per coupon:このコードを使用できる合計回数
- Usage limit per user:1 人の顧客が使用できる回数
- Publish をクリックします
WooCommerce で一意のコードを一括生成する方法:
- WooCommerce Smart Coupons をインストールします(プレミアムプラグイン。StoreApps から年間約 99 ドル)
- WooCommerce → Smart Coupons → Generate Coupons に移動します
- 数量、割引額、有効期限、接頭辞を設定すると、一意のコードをまとめた CSV が生成されます
- メールプラットフォームからインポートまたは配布します
BigCommerce
- Marketing → Coupon Codes → Create Coupon Code に移動します
- 以下を入力します:
- Code:顧客が入力するコード(または自動生成ボタンを使用します)
- Type:注文の割引率、注文の定額割引、商品の割引率、商品の定額割引、送料無料、無料商品
- Discount amount:割引額
- Applies to:すべての商品、特定のカテゴリーの商品、または特定の商品
- Restrictions で以下を設定します:
- Minimum order:小計がこの金額を超える必要があります
- Max uses:使用できる合計回数
- Max uses per customer:アカウントごとの上限
- Expiration date:コードが無効になる日付
- Save をクリックします
BigCommerce でコードを一括生成する方法:
BigCommerce Promotions API(POST /v2/coupons)を使ってコードをプログラムで生成し、配布用にエクスポートします。
カスタム/ヘッドレス
ヘッドレスストアでは、検証と引き換えのロジックを構築する必要があります。主な要件は、アトミックな引き換え(2 人の顧客が同時に残りの引き換え可能回数を使用する際の競合状態を防ぐこと)と、冪等な注文処理です。
// Coupon validation at checkout
async function validateCoupon(
code: string,
customerId: string,
orderSubtotalCents: number
): Promise<{ valid: boolean; discountCents: number; error?: string }> {
const coupon = await db.coupons.findOne({ code: code.toUpperCase().trim(), is_active: true });
if (!coupon) return { valid: false, discountCents: 0, error: 'Code not found' };
const now = new Date();
if (coupon.expires_at && coupon.expires_at < now) return { valid: false, discountCents: 0, error: 'Code expired' };
if (coupon.usage_limit && coupon.usage_count >= coupon.usage_limit) return { valid: false, discountCents: 0, error: 'Code fully used' };
if (coupon.min_order_cents && orderSubtotalCents < coupon.min_order_cents) return { valid: false, discountCents: 0, error: `Minimum order $${coupon.min_order_cents / 100}` };
// Per-customer limit check
if (coupon.per_customer_limit) {
const uses = await db.couponRedemptions.count({ coupon_id: coupon.id, customer_id: customerId });
if (uses >= coupon.per_customer_limit) return { valid: false, discountCents: 0, error: 'Already used' };
}
const discountCents = coupon.type === 'percentage'
? Math.round(orderSubtotalCents * (coupon.value / 100))
: Math.min(coupon.value_cents, orderSubtotalCents);
return { valid: true, discountCents };
}
// Atomic redemption — use inside the order creation transaction
async function redeemCoupon(tx: Tx, couponId: string, customerId: string, orderId: string, discountCents: number) {
// Atomic increment with guard — prevents over-redemption under concurrency
const result = await tx.raw(
`UPDATE coupons SET usage_count = usage_count + 1
WHERE id = ? AND (usage_limit IS NULL OR usage_count < usage_limit)
RETURNING id`,
[couponId]
);
if (result.rowCount === 0) throw new Error('COUPON_EXHAUSTED');
await tx.couponRedemptions.insert({ coupon_id: couponId, customer_id: customerId, order_id: orderId, discount_cents: discountCents });
}
メールキャンペーン用のコードの一括生成:
import crypto from 'crypto';
function generateCode(prefix = 'PROMO', length = 8): string {
const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; // no ambiguous chars
return prefix + '-' + Array.from(crypto.randomBytes(length))
.map(b => chars[b % chars.length]).join('');
}
async function bulkGenerate(template: CouponTemplate, quantity: number): Promise<string[]> {
const codes: string[] = [];
while (codes.length < quantity) {
const batch = Array.from({ length: Math.min(500, quantity - codes.length) }, () => generateCode(template.prefix));
const inserted = await db.coupons.insertMany(
batch.map(code => ({ ...template, code, usage_limit: 1, per_customer_limit: 1 })),
{ onConflict: 'ignore' }
);
codes.push(...inserted.map(r => r.code));
}
return codes;
}
ベストプラクティス
- コードを大文字に統一する — コードを大文字で保存して照合し、空白を削除することで、書式のわずかな違いによる「コードが見つかりません」エラーを防ぎます
- ターゲットを絞ったキャンペーンには使い捨てコードを使用する — メールで一意のコードを配布する場合は、共有を防ぐためにコードごとの使用上限を 1 に設定します
- カートだけでなく、注文作成時にも検証する — 競合状態に対処するため、注文が実際に確定される際にクーポンの有効性(有効期限、使用上限)を再確認します
- クーポンを論理削除する — 引き換え履歴を会計処理用に保持するため、削除するのではなく無効化します
- 割引の不正利用を追跡する — 顧客が割引コードを使ってカート放棄と購入再開を 3 回以上繰り返している場合、割引キャンペーンの対象から除外することを検討します
- 割引額の上限を設定する — 割引率クーポンには割引額の上限を設定し、過度な割引を防ぎます(例:20%オフ、上限 50 ドル)
よくある落とし穴
| 問題 | 解決策 |
|---|---|
| 2人の顧客が同時に最後の1回分を利用する | 原子的な UPDATE ... WHERE usage_count < usage_limit を使用し、rowCount === 1 であることを確認します(カスタム構築の場合)。プラットフォームではネイティブに処理されます |
| 注文をキャンセルした後もクーポンが有効なままになる | 注文がキャンセルまたは返金されたときに利用回数を減らします。Shopify ではこれが自動的に行われます |
| 複数のアカウントを使って顧客ごとの上限を回避できる | 顧客 ID の確認にメールアドレスの確認を加えます。高額なキャンペーンでは、電話番号の認証を必須にします |
| 一括生成したコードが既存のコードと重複する | INSERT ... ON CONFLICT DO NOTHING を使用し、目標の数量に達するまで重複したコードを再生成します |
| 送料無料クーポンが予期せず割引率と併用される | 併用ポリシーを明確に定義します。Shopify では、各割引の「併用可能」設定を使用します |
関連スキル
- @discount-engine
- @price-rules-engine
- @ab-testing-pricing
- @loyalty-points-system
- @checkout-flow-optimization