CONTENT
ここから
第26章では、定期購入・サブスクリプションについて学びました。
定期購入は、リピート購入を増やし、売上を安定させる仕組みでした。
この章では、購入のきっかけを作るためのクーポン・割引・キャンペーンを扱います。
クーポンや割引は、うまく使えば購入の背中を押してくれます。
しかし、使い方を間違えると、利益が減ったり、ブランド価値が下がったりします。
割引する
↓
売れやすくなる
↓
でも利益が減る
↓
使いすぎると安売りの印象になる
つまり、クーポンは魔法の道具ではありません。
誰に、何のために、どれくらい割引するのかを決めて使う必要があります。
攻略本風に言えば、第27章は**「購入のきっかけを作る補助アイテムを使いこなすステージ」**です。
27.1 クーポン設計の基本
クーポン設計で最初に決めるべきことは、目的です。
なんとなく割引すると、売上は増えても利益が残らないことがあります。
悪い例:
とりあえず10%OFF
よい例:
初回購入の不安を下げるために、初回限定500円OFF
クーポンの主な目的は、次の通りです。
・初回購入を促す
・LINE登録を増やす
・再購入を促す
・在庫を動かす
・季節商品を売る
・催事前に予約を集める
・送料無料ラインまで購入単価を上げる
クーポンには、いくつかの種類があります。
・金額割引
・割合割引
・送料無料
・初回限定
・期間限定
・商品限定
・カテゴリ限定
・LINE登録者限定
金額割引の例です。
500円OFF
1,000円OFF
割合割引の例です。
10%OFF
20%OFF
小規模ECでは、最初は金額割引の方が分かりやすいです。
5,000円の商品を10%OFF
→ 500円引き
10,000円の商品を10%OFF
→ 1,000円引き
割合割引は、商品価格が高いほど割引額も大きくなります。
そのため、利益計算に注意が必要です。
クーポン設計では、次の項目を決めます。
・クーポン名
・割引内容
・対象商品
・対象者
・利用条件
・利用回数
・有効期限
・併用可否
たとえば、初回購入クーポンなら次のようにします。
クーポン名:
初回購入500円OFF
割引内容:
500円引き
対象者:
初回購入者
利用条件:
3,000円以上の購入
利用回数:
1人1回
有効期限:
発行から30日
クーポンは、売上を増やす道具であると同時に、利益を削る道具でもあります。
使う前に、必ず利益が残るか確認します。
27.2 割引コード
割引コードとは、購入者が入力すると割引が適用されるコードです。
WELCOME500
LINE10
GIFT2026
購入者は、カートや注文確認画面でコードを入力します。
割引コード:
[ WELCOME500 ]
[適用する]
割引コードの基本フローです。
コードを入力
↓
サーバー側で検証
↓
条件に合えば割引
↓
合計金額を再計算
ここで大切なのは、割引の判定をサーバー側で行うことです。
ブラウザ側だけで割引すると、改ざんされる可能性があります。
危険な設計:
クライアント側で割引額を決める
安全な設計:
コードだけ送信し、サーバー側で割引条件を確認する
割引コードの型を考えると、次のようになります。
type DiscountType = 'fixed_amount' | 'percentage' | 'free_shipping';
type Coupon = {
id: string;
code: string;
name: string;
discountType: DiscountType;
discountValue: number;
minimumSubtotalAmount: number | null;
startsAt: string;
endsAt: string | null;
usageLimit: number | null;
isActive: boolean;
};
割引コードを適用するときの入力型です。
type ApplyCouponInput = {
code: string;
userId: string | null;
cartSubtotalAmount: number;
};
/**
* 役割: 入力された割引コードを検証し、適用できる割引額を計算する
* 入力: 割引コード、ユーザーID、カート小計
* 出力: 割引適用結果
*/
async function applyCoupon(input: ApplyCouponInput): Promise<{
success: boolean;
discountAmount: number;
reason?: string;
}> {
// 実際の実装では、DBからクーポンを取得し、
// 有効期限、利用回数、最低購入金額、対象者を確認する
return {
success: true,
discountAmount: 500,
};
}
割引コードで確認すべき条件は、次の通りです。
・コードが存在するか
・有効状態か
・有効期限内か
・最低購入金額を満たしているか
・対象商品が含まれているか
・利用回数の上限を超えていないか
・そのユーザーがすでに使っていないか
割引コードは便利ですが、条件を曖昧にすると不正利用や利益低下につながります。
27.3 期間限定キャンペーン
期間限定キャンペーンは、購入のきっかけを作るためによく使われます。
たとえば、次のようなものです。
・週末限定10%OFF
・お中元早割
・年末感謝キャンペーン
・新商品発売記念
・催事前予約キャンペーン
期間限定キャンペーンの強みは、購入の期限を作れることです。
いつか買おう
↓
今週中なら特典あり
↓
今買う理由ができる
ただし、期限を作りすぎると、常にセールをしている印象になります。
常に割引
↓
通常価格で買われにくくなる
期間限定キャンペーンでは、次の項目を決めます。
・開始日時
・終了日時
・対象商品
・割引内容
・告知場所
・利用条件
・キャンペーン終了後の表示
キャンペーンページや商品ページでは、期間を明確に表示します。
キャンペーン期間:
2026年7月1日〜2026年7月15日
期間中、対象商品を500円OFFでご購入いただけます。
終了後は、古いキャンペーン表示を残さないようにします。
悪い例:
終了したキャンペーンバナーが残っている
よい例:
終了後は自動で非表示、または販売終了表示に変更
システム側では、現在時刻で判定します。
現在時刻
↓
startsAtより後か
↓
endsAtより前か
↓
条件を満たせば適用
期間限定キャンペーンでは、表示と適用条件を一致させます。
画面ではキャンペーン中
でも決済では割引なし
これはトラブルになる
キャンペーン表示とサーバー側の割引判定を必ず連動させます。
27.4 送料無料キャンペーン
送料無料キャンペーンは、購入者にとって分かりやすい特典です。
送料は、購入直前の離脱原因になりやすい項目です。
商品価格は納得
↓
カートで送料が追加
↓
思ったより高い
↓
離脱
送料無料キャンペーンには、いくつかの形があります。
・全商品送料無料
・一定金額以上で送料無料
・対象商品だけ送料無料
・初回購入だけ送料無料
・地域限定で送料無料
・期間限定で送料無料
最も使いやすいのは、一定金額以上で送料無料です。
税込10,000円以上で送料無料
この方法は、平均注文単価を上げる効果が期待できます。
現在のカート:
8,000円
送料無料条件:
10,000円以上
表示:
あと2,000円で送料無料です
送料無料キャンペーンの計算も、サーバー側で行います。
商品小計
↓
送料無料条件を判定
↓
送料を0円にする
↓
合計金額を計算
TypeScriptでは、次のように考えます。
type FreeShippingRule = {
minimumSubtotalAmount: number;
startsAt: string;
endsAt: string | null;
isActive: boolean;
};
/**
* 役割: 送料無料条件を満たしているか判定する
* 入力: 商品小計と送料無料ルール
* 出力: 送料無料かどうか
*/
function isFreeShippingCampaignApplicable(
subtotalAmount: number,
rule: FreeShippingRule
): boolean {
if (!rule.isActive) {
return false;
}
return subtotalAmount >= rule.minimumSubtotalAmount;
}
送料無料で注意したいのは、店舗側が送料を負担することです。
購入者:
送料0円
店舗:
配送会社への送料は支払う
つまり、送料無料は実際には「店舗が送料を負担するキャンペーン」です。
利益が残るかを確認してから設定します。
27.5 初回購入特典
初回購入特典は、まだ購入したことがない人の不安を下げるための施策です。
初めてのECサイトでは、購入者は少し不安を持っています。
このお店は大丈夫かな
商品は本当に良いのかな
配送はちゃんとしているかな
初回購入特典は、その最初の一歩を後押しします。
初回500円OFF
初回送料無料
初回限定お試しセット
初回限定ギフト包装無料
初回購入特典でおすすめなのは、値引きしすぎないことです。
高級商材やブランド商品では、大きな割引がブランド印象を下げることがあります。
強すぎる割引:
初回50%OFF
自然な特典:
初回送料無料
初回500円OFF
初回限定お試しセット
初回購入の判定方法はいくつかあります。
・会員IDで判定
・メールアドレスで判定
・クーポン利用履歴で判定
・注文履歴で判定
会員機能がある場合は、ユーザーIDで判定しやすいです。
userId
↓
過去注文があるか確認
↓
なければ初回購入
ゲスト購入中心の場合は、メールアドレスで判定することもあります。
ただし、メールアドレスを変えれば再利用できる可能性があります。
ゲスト購入:
初回判定は完全ではない
会員購入:
初回判定しやすい
初回購入特典は、不正利用を完全に防ぐよりも、被害が大きくならない設計にします。
割引額を大きくしすぎない
利用回数を制限する
最低購入金額を設定する
初回特典は、あくまで購入のきっかけです。
利益を削りすぎない範囲で使います。
27.6 LINE登録クーポン
LINE登録クーポンは、小規模ECと相性が良い施策です。
LINE登録をしてくれた人に、クーポンを配布します。
LINE登録
↓
クーポン配布
↓
初回購入
↓
その後もLINEで再接点
LINE登録クーポンの目的は、短期的な購入だけではありません。
購入後もつながり続けることです。
新商品案内
再入荷案内
季節商品案内
催事情報
使い方案内
LINE登録クーポンの例です。
LINE登録で500円OFF
LINE登録で初回送料無料
LINE登録でギフト包装無料
文面例です。
LINEにご登録いただいた方へ、初回購入で使える500円OFFクーポンをお届けしています。
再入荷や季節商品のご案内もLINEでお知らせします。
クーポンコードは、共通コードと個別コードの2種類があります。
共通コード:
LINE500
個別コード:
LINE-8F3K2A
共通コードは運用が簡単です。
ただし、SNSなどで拡散される可能性があります。
共通コード:
簡単だが拡散されやすい
個別コード:
管理しやすいが実装が複雑
最初の小規模ECでは、共通コードから始めても構いません。
ただし、利用条件を付けます。
・1人1回
・最低購入金額あり
・有効期限あり
・初回購入限定
LINE登録クーポンで重要なのは、登録後に何を届けるかです。
クーポンだけ配って、その後何も送らなければ、関係が続きません。
LINE登録
↓
クーポン
↓
使い方・レシピ
↓
再入荷案内
↓
季節商品
↓
リピート購入
LINE登録は、割引のためだけではなく、関係づくりの入口として設計します。
27.7 Square側で割引を扱う場合
Square側で割引を扱う方法もあります。
SquareのOrders APIでは、注文に割引を適用できます。Square公式ドキュメントでは、割合割引、固定額割引、Catalog側の割引などをOrders APIで扱えることが説明されています。(
)また、Catalog APIは商品、バリエーション、カテゴリ、割引、税、モディファイアなどをプログラムから管理できるAPIです。(
)
Square側で割引を扱う場合のイメージです。
自社ECでカートを作る
↓
割引条件を確認する
↓
Square Orderにdiscountを含める
↓
Square Checkoutへ送る
Square側で割引を扱うメリットは、SquareのOrder金額に割引が反映されることです。
商品小計
割引
税
送料
合計
これらをSquare Order上で確認しやすい
SquareのCatalogDiscountオブジェクトでは、割引名や、固定額・割合などの割引種別を持てます。(
)
Square側で扱うのに向いている割引です。
・単純な10%OFF
・固定額割引
・商品単位の割引
・Square Order上にも残したい割引
ただし、注意点もあります。
自社EC独自のクーポン条件が複雑な場合、Square側だけでは管理しにくいことがあります。
・初回購入判定
・LINE登録者限定
・1人1回制限
・会員ランク別
・独自キャンペーン条件
このような条件は、自社DBで判定してから、最終的な割引額をSquare Orderに渡す設計が分かりやすいです。
自社DB:
クーポン条件を判定
Square Order:
割引後の注文金額を記録
Square側で割引を扱う場合でも、最終的な金額はサーバー側で計算します。
ブラウザ:
クーポンコードを送る
サーバー:
条件を確認
割引額を計算
Squareへ送る
Squareに任せる部分と、自社ECで判定する部分を分けて設計します。
27.8 自前DBで割引を扱う場合
自前DBで割引を扱う方法もあります。
この場合、クーポンコード、利用条件、利用履歴などを自社EC側で管理します。
coupons:
クーポン情報
coupon_redemptions:
利用履歴
orders:
割引適用後の注文
DB設計の例です。
type CouponRecord = {
id: string;
code: string;
name: string;
discountType: 'fixed_amount' | 'percentage' | 'free_shipping';
discountValue: number;
minimumSubtotalAmount: number | null;
startsAt: string;
endsAt: string | null;
usageLimit: number | null;
perCustomerLimit: number | null;
isActive: boolean;
};
利用履歴の型です。
type CouponRedemptionRecord = {
id: string;
couponId: string;
orderId: string;
userId: string | null;
email: string | null;
discountAmount: number;
usedAt: string;
};
自前DBで割引を扱うメリットは、自由度が高いことです。
・初回購入限定
・LINE登録者限定
・会員限定
・カテゴリ限定
・利用回数制限
・有効期限
・最低購入金額
・顧客ごとの制限
一方で、実装すべきことも増えます。
・クーポン登録画面
・クーポン編集画面
・利用履歴
・不正利用対策
・サーバー側の金額計算
・Square Orderとの金額一致
自前DBで割引を扱う場合の流れです。
クーポンコード入力
↓
自前DBでコードを検索
↓
利用条件を確認
↓
割引額を計算
↓
注文に割引額を保存
↓
Squareへ割引後の金額を送る
↓
利用履歴を保存
重要なのは、注文DBにも割引情報を保存することです。
orders:
subtotal_amount
discount_amount
shipping_fee
total_amount
coupon_code
これにより、あとからなぜその金額になったのか確認できます。
商品小計:5,400円
クーポン:-500円
送料:800円
合計:5,700円
割引額の計算結果は、必ずサーバー側で保存します。
画面表示だけに頼ってはいけません。
27.9 不正利用対策
クーポンには、不正利用のリスクがあります。
特に割引額が大きい場合や、共通コードを使う場合は注意が必要です。
よくある不正利用です。
・同じ人が何度も初回クーポンを使う
・共通コードがSNSで拡散される
・最低購入金額を満たさないのに使おうとする
・期限切れクーポンを使おうとする
・複数クーポンを重ねて使う
・割引額をブラウザ側で改ざんする
不正利用対策の基本は、サーバー側で検証することです。
ブラウザ:
コードを入力するだけ
サーバー:
使えるか判定する
検証すべき条件です。
・クーポンが有効か
・期限内か
・対象商品か
・最低購入金額を満たしているか
・利用回数の上限内か
・ユーザーごとの利用上限内か
・他クーポンと併用できるか
初回クーポンでは、過去注文を確認します。
userIdあり:
そのuserIdの注文履歴を確認
ゲスト購入:
メールアドレスの過去注文を確認
ただし、ゲスト購入では完全な判定は難しいです。
メールアドレスを変える
↓
初回扱いになる可能性がある
そのため、ゲスト購入で使う初回クーポンは、割引額を大きくしすぎない方が安全です。
併用ルールも決めます。
・クーポンは1注文につき1つまで
・送料無料とは併用不可
・LINEクーポンと初回クーポンは併用不可
不正利用対策では、エラーメッセージも分かりやすくします。
このクーポンは有効期限が切れています。
このクーポンは初回購入の方のみご利用いただけます。
このクーポンは5,000円以上のご注文でご利用いただけます。
不正利用を防ぎながら、正しく使おうとしている購入者には分かりやすく案内します。
27.10 キャンペーン効果測定
クーポンやキャンペーンは、実施して終わりではありません。
効果を測定します。
見るべき数字は、次の通りです。
・クーポン利用回数
・クーポン経由の売上
・割引額の合計
・平均注文単価
・購入完了率
・新規購入者数
・リピート購入数
・LINE登録数
・利益への影響
大切なのは、売上だけを見ないことです。
売上は増えた
でも割引しすぎて利益が減った
これは成功とは言いにくい
キャンペーンの効果は、次のように見ます。
キャンペーン前:
1週間の売上 50,000円
キャンペーン中:
1週間の売上 80,000円
割引額 20,000円
実際に利益が増えたか確認する
クーポンごとに利用履歴を残しておくと、分析しやすくなります。
WELCOME500:
利用回数 30回
売上 120,000円
割引額 15,000円
LINE500:
利用回数 20回
売上 90,000円
割引額 10,000円
効果測定では、目的ごとに見る数字を変えます。
初回購入クーポン:
新規購入者数を見る
LINE登録クーポン:
LINE登録数と購入数を見る
送料無料キャンペーン:
平均注文単価を見る
在庫処分キャンペーン:
対象商品の販売数を見る
キャンペーン終了後は、必ず振り返ります。
・目的は達成できたか
・利益は残ったか
・不正利用はなかったか
・問い合わせは増えたか
・次回も実施すべきか
小規模ECでは、複雑な分析ツールがなくても、最初は注文DBとスプレッドシートで十分です。
注文番号
クーポンコード
割引額
合計金額
購入者種別
購入日時
キャンペーンは、やりっぱなしにしないことが大切です。
数字を見て、次の施策へつなげます。
第27章のまとめ
クーポン・割引・キャンペーンは、購入のきっかけを作るための強力な道具です。
しかし、使い方を間違えると、利益が減り、ブランド価値も下がります。
この章で覚えておきたいポイントは、次の通りです。
1. クーポンは、目的を決めて設計する
2. 割引コードはサーバー側で検証する
3. 期間限定キャンペーンでは、開始日と終了日を明確にする
4. 送料無料キャンペーンは分かりやすいが、店舗が送料を負担する
5. 初回購入特典は、購入の不安を下げるために使う
6. LINE登録クーポンは、購入後の関係づくりにもつながる
7. Square側ではOrders APIやCatalog APIで割引を扱える
8. 自前DBで割引を扱うと、条件設定の自由度が高い
9. 不正利用対策では、有効期限、利用回数、併用可否を検証する
10. キャンペーンは、売上だけでなく利益と継続効果を見る
クーポン設計の基本は、次の一言にまとめられます。
割引は、安く売るためではなく、買う理由を作るために使う。
安売りを続けるのではなく、初回購入、再購入、LINE登録、季節商品、在庫調整など、目的に合わせて使う。
それが、利益を守りながら売上を伸ばすキャンペーン設計です。
第28章では、実店舗、催事、ポップアップ販売にも対応できる多店舗・催事ECの設計を学んでいきます。