LoginSignup
8

More than 1 year has passed since last update.

Stripe Subscription 開始パターンごとの作成方法まとめ

Posted at

Stripe を使うとサブスクリプションの決済が楽にできます。

サービスにおいてサブスクリプションを開始する際、トライアルをつける場合や、決済日を月初に固定したい場合などがあります。
サブスクリプションの開始パターンの取り方としては下記の方法があると思います。

  • トライアル期間の有無
  • 固定決済日の有無
    • 日割り決済の有無

上記の選択肢で6パターンのSubscription作成パターンが存在することになります。
が、トライアル終了後に日割りなしでその月の金額を請求するということは、その月の決済タイミングまででトライアルが実質終了していることになるので省かれます。
そのため、 5パターンについてRuby での例でコードを記述します。

API ドキュメントは上記をご参照ください

固定決済日なし、トライアルあり

よくあるサブスクリプションサービスのパターンだと思います。
トライアルが一月(30日)あって、その後、登録日を基準に毎月決済されるパターンです。
これは、trial_end オプションを指定するだけです。

Stripe::Subscription.create({
  customer: STRIPE_CUSTOMER_ID,
  items: [
    { price: STRIPE_PRICE_ID },
  ],
  trial_end: TRIAL_END_DATETIME,
})

固定決済日なし、トライアルなし

フリーミアムモデルで、途中から有料プランに切り替える場合はトライアル無く、サブスクリプション開始時から決済が発生する形になると思います。
これは trial_end を指定しません。
明示的にオプション指定する場合は trial_end: 'now' とします

Stripe::Subscription.create({
  customer: STRIPE_CUSTOMER_ID,
  items: [
    { price: STRIPE_PRICE_ID },
  ],
})

固定決済日あり、日割り決済あり、トライアルあり

決済を固定したいケースもあると思います。
決済タイミングが固定されていないと、ユーザーはいつ決済が行われるかわかりにくくなってしまいますが、月初に揃えるなどするとわかりやすくなります。
決済日を指定する場合は billing_cycle_anchor オプションを使用して決済日を指定します。

また、トライアルを含む場合、トライアル終了後に次の決済日(billing_cycle_anchor)までの残り日数を元に日割りの決済が行われます。

billing_cycle_anchortrial_end より先の時間を指定する必要があります。

Stripe::Subscription.create({
  customer: STRIPE_CUSTOMER_ID,
  items: [
    { price: STRIPE_PRICE_ID },
  ],
  trial_end: TRIAL_END_DATETIME,
  billing_cycle_anchor: FIRST_BILLING_DATETIME,
})

固定決済日あり、日割り決済あり、トライアルなし

これは trial_end を指定しません。

Stripe::Subscription.create({
  customer: STRIPE_CUSTOMER_ID,
  items: [
    { price: STRIPE_PRICE_ID },
  ],
  billing_cycle_anchor: FIRST_BILLING_DATETIME,
})

固定決済日あり、日割り決済なし、トライアルなし

日割り決済をしない場合はオプションで prorate: false を指定します。
このとき、最初の決済は billing_cycle_anchor で指定した日時が初回の決済タイミングになります。

Stripe::Subscription.create({
  customer: STRIPE_CUSTOMER_ID,
  items: [
    { price: STRIPE_PRICE_ID },
  ],
  billing_cycle_anchor: FIRST_BILLING_DATETIME,
  prorate: false,
})

もし、サブスクリプション開始時に決済し、次回の決済タイミングを固定したい場合は無理矢理実現する必要があります。
billing_cycle_anchor を最初は指定せず、Subscription を作成し、後から billing_cycle_anchor を変更します。

ただ、 billing_cycle_anchor を変更する場合、'now' しか指定できません。
そのため、代替方法として、終了日が次回決済日になるトライアルを後から追加します。

stripe_subscription = Stripe::Subscription.create({
  customer: STRIPE_CUSTOMER_ID,
  items: [
    { price: STRIPE_PRICE_ID },
  ],
  prorate: false,
})

Stripe::Subscription.update(stripe_subscription.id, trial_end: FIRST_BILLING_DATETIME, proration_behavior: 'none')

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
What you can do with signing up
8