Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

Subscription 101 Part 2

Last updated at Posted at 2017-03-17

Subscription Part 1 に引き続き、基本的な部分をカバーしていきます。

##今回のカバー範囲

- プラン変更に伴う差額の比例配分(Proration)の考え方
- 複数プラン
- 従量課金の扱い方
- Subscription のキャンセル方法

##プラン変更に伴う差額の比例配分(Proration)の考え方
異なる料率のプランを複数用意している場合、プラン変更が考えられます。こちらは、考え方によっては、プラン変更時の差額調整は行わないということも考えられます。

  1. アップグレード: 低い料金プランから、高い料金プランへ変更する場合
  2. ダウングレード: 高い料金プランから、低い料金プランへ変更する場合

###前提となるプランの変更
プランを変更するには、 既存の Subscription のプランを変更する処理をします。

前提として、以下とします。

  • 変更前のプラン: 毎月 1000円, Plan id: standard-monthly
  • これから適応するプラン: 毎月 3000円, Plan id: pro-monthly
プランの変更
subscription = Stripe::Subscription.retrieve("sub_xxxx") #既存の Subscription ID を指定
subscription.plan = "pro-monthly" #変更後の Plan ID を指定(Planは作成済みのもの)
subscription.save

これで終わりです。

プラン変更時に、Invoice の請求サイクルが変わるか変わらないかもポイントです。
以下の条件だと、請求サイクルは変わりません。

  • intervalinterval_countが同じである
  • 新しいプランに変更した際に、トライアルやクーポンがない

参考ドキュメント: https://stripe.com/docs/subscriptions/upgrading-downgrading#switching

###1. アップグレードする場合
具体的なケースで考えていきます。
現在のプランは毎月1000円の Standard プランで、毎月1日に Invoice が発行されます。より充実したサービスへアップグレードするため、毎月3000円の Pro プランへ変更するとします。

Subscription の途中でプランを変更すると、当月分がすでに請求されているため、実際に利用した部分と利用していない部分が出てきます。この調整を自動で行います。重要なことは、実際に金額に反映されるのは、次回の Invoice から です。これを覚えておきましょう。

実際に簡単な例で、金額を計算してみます。
例えば、4/15 日に変更し、ちょうど 50% (4/1 に開始、4/15 に変更) の時間を利用しているケースを考えてみます。

**既存プラン(毎月1000円)**の調整金額の計算は、以下のようになります。

  • 実際に利用した金額: 500円 = 1000円 × 50%
  • 未使用分の金額: 500円 = 1000円 × 50% <== 次回の Invoice から引きます(ドキュメントでは、credit と表現されています)

**新プラン(毎月3000円)**の調整金額の計算

  • 4月に利用する金額: 1500円 = 3000円 × 50% <== 次回の Invoice に加算します

5/1 の次回の Invoice の金額は 4000円 となります。内訳は以下です。

  • 新プランの料金: 3000円
  • 旧プランの4月未使用料金: -500円
  • 新プランの4月未払い料金: 1500円

請求サイクルが変わらない場合は、翌月の Invoice で調整されるというのを今一度覚えておいてください。

もし、毎月1000円のプランから、毎年10000円のプランへと変更した場合は、Interval が代わりますので、プラン変更時点で新しい Invoice が作成され、その時点で請求します。つまり、4/15 に上記のように(50%の経過時点で)変更した場合の請求金額は 9500円(10000円 - 500円)となります。

###2. ダウングレードする場合
今度は、逆のケースを考えてみたいと思います。
現在のプランは毎月3000円の Pro プランで、毎月1日に Invoice が発行されます。サービスへ満足しなかったので、毎月1000円の Standard プランへ変更する、とします。

既存プランの調整金額の計算

  • 実際に利用した分: 1500円 = 3000円 × 50%
  • 未使用分: 1500円 = 3000円 × 50% <== 次回の Invoice から引きます(ドキュメントでは、credit と表現されています)

新プランの調整金額の計算

  • 4月に利用する金額: 500円 = 1000円 × 50% <== 次回の Invoice に加算します

5/1 の Invoice の金額は 0円となります。内訳は以下です。

  • 新プランの料金: 1000円
  • 旧プランの4月未使用料金: -1500円
  • 新プランの4月未払い料金: 500円

このケースだと5月に支払いは発生しません。もし、調整後の金額がマイナスになった場合は、翌々月の Invoice で調整されます。

###比例配分のコストを把握する方法

現時点でプランを変更し比例配分のコストを把握する
 # 現時点の時間を取得します:
proration_date = Time.now.to_i
 
# 次回の Invoice がどうなるかを確認します
# proration date をセットします:
invoice = Stripe::Invoice.upcoming(
    customer: "cus_xxxx",  #該当する Customer ID
    subscription: "sub_xxxx", #既存の Subscription ID
    subscription_plan: "pro-monthly", #変更予定の新しい Plan ID
    subscription_proration_date: proration_date,)  #上で取得したProration をする日
 
# 比例配分の費用を取得します:
current_prorations = invoice.lines.data.select { |ii| ii.period.start == proration_date }
cost = 0
current_prorations.each do |p|
  cost += p.amount
end

cost で、把握できます。

###比例配分する日を決める
よくあるお問い合わせですが、日割りにしたい変更日を指定したい というお問い合わせをいただきます。
その場合は、proration_dateを指定します。タイムスタンプを利用すれば秒割り、日割りも可能です。

比例配分の日付指定
subscription = Stripe::Subscription.retrieve("sub_xxxx")
subscription.plan = "pro-monthly"
subscription.proration_date = {unix timestamp}
subscription.save

###比例配分をしない場合
比例配分をしない場合は、プランの変更時にsubscription.proratefalseとして渡すだけです。

差額の比例配分をしない
subscription = Stripe::Subscription.retrieve("sub_xxxx") #既存の Subscription ID を指定
subscription.plan = "pro-monthly" #新しい Plan ID を指定
subscription.prorate = false
subscription.save

##複数プランの考え方
Stripe のプランでは、複数のプランを一つの Invoice にまとめることができます。例えば、基本プランに対して、オプションを追加することなどが考えらます。よくある例がスマートフォンのデータ量の追加などがイメージしやすいかと思います。

既存のSubscriptionにオプションを追加する
Stripe::SubscriptionItem.create(
  subscription: "sub_xxxx",
  plan: "option1-extra",
  quantity: 2
)

とすると、オプションプランを二つ追加するということができます。次回の Invoice でプランを追加して請求ができるようになります。

###次回のInvoiceはいくらになるか
Subscription の途中で、追加プランを設定すると次回の Invoice で追加します。追加プラン分が比例配分されます。
例えば、毎月5000円のプランを利用していて、オプションで毎月500円のプランを、Subscriptionの月の真ん中に追加したとします。
そうすると、次回のInvoiceでは以下のような項目で請求されます。

  • 基本月額プラン: 5000
  • 次回のオプションプラン: 1000円
  • 新たに追加したオプションプランの先月利用料(半分の利用): 500円
  • => 合計 6500円

参考ドキュメント: https://stripe.com/docs/subscriptions/multiplan

##従量課金の扱い方
Stripe の Subscriptions でどのように対応するかを基本概念を説明したいと思います。

以下のような場合で対応が可能です

  • 毎月など定期的に請求するプランに登録(ゼロ円のプランでもOKです)
  • 毎回の金額が変動する

変動する金額には、2 種類考えられます。

###変動金額が一定の場合
上記の複数プランの例を用いて説明します。

例えば、追加オプション(1GBの追加)を当月に3回購入したら 500円 × 3 で 1500 円がかかるようなイメージです。このように、決まった金額を足していく場合には、Subscription のパラメータである quantity を更新する(Subscription.update)、という方法がおすすめです。

数量の更新
subscription = Stripe::Subscription.retrieve(sub_xxxx)
subscription.quantity = 3
subscription.save

参考ドキュメント: https://stripe.com/docs/api#update_subscription-quantity

###変動金額が固定ではない場合
Subscription の機能を利用して、従量課金をしていく仕組みを作ることができます。手順としては以下のようになります。

  • Plan で定期的に決められた金額を請求する(0 円プランでも可)
  • Invoice Item で変動する金額を追加して毎回請求する

これだけです。

追加する金額は InvoiceItem の amount に追加すれば OK です。また、追加するための方法は 2 つありますので、ビジネスに合わせて使用します。

  • 2 回目以降の請求サイクルでは、invoice の作成 invoice.created から決済 charge.succeeded までの時間が 1 時間あるので、invoice.createdから一時間以内に金額を追加する方法
  • InvoiceItem をサブスクリプション期間内に金額が変わり次第、その都度追加していく方法
InvoiceItemの追加
Stripe::InvoiceItem.create(
    customer: "cus_xxxx",
    subscription: "sub_xxxx",
    amount: 2500, #ここに値を追加します
    currency: "jpy",
    description: "追加利用料", #詳細をこちらに書きます
)

そうすると、下記のようにInvoiceに追加することができます。
AddInvoiceItem.png

全体的なInvoiceのイメージはこんな感じです。
次回のInvoiceにまとめられます.png

なお、Subscription に tax_percent を予め設定しているので上記のように、税金を自動で計算し表示しています。

参考ドキュメント: https://stripe.com/docs/subscriptions/invoices#adding-invoice-items

##Subscription のキャンセル
最後に、残念ながら Subscription をキャンセルする場合を考えます。

Subscriptionのキャンセル
subscription = Stripe::Subscription.retrieve("sub_xxxx")
Subscription.delete

該当の Subscription を指定して、delete します。そうすると、ただちにキャンセルされます。
Subscription のキャンセル時には事前にいただいた期間分、すべてを使い切らずにキャンセルした場合、返金すべきかどうか、考慮する必要がある場合があります。

例えば、支払い済みの年間 Subscription を途中でキャンセルする場合などは、キャンセル時にどこまで利用したかを計算して計算する必要などがあります。その場合は、今辞めたらいくら分かかるかなどを確認できる Preview を利用すると良いと思います。

一方で毎月の Subscription などある程度期間が短い場合は、返金はせずに、該当の期間終了をもってキャンセルする、というサービスがかなり多いかと思います。その場合は、at_priod_endが利用できます。

Subscriptionを期間終了時にキャンセル
subscription = Stripe::Subscription.retrieve("sub_xxxx")
subscription.delete(:at_period_end => true)

参考ドキュメント: https://stripe.com/docs/subscriptions/canceling-pausing

こんな感じです。

これで、Stripe Subscription 101 は以上です。
お役に立てれば幸いです。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?