1 分

サブスクリプションプランと請求のためのウェブアプリを作る方法

サブスクリプション型のウェブアプリを構築する手順:プラン設計、チェックアウト、定期請求、請求書・領収書、税金処理、再試行/督促、分析、セキュリティのベストプラクティスを網羅したガイド。

サブスクリプションプランと請求のためのウェブアプリを作る方法

サブスクリプション事業の要件を明確にする

支払いプロバイダーを選んだりデータベースを設計したりする前に、何を売っていて顧客が時間とともにどう変化するかを明確にしてください。多くの請求に関する問題は、要件の不明瞭さが原因です。

リスクを早期に減らす助けとして、請求を単なるバックエンド機能ではなくプロダクトの表面(product surface)として扱ってください:チェックアウト、権限、メール、分析、サポートワークフローに触れます。

サブスクリプションモデルを定義する

まず製品の商業的な形を決めます:

  • B2B vs B2C: B2Bは通常、請求書、発注番号フィールド、チーム管理、管理者コントロールが必要です。B2Cは高速なチェックアウトと簡単な解約を重視します。
  • シート(Seats) vs 使用量(usage): シートは予測しやすい(例:$15/ユーザー/月)。使用量ベースの課金はメトリクスルール(何をカウントするか、いつ測るか、丸め方)と顧客向けの使用状況表示が必要です。
  • アカウント構造: 1人の“オーナー”が複数のメンバーを持つ構造ですか?1人が複数のワークスペースに属せますか?これらの決定は権限、請求連絡先、誰が解約できるかに影響します。

具体例を書き出してください:「12人のメンバーを持つ会社が月途中で8人にダウングレードする」や「個人が1か月休止して戻ってくる」など。明確に説明できなければ、確実に構築できません。

サポートすべきワークフローを列挙する

最低でも、以下の正確な手順と期待される結果を文書化してください:

  • サインアップ → トライアル → 初回支払い(または即時請求)
  • アップグレード/ダウングレード(日割り計算は?即時反映か次回更新か?)
  • 解約(即時終了、期間終了で終了、または一時停止)
  • 更新(自動更新、手動更新、猶予期間)

支払い失敗時にアクセスに何が起きるかも決めてください:即時ロック、制限モード、猶予期間のいずれか。

セルフサービスか管理者管理かを決める

セルフサービスはサポート負荷を減らしますが、顧客ポータル、明確な確認画面、(例:制限を壊すダウングレードを防ぐ)ガードレールが必要です。管理者管理は初期は簡単ですが、内部ツールと監査ログが必要になります。

成功指標を設定する

プロダクト判断を導くために測定可能なターゲットをいくつか選びます:

  • アクティベーション率(トライアル→アクティブ、またはサインアップ→初回価値)
  • チャーン(顧客ロス率と収益のチャーン)
  • MRR/ARR と拡張(アップグレード、シート追加)
  • 請求関連サポートチケット(返金、支払い失敗、混乱)

これらの指標は何を自動化するか、何を後回しにするかの優先順位付けに役立ちます。

プラン、価格、トライアル、アドオンの設計

請求コードを書く前に、実際に何を売るかを決めてください。明確なプラン構造はサポートチケット、失敗したアップグレード、"なぜ請求されたのか"という問い合わせを減らします。

価値に合った価格モデルを選ぶ

一般的なモデルは有効ですが、請求の振る舞いが異なります:

  • フラットレート:全員に同じ価格。説明・実装が最も簡単。
  • 階層(Tiered):複数のパッケージ(例:Starter/Pro/Business)で機能や上限が異なる。成長に応じたポジショニングに有効。
  • 席数課金(Per-seat):チームの規模で価格が変動。招待ユーザーとアクティブユーザーのどちらを席と数えるかを明示する。
  • 使用量ベース:消費した分だけ支払う(APIコール、ストレージ、メッセージ)。後払いで請求するか、前払いのアローワンスを設けるか、上限を設定するかを決める。

モデルを混合する場合(例:ベースプラン + 席課金 + 使用量超過)、そのロジックを今のうちに文書化してください—これが請求ルールになります。

課金間隔とトライアルルールを定義する

ビジネスに合うなら 月額と年額 を提供します。年額プランでは通常:

  • 明確な節約メッセージ(例:「2か月分無料」)
  • サイクル途中でのアップグレード/ダウングレードの日割り計算ルール

トライアルについては以下を決めます:

  • 期間(7/14/30日)
  • 支払い手段が事前に必要か
  • 終了時の挙動(自動変換、停止、確認が必要)
  • トライアル中のダウングレードを許可するかどうか

アドオン、クーポン、グランドファザー(既存優遇)プラン

アドオンはミニ製品として価格設定・請求を考えてください:一度きりか継続課金か、数量ベースか固定、どのプランと互換性があるか。

クーポンは単純なガードレールが必要です:期間(一度きりか繰り返しか)、適格性、アドオンへの適用可否。

グランドファザー(既存優遇)プランについては、ユーザーが古い価格を永続的に保持できるのか、プラン変更まで許容するのか、終了日を設けるのかを決めてください。

UI向けのプラン名と上限の文言を作る

「Starter」「Team」のように結果を示すプラン名を使い、内部ラベルではなくユーザーにわかりやすくします。

各プランについては 機能上限 をわかりやすい言葉で定義(例:「プロジェクト最大3件」「月間メール10,000通」)し、UIで次を示してください:

  • 含まれる内容
  • 上限到達時の挙動(ブロック、超過課金、またはアップグレード促進)
  • 驚きがないようにアップ/ダウングレードの経路

プランと請求のためのデータモデル設計

サブスクリプションアプリは表面的には単純(「毎月請求する」)に見えますが、データモデルが明確でないと請求は複雑になります。コアオブジェクトの名前を付け、その関係を明確にして、レポート、サポート、エッジケースがワンオフのハックにならないようにしてください。

コアエンティティ(格納すべき情報)

最低でも次を想定してください:

  • Customer: ID、メール、請求先住所、税ID(該当する場合)、支払い方法へのリンク。
  • Plan: 製品のティア(例:Starter、Pro)。主にマーケティング/機能情報を保持。
  • Price: 課金金額と周期(例:$29/月、$290/年)。1つのPlanが複数のPriceを持つことがあるため分離しておく。
  • Subscription: どのCustomerがどのPriceに入っているか、開始日、現在の期間の開始/終了、更新挙動。
  • Invoice: ある期間に請求しようとした内容(明細、合計、税、割引)、およびSubscriptionへの参照。
  • Payment: Invoiceに紐づく金銭の移動試行/結果。
  • Refund: Paymentに紐づく返金(しばしばInvoiceへも紐づく)。

有用なルール:Plansは価値を、Pricesはお金を表す

ステータス変更を混乱なく表現する

SubscriptionsとInvoicesの両方にステータスが必要です。明示的かつ時系列ベースで保持してください。

Subscriptionでは一般的に:trialing, active, past_due, canceled, pausedInvoiceでは:draft, open, paid, void, uncollectible

現在のステータスだけでなく、その説明となるタイムスタンプ/理由(例:canceled_at, cancel_reason, past_due_since)も保存してください。これによりサポートが楽になります。

請求アクションの監査ログ

請求には追加のみ(append-only)の監査ログが必要です。誰がいつ何をしたかを記録します:

  • プラン変更、日割り計算の判断、返金発行、請求書の手動無効化
  • 実行者(顧客、管理者、システムWebhook)、関連するIP/デバイス(必要に応じて)
  • 変更前/変更後の値(要約でよい)

管理者と顧客の権限分離

明確な線引きをします:

  • 顧客:請求書/領収書の閲覧、支払い方法の更新、解約/再開、書類のダウンロード。
  • 管理者/サポート:返金発行、補償期間の付与、ステータスの上書き(稀)、顧客の税情報編集、監査履歴の参照。

この分離によりセルフサービスは安全に保たれ、運用側が必要なツールを持てます。

支払いアプローチの選択とプロバイダー統合

支払い設定は最も影響力のある決定の一つです。開発時間、サポート負荷、コンプライアンスリスク、価格の反復速度に影響します。

オールインワン請求プロバイダー vs カスタム請求エンジン

ほとんどのチームではオールインワンプロバイダー(例:Stripe Billing)が定期支払い、請求書、税設定、顧客ポータル、督促ツールへの最短経路です。柔軟性の一部を速度と既知のエッジケース処理とトレードします。

カスタム請求エンジンは、特異な契約ロジック、複数の決済プロセッサ、厳格な請求書/収益認識要件がある場合に意味を持ちます。ただしコストは継続的で、日割り計算、アップ/ダウングレード、返金、再試行スケジュール、多くの帳簿作業を自分で構築・保守する必要があります。

ホスト型チェックアウト vs 埋め込みフォーム(PCI範囲)

ホスト型チェックアウトページはカード情報がサーバーを通らないためPCIコンプライアンスの範囲を減らします。ローカライズや最新仕様(3DS、ウォレット支払い等)の維持も容易です。

埋め込みフォームはUIの統制が高まりますが、セキュリティ責任とテスト負担が増えます。初期段階ならホスト型チェックアウトが現実的なデフォルトです。

Webhook/イベント:アプリを同期させる

支払いはアプリの外で起きると仮定してください。プロバイダーのWebhook(イベント)を事実の源として扱い、支払い成功/失敗、サブスクリプション更新、返金などのイベントでデータベースを更新します。Webhookハンドラは冪等(idempotent)かつ再試行安全に実装してください。

出荷前に失敗モードを文書化する

カード拒否、有効期限切れ、残高不足、銀行エラー、チャージバックの対処を文書化してください。ユーザーに何が表示されるか、どのメールが出るか、いつアクセスが一時停止されるか、サポートが何をできるかを定義しておくと、最初の失敗更新が来たときの驚きを減らせます。

サインアップ、チェックアウト、サブスクリプション作成を構築する

ここで価格戦略が動作するプロダクトになります:ユーザーがプランを選び、支払い(またはトライアル)を行い、即座に適切なアクセスが付与されます。

迅速にエンドツーエンドのサブスクリプションウェブアプリを出荷したいなら、vibe-coding のようなワークフローで要件を省略せずにスピードを上げられます。たとえば Koder.ai では、チャットでプランの階層、席数上限、請求フローを記述し、生成されたReact UIやGo/PostgreSQLバックエンドを反復して要件とデータモデルを合わせながら進められます。

明確な料金ページと選択フローを作る

料金ページは迷わず選べることが重要です。各ティアの主要上限(席、使用量、機能)、含まれるもの、請求間隔のトグル(月額/年額)を表示してください。

フローは予測可能であるべきです:

  • プラン選択 → アカウント作成(またはサインイン) → チェックアウト → 確認

アドオン(追加席、優先サポート)がある場合は、最終価格が一貫するようチェックアウト前に選択させてください。

"現実世界"の詳細を含めたチェックアウトを実装する

チェックアウトはカード番号を取るだけではありません。エッジケースがここで現れるため、事前に何を必須にするか決めておきます:

  • トライアル: トライアルモードでサブスクリプションを開始し、トライアル終了時にどうするか(自動請求、支払い方法必須、継続するには支払い)を定義する。
  • クーポン/プロモ: 割引コードを適用し、調整後の小計を明確に表示する。
  • 税金/VAT: 国/州/郵便番号を収集し、最終支払い前に見積税を表示する。
  • 必須フィールド: 請求名、メール、会社名、VAT ID(該当する場合)、請求先住所。

サブスクリプション作成の確認とアクセス付与

支払い後はプロバイダーの結果(および関連Webhookの確認)を検証してから機能を解放してください。サブスクリプションのステータスと権利情報を保存し、アクセスをプロビジョニングします(例:プレミアム機能有効化、席数制限の設定、使用カウンタ開始)。

サポートチケットを減らすトランザクショナルメールを送る

自動で送るべき基本メール:

  • ようこそメール:次のステップと /account/billing へのリンク
  • 領収書/請求書メール:支払い成功後
  • トライアル終了リマインダー(例:7日前と1日前)

これらのメールはアプリ内表示(プラン名、更新日、解約・支払い情報更新の方法)と一致させてください。

顧客向け請求ポータルとセルフサービスを作る

主要な請求スキーマを設計する
GoとPostgreSQLで、Customer、Plan、Price、Subscription、Invoiceのクリーンなモデルから始める。

顧客請求ポータルは良い意味でサポートチケットを減らす場所です。ユーザーが自分で請求問題を解決できれば、チャーン、チャージバック、「請求書を更新して」メールが減ります。

顧客が管理できること

最初は必須機能に絞って目立つようにします:

  • 支払い方法の更新: 顧客がカード情報を更新(または別の方法に切替)でき、適切な場合は未払いの請求書を即座に再試行する。
  • 請求情報の更新: 請求先住所や会社情報を更新して将来の請求書が正しくなるようにする。

Stripeのようなプロバイダーを使うなら、ホスト型ポータルへリダイレクトするか、自前のUIを構築してAPIを呼ぶか選べます。ホスト型ポータルは速く安全、カスタムポータルはブランディングやエッジケース制御で有利です。

アップグレード、ダウングレード、日割り計算

プラン変更は混乱が生まれる場所です。ポータルは以下を明確に表示するべきです:

  • 現在のプラン、更新日、次回請求額
  • 新しい価格と適用開始時期
  • 日割りの挙動(未使用期間のクレジット vs 即時請求)

日割りルールを先に定義して(例:「アップグレードは即時有効で日割り請求、ダウングレードは次回更新で適用」)、UIもその方針を反映し、明確な確認ステップを入れてください。

公平に感じられる解約オプション

次を両方提供してください:

  • 期間終了で解約(更新時までアクセス継続)
  • 即時解約(アクセスを即時終了、必要なら返金ロジック)

アクセスと請求に何が起きるかを常に表示し、確認メールを送信してください。

請求書と領収書のオンデマンド表示

「請求履歴」領域に請求書/領収書のダウンロードリンクと支払いステータス(paid, open, failed)を表示し、VAT ID修正や請求書再発行のようなエッジケースは /support へ誘導してください。

請求書、領収書、返金処理を実装する

請求書は単なるPDF送付ではありません。何をいつ請求したか、そしてその後に何が起きたかの記録です。請求書ライフサイクルを明確にモデル化すれば、サポートと経理作業が楽になります。

明確な請求書ライフサイクルを定義する

請求書を状態を持つオブジェクトとして扱い、遷移ルールを定義します。シンプルなライフサイクル例:

  • Draft: 作成済みだが確定前(明細を編集可能)。
  • Open: 確定済みで支払い待ち。
  • Paid: 支払い成功(領収書発行)。
  • Void: 支払い前に確定済み請求書を取り消した状態。
  • Refunded: 支払いが(全額または部分的に)取り消された状態。

遷移は明示的にし(例:Open請求書は編集不可。Voidして再発行)、監査用のタイムスタンプも保存してください。

請求番号、PDF、保存方針

請求番号は一意で人間にとって分かりやすいものを生成してください(通常はプレフィックス付きの連番、例:INV-2026-000123)。プロバイダーが番号を生成する場合はその値も保存します。

PDFはアプリのDBに生ファイルを保存しないことを推奨します。代わりに:

  • プロバイダーの請求書URL(ホストされた請求書ページ)を保存、または
  • セキュアなオブジェクトストレージに保存したPDFリンク(アクセス制御付き)を保存する。

返金、部分返金、クレジットノート

返金処理は会計要件に合わせて設計してください。シンプルなSaaSなら返金レコードがPaymentに紐づく形で十分なことが多いです。正式な調整が必要ならクレジットノートをサポートし、元の請求書へリンクしてください。

部分返金は明細単位の明確さが必要です:返金額、通貨、理由、関連する請求書/支払いを保存してください。

UIとメールで請求履歴を公開する

請求エリア(例:/billing)に請求履歴を金額・ステータス・ダウンロードリンクとともに表示し、確定した請求書や領収書は自動でメール送信、必要に応じて再送可能にしてください。

税金、VAT/GST、コンプライアンスの基本対応

安全な管理者コントロールを作る
データベースを手動で編集せずに、返金、トライアル延長、監査ログなどを追加する。

税金はサブスクリプション請求で最も失敗しやすい部分の一つです。顧客の所在地、販売するもの(ソフトウェアかデジタルサービスか)、買い手が消費者か事業者かで課税が変わるためです。

適用される税を決める

まずどこで販売し、どの税制度が関係するかを列挙してください:

  • 売上税(米国など):州や市/郡ごとにルールが異なる。
  • VAT(EU/英国など):通常は顧客の国に基づく。
  • GST(オーストラリア、ニュージーランドなど):似た概念だが閾値やルールが異なる。
  • デジタルサービス規則:一部の国はSaaS/デジタル製品を物理商品と扱い区別する場合がある。

不明な場合は、これはコーディングの問題ではなくビジネス判断と扱い、早めに助言を得て請求書をやり直す必要がないようにしてください。

必要な顧客税情報を収集する

チェックアウトと請求設定で税計算に必要な最小データを収集します:

  • 顧客の(場合によっては州/県)
  • 請求先住所(税的証拠として必要なことが多い)
  • 事業者か消費者かの指標
  • VAT ID / 税ID(該当する場合)とその妥当性

B2BのVATでは、有効なVAT IDが提供された場合に逆課税や免除を適用する必要があることがあり、この判定を請求フローで予測可能かつ顧客に見えるようにしてください。

税計算ツールの利用を検討する

多くの決済プロバイダーは組み込みの税計算機能(例:Stripe Tax)を提供します。これはエラーを減らしルールの更新を簡単にします。多数の管轄区域で販売する、高頻度の取引がある、あるいは高度な免除処理が必要な場合は専用の税サービスを検討してください。

サポートとレポートのために税の内訳を保存する

各請求書/課金について以下を保存してください:

  • 適用した税率、課税対象額、税額、合計
  • その判断に使った顧客の所在地証拠
  • 提供されたVAT/GST IDと検証結果(あれば)

これにより「なぜ税がかかったのか?」への回答、返金処理の正確化、後の経理レポート作成が容易になります。

支払い失敗、再試行、督促(ダニング)の管理

支払い失敗はサブスクリプション事業では普通に発生します:カードの有効期限切れ、限度額の変更、銀行による拒否、顧客が更新を忘れるなど。目的は顧客を驚かせずに収益を回収することです。

シンプルなダニングフロー(再試行+リマインダー)を実装する

明確なスケジュールから始め、一貫性を保ってください。一般的には7–14日間で3–5回の自動再試行と、何が起きたかと次の行動を説明するリマインダーを併せます。

リマインダーは次に焦点を当てます:

  • 何が失敗したか(例:「4月の更新支払いが通りませんでした」)
  • 起こりうる理由(有効期限切れ、銀行による拒否、残高不足)
  • ワンボタンアクション(例:「支払い方法を更新する」)

Stripeのようなプロバイダーを使う場合は組み込みの再試行ルールとWebhookに頼り、アプリは実際の支払いイベントに基づいて反応してください。

猶予期間とアクセス停止ルール

「滞納」の定義を文書化してください。特に年額プランや法人アカウントでは短い猶予期間中はアクセスを継続する方が得策な場合があります。

現実的なポリシー例:

  • Day 0–3: 支払い失敗 → サービス継続、リマインダー送付
  • Day 4–14: 機能制限(任意)+強めのリマインダー
  • After Day 14: 支払い成功までアクセス停止

何を選んでも予測可能にし、UIで見える化してください。

支払い方法の更新と自動回復

チェックアウトと請求ポータルはカード更新を速やかに行えるようにしてください。更新後は未払いの最新請求書を即座に支払おうと試みる(またはプロバイダーの「今すぐ再試行」アクションをトリガーする)ことで、顧客に即時解決を見せるべきです。

拒否メッセージを実行可能にする

「支払いに失敗しました」だけでは不十分です。フレンドリーなメッセージ、日時、次の手順(別のカードを試す、銀行に問い合わせる、請求情報を更新する)を示してください。/billing ページがあるなら直接誘導し、メールとアプリでボタン文言を一貫させてください。

サポート・運用スタッフ向け管理ツールを追加する

請求フローは「作って終わり」にはなりません。実際に顧客が支払いを始めると、チームは本番データを手作業で編集することなく安全かつ再現可能に顧客を助ける手段を必要とします。

早期に提供すべきコア管理ツール

最も一般的なサポート要求をカバーする小さな管理領域から始めてください:

  • プラン管理: プラン作成/無効化、価格設定、トライアル長、アドオン管理。既存の購読者を壊さないようにプランは削除せず「非推奨」状態にする。
  • 顧客検索: メール、顧客ID、請求書番号、カード下4桁(プロバイダー参照)で検索可能にし、重要情報(現在のプラン、次回更新日、ステータス、最近の支払い試行)を一目で見せる。
  • 返金と解約: 「最後の請求を返金」「期間終了で解約」「即時解約」などのボタンを明確にし、確認プロンプトと簡単な必須理由を入れる。

サポートワークフローで時間を節約する機能

サポートが一度の対応で解決できる軽量ツールを用意します:

  • クレジット付与(例:アカウントに$20のクレジット)を付与し適用時期を追跡。
  • トライアル延長をX日間行える(最大延長などのガードレール付き)。
  • 内部メモ(スタッフのみ閲覧可能)をアカウントに記録し、チケットへのリンクを残す。

ロールベースのアクセス制御(RBAC)

全てのスタッフが請求を変更できるべきではありません。Support(閲覧+メモ)Billing Specialist(返金/クレジット)、**Admin(プラン変更)**のような役割を定義し、UIだけでなくサーバー側で権限を強制してください。

機微な操作の監査ログ

敏感な管理操作は誰がいつ何を変更したかを記録してください。対象の顧客/サブスクリプションIDへのリンク、検索可能・エクスポート可能なログを用意し、監査やインシデントレビューに備えます。

サブスクリプション指標の分析とレポーティング

まず請求の状態を設計する
画面やAPIを生成する前に、トライアル、日割り、解約、アクセスルールを設計する。

分析は請求システムを意思決定ツールに変えます。単に支払いを集めるだけでなく、どのプランが機能しているか、顧客がどこでつまずいているか、どの収益を頼りにできるかを学ぶ場です。

トラックすべきコア指標(とその理由)

信頼できる小さな指標セットから始めます:

  • MRR/ARR:定期的な収益基盤。新規、拡張、縮小、チャーン別に分解して何が成長を牽引しているかを見る。
  • チャーン:顧客チャーンと収益チャーンの両方を追う(異なる物語を語る)。
  • LTV:マーケティング支出の判断に有用。ただしチャーンデータがクリーンであることが前提。
  • トライアルコンバージョン:プラン別、チャネル別、コンバージョンまでの時間で測る。
  • 拡張収益:アップグレード、アドオン、席数増加は通常最も伸ばしやすい収益源。

コホートとリテンションチャート

時点の合計だけでは問題を隠します。サブスクリプションコホートビューを追加して、同じ週/月に始めた顧客の保持を比較してください。

簡単なリテンションチャートは次の問いに答えます:「年額プランはリテンションが良いか?」「先月の料金変更は4週目のリテンションに影響したか?」

請求判断を支えるイベントトラッキング

主要アクションをイベントとして計測し、コンテキスト(プラン、価格、クーポン、チャネル、アカウント年齢)を付与してください:

  • upgrade / downgrade
  • cancel(解約理由を含む)
  • payment failed
  • payment recovered

イベントスキーマを一貫させ、レポートが手作業のクリーンアップに変わらないようにします。

対応可能な問題に関するアラート

次のような自動アラートを設定します:

  • 支払い失敗の突然の増加
  • 返金の異常な増加
  • チャーン率が通常の範囲を外れる

アラートはチームが実際に見るツール(メール、Slack)へ送り、調査用に /admin/analytics などの内部ダッシュボードルートへのリンクを付けてください。

セキュリティ、信頼性、テストチェックリスト

請求は小さくて高コストな失敗が起きやすい領域です:Webhookが二重で届く、再試行で二重請求される、APIキーが流出して返金を作られる、など。以下のチェックリストで請求を安全かつ予測可能に保ってください。

シークレットとWebhookを保護する

決済プロバイダーの鍵はシークレットマネージャー(または暗号化された環境変数)で保管し、定期的にローテーションし、gitにコミットしないでください。

Webhookは全て信頼できない入力として扱います:

  • 全てのリクエストでプロバイダーのWebhook署名を検証し、古いタイムスタンプは拒否する。
  • WebhookエンドポイントはHTTPSのみ、許可リストとレート制限を設定する。
  • WebhookイベントIDと処理結果をログに残し、サポートが「何が起きたか」を追跡できるようにする。

PCI範囲を最小化する(カードデータを保存しない)

Stripeなどを使う場合はCheckout、Elements、トークンを利用して生のカード番号がサーバーに触れないようにしてください。PAN、CVV、磁気ストライプデータは絶対に保存しないでください。

「支払い方法」を保存する場合でも、プロバイダーが返す参照ID(例:pm_...)と表示用のlast4/ブランド/有効期限のみを保存します。

請求操作を冪等にする

ネットワークタイムアウトは起きます。サーバーが「サブスクリプション作成」や「請求作成」を再試行すると二重請求の恐れがあります。

  • 金銭の移動を伴うAPI呼び出しには冪等キーを使う。
  • DB側で外部ID(customer ID, subscription ID, invoice ID)のユニーク制約を設けて重複を防ぐ。

お金がかかっているかのようにテストする

サンドボックス環境を使い、以下をカバーする自動テストを用意します:

  • サインアップ → トライアル → 変換 → 解約 → 再開
  • Webhookの順序が入れ替わる、遅延、重複配信
  • 支払い失敗、再試行、請求ポータルでのカード更新
  • サイクル途中のプラン変更(オン/オフの日割り)、クーポン、アドオン

スキーマ変更前にはプロダクションに近いデータでマイグレーションのリハーサルを行い、過去のWebhookイベントサンプルをリプレイして問題がないか確認してください。

チームが高速で反復するなら、実装前に軽量な「設計モード」ステップを追加することを検討してください。内部RFCやツール支援ワークフローでも構いません。たとえばKoder.aiでは、課金状態、Webhookの振る舞い、役割権限をまず定義し、その後スナップショットとロールバック機能を使ってエッジケースをテストしながらアプリを生成・洗練できます。

よくある質問

サブスクリプション請求を構築する前に何を定義すべきですか?

顧客の利用フローから始めましょう。登録、トライアルまたは初回請求、更新、プラン変更、解約、決済失敗を整理します。ツールやテーブルを選ぶ前に、たとえば月の途中でチームがシート数を減らす場合など、実際のシナリオをいくつか書き出してください。

データモデルではプランと価格を分けるべきですか?

プランと価格は分けて管理してください。プランは顧客が利用できる機能と上限を示し、価格には金額、通貨、請求間隔を保存します。これにより、機能ルールを重複させずに、1つのプランで月額と年額の選択肢を提供できます。

ホスト型チェックアウトを使うべきですか、それとも独自の決済フォームを作るべきですか?

ほとんどの新しいアプリでは、ホスト型チェックアウトが最も簡単な選択です。決済プロバイダーがカード情報の入力と多くのセキュリティ対応を担い、アプリは完了した決済結果を受け取ってアクセスを付与します。

サブスクリプション請求にWebhookが必要なのはなぜですか?

プロバイダーのWebhookを、決済とサブスクリプション変更に関する信頼できる情報源として扱ってください。各イベントを検証し、外部IDを保存し、重複配信されてもアクセスや請求が重複しないよう、処理を安全に再実行できるようにします。

アップグレードとダウングレードはどのように処理すべきですか?

分かりやすいルールを1つ選び、確定前に表示してください。一般的には、アップグレード時は未使用期間分をクレジットしてすぐに請求し、ダウングレードは次回更新時に反映します。顧客が承諾する前に、新しい料金と適用日を確認できるようにしてください。

請求ポータルで顧客ができるようにすべきことは何ですか?

サポートに連絡しなくても、顧客が支払い情報の更新、請求書の確認、プラン変更、解約を行えるようにしてください。ホスト型の請求ポータルなら、こうしたニーズをすばやく満たせます。独自のルールやインターフェースが必要な場合にだけ、カスタムポータルを構築します。

継続課金が失敗した場合はどうすべきですか?

明確なリマインダーを伴う、短く一貫した再試行スケジュールを使ってください。多くの企業では、1〜2週間にわたって数回再試行し、定めた猶予期間中はアクセスを維持した後、顧客が支払うか支払い方法を更新するまでアクセスを停止します。

VAT、GST、売上税はどのように処理すればよいですか?

該当する場合は請求先住所、顧客区分、税務IDを収集し、すべての請求書に税率と税額を保存してください。税制は地域や商品によって異なるため、ルールをコードに固定する前に、プロバイダーの税務ツールを使うか専門家に相談しましょう。

サブスクリプションアプリにはどのような管理ツールが必要ですか?

スタッフには必要な権限だけを付与してください。サポート担当者はアカウントの閲覧とメモの追加、請求担当者は返金やクレジットの発行を行い、プランや価格を変更できるのは少人数に限定します。重要な操作はすべて監査ログに記録してください。

サブスクリプション請求を開始する前に何をテストすべきですか?

サンドボックスで、トライアル、初回決済、更新、解約、返金、決済失敗、カード更新、プラン変更まで、資金の流れ全体をテストしてください。遅延、重複、順序が前後したWebhookもテストします。こうしたイベントは実際の決済システムで発生するためです。

Related posts