🧾

Stripeでサブスクを実装したが途中で法人から月末締め翌月末払いをお願いされることが多くなった時に読む記事

2024/10/02に公開

こんにちは、タイトルでだいたい言い尽くしましたが、このような悩みを自分および自分の周りでよく聞くようになったので、Stripeの方に教えてもらいながらどうすればいいか整理しました。

あくまで「めちゃくちゃ開発コストをかけない範囲で」の解決策なので多少トリッキーですがお付き合いください。あるいは、この記事を読んで「そろそろちゃんとコストかけて作りこむか」と決めていただいてもいいと思います。基本的にStripeの実装経験がある方向けの記事です。

どういう状況か

さて、状況を具体的にするために具体例を挙げていきましょう。

  • 1アカウントあたり月額3000円のSaaSを運営している。
  • 当初はクレジットカードのみ、利用開始日に決済が走る標準の課金体系で進めていた
  • サービスが成長し、法人の取引が増えて「請求書払いいけますか?」と聞かれることが増えた。
  • ここでいう請求書払いとは、10/1開始で契約したとして、初回は10月末請求、11月末までに銀行振込、以降翌月も同じく月末に請求書を発行し翌月末に銀行振込が行われるというもの

何が問題か

Stripeには原則月額基本料金を後払いするという概念がなければ、月末に請求書発行する、翌月を入金期限に設定する、といった機能がないために、なんとか独自で対応する必要がある。

よくあるワークアラウンド

自分の周りでよく聞く対応は

  • アプリケーション側の有効無効をStripeのサブスク状態と連動させていない場合、請求書払いではStripeを一切使わない
  • 連動させている場合は「請求書払い用」という0円サブスクを適用する
  • 請求書の送付は外部ツール、振込先は自社の銀行、消込は目視でつい忘れることもある

これが1件2件なら問題ないのですが、10件20件と増えていくとミスが増えたり漏れが発生して事故につながります。また収益の集計もStripeと銀行でばらけるため、MRRなども追いにくくなります。

なぜStripeだけでこんな問題が起こるのか?これまでこんなに簡単にサブスクが実装できるプラットフォームがなかったから問題どころかサブスクビジネスが存在できなかったのですよ!

直接的な解決策はないので問題を深ぼる

実は中の人に聞いたのですが、「こうすればいい」という一発で解決できるソリューションはありません。海外発の決済プラットフォームであるStripeには、月末締め翌月末払いという概念が実装されていないためです。

しかし、便利なAPIが多数生えているため、だいたいの問題は解決することができます。どのような観点で自社にあった解決策を見つけるべきか、検討の軸を提示したいと思います。

1. サブスクリプション状態の管理をStripeに委ねるべきか

Before stripeの時代では、月額課金を実装するということは、自社でバッチ管理を駆使してGMOPGやSBPSなど決済代行業者に個別で決済指示を送っていました。これをおまかせできるのがStripeのサブスクリプション機能ですね。

アプリケーションから月額3000円というプロダクトをセットして開始すると、毎月課金を自動で行ってくれます。決済が失敗しつづけると、解約扱いになったりといった制御も行ってくれますね。このサブスクリプション状態は、アプリケーション側から問い合わせることもできますし、変化があったときにWebhookで受け取ることもできます。

ここで問題になってくるのが、このサブスクリプションは基本的に「開始した日時を起点に1か月ごと」「前払い」という仕様になっています。そのため、ここがネックになってしまうのです。この点は変えられないので、頭に入れておいてください。

2. 請求することと銀振の入金確認(消込)を自動化したいか

サブスクリプションはともかく、Stripeは銀行振込による収納代行に対応しています。Invoiceを発行し、支払期日を30日などに設定し、入金ステータスの管理を自動で行ってくれます。

自社で請求書の発行を行っても、銀行からの通知をフックしたり振り込み名義人と付き合わせたりしないと、なかなか入金ステータスを追うのは面倒ですよね。なのでこの機能は使いたい。ですが、サブスクリプション機能で発行される請求書と入金期限には以下の課題があります。

  • 前払い前提なので、日付を変えて請求しても明細に記載されるのは請求日より「あと」の利用料として記載されてしまう。9/30に発行する請求書の明細には、9/1~30利用分としたいのに、9/30~10/30(31ではなく)利用分みたいになっちゃう。
  • 入金期日がきっちり翌月末ではなく30日とか日数指定しかできないので、大の月と小の月に対応できない。
  • 細かいことを言うと、社印を押せない。ロゴ掲載欄を使うよう案内されたこともあるがさすがにサイズが厳しい。エンプラのお客さんでたまに社印必須のところがある。

解決策(できるだけStripeに寄せるver)

さて、ここまでお困りごとを列挙してきましたが、目指したい姿でいえば「人力で契約した後、前払いすることなく任意の日からアプリケーションの有料機能が使える」「利用開始後、営業がお客さんと決めた月末に請求書が適切な明細と入金期日で自動で送られ」「翌月顧客が入金されたことが自動で処理され、サブスクリプションが有効に保ち続けられる」「収益がStripe上で集計される」ということだと思います。

これを、基本前払いを前提としているStripeのサブスクリプション機能にできるだけ寄せて実装する方法は以下の通りです。

  • アプリケーションの利用権とStripeのサブスクリプションは一致(同期)させる
  • 実際の請求サイクルとStripeのサブスクリプションサイクルは若干ずらす
  • StripeのInvoiceは作成するが、人間向けの請求書はStripeから送らない(領収証も)
  • 何らかの方法で人間用PDFを自動発行する開発を行う

という方法になります。これがそこそこ幸せになる方法です。実際の作成の流れを考えてみましょう。月半ばの処理は後述していますので、まずは1日にサブスクリプションが開始する例を書きます。

  1. 10/1から顧客は利用開始、10/31に初回請求、11/30に初回入金とします。
  2. ざっくり10/1にサブスクリプションを開始します。厳密にはJSTにおけるある時間が開始時点となりますが、この方法では厳密さは不要です。まぁでも0時よりは9時以降がUTCとも日付が合うのでいいかもしれないですね。
  3. 支払方法を請求書・銀行振りこみに設定し、支払期限を65日くらいにします。この段階でStripe的にはInvoiceが発行されます。(設定画面から顧客にメールが飛ばない設定にしましょう)
  4. これでアプリケーションからは有料顧客として扱われます。未払いが発生するまではこのままです。
  5. 10/31にStripeのサブスクリプションに紐づくInvoice情報を取得し、社印や明細書は自前で記入しPDFを作成、顧客に送付します。
  6. 顧客は11/30に入金します。Stripeは10/1付で発行したInvoiceが65日以内に支払われてOK!となります。

図で書くとこんな感じ

この方法を用いることで、エンプラ顧客にも適切な請求書が送られ、さも月末締め翌月末払いが実現しているようなことが可能なだけでなく、追加オーダーがあったときも同様の対応を行うだけで支払い管理ができるためある程度の規模までは対応可能になります。

おまけ:初月や解約月の利用をきれいに揃えたいか

これは上記1や2に比べると大した問題ではないのですが、地味に面倒な課題です。9/15に契約したお客様に対しては以下のパターンがあると思います。解決策は以下でどうでしょうか。

  • 9/30まで無料にして10/1からサブスクリプションを開始する
    • トライアルを15日間つけるだけ
  • 9/15-9/30を日割り課金にして、9/30に初回請求10/1から通常サイクル
  • 9/15から1か月分まるまる課金し、9/30に初月請求をあげる
    • 9/15からサブスクを開始して、10/1にサブスクのサイクルを変更ってのができました。日割り計算はStripe側でやってしまうので、少々面倒です。請求額の調整という技が使えたはずです。
    • 9/15からは無料トライアルにして、10/1からサブスク開始、9月分9/30にサブスクに紐づかない単発のInvoiceを発行し、上記人間用PDFを発行してあげるというスタイルもありでしょう。経理上の収益認識をクレカもある中どう管理したいかで決めましょう。

解約月に関しては、上記の通りおおむね1日にサブスクが開始するようにしておけば大きくずれることはありません。うっかりサブスク止め忘れた、とかがあればきちんと発行済みInvoiceを回収不能にするだけですね。

これ以外の方法は?

自前でサブスク管理を実装し、APIとWebhookなどを用いて決済状態ごとにサブスクの有効無効を判断すれば、お好きな決済代行業者を利用できます。PaidやNP掛け払いを利用すると、入金してくれなかったときの補填なども利用可能ですよ!

長くなりましたが、これで「前払い×カード決済」と「後払い×銀行振り込み」を一つのサブスクリプションで混在させることが可能になります。もっと良い方法があるよ!とか、こんなケースはどう?というご質問もぜひお待ちしております!

Discussion