READ ONLY TODO: mv Notion or Zenn

アウトプット場所

Stripe サブスクを実装した

わかること

Stripeサブスクを実装する上で一番大切なこと

TL;DR

自分たちのサービスが、何をいくらで売っているか理解する
それをStripeの SubscriptionモデルとPriceモデルで、
適切に設計することが一番大切

今回やったこと

ビジネス側から以下の表を渡されて
これ作ってと言われたので作った

項目\チームのプラン トライアル スタンダード
月額費用 0円 3000円/ユーザー
容量追加(10GB) 購入不可 500円

チームが複数のユーザーを持っていて
ユーザーがチーム上にファイルをアップロード、ダウンロードできるシステムと思って差し支えない

サブスクリプションの料金にもいろいろある

大きく次の2つに分けることができる

  1. 期間で料金が固定
  2. 期間によって料金が変動

1は amazon prime の年会費やnetfilxの月の料金など単純
どれだけサービスを使おうと固定料金

2が意外と性質が違うものが多いと今回気づいた
例を挙げる

icloudの追加ストレージはアップグレードすると料金が変わり、日割りで請求される
amazonで炭酸水を定期便で購入していたら、注文個数によって料金が変わる
電話番号で通話をしたら、通話時間に比例して料金が変わる

これらは

  • アップグレード、ダウングレード
  • 日割り
  • 注文個数
  • 使用量の計測

という要素によって金額が変動している

私の1回目の設計

項目\チームのプラン トライアル スタンダード
月額費用 0円 3000円/ユーザー
容量追加(10GB) 購入不可 500円

月額費用を使用量の計測
容量追加を注文個数
として設計した

月額費用については
期間の終わりにユーザーを削除して
期間が始まったらユーザーを復活させる
という操作で請求額が減ることがないのが条件だった

そこで期間中にアクティブなユーザー数の最大値を計測して 料金を計算しようとした

容量追加は、期間中に必要な一瞬だけ増やして、
アップロードし、他の人がダウンロードしたら
アップロードしたものを削除して容量を減らす
という操作で請求額をちょろまかすことのないようにする必要があった

これに関しては、注文個数の変動 + 日割りで設計した
個数を1つ増やしたらその日から期間の終了までの日割り分が請求額に追加される。
個数を1つ減らしたら次の期間の請求額から1つ分料金が減るという設計

気付きと設計のブラッシュアップ

1回目の設計時点で月額費用の設計の

そこで期間中にアクティブなユーザー数の最大値を計測して
料金を計算しようとした

に怪しさをうっすら感じていた。

そして1週間くらい経ってふと気づいた

月額費用の方も容量追加と同じだった

月額費用という日本語につられてしまったが
要はユーザーの利用権利を1つ買えば使える人が1人増えるということだった

ので正しくは

月額費用ではなく 1ユーザーのアカウントを3000円で追加できる という日本語だった。

これで容量追加と月額費用の実装がほとんど一致してすっきりした

Stripeでのモデル

Subscription -    SubscriptionItem(n個) - Price(3000円) - Product(1ユーザーのアカウント)
   |
   |-- SubscriptionItem(n個) - Price(500円) - Product(追加容量5G)