この記事について
ポイント変換で発行するクーポンには、不正利用を防ぐための制約を設けています。クーポンの仕様と、その設計理由を解説します。
クーポンの基本仕様
発行されるクーポンの特徴
| 項目 | 仕様 | 理由 |
|---|---|---|
| 割引タイプ | 固定金額割引 | ポイント数=金額でわかりやすい |
| 割引金額 | 使用ポイント数と同額 | 1pt=1円の明確なレート |
| 使用回数 | 1回のみ | ポイントは一度しか消費されない |
| 使用者 | 発行を依頼した顧客のみ | 他人への譲渡を防止 |
| 有効期限 | 発行から1年間 | 十分な猶予を提供 |
| 最低購入額 | なし | 使いやすさを優先 |
割引タイプ
仕様固定金額割引
理由ポイント数=金額でわかりやすい
割引金額
仕様使用ポイント数と同額
理由1pt=1円の明確なレート
使用回数
仕様1回のみ
理由ポイントは一度しか消費されない
使用者
仕様発行を依頼した顧客のみ
理由他人への譲渡を防止
有効期限
仕様発行から1年間
理由十分な猶予を提供
最低購入額
仕様なし
理由使いやすさを優先
クーポンコードの形式
形式: [顧客ID下5桁]-[ランダム6文字]-[ポイント数] 例: 70934-AB12CD-500
| 部分 | 例 | 意味 |
|---|---|---|
| 顧客ID下5桁 | 70934 | 誰のクーポンか |
| ランダム6文字 | AB12CD | 重複防止(同一顧客で複数発行可能) |
| ポイント数 | 500 | いくら引きのクーポンか |
顧客ID下5桁
例70934
意味誰のクーポンか
ランダム6文字
例AB12CD
意味重複防止(同一顧客で複数発行可能)
ポイント数
例500
意味いくら引きのクーポンか
メリット: コードを見れば内容がわかる、重複が発生しない、問い合わせ対応が容易、不正コード生成が困難
制約の詳細
使用回数の制限
ポイント変換時: 500pt消費 → 500円クーポン発行
顧客限定の制約
Shopifyのクーポン設定:
- customer_selection: "specific"
- prerequisite_customer_ids: ["12345"]
| 効果 | 詳細 |
|---|---|
| 使用制限 | 顧客12345以外はこのコードを使えない |
| 漏洩対策 | コードが漏洩しても他人は使えない |
| 共有防止 | 家族間での共有も不可 |
使用制限
詳細顧客12345以外はこのコードを使えない
漏洩対策
詳細コードが漏洩しても他人は使えない
共有防止
詳細家族間での共有も不可
検証の流れ
顧客がコード入力
購入画面でクーポンコードを入力
Shopifyがチェック
コードは有効? → Yes / この顧客が対象? → 顧客ID照合
結果
一致 → 割引適用 / 不一致 → 「このコードは使用できません」
有効期限の設計
期限切れの扱い: 期限切れクーポン → 使用不可、消費したポイント → 戻らない、事前のリマインダー → 検討中
不正利用対策
想定される不正と対策
| 不正パターン | 対策 |
|---|---|
| コードの推測 | ランダム6文字で推測困難に |
| コードの共有 | 特定顧客限定で使用者を制限 |
| 複数回使用 | 1回限りで使用回数を制限 |
| 期限切れ後の使用 | Shopify側で自動的に無効化 |
| 残高以上の変換 | 変換前に残高を必ず確認 |
コードの推測
対策ランダム6文字で推測困難に
コードの共有
対策特定顧客限定で使用者を制限
複数回使用
対策1回限りで使用回数を制限
期限切れ後の使用
対策Shopify側で自動的に無効化
残高以上の変換
対策変換前に残高を必ず確認
ブルートフォース対策
コード形式: 70934-AB12CD-500
| 項目 | 内容 |
|---|---|
| 使用文字 | A-Z, 0-9(36種類) |
| 桁数 | 6桁 |
| 組み合わせ数 | 36^6 = 約21億通り |
使用文字
内容A-Z, 0-9(36種類)
桁数
内容6桁
組み合わせ数
内容36^6 = 約21億通り
総当たり攻撃の困難さ:
- 1秒に100回試行しても全パターン試行に約240日
- しかもレート制限で1分60回まで
追加対策: 連続失敗でアカウント一時ロック、異常なパターンを検知してアラート
変換レートと制限
ポイント→金額の変換レート
基本レート: 1ポイント = 1円
| ポイント | クーポン金額 |
|---|---|
| 100pt | 100円引きクーポン |
| 500pt | 500円引きクーポン |
| 1000pt | 1000円引きクーポン |
100pt
クーポン金額100円引きクーポン
500pt
クーポン金額500円引きクーポン
1000pt
クーポン金額1000円引きクーポン
将来の拡張可能性:
- キャンペーン時: 1pt = 1.5円
- 会員ランク別: ゴールドは1pt = 1.2円
- 設定で変更可能な設計にしておく
変換の制限
| 制限 | 値 | 理由 |
|---|---|---|
| 最小変換単位 | 100pt | 少額クーポンの乱発防止 |
| 最大変換単位 | 10,000pt/回 | 高額変換は手動確認 |
| 1日あたり上限 | 30,000pt | 不正利用時の被害限定 |
| 変換単位 | 100pt刻み | 端数処理の複雑さ回避 |
最小変換単位
値100pt
理由少額クーポンの乱発防止
最大変換単位
値10,000pt/回
理由高額変換は手動確認
1日あたり上限
値30,000pt
理由不正利用時の被害限定
変換単位
値100pt刻み
理由端数処理の複雑さ回避
顧客への表示
クーポン情報の表示項目
| 項目 | クーポン1 | クーポン2 |
|---|---|---|
| コード | 70934-AB12CD-500 | 70934-XY34ZW-1000 |
| 金額 | 500円引き | 1,000円引き |
| 有効期限 | 2025年1月15日 | 2024年12月31日 |
| 状態 | 未使用 [コードをコピー] | 使用済み(2024/10/20) |
コード
クーポン170934-AB12CD-500
クーポン270934-XY34ZW-1000
金額
クーポン1500円引き
クーポン21,000円引き
有効期限
クーポン12025年1月15日
クーポン22024年12月31日
状態
クーポン1未使用 [コードをコピー]
クーポン2使用済み(2024/10/20)
使用方法の案内
クーポン使用ガイド
カートに商品を入れる
購入したい商品をカートに追加
購入手続きへ進む
チェックアウト画面へ移動
クーポンコード欄を見つける
購入画面内のクーポン入力欄を探す
コードを入力または貼り付け
例: 70934-AB12CD-500
「適用」をクリック
クーポンを適用する
割引が反映されたことを確認
小計: 5,000円 → クーポン: -500円 → 合計: 4,500円
この設計がもたらす効果
セキュリティ面
- 不正利用のリスクを最小限に抑制
- 仮に問題が発生しても被害を限定
- 追跡可能な設計で問題の特定が容易
顧客体験
- 金額が明確でわかりやすい
- コピー機能で入力の手間を軽減
- 十分な有効期限で焦らずに使える