TEXTBOOK SECTION / AI LEARNING

定期購入・サブスクリプション

Square API × Next.js 実践EC開発|自社ECを低コストで作る、決済・在庫・注文管理の設計と実装の「応用編:本格ECへ拡張する」より、定期購入・サブスクリプションを解説。生成AI、AI活用、DX、業務改善を実践しながら学べるオンライン教材です。

2応用編:本格ECへ拡張するEC

OVERVIEW

この節で学べること

概要を表示する
項目内容
教材名Square API × Next.js 実践EC開発|自社ECを低コストで作る、決済・在庫・注文管理の設計と実装
応用編:本格ECへ拡張する
定期購入・サブスクリプション
カテゴリEC
学習内容生成AI、AI活用、DX、業務改善を実践しながら理解するための教材です。

TABLE OF CONTENTS

目次

CONTENT

ここから

第25章では、会員機能について学びました。

会員機能を入れると、注文履歴、再購入ボタン、住所保存、マイページなどを作れるようになります。

この章では、さらに一歩進めて、定期購入・サブスクリプションを扱います。

定期購入とは、購入者が一度申し込むと、決まった間隔で商品が届き、継続的に支払いが発生する販売方法です。

初回申し込み
  ↓
毎月決済
  ↓
商品を発送
  ↓
翌月も決済
  ↓
商品を発送

食品、日用品、消耗品のECでは、定期購入があると売上が安定しやすくなります。

ただし、通常購入よりも設計は複雑です。

決済、注文、在庫、発送、スキップ、停止、解約、メール通知などを整理する必要があります。

攻略本風に言えば、第26章は**「一度きりの購入を、続く購入に変えるステージ」**です。


26.1 定期購入モデルの基本

定期購入の基本は、同じ商品やサービスを一定間隔で届けることです。

たとえば、次のような販売方法です。

毎月1回、だしパックを届ける
2か月に1回、コーヒー豆を届ける
毎月、化粧品を届ける
季節ごとにギフトセットを届ける

通常購入と定期購入の違いを整理します。

通常購入:
購入者が毎回注文する

定期購入:
最初に申し込むと、決まった間隔で継続される

通常購入の流れです。

商品を選ぶ
  ↓
決済する
  ↓
発送する
  ↓
完了

定期購入の流れです。

定期購入を申し込む
  ↓
初回決済
  ↓
初回発送
  ↓
次回決済日を待つ
  ↓
継続決済
  ↓
次回発送

定期購入で設計する項目は、次の通りです。

・対象商品
・価格
・配送間隔
・初回決済日
・次回決済日
・次回発送日
・スキップ可否
・停止可否
・解約条件
・在庫確保方法

定期購入は、購入者にとって便利な仕組みです。

買い忘れを防げる
毎回注文しなくてよい
使い切る頃に届く

店舗にとってもメリットがあります。

売上予測がしやすい
在庫計画が立てやすい
リピート導線を作りやすい
顧客との関係が続く

ただし、説明が不十分だとトラブルになります。

いつ請求されるのか分からない
いつ届くのか分からない
解約方法が分からない
スキップできるか分からない

定期購入では、売る前にルールを明確にすることが重要です。

いつ
何が
いくらで
どの頻度で
どう止められるか

これを購入前に分かるようにします。


26.2 Square Subscriptions APIの考え方

Squareには、定期購入を扱うためのSubscriptions APIがあります。

SquareのSubscriptions APIは、開発者がアプリケーションにサブスクリプション機能を組み込むためのAPIです。Squareの公式ドキュメントでは、まずCatalog APIでSubscription PlanやPlan Variationを作成し、その後Subscriptions APIでサブスクリプションを作成・管理する流れが説明されています。(

Square

)SquareのSubscriptionは、顧客と販売者の間で、決められたスケジュールに従って支払いを行う約束を表すオブジェクトです。Subscriptionは

customer_id

location_id

に紐づきます。(

Square

)

基本の関係は、次のようになります。

Catalog API:
定期購入プランを作る

Subscriptions API:
顧客を定期購入プランに登録する

Customers API:
顧客情報を管理する

Invoices / Payments:
請求や支払い結果を確認する

Webhooks:
定期購入や支払いの変化を受け取る

イメージです。

定期購入プラン
  ↓
顧客が申し込む
  ↓
Square Subscriptionを作成
  ↓
Squareが継続課金を管理
  ↓
Webhookで状態変化を受け取る
  ↓
自社ECで注文・発送を管理

本書のECでは、次のように責務を分けます。

Squareに任せる:
継続課金
Subscription ID
請求状態
支払い状態

自社ECで管理する:
商品ページ
申込画面
定期購入一覧
発送予定
在庫
メール通知
管理画面

Subscriptions APIを使う場合、通常購入よりもSquare側の設計が少し複雑になります。

特に、次の情報を保存しておく必要があります。

・Square Customer ID
・Square Subscription ID
・Square Plan Variation ID
・自社ユーザーID
・自社定期購入ID
・次回発送予定日
・定期購入ステータス

定期購入では、支払いだけでなく、発送も繰り返されます。

そのため、SquareのSubscriptionだけを見て終わりではなく、自社EC側で「次に何を発送するか」を管理します。

Square:
継続課金の状態

自社EC:
発送すべき注文の状態

ここを分けて考えることが、定期購入ECの基本です。


26.3 定期便ECの注文設計

通常購入では、1回の決済に対して1つの注文を作ります。

1回購入
  ↓
1注文
  ↓
1発送

定期購入では、1つの契約から複数の注文が発生します。

定期購入契約
  ↓
1回目の注文
  ↓
2回目の注文
  ↓
3回目の注文

そのため、定期購入では、契約情報毎回の注文を分けて管理します。

subscriptions:
定期購入の契約情報

orders:
各回の注文情報

order_items:
各注文の商品明細

データ構造のイメージです。

subscriptions
  id
  user_id
  square_subscription_id
  status
  interval
  next_billing_date
  next_shipping_date

orders
  id
  subscription_id
  status
  total_amount
  billing_cycle
  created_at

TypeScriptで考えると、次のようになります。

type SubscriptionStatus =
  | 'active'
  | 'paused'
  | 'cancelled'
  | 'past_due'
  | 'manual_review';

type SubscriptionInterval = 'monthly' | 'every_two_months' | 'quarterly';

type SubscriptionRecord = {
  id: string;
  userId: string;
  squareSubscriptionId: string | null;
  status: SubscriptionStatus;
  interval: SubscriptionInterval;
  nextBillingDate: string;
  nextShippingDate: string;
  createdAt: string;
};

各回の注文には、何回目の発送か分かる情報を持たせます。

type SubscriptionOrder = {
  id: string;
  subscriptionId: string;
  billingCycle: number;
  orderStatus: OrderStatus;
  totalAmount: number;
  scheduledShippingDate: string;
  createdAt: string;
};

たとえば、毎月1回の定期便なら、次のようになります。

subscription_id: sub_001

1回目:
billing_cycle: 1
order_id: ORDER-1001

2回目:
billing_cycle: 2
order_id: ORDER-1028

3回目:
billing_cycle: 3
order_id: ORDER-1054

このように分けると、契約は続いていても、各回の注文や発送を個別に管理できます。

契約:
継続中

今月分の注文:
発送済み

来月分の注文:
まだ作成前

定期便ECでは、契約と注文を同じものとして扱わないことが大切です。


26.4 初回購入と継続課金

定期購入では、初回購入と2回目以降の継続課金を分けて考えます。

初回購入は、購入者が申し込むタイミングです。

商品ページ
  ↓
定期購入を申し込む
  ↓
初回決済
  ↓
初回注文作成
  ↓
初回発送

2回目以降は、購入者が毎回購入ボタンを押すわけではありません。

決まったタイミングで継続課金が発生します。

次回決済日
  ↓
継続課金
  ↓
支払い成功
  ↓
次回注文作成
  ↓
発送準備

この違いを整理します。

初回:
購入者が操作する

2回目以降:
システムとSquareが処理する

初回購入で確認することです。

・顧客情報を作成する
・Square Subscriptionを作成する
・初回支払いを確認する
・自社subscriptionをactiveにする
・初回注文を作成する
・注文完了メールを送る

SquareのCreate subscription APIは、顧客をサブスクリプションに登録するAPIです。リクエストにカード情報がある場合、Squareはそのカードに対してサブスクリプションの請求を行う旨がAPIリファレンスに記載されています。(

Square

)

継続課金で確認することです。

・請求が成功したか
・支払い失敗していないか
・次回注文を作るか
・在庫は足りるか
・発送予定日はいつか
・メール通知を送るか

定期購入では、Webhookが重要になります。

通常購入では、決済完了のWebhookを受けて注文をpaidにしました。

定期購入でも、Square側の支払い状態やSubscription状態の変化を受け取る必要があります。

継続課金成功
  ↓
Webhook受信
  ↓
自社ECで次回注文を作成
  ↓
発送準備へ

ただし、Webhookイベントの設計はSquare側の仕様に合わせて確認が必要です。

本番実装では、使用するSquare API、Invoice、Subscription、Paymentのどのイベントを使うかを、Developer Dashboardと公式ドキュメントで確認します。Square Webhooksは、Squareアカウント内のイベントを指定URLへ通知する仕組みです。(

Square

)

初回と継続課金を混ぜない。

これが定期購入の基本です。


26.5 スキップ・停止・解約

定期購入で重要なのが、スキップ、停止、解約です。

購入者が続けやすい定期購入は、やめ方や休み方が分かりやすいです。

スキップ:
次回だけ休む

停止:
しばらく休む

解約:
定期購入を終了する

それぞれの違いです。

スキップ:
次回配送だけ不要。
その次から再開する。

停止:
再開するまで配送と請求を止める。

解約:
契約を終了する。
以後の請求と配送を行わない。

購入者にとって分かりにくい定期購入は、不信感につながります。

いつ止められるのか分からない
解約方法が分からない
電話しないと止められない
次回請求日が分からない

マイページでは、次の情報を表示します。

・現在のステータス
・次回請求日
・次回発送予定日
・配送間隔
・次回スキップボタン
・停止ボタン
・解約ボタン

画面イメージです。

定期購入中

商品:
だしパック定期便

配送間隔:
毎月1回

次回請求日:
2026年8月1日

次回発送予定日:
2026年8月3日

[次回をスキップする]
[一時停止する]
[解約する]

スキップ処理のイメージです。

次回注文予定
  ↓
購入者がスキップ
  ↓
次回分は作成しない
  ↓
さらに次の回へ予定を進める

解約処理では、注意文を表示します。

解約すると、次回以降の定期購入は停止されます。
すでに決済済み、または発送準備中の注文はキャンセルできない場合があります。

定期購入では、スキップ・停止・解約の締切日も決めておきます。

次回発送日の3日前まで変更可能
次回決済日の前日までスキップ可能
発送準備後は変更不可

ルールが曖昧だとトラブルになります。

購入前に、分かりやすく表示します。


26.6 在庫と定期購入の関係

定期購入では、在庫管理が通常購入より難しくなります。

通常購入では、購入されたタイミングで在庫を確認します。

購入
  ↓
在庫確認
  ↓
在庫を減らす

定期購入では、将来の発送分も考える必要があります。

今月分
来月分
再来月分

たとえば、定期購入者が10人いて、毎月1個ずつ商品を発送する場合です。

定期購入者:10人
1人あたり:1個
毎月必要在庫:10個

通常購入分もある場合は、さらに注意が必要です。

在庫:20個

定期便予定:10個
通常販売可能:10個

このように、定期購入分を別で考えると安全です。

総在庫:
20個

定期購入予約分:
10個

通常販売可能在庫:
10個

定期購入で在庫不足になった場合、対応を決めておきます。

・発送を遅らせる
・代替商品を案内する
・次回分をスキップする
・返金する
・手動確認に回す

在庫不足時に、自動で無理に請求や発送を進めると危険です。

継続課金成功
でも在庫不足
  ↓
manual_review

定期購入では、発送予定の数を事前に管理画面で確認できると便利です。

来月発送予定:
だしパック定期便 35件
クラシック節定期便 12件

これにより、仕入れや製造計画を立てやすくなります。

定期購入は売上を安定させますが、在庫の見通しも必要です。

定期購入者数
  ↓
次回発送数
  ↓
必要在庫
  ↓
仕入れ・製造

この流れを作ります。


26.7 メール通知

定期購入では、メール通知が非常に重要です。

通常購入よりも、購入者に伝えるべきタイミングが多いからです。

定期購入で送るメールには、次のようなものがあります。

・定期購入申込完了メール
・初回注文完了メール
・次回発送予定メール
・継続課金成功メール
・継続課金失敗メール
・発送完了メール
・スキップ完了メール
・停止完了メール
・解約完了メール

すべてを最初から作る必要はありません。

まずは、次の4つから始めるとよいです。

・申込完了メール
・次回発送予定メール
・発送完了メール
・解約完了メール

申込完了メールの例です。

件名:
定期購入のお申し込みありがとうございます

本文:
山田 太郎 様

このたびは定期購入にお申し込みいただき、誠にありがとうございます。

下記内容で定期購入を受け付けました。

商品名:だしパック定期便
配送間隔:毎月1回
初回発送予定日:2026年7月10日
次回請求予定日:2026年8月1日

変更や解約をご希望の場合は、マイページよりお手続きいただけます。

次回発送予定メールの例です。

件名:
次回定期便のお届け予定について

本文:
次回の定期便は、下記日程で発送予定です。

商品名:だしパック定期便
発送予定日:2026年8月3日

スキップや変更をご希望の場合は、2026年7月30日までにお手続きください。

課金失敗時のメールは特に大切です。

件名:
定期購入のお支払いを確認できませんでした

本文:
定期購入のお支払いを確認できませんでした。
お手数ですが、お支払い方法をご確認ください。

確認が完了するまで、次回発送を保留させていただく場合があります。

メール通知では、購入者が次に何をすればよいかを明確にします。

確認だけでよい
手続きが必要
期限までに変更が必要

定期購入は継続する仕組みだからこそ、メールで不安を減らすことが重要です。


26.8 管理画面での定期購入管理

定期購入を運用するには、管理画面も必要です。

通常注文の管理画面とは別に、定期購入一覧を用意します。

管理画面で見たい情報は、次の通りです。

・顧客名
・商品名
・定期購入ステータス
・配送間隔
・次回請求日
・次回発送予定日
・前回発送日
・スキップ状況
・課金失敗状況
・管理メモ

画面イメージです。

定期購入一覧

山田 太郎 様
だしパック定期便
ステータス:継続中
次回請求日:2026年8月1日
次回発送日:2026年8月3日

[詳細を見る]

定期購入詳細では、次の操作ができるようにします。

・ステータス確認
・次回発送日の変更
・スキップ設定
・停止
・解約
・管理メモ追加
・関連注文一覧の確認

定期購入詳細のイメージです。

定期購入詳細

顧客名:
山田 太郎 様

商品:
だしパック定期便

状態:
継続中

次回請求日:
2026年8月1日

次回発送日:
2026年8月3日

操作:
[次回をスキップ]
[一時停止]
[解約]
[管理メモを追加]

管理画面では、注意が必要な定期購入を見つけやすくします。

・課金失敗
・在庫不足
・発送予定日が近い
・手動確認
・解約依頼あり

特に、課金失敗や在庫不足は見落とすとトラブルになります。

課金失敗:
発送してはいけない可能性がある

在庫不足:
発送準備ができない

定期購入の管理画面では、「今日対応すべきもの」が分かることが大切です。

今日発送準備する定期便
今週請求予定の定期便
課金失敗した定期便
手動確認が必要な定期便

定期購入は、通常注文よりも時間軸が長い運用です。

そのため、一覧性と予定管理が重要になります。


26.9 食品・消耗品ECとの相性

定期購入は、食品や消耗品と相性が良いです。

理由は、使い切るタイミングがあるからです。

使う
  ↓
減る
  ↓
また必要になる

食品ECで相性が良い商品です。

・だしパック
・お茶
・コーヒー
・調味料
・米
・冷凍食品
・健康食品

消耗品ECで相性が良い商品です。

・化粧品
・スキンケア
・ペット用品
・洗剤
・日用品

定期購入の訴求では、値引きだけに頼らない方がよいです。

安いから続ける
  ではなく
便利だから続ける

食品ECでは、次のような言い方が自然です。

毎日の料理に使うものだから、なくなる前にお届けします。

消耗品では、次のように説明できます。

使い切る頃に届くので、買い忘れを防げます。

定期購入に向かない商品もあります。

・一点もの
・高額な工芸品
・購入頻度が低い商品
・季節限定で毎月必要ない商品
・好みが毎回大きく変わる商品

このような商品では、定期購入よりも再入荷通知やLINE登録の方が向いています。

定期購入に向く:
繰り返し使う商品

定期購入に向かない:
毎回選びたい商品

商品特性に合わせて導線を選びます。


26.10 トラブルになりやすいポイント

定期購入は便利ですが、トラブルになりやすいポイントもあります。

通常購入よりも、購入者との関係が長く続くためです。

代表的なトラブルです。

・定期購入だと分からず申し込んだ
・次回請求日が分からなかった
・解約方法が分からない
・スキップできると思っていた
・発送前に変更したかった
・課金されたのに商品が届かない
・在庫不足で発送が遅れた
・カード決済に失敗した
・住所変更を忘れていた

これらを防ぐために、購入前に説明を明確にします。

・これは定期購入である
・請求間隔
・初回金額
・次回以降の金額
・次回請求予定日
・解約方法
・スキップ条件
・変更締切

商品ページでは、次のように表示します。

この商品は定期購入です。
毎月1回、自動で決済され、商品をお届けします。

次回以降の変更・スキップ・解約は、マイページからお手続きいただけます。

申し込み直前にも確認を入れます。

定期購入として申し込みます。

商品:だしパック定期便
金額:3,000円
配送間隔:毎月1回
次回請求日:2026年8月1日

[内容を確認して申し込む]

解約導線を隠すのは避けます。

悪い例:
解約方法がどこにも書かれていない

よい例:
マイページから解約できることを明記する

また、決済失敗時の対応も決めておきます。

決済失敗
  ↓
購入者へメール
  ↓
発送を保留
  ↓
管理画面で確認
  ↓
再決済または停止

定期購入は、信頼が大切です。

購入者が「勝手に課金された」と感じると、ブランドへの信頼が落ちます。

定期購入では、
分かりやすさが信頼になる。

第26章のまとめ

定期購入・サブスクリプションは、ECの売上を安定させる強力な仕組みです。

一方で、通常購入よりも設計が複雑になります。

この章で覚えておきたいポイントは、次の通りです。

1. 定期購入は、決まった間隔で商品と支払いが続く仕組みである
2. Square Subscriptions APIでは、Catalog APIでプランを作り、Subscriptions APIで顧客を登録する
3. 定期便ECでは、契約情報と毎回の注文を分けて管理する
4. 初回購入と2回目以降の継続課金は別の流れとして設計する
5. スキップ、停止、解約のルールを分かりやすくする
6. 定期購入では、将来の発送分を考えた在庫管理が必要になる
7. メール通知で、次回請求日や発送予定を知らせる
8. 管理画面では、課金失敗、在庫不足、発送予定を見つけやすくする
9. 食品や消耗品は定期購入と相性が良い
10. 定期購入では、説明不足がトラブルになりやすい

定期購入の基本は、次の一言にまとめられます。

続けてもらう仕組みは、やめ方まで分かりやすくする。

申し込みやすいだけでなく、スキップ、停止、解約も分かりやすくする。

それが、信頼される定期購入ECの設計です。

第27章では、購入のきっかけを作るためのクーポン・割引・キャンペーン設計を学んでいきます。

FAQ

よくある質問

定期購入・サブスクリプションは医療関係者向けだけの内容ですか。
医療分野の例が含まれる場合もありますが、医療関係者だけに限定した内容ではありません。生成AI、AI活用、DX、業務改善、プロトタイプ開発など、一般的なAI学習の事例として読める内容です。
AI初心者でも読めますか。
はい。AIをこれから学ぶ方、数学が苦手な方、仕事でAIを使いたい方にも読み進めやすいように、教材の章と節の流れに沿って整理しています。
サムネイル画像は必ず表示されますか。
はい。教材にcoverUrlが設定されている場合はその画像を表示し、未設定の場合は代替サムネイル画像を表示します。
Square API × Next.js 実践EC開発|自社ECを低コストで作る、決済・在庫・注文管理の設計と実装のほかの章も読めますか。
はい。教材トップから章立てを確認でき、前後の節へもページ下部のナビゲーションから移動できます。