Stripeを使った簡単なサブスク型課金サービスの作り方

この記事は、2021/11/25 に行った WESEEK Tech Conference #15 の内容をまとめたものです。

はじめに

こういった悩みや疑問をお持ちの方はいませんか?

  • サブスクリプション型課金のサービスを考えているが決済をどうすればいいのか分からない
  • クレジットカードや銀行などが絡んでくると、決済の管理が大変
  • そもそも定期支払ってどうやって実現するの?

そんな悩みを解消してくれる Stripe というサービスを、 WESEEKがサービスを提供する GROWI.cloud を実例としてご紹介します。

「Stripe」とは

Stripe は、米 Stripe 社が提供するオンライン決済サービスです。
ライブラリ・API が用意されており、サブスクリプション型の決済を行うプログラムを簡単にサービスに組み込むことができます。

始めるのがとても簡単

メールアドレスさえあれば、誰でも簡単かつ即時にテストアカウントを発行が可能で、思い立ったと同時にすぐに検証を開始できます。
また、本番環境利用の申請についても必須項目を埋めて送信するだけで完了するので、最短1日で利用開始できます。

Stripeのデータの種類

主要なデータの種類

Stripe でサブスクリプション形式の課金を組むために、知っておく必要がある5つのデータの種類についてご紹介します。

  • 顧客 (Customer) ・・・ 一顧客を表すデータ
  • 商品 (Product) ・・・ 提供する商品を表すデータ
  • 料金 (Plan) ・・・商品の料金 ¥〇 / 月 等のデータ
  • インボイス(Invoice) ・・・(料金 × 顧客) 請求情報を表す
  • サブスクリプション(Subscription) ・・・定期支払を表す

上記の 5 種のデータの組み合わせによって、最終的にサブスクリプションが構成されます。

サブスクリプション(Subscription)の仕様

これから、Stripe における Subscription のデータの中身や挙動について深掘りしていきます。

サブスクリプションというデータの中身・挙動

  1. 顧客の情報を持つ
  2. 期間と期間の区切り、料金プランを持つ
  3. 期間の区切りごとに支払い情報を作成する

つまり、インボイスを定期的に自動生成して定期支払を実現しているのが「サブスクリプション」なのです。

また、課金が発生しない (0円課金) の料金プランをサブスクリプションに設定する場合は、顧客情報に支払い方法を登録する必要がありません。

開発者向け情報

もちろんですが、テスト版アカウントでは引き落としなどは発生しません。
テスト版アカウントでは、Stripe が用意するダミーのカードを使用できます。

また、支払いに成功する場合のみを検証していては、実際に運用することはできませんよね?
そういった支払いに失敗した場合を確認するためのダミーカードもあります。
また、その種類も豊富で、失敗してしまう理由が異なるダミーカードが様々用意されています。

ここでStripeの仕様について疑問

  • Q: 期間の途中で顧客がプランを変更したらどうなるでしょうか?

    • A: Stripe が日割り計算を行って次回請求情報を自動更新してくれます
      よって、サービス提供者が課金周りをシビアに気にする必要がありません
  • Q: Stripeの月額はいくら?

    • A: 月額の利用料はナシだが、決済成立ごとに 3.6% の手数料がかかる
      規模の小さなスタートアップのサービスほど導入しやすい

SDK&ドキュメント

Stripe では、様々な種類の開発者ツールが提供されています

  • CLI
  • Node.js ライブラリ
  • VisualStudio Code の拡張機能
  • REST API

ドキュメントも充実

API ドキュメントをはじめ、仕様に関するドキュメントが充実しています。
日本語版も現在整備されつつありますが、基本は英語版を翻訳したものであり翻訳が未対応の箇所や言語による若干の表現の差もあります。

安心のサポート

前述で不安を覚える方もいらっしゃると思いますが、ご安心ください。
開発者向けのサポートも手厚く、ドキュメントを読んで不明な点があれば、気軽にサポートへ質問できます。

サポートの体制

日本語でのサポートはメールでの対応となり、翌営業日に回答していただけます。
また急いで確認したい場合は、英語であればチャットでのサポート対応を受けていただけるため、その場で会話しながら不明点の解消を進められます。

GROWI.cloudでの導入事例

GROWI.cloud では、Stripe が提供している Node.js のライブラリ、Stripe React Element というコンポーネントライブラリを使用しています。

商品とプランの管理については、プランごとの料金設定をマイグレーション用ファイルにまとめて一元管理しています。
商品の追加や価格の変更などが発生した際には、該当ファイルを更新しマイグレーションを実行しています。

GROWI.cloud では顧客、サブスクリプション、インボイスをどう扱っているのか?

顧客の作成からプランのご契約までの流れをご紹介します。

  1. アカウント登録時に Stripe 上の顧客情報を作成

    const attachStripeCustomer = async(customer, option) => {
    const stripeCustomer = await stripe.customers.create({
    email: customer.email,
    description: `Customer ID: ${customer.id}`,
    });
    await customer.update({ stripeCustomerId: stripeCustomer.id }, option);
    };
  2. 同時に課金額0円の料金プランでサブスクリプションを作成

    const attachStripeSubscription = async(customer, plan, options) => {
    return stripe.subscriptions.create({
    customer: customer.id,
    items: [{ plan: plan.id }],
    expand: ['latest_invoice.payment_intent'],
    ...options,
    });
    };
  3. 登録完了後、ユーザーの任意のタイミングでプラン変更

    const changeSubscription = async(subscriptionId, subscriptionItems, options) => {
    await stripe.subscriptions.update(subscriptionId, {
    items: subscriptionItems,
    expand: ['latest_invoice.payment_intent'],
    ...options,
    });
    };
  4. 支払い情報が未登録の場合は、登録完了後にプラン変更が可能
    Stripe React Element を利用しています

Stripeの便利機能PickUp

ダッシュボード

Stripe が自動集計してくれる様々なデータを閲覧可能

MRR (月間標準収益)

ダッシュボードから確認可能な指標の一つで、サブスクリプションが継続している契約全体の月当たりの収益見込みを表します。

サブスクリプションサービスを提供する場合、継続が見込める月間の収益は売り上げと直結するので、サービス戦略を考える指標としても非常に重要な指標です。

クーポン

特定の支払いに対して割引を行う「クーポン」を発行することができます。
割引率は MRR に影響しません。 (正規の金額通り MRR に反映される)

例)新規に契約される 600 円/月 プランに 50% 割引クーポンを適用した場合

  • → 顧客の支払金額は 300 円/月
  • → MRR の変動は +600 円

クーポンは割引される支払いが限定されるため「MRR」つまり「月間標準収益」という扱いの上では、標準の値 (クーポンによる割引を適用しない値) が反映される仕様だと考えるのが妥当です。

トライアル

期限を設けて、期限まで割引した額で請求を行うトライアル提供を行うことができます。
トライアル中のサブスクリプションは MRR に影響しません。

例)600円/月プランを50%割引でトライアル開始した場合

  • → 顧客の支払金額は 300 円/月
  • → MRR の変動は ±0 円

トライアルは、収益の見込みがまだ立っていない状態で、名の表す通りトライアル中という状況を作り出すものです。
また、トライアルを開始させるためには、顧客がキャンセルするための様々な条件や同意を明示的に提示する必要があります。
これは、トライアル中の顧客は正式な顧客となる前の段階で、収益が約束された本契約ではないと扱うためそうなっていると考えられます。
よって、トライアル中の状態ではまだ「(月間)標準収益」として扱うことができないため MRR に反映されない仕様だと考えるのが妥当です。

失敗談と対策

初月無料キャンペーンにおける失敗

[問題その1]突貫実装による考慮不足で、支払い失敗が連発してしまう

経緯

  1. 他サービスで当たり前となっている「初回〇〇無料!」という販促施策について社内から強い要望があり、優先して実装することになりました

  2. そこで我々は Stripe のドキュメントを調査し、クーポンという機能があることを知ります

  3. また、調査の結果以下の仕様が分かりました

    • 「〇〇%オフ」のクーポンを作成することができる
    • クーポンを適用することで、1回の支払いにおいて割引を適用できる
    • 100%オフクーポンを使うことで、支払い方法の登録なしのまま有料プランを設定できる
  4. 実装も完了し意気揚々と初月無料キャンペーン開始のプレスリリースを打ちました。
    キャンペーンの効果もあり、徐々にユーザーが増えてきた・・・が、そこで事件が起こります。

!問題発生!
1か月が経過した初月無料キャンペーン適用ユーザーが現れ始めたころ、その支払いが (ほぼ) 全て失敗するという現象が発生してしまいました。

原因
支払い情報の登録を行わず、100%オフクーポンを使う仕様としたことで、本来であれば有料であるプランを次回の支払いを考慮せずに契約させてしまったこと。
→ どういうことか?

  • 初めて請求を行う「初月無料キャンペーン」開始の際は支払い方法が登録されていなくとも問題は発生しなかった
  • 2回目の請求を行った際に、有償のプランを契約した状態のまま支払い方法が登録されていないため失敗していた

という、単純な仕様の考慮漏れに気づくことができなかったことが今回の敗因でした。

[問題その2]MRRの数値に悪影響が出てしまった

問題点
MRR の数値を、施策の方針を検討する際の材料として利用していたが、初月無料プラン提供開始後から、実際に課金される値と
「クーポンは MRR に影響しない」という値と値と関係性を正しく理解していなかった。
MRR には 割引を適用しない 金額が加算される
つまり、無料期間だけお試しで利用してみるだけの顧客が利用したプランの金額が有効なものとして扱われるため、
本来の課金額が高いプランを利用したユーザーが居れば居るほどプランで MRR が乱高下した。

対策編

トライアルという機能があり、そちらが適切だと気づく

ドキュメントをさらに読み込み、トライアルという機能に出会います。
トライアルを利用するよう再度仕様を練り直す事にしました。
結果的に、クーポンを利用した「初月無料キャンペーン」から、「1か月無料トライアル」に乗り換えることになります。

実際のコード変更

元々、 Stripe がトライアルという機能で提供していたものに似たようなものを「クーポン」として提供しようとしていたためか、内部の実装は大きく変わらず実現できました。

await stripe.subscriptions.update(subscriptionId, { items: subscriptionItems, coupon: “COUPON_CODE_XXX” });

↓↓

await stripe.subscriptions.update(subscriptionId, { items: subscriptionItems, trial_end: addMonths(new Date(), 1)  });

結果

トライアルにすることで、サブスクリプションそのものが MRR に影響しなくなった!
長い間懸念していた MRR の乱高下もかなり落ち着きました。

まとめ

  1. Stripe は、現在勢いのあるオンライン決済サービス
  2. 導入が簡単
  3. 素早く柔軟に変更可能
  4. 正しく理解して使えばとても便利

ぜひ利用を検討してみてはいかがでしょうか

著者プロフィール

伊勢 達也

株式会社WESEEK / システムエンジニア

2013年8月から2015年3月まで WESEEK に在籍
2017年7月に WESEEK 初のフルリモートメンバーとして WESEEK に再入社
2018年5月に別府サテライトオフィスを開設
別府サテライトオフィスのメンバー5名を率いて GROWI / GROWI.cloud を開発・運用中

株式会社WESEEKについて

株式会社WESEEKは、システム開発のプロフェッショナル集団です。

【現在の主な事業】

  1. 通信大手企業の業務フロー自動化プロジェクト
  2. ソーシャルゲームの受託開発
  3. 自社発オープンソースプロダクト「GROWI」「GROWI.cloud」の開発

GROWI

GROWIは、Markdown記法でページを記述できるオープンソースのWikiシステムです。

GROWI.cloud

GROWI.cloudはOSSのGROWIを専門的知識がなくても簡単に運用・管理できる、法人・個人向けの商用サービスです。

大手SIer・ISPや中小企業、大学の研究室など様々な場所でご利用いただいております。

【主な特徴】

  • テキストも図表もどんどん書ける、強力な編集機能
  • チーム拡大に迅速に対応できる管理者向け機能を提供
  • 充実した機能・サポートでエンタープライズにも対応

【導入事例記事】
インターネットマルチフィード株式会社様
[https://growi.cloud/interviews/mfeed/?utm_source=connpass-top&utm_medium=web-site&utm_campaign=mf:embed:cite]

株式会社HIKKY(VR法人HIKKY)様
[https://growi.cloud/interviews/hikky:embed:cite]

WESEEK Tech Conference

WESEEK Tech Conferenceは、株式会社WESEEKが主催するエンジニア向けの勉強会です。

月に2回ほど、WESEEKに所属するエンジニアが様々なテーマで発表を行う予定です。

次回は「激白!GROWI.cloudの可用性向上の取り組み」
12/23(木) 19:00~20:00に開催予定です。

顧客に何らかのサービスを提供する上で、日常的なサービス可用性の維持・向上に関する業務は必須となります。

本発表では、可用性維持・向上に必要な項目を挙げつつ、弊社が実際に提供しているサービスである GROWI.cloud での実施例をご紹介いたします。

  • どのような形で SLO の策定に至ったのか
  • どのような構成で可用性を数値化しているのか
  • どのような業務を実施して、可用性の維持・向上を達成しているか

現在、connpassやTECH PLAYで参加受付中です。皆様のご参加をお待ちしております!
https://weseek.connpass.com/event/231659/
TECH PLAYはこちらから

一緒に働く仲間を募集しています

東京の高田馬場オフィス、大分にある別府サテライトオフィスにてエンジニアを募集しております。

中途採用だけではなく、インターンシップも積極的に受け入れています!

詳しい募集要項は、弊社HPの採用ページからご確認ください。