見積りや再契約が必要な大型サブスクリプション契約を実現するための、Stripe Billing活用方


この記事では、Stripeを使って構築したサブスクリプション請求システムに、大企業向けの大型契約に向けたワークフローを追加する方法を紹介します。Stripeが持つサブスクリプション・請求書、そして見積書を発行する仕組みを活用することで、より複雑な契約・請求シナリオを必要とする場面にも対応できるようになります。

毎年や2年周期で契約内容の見直しや再契約の承認フロー通過を必要とするような企業に対して、自社のサービスを提案する際に、この記事で紹介する仕組みをもとにしたワークフローを活用することで、営業や請求管理チームの業務を効率化しつつ、請求管理の複雑さをシステム側にできるだけ持ち込まないようにすることができます。

## 契約更新のための手続きを毎年行うタイプのサブスクリプションを作成する方法

大型の契約案件では、定期的な契約内容の見直しが必要になりがちです。そのため、一般的なサブスクリプション契約の作成方法では、見直し時期に自動更新が入らないような調整も必要となります。更新期間が事前にわかっている状態で、新しい契約としてサブスクリプションの継続を行うようなシナリオの場合は、サブスクリプションを作成する際に`cancel_at`を使用して、**キャンセル予定日を事前に設定する**実装が行えます。

```js
const stripe = require('stripe')('sk_test_XXX');
const subscription = await stripe.subscriptions.create({
  customer: 'cus_xxxx',
  cancel_at: new Date("Dec 28 2024 23:59").getTime() / 1000,  // UNIXTIMESTAMPへ変換する
  items: [{
    price: "price_XXX",   
    quantity: 1,
  }]
});
```

このコードを実行すると、2024年12月28日にサブスクリプションが自動解約されるサブスクリプションを作成します。キャンセル時には、`customer.subscription.deleted`のWebhookイベントがトリガーされますので、このイベントを利用してシステム・アプリケーション側のデータベース情報を更新することができます。

![スクリーンショット 2024-11-28 16.07.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/c4dcbdf7-9fc2-979c-eec4-651bf14bea28.png)

もし契約見直しの商談開始タイミングを通知する仕組みを自動化したい場合は、`customer.subscription.updated` Webhookイベントを利用しましょう。このイベントで送信されるデータには、解約時期を示す`cancel_at`や現在の契約サイクルに関する`current_period_start` / `current_period_end`などのパラメータが含まれています。この値を利用して、「解約記事のXヶ月前にSlackへ通知を行う仕組み」などを構築します。

![スクリーンショット 2024-11-28 16.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/bb959052-380f-cb7b-5278-b60d2bf53488.png)

契約更新の商談が固まった場合は、サブスクリプションを新しく作成するか、既存のサブスクリプションを更新することで契約を延長できます。もし既存のサブスクリプションを更新する場合は、`cancel_at`に新しい契約終了日を設定します。

```js
const subscription = await stripe.subscriptions.update(
  'sub_xxxx',
  {
    cancel_at: new Date("Dec 28 2025 23:59").getTime() / 1000,  // UNIXTIMESTAMPへ変換する
    items: [
    {
      // 既存プランの数量を変更する場合
      id: "si_xxx",
      quantity: 2,
    }, {
      // 新しいプランを追加する場合
      price: "price_XXX",   
      quantity: 1,
    }, {
      // 既存のプランを解約する場合
      id: "si_xxx",
      deleted: true,
    }]
  }
 );
```


## 商談管理は、Stripe Appsを利用したサービス連携を活用

契約更新にあたってのコミュニケーションや過去の商談履歴を参照するには、Stripeと別に営業支援・CRM系のサービスを活用します。HubSpotやSalesforceなどで商談管理を行っている場合は、[Stripe App Marketplace](https://marketplace.stripe.com)に公開されているアプリケーションや[Stripe Connector](https://docs.stripe.com/connectors)を利用して、Stripe上にあるデータを連携できます。

https://marketplace.stripe.com/apps/hubspot-data-sync

https://docs.stripe.com/connectors/salesforce-billing

このようなツールやAPI連携を行うことにより、契約更新にあたっての商談内容に基づいた見積もり内容や次回のサブスクリプション内容を更新する作業を効率化・自動化することができます。将来的には、生成AIエージェントを活用することによって商談内容に基づいてStripe上のデータを更新したり、特別オファーの提案などを行うことも可能となるかもしれません。Stripeが2024年11月に開発者プレビューとしてリリースした生成AIエージェントを開発するためのSDKについては、以下のドキュメントからお試しください。

https://docs.stripe.com/agents?locale=ja-JP
 
## まとめ

大企業との取引、特に個別のカスタマイズやボリュームディスカウントなどを提示するような契約では、定期的な契約内容の見直しや顧客側の承認フローを通過する手続きが必要になることがあります。これらの契約サイクルと、ユーザーが自分でアカウントを作成して支払いを行う契約サイクルをまとめて処理することは一見困難に見え、大企業向けの契約を処理するための個別の請求管理システムを構築することを検討することもあるでしょう。

しかしStripeにおいては、このような定期的に見積書を発行し、その承認を持って契約を更新するタイプのサブスクリプション契約もAPIとダッシュボード操作両方で実現できます。1年ごとなど、有効期限を設定したサブスクリプションの見積書をAPIやダッシュボードで作成し、終了間際にまた新しく見積書を発行する。この仕組みを実装することで、通常の顧客申し込みフローと個別の大企業向けプランをサービス上に同居させることができます。

サービスのさらなる成長や、営業メンバーの取り組みを支援するためにも、ぜひこのような大企業向けの契約オファーもサポートできるサブスクリプション基盤を構築しましょう。