サブスクリプションの一時停止と再開ができるモバイルアプリを作る
顧客がサブスクリプションを一時停止/再開できるモバイルアプリを設計・構築する方法。課金ルール、UXパターン、ロールアウト手順を解説します。

一時停止/再開のユースケースを明確にする
何かを作る前に、「一時停止」と「再開」があなたのプロダクトで何を意味するかを定義してください。これらの言葉は一見明白ですが、顧客は違う解釈をすることがあり、課金システムも同様です。信頼できる機能を素早く出す最速の方法は、定義に合意し、その定義をUX、バックエンド、課金に一貫して実装することです。
「一時停止」をビジネスの言葉で定義する
一時停止中に何が変わるかを決めてください:
- アクセス/権利(entitlements): ユーザーは即座にアクセスを失うのか、現在の請求期間の終了までアクセスを維持するのか、部分的なアクセス(例:読み取り専用)を残すのか。
- 課金: 完全に請求を停止するのか、次回更新日を遅らせるのか、クレジットを発行するのか。
- 期間: 最小/最大の一時停止期間はあるか(例:1〜12週)?年間で複数回一時停止できるか?
その後、同様に「再開」を明確に定義してください。例えば「再開」は“即時に再有効化して今請求する”か、“即時に再有効化するが請求は次回更新日に開始する”のどちらかです。プランごとに一つを選んでください(ユーザーごとに変えない)。
サポートするサブスクリプションタイプを列挙する
一時停止/再開ルールはサブスクリプションタイプによって異なることが多いです。v1で対象とするものを明記してください:
- 月次プラン: 通常は最も単純—一時停止期間だけ次回更新日を先に伸ばすことが一般的です。
- 年次プラン: 一時停止が期間を延長するのか、日割りクレジットを与えるのか、あるいは許可しないのかを決める。
- 無料トライアル: 残りのトライアル日数を凍結するのか、トライアルを終了するのかを考慮する。
アプリ内課金をサポートする場合、Apple/Googleの規約で可能なことと、サービス側の"アカウントレベル"で処理すべきことを確認してください。
一時停止できる人を明確にする
対象を定義してください:全ユーザーか、特定プランのみか、支払い状況が良好なユーザーのみか、最低加入期間が必要か。セルフサービスのみかサポート承認が必要かも決めてください。
実際の依存関係を洗い出す
アプリでの「サービス提供」が何を意味するかをリストアップしてください。これはエッジケースを導きます:
- 配送: 注文の一時停止、輸送中の出荷、前払い在庫、住所変更。
- コンテンツアクセス: オフラインダウンロード、保存アイテム、会員専用コンテンツ。
- 予約: 既存の予約、キャンセルルール、一時停止中の再スケジューリング。
これらを明確にしておくと「一時停止なのに料金が発生した」や「再開したのに動作しない」といった混乱を防げます。
一時停止ポリシーと課金ルールを決める
ユースケースが明確になったら、それを文書化した一時停止ポリシーに落とし込んでください。明確なポリシーはサポートチケット、返金紛争、課金の不整合を防ぎます。
許可する一時停止期間を選ぶ
分かりやすいオプションから始めましょう。多くのアプリは固定選択肢(例:2週間、1か月、2か月)を提供します。固定選択は課金やレポートで予測しやすくなります。カスタム日付は柔軟に見えますが、タイムゾーンや月末の処理、プロモーションの重複などエッジケースが増えます。
実務的な中間案としては、ほとんどのユーザーには固定期間を提供し、カスタム日付は年次プランやサポート対応の例外にする、という方法です。
頻度制限とエッジケースの扱いを設定する
顧客がどのくらいの頻度で一時停止できるかを定義してください:
- 年間の最大一時停止回数(例:ローリング12か月で最大2回)
- 一時停止間の最小稼働期間(例:再度一時停止するには30日間アクティブである必要がある)
- 最小一時停止期間(例:少なくとも7日)—「ポーズホッピング」を防ぐため
また、ユーザーが更新日に一時停止した場合、トライアル中、請求書が保留中のときにどうするかを明確にしてください。昨日支払いが失敗した場合に一時停止を許可するかどうかなど、明示的にルールを書きましょう。
一時停止中にどの特典が継続するか決める
サブスクリプションが提供するすべての権利を列挙し、一時停止中に「継続する」か「停止する」かを選んでください:
- アプリアクセス(フル、読み取りのみ、ロック)
- 使用量クレジット/割当(凍結、継続、リセット)
- プレミアムサポートやコーチングセッション
また、既にダウンロードしたコンテンツを消費できるか、履歴データやエクスポートを許可するかもここで決めます。
更新と請求書のシフトを文書化する
多くの製品は一時停止期間だけ次の請求日を前倒しにします(顧客にとって最も分かりやすいモデル)。例:更新日は5月10日、ユーザーが4月20日に30日間一時停止した→次回更新日は6月9日/10日("深夜で終わる"のルール次第)。
按分(proration)についても明確にしてください:未使用期間を返金するのか、クレジット残高を作るのか、単に契約期間を延長するのか。これらのルールを平易な言葉で書き、アプリ内の確認画面に反映させましょう。
サブスクリプションのデータモデルと状態を設計する
一時停止/再開を正しく扱うには、データモデルに明確な“単一の真実”が必要です。アプリ、バックエンド、課金システムが一人のユーザーが一時停止中かどうかで不一致だと、二重請求やアクセス欠如、調査の難しいサポートチケットが発生します。
モデル化すべきコアエンティティ
最低でも、以下を定義してください:
- Plan: 顧客が購入したもの(価格、請求間隔、トライアル規則、一時停止の可否)。
- Subscription: プランへの顧客の登録(現在の状態、更新日、App Store/Google PlayなどのプロバイダID、顧客識別子)。
- PausePeriod: 各一時停止の記録(開始時刻、予定終了時刻、実際の再開時刻、理由、実行者)。
- Invoice(または Transaction/Charge): 請求内容(金額、通貨、課金期間、支払いステータス、失敗理由)。
- Entitlement: 顧客が利用できるもの(機能/コンテンツ、上限、有効期間)。これはサブスクリプション状態とビジネスルールから導出できるべきです。
サブスクリプション状態(シンプルに)
皆が理解できる小さな状態セットを使ってください:
- active: アクセス許可、課金は正常。
- paused: アクセスはポリシーに従って制限される。課金挙動はルール依存。
- past_due: 支払い失敗、アクセスが制限される場合あり。
- canceled: 顧客またはシステムが更新を停止。
- expired: 期間終了(通常はキャンセルや未払い後)でアクセス不可。
状態遷移とトリガー
サブスクリプションをある状態から別の状態へ移す条件を定義してください:
- ユーザー操作: 「一時停止」→
active → pausedを作りPausePeriodを生成。 - ユーザー操作: 「再開」→
paused → activeとしてPausePeriodを終了。 - システムジョブ: 予定終了時の自動再開(
paused → active)。 - 課金ウェブフック/ジョブ: 支払い失敗(
active → past_due)、回復(past_due → active)、キャンセル後の期間終了(canceled → expired)。
監査履歴(必須)
サブスクリプション変更の不変の監査ログを保存してください:誰が(ユーザー、管理者、システム)、いつ、何が変わったか、なぜ(理由コード)。これはサポート、返金、コンプライアンスに不可欠です。
一時停止/再開のモバイルUXを設計する
一時停止/再開の体験は、配達日の変更をするような感覚で簡潔かつ予測可能であるべきです。ユーザーに課金システムを理解させる必要はなく、「何が変わるか」「いつ変わるか」を知れば十分です。
明確なサブスクリプションステータスカードから始める
サブスクリプション画面の上部にステータスカードを置き、現在の状況が一目で分かるようにしてください。表示項目例:
- 現在のステータス(Active、Paused、Scheduled to pause)
- 次回請求日(または一時停止中は「課金は○○に再開」)
- アクセス状況(一時停止中に何が使えるか)
このカードは、一時停止したことを忘れているユーザーの混乱を防ぎ、サポート件数を減らします。
シンプルな一時停止オプションを提示する
ユーザーが Pause をタップしたときは選択肢を短く分かりやすく:
- 1週間
- 1か月
- 日付を選ぶ(カレンダー)
また、計算された一時停止終了日を即座に表示してください(例:「3月18日まで一時停止」)。可能であれば制限(「最大3か月まで一時停止できます」など)を小さく表示します。
確定前に影響を表示する
ユーザーが確定する前に、平易な言葉で影響を説明する確認画面を表示してください:
- アクセスの変更: 一時停止中に何が使えて何が使えないか
- 課金のシフト: 新しい次回請求日と按分があるかどうか
- サービスの変更: スキップされる出荷/予約/サポート特典
あいまいな文言は避け、可能な限り具体的な日付や金額を使ってください。
再開や調整を簡単にする
一時停止中は主なアクションを2つ見えるようにしてください:
- 今すぐ再開(即時にアクセスと課金を再開)
- 一時停止終了日の変更(キャンセルせずに戻り日を編集)
変更後はステータスカードに成功状態と「次に何が起きるか」の短いまとめを表示して信頼を補強します。
一時停止/再開のためのバックエンドAPIを作る
アプリ上では即時に感じられる機能でも、安全で予測可能、サポートしやすくするのはバックエンドAPIです。
認証と認可
すべてのサブスクリプション操作に対して認証済みユーザーを要求してください。次にサブスクリプションレベルでの認可を行う:呼び出し元はサブスクリプションの所有者であるか(または管理者/サポート権限があるか)を検証します。ファミリープランやエンタープライズアカウントをサポートする場合は、「アカウントオーナー」と「メンバー」で権限を分けるか決めてください。
また、プラットフォーム制約を検証してください。たとえば、サブスクリプションがApple/Googleで管理されている場合、APIはユーザーの意図(intent)を保存しストアのステータスを読み取るだけで、直接課金を変更できない場合があります。
最初はコアなエンドポイントに絞る
最初のバージョンでは小さく明示的に保ちます:
GET /subscriptions/{id}: 現在のステータス、次回請求日、一時停止可否、予定されている一時停止/再開POST /subscriptions/{id}/pause: 今すぐ一時停止、または予定一時停止(start_date, 任意のend_date)POST /subscriptions/{id}/resume: 即時再開、または予定再開PUT /subscriptions/{id}/pause-schedule: 既存のスケジュールを更新(日時、理由)
各レスポンスは正規化されたボディ(サブスクリプション状態 + “次に何が起きるか”)を返し、アプリがUIを推測しないようにします。
冪等性:二重変更を防ぐ
モバイルはネットワーク不安定でユーザーが二重タップしがちです。pause/resume リクエストには Idempotency-Key ヘッダを要求してください。同じキーが再送された場合は元の結果を返し、二重適用を防ぎます。
ユーザーフレンドリーなエラー(次のステップ付き)
明確なエラーコードとメッセージを使ってください。例:SUBSCRIPTION_NOT_ELIGIBLE, ALREADY_PAUSED, PAUSE_WINDOW_TOO_LONG。next_allowed_action, earliest_pause_date、または /help/subscriptions のようなリンクを含め、UIがユーザーを案内できるようにします。
Koder.ai で実装を早める(オプション)
小規模チームでこの機能を作るなら、Koder.ai のようなvibe-codingプラットフォームでプロトタイプを素早く作れます:Reactベースの管理/サポート画面、サブスクリプション状態マシン用のGo + PostgreSQLバックエンド、必要ならFlutterのモバイル画面。プラン決定を仕様に固定するPlanningモードや、スナップショット/ロールバックは課金ロジックを反復する際のリスクを下げます。
課金ロジックと支払い処理を実装する
課金は「一時停止」を顧客への約束に変えるポイントです。目標は:予測可能な請求、明確な更新タイミング、支払い失敗後に誤ってアクセスを許可しないこと。
会計アプローチを選ぶ
一般に実用的なパターンは2つあります:
- 状態変更を保存し、次回請求で新しい状態を反映する。
paused_at,resume_atを記録し、次回請求日をオンザフライで計算する。台帳がクリーンになるが、日付計算を慎重に行う必要がある。 - 明示的な按分調整を作る。 一時停止開始(または終了)時に未使用時間のクレジット/請求を生成する。請求書は透明になるが複雑さとエッジケースが増える。
どちらかを選び、Web・モバイル・サポートツールで一貫して使ってください。
更新日移動と請求タイミング
一時停止が「時間を凍結する」のか「サイクルをスキップする」のかを決めてください:
- 時間を凍結する: 更新日を一時停止期間分だけ前に伸ばす。顧客は「支払った分を保持している」と感じる。
- サイクルをスキップする: 一時停止中は予定の更新をキャンセルし、再開時に決まったスケジュールで課金を再開する。
また、再開時にいつ請求するかも決めてください:即時請求(従量課金やアドオンがある場合に一般的)か、次回更新日に請求(単純な月次プランで一般的)か。
未払い請求と支払い失敗の扱い
一時停止リクエストは支払い失敗直後に来ることが多いです。明確なルールを決めてください:
- 未払い請求がある場合、支払いが完了するまで一時停止をブロックするか、一時停止は許可するがアクセスを停止するか。
- 債務を許可して一時停止する場合は、督促メールを引き続き送信し、サポートが残高を確認できるようにする。
これらのルールをヘルプセンターとアプリ内文言で文書化して、顧客が驚かないようにしてください。
下流システムへ課金イベントを発行する
課金に関連する変更はすべて subscription_paused, invoice_payment_failed, subscription_resumed, renewal_date_changed のようなイベントを発行してください。これらをメール、CRM、分析、サポートシステムにルーティングして、メッセージとレポートの整合性を保ちます。簡単なイベントログは紛争解決にも役立ちます。
権利(Entitlements)とサービス提供を同期する
一時停止/再開が機能するためには、顧客が“実際に使えるもの”がサブスクリプションの真の状態と一致している必要があります。UI上の「一時停止」バッジだけでは不十分です—権利チェック、フルフィルメントシステム、キャッシュの挙動がデバイス間で一致するようにしてください。
サブスクリプション状態と権利をマッピングする
active と paused(および利用する他の状態、例:猶予期間)での権利マトリクスを定義してください。
例:
- Active: 有料機能/コンテンツへフルアクセス、出荷は予定通り、プレミアムサポート有効
- Paused: 課金は停止または延期、プレミアムアクセスは制限(または一部許可)、出荷は停止
権利評価は可能な限りサーバ駆動にし、アプリは起動時と一時停止/再開後に現在の権利セットを取得し、短い期限でキャッシュしてください。
物理商品を出荷する場合:フルフィルメントを停止・再スケジュールする
物販の場合、一時停止は将来の出荷を即座にブロックする必要があります。通常は:
- 次のフルフィルメントジョブをキャンセルまたは保留にする
- 再開時に次の出荷日を再計算する(ポリシーで約束していない限り"追いつく"ことはしない)
- 締切後(箱詰め済みなど)は出荷される可能性がある旨をユーザーに伝える
コンテンツを配信する場合:何がアクセス可能か決める
コンテンツサブスクリプションは、顧客に理解されるポリシーが必要です。選択肢の例:
- 一時停止中はアクセスを完全に凍結する
- 既にダウンロード済みのコンテンツは許可するが新しいダウンロード/ストリーミングはブロックする
- 一時停止中に限定的な「フリーティア」体験を残す
どれを選んでもプラットフォームとデバイスを横断して一貫して適用してください。
マルチデバイスセッションとキャッシュされたアクセス
ユーザーは片方のデバイスで一時停止し、すべてのデバイスにすぐ反映されることを期待します。短命のアクセストークンを使い、アプリ復帰時に権利を更新し、状態変化時にセッションを無効化してください。オフライン/キャッシュされたアクセスはルールを明確に(例:最終権利更新からX時間は再生を許可)し、アクセスが制限されたときはアプリ内メッセージで通知します。
通知、メール、アプリ内メッセージ
一時停止と再開は意思の強いタイミングです:ユーザーはリクエストが成功したかを確認したがり、請求が再開されるときに驚きたくありません。良いメッセージはサポートチケットを減らし、忘れての解約を防ぎます。
何をいつ送るか
ユーザーの一時停止日と課金ルールに紐づけたシンプルなタイムラインから始めてください:
- 一時停止確認(即時): 一時停止開始日、一時停止中のアクセス挙動、予定再開日(または手動再開)を確認
- 再開直前(予定): サービスや請求が再開される3〜7日前にリマインドし、管理画面へのディープリンクを付ける
- 再開(即時): サービスが復活したことと次回請求日を通知
複数回の一時停止を許可する場合は、残りの回数や制限情報も含めてユーザーが可能な行動を理解できるようにします。
オプトイン/オプトアウトとプラットフォーム規則
チャネルごとに扱いを分けてください:
- メール: 設定で明確にオプトイン/オプトアウトできるようにする。多くのアプリは取引通知(例:「サブスクリプションが一時停止されました」)をマーケティングメールとは別に送信できるようにする—これを明示してください。
- プッシュ通知: 価値がある場面でのみ許可を求める(例:ユーザーが一時停止をスケジュールした直後)。「更新リマインダー」や「サブスクリプション更新」のトグルを提供する。
- アプリ内インボックス/バナー: プッシュが無効でも重要なタイミングに使えるようにする。
App Store/Google Playの通知や同意に関する要件も反映してください。
驚きを防ぐアプリ内メッセージ
特に支払い方法に問題がある場合、更新再開前に軽いバナーやモーダルを出しておくと良いです。アクション志向で:「プランを確認」「支払い情報を更新」「一時停止を延長(条件があれば)」など。詳しい説明が必要なユーザーには /help/subscriptions などのヘルプリンクを付けてください。
分析と成功指標
一時停止/再開は単なる機能ではなくプロダクトの一部です—そのため機能が顧客維持に効いているか、正しく動作しているかを示す指標が必要です。
適切なイベントを計測する
小さく一貫したイベントセットを追跡し、後でサブスクリプション状態や収益と結合できるようにしてください。最低限:
- pause_started(含む: subscription_id, user_id, plan, pause_length, platform, entry_point)
- pause_ended(含む: ended_by = scheduled|user_resume|admin, effective_date)
- resumed_early(含む: days_paused, reason_if_provided)
加えて resume_failed(エラーカテゴリ付き)を記録すると、サポートに上がらない問題も検出できます。
影響を測る(使用量だけでなく)
高い一時停止率が自動的に良いとは限りません。次のようなアウトカム指標と組み合わせて評価してください:
- 解約率低減:一時停止を使ったユーザーと似た条件の一時停止を使わなかったユーザーの解約率を比較(プラン、加入期間、獲得チャネルでコホート化)
- 再活性化率:一時停止後に課金が再開される割合(および30/60/90日後の継続率)
- サポートチケットの抑制効果:サブスクリプション関連の問い合わせ(「解約したい」「課金の混乱」「再開できない」など)の変化
可能なら、一時停止があるコホートとないコホートの純収益維持率(net revenue retention)も追ってください。
理由を軽く取得する
ユーザーが一時停止する際に任意で理由を選べるようにしてください(オプションで自由記述を出すのは、扱える場合のみ)。選択肢は短く(5〜7個)し、判断的なラベルは避けてください。こうすることで「一時的な事情(旅行、予算)」と「プロダクトの欠落(使っていない、機能不足)」を区別できます。
アクションにつながるダッシュボードを作る
運用上の問題を早く発見できるダッシュボードを用意してください:
- 時系列の一時停止数(プラン/プラットフォーム/アプリバージョン別)
- ファネル:一時停止画面を開く → 確認 →
pause_started - 再開失敗(率、エラーカテゴリ、影響バージョン)
- 一時停止の中央値時間と分布(早期に戻る割合 vs 予定どおり戻る割合)
ローンチ時は週次で、それ以降は月次でレビューし、学びを /blog やプロダクトロードマップに反映して一時停止を維持戦略の一要素にしてください。
テスト戦略とエッジケース
一時停止/再開は課金、権利、UX をまたぐため、バグは「アクセスが消えた」や「二重請求された」といった重大な形で現れます。良いテスト計画は状態変化、日付計算、冪等性(安全なリトライ)に焦点を当てます。
ユニットテスト:状態と日付
最低限、サブスクリプション状態マシンとあなたが管理する日付計算についてユニットテストを作成してください:
- 状態遷移:
active → paused,paused → active,active → canceled,paused → canceled。無効な遷移は拒否されることを確認する。 - 請求日計算:一時停止時に次回更新日が正しく動くこと。1月31日のような月末ドリフト、タイムゾーン、サマータイムのケースを含める。
- 按分ルール(該当する場合):クレジットの繰越や「再開時請求」がポリシーに一致するかを確認する。
統合テスト:プロバイダコールバック、再試行、順序
支払プロバイダはウェブフックを複数回、順不同で送ることがあります:
- 重複コールバック処理を検証する(冪等性キー、イベントID)。
- リトライ挙動をテストする:ウェブフックが遅延して届いた、サーバが500を返した、プロバイダが再送—二重で一時停止/再開が適用されないことを確認する。
- 競合状態:ユーザーが「一時停止」をタップした同時刻に更新支払いが処理されているケースを扱う。
アプリテスト:現実的なUX障害モード
モバイル特有の状況は微妙なエッジケースを生み、課金バグのように見えることがあります:
- オフラインモード:接続なしで一時停止要求を出した場合、アクションをキューに入れて明確なメッセージと安全な再試行を行う。
- 連続タップ:急速にPause/Resumeを連打しても複数リクエストが発生しないようにボタンを無効化し、APIは冪等に対応する。
カバーすべきシナリオ
エンドツーエンドのシナリオをスクリプト化してテストしてください:
- トライアルユーザー:トライアル中の一時停止、トライアル終了後の再開、期待しない課金が発生しないことを確認。
- 年次プラン:多くのチームが年次プランで一時停止を許可しないか別扱いにするため、ルールを検証し更新日が一貫することを確認する。
- 滞納アカウント:一時停止で未払いが消えないこと、再開は回収ルールに従うことを確認する。
テストチェックリストをプロダクト仕様の近くに置き、課金ルールの変更があればテストケースを自動で更新するようにしてください。
セキュリティ、プライバシー、コンプライアンス
一時停止/再開は単純なトグルに見えますが、課金・アクセス・顧客権利を変えるため、サインアップや支払いと同等の注意が必要です。
Pause/Resume API を保護する
これらのエンドポイントは悪用される可能性があります(例:ボットが繰り返し一時停止して請求を回避する)。支払いエンドポイントと同様に保護してください:
- ユーザー/デバイスごとのレート制限とクールダウン(例:1時間に1回の変更)を設ける。
- リプレイ防止を追加する:短命の冪等キー、サーバサイドのノンス、タイムスタンプ検証を使う。
- 強い認証(最近のログイン、デバイス紐付けトークン)を要求し、ハイリスクアカウントにはステップアップ認証を検討する。
監査性と紛争処理
すべてのサブスクリプション状態変更の監査トレイルを記録してください。誰が(ユーザー/管理者/システム)、いつ、どのアプリバージョンから、どのように状態を変更したかをログに残すことで、サポート・返金・チャージバック対応が容易になります。
監査ログは改ざん検知可能にし、アクセス制御をかけてください。カード情報や不必要な個人情報をログに入れないよう注意してください。
プライバシー設計
保存する個人データは最小限に抑え、必要なものだけ収集してください。機密フィールドは静止時に暗号化し、常にTLSで転送してください。スタッフには最小権限を与え、保持ルール(古いレコードの削除または匿名化)を設定してください。
アカウント削除をサポートする場合は、一時停止中のサブスクリプションや課金トークンの扱いを正しく実装してください。
法令・プラットフォーム規則
更新、キャンセル、開示に関する地域の消費者ルールを確認してください。多くの地域で価格、更新条件、簡単なキャンセル方法の明示が求められます。
また、Apple/Googleのサブスクリプションポリシー(課金、権利アクセス、返金処理など)に従ってください。支払いプロセッサを使う場合は、カード処理がトークン化されていてもPCI要件に合わせた実装が必要です。
ロールアウト計画と継続的運用
「一時停止と再開」を出すのは一回限りのリリースではありません。課金に関わる変更として徐々に展開し、実際の挙動を監視し、運用体制を整えておいてください。
段階的に公開する
機能フラグから始め、内部グループ→ベータコホート→段階的ロールアウト(例:5% → 25% → 100%)の順で広げてください。これにより収益保護とサポート負荷の管理ができます。
段階的拡大時に監視する項目:
- 一時停止試行数と成功数(主要なエラー理由)
- 再開試行と支払い失敗率
- 返金/チャージバックの変化
- サブスクライバー当たりのサポート問合せ率
運用準備:サポートとFAQ
ローンチ前にサポート用プレイブックを作っておいてください。スクリーンショット、期待されるタイムライン("一時停止は次回請求周期から開始" vs "即時開始")、よくある質問のテンプレートを含めます:
- 「一時停止中に請求されたのはなぜ?」
- 「一時停止中にアプリは使えますか?」
- 「どうやって再開して、いつ請求が再開しますか?」
ヘルプセンターに明確なFAQを公開し、プラン比較やアップグレード用に /pricing へのセルフサーブパスを用意しておくと、ユーザーが一時停止・ダウングレード・請求周期変更を自分で判断しやすくなります。
後方互換性とバージョニング
古いアプリバージョンが「paused」状態に遭遇しても安全に扱えるように計画してください。最低限:
- 「subscription paused」の中立的な表示(エラーではない)
- プレミアム機能を一貫してブロックする
- アップデートを促すのは本当に必要な場合のみ
最後に、定期的な監査スケジュールを作っておいてください:月次でエッジケースの請求結果、ポリシーのズレ(例:新プランで一時停止ルールが設定されていない)、アプリストアガイドラインの変更をチェックします。
よくある質問
サブスクリプションアプリで「一時停止」と「再開」はどう定義すべき?
ビジネスの言葉で両方を定義してください:
- Pause(一時停止):アクセス、課金、期間に何が起きるか(例:アクセスが即時停止、課金は延期、更新日が延長されるなど)。
- Resume(再開):即時に再有効化して今請求するのか、再開はするが請求は次回更新日に行うのか。
各プランごとにこれらのルールを書いておくと「一時停止したのに課金された」といった混乱を防げます。
一時停止は次の請求日にどう影響しますか?
多くのプロダクトは次のいずれかを採ります:
- 時間を凍結する(一般的):一時停止した期間だけ次の更新日を先に伸ばす。
- サイクルをスキップする:一時停止中は更新を止め、再開時に課金を再開する。
どちらかを選び、確認画面で「次の請求日」を必ず表示してください。
v1ではどんな一時停止期間や制限を提供すべき?
シンプルで予測可能な選択肢から始めてください:
- 1週間 / 1か月 / 2か月のような固定オプションはエッジケースを減らします。
- 最小一時停止期間(例:7日)を設けて「ポーズ跳び」を防ぎます。
- 最大期間(例:12週間)を設けて収益リスクを制限します。
カスタム日付は例外(年次プランやサポート対応)に限定すると良いです。
月次/年次/トライアルで一時停止はどう扱うべき?
サブスクリプション種別ごとに明確に扱ってください:
- 月次:最も扱いやすく、通常は一時停止期間だけ更新日を伸ばす。
- 年次:期間を延長するか、時間に応じてクレジットを付与するか、一時停止不可にするかを決める。
- トライアル:残りのトライアル日数を凍結するのかトライアルを終了するのか決める。
これらの違いをヘルプと確認画面で記載してください。
一時停止/再開に必要なサブスクリプション状態とデータモデルは?
少数で分かりやすい状態を使い、遷移を明確にしてください:
active,paused,past_due,canceled,expired
各一時停止は個別のレコード(例:PausePeriod に開始・終了・実際の再開時刻)として保存し、誰がいつ何をしたかを残す不変の監査ログを必須にしてください。
一時停止/再開に必要なバックエンドAPIは何ですか?
最小限で明確なエンドポイントを用意してください:
GET /subscriptions/{id}: ステータス、次回請求日、停止可否POST /subscriptions/{id}/pausePOST /subscriptions/{id}/resumePUT /subscriptions/{id}/pause-schedule
各レスポンスは「現在の状態 + 次に何が起きるか」を正規化して返し、アプリ側が推測しないようにします。
ダブルタップやリトライで重複した一時停止/再開操作が起きるのをどう防ぐ?
書き込み系リクエストで**冪等性(idempotency)**を使ってください:
pause/resumeリクエストにはIdempotency-Keyヘッダを必須にする。- 同じキーが再送されたら、最初の結果を返して二重適用を防ぐ。
UI側でもボタンを無効化し、ローディングを示して二重送信を防ぎます。
一時停止中にユーザーは何にアクセスできるべき?
事前に権利(entitlement)の挙動を決め、サーバ側で強制してください:
- フルアクセス/読み取りのみ/ロック
- 既にダウンロードしたオフラインコンテンツを許可するかどうか
- 使用量クレジットの凍結・維持・リセット
アプリは起動時や一時停止後にサーバで最新の権利を取得し、短いキャッシュ期間を設けて整合性を保ちます。
未払い・支払い失敗がある場合、一時停止はどう扱うべき?
負債や支払い失敗がある場合のルールを明確にしてください:
- 未払いの請求書があるときに一時停止をブロックするか、許可するがアクセスを停止するかを決める。
- 一時停止で過去の未払い残高が消えることはない。
invoice_payment_failedやsubscription_pausedのようなイベントを発行してサポートと通知を連携させる。
エラーは SUBSCRIPTION_NOT_ELIGIBLE のような分かりやすいコードと次のアクションを含めて返してください。
ユーザーが一時停止/再開したとき、どんな通知を送るべき?
送るべきメッセージとタイミングの基本:
- 一時停止確認(即時):開始日、アクセスへの影響、予定再開日(または手動再開と明記)
- 再開直前のリマインダー:請求/サービス再開の3〜7日前に深いリンク付きで通知
- 再開確認(即時):サービスが復活したことと次回請求日
リンクは相対パス(例:/help/subscriptions)を使い、残りの停止可能回数などの情報を含めると親切です。