Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
サブスクリプション決済入門 Stripeでの実装方法と、要件定義時のポイント/jp_strip...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hidetaka Okamoto (Stripe)
November 12, 2022
Technology
6k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
サブスクリプション決済入門 Stripeでの実装方法と、要件定義時のポイント/jp_stripes_okayama_vol3
Hidetaka Okamoto (Stripe)
November 12, 2022
More Decks by Hidetaka Okamoto (Stripe)
See All by Hidetaka Okamoto (Stripe)
Stripeではじめる Revenue Operations / jp_stripes_okinawa_8
stripehideokamoto
0
320
収益を高めるための Stripeダッシュボード活用術 / jp_stripes_online_7
stripehideokamoto
0
410
No-code SaaS and Full Site Editing / wcasia2023
stripehideokamoto
0
280
コア機能開発に集中するための Stripe Checkout活用法 / jp_stripes_deep_dive_202301
stripehideokamoto
0
550
State of Checkout 2022から見た オンライン決済フローの最適化/jp-stripes-miyzaki-202301
stripehideokamoto
0
240
サブスクリプション決済入門 Stripeでの実装方法と、要件定義時のポイント/okta-stripe-202301
stripehideokamoto
0
220
ノーコード・ローコードツールで サブスク運用を効率化する方法 / JP_Stripes_Osaka_202301
stripehideokamoto
0
160
ビジネスユーザを巻込む Stripeダッシュボード活用法 / jp_stripes_deepdive-202212
stripehideokamoto
0
360
AWSでローコードにはじめる サブスクリプション運用の効率化/aws-startup-tech-meetup-fukuoka-2
stripehideokamoto
0
190
Other Decks in Technology
See All in Technology
noUncheckedIndexedAccess、3時間、1万円。 / noUncheckedIndexedAccess, 3 Hours, 10,000 JPY.
kaonavi
1
300
価格.comをAI駆動で全面刷新する ー 30年分の技術的負債を返し、次の30年の土台をつくる ー / AI Engineering Summit Tokyo 2026
tkyowa
49
52k
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
0
7.6k
さきさん文庫の書籍ができるまで
sakiengineer
0
370
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
50k
Cloud Run のアップデート 触ってみる&紹介
gre212
0
310
ITエンジニアを取り巻く環境とキャリアパス / A career path for Japanese IT engineers
takatama
4
1.8k
Claude code Orchestra
ozakiomumkj
3
960
MIERUNE JCT 発表資料「宇宙から伊能忠敬ごっこ」
syuchimu
0
180
【Gen-AX】20260530開催_JJUG CCC 2026 Spring
genax
0
420
Unlocking the Apps
pimterry
0
230
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
460
Featured
See All Featured
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
150
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Cult of Friendly URLs
andyhume
79
6.9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
310
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
200
Building Adaptive Systems
keathley
44
3k
sira's awesome portfolio website redesign presentation
elsirapls
0
270
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
390
Transcript
サブスクリプション決済入門 Stripeでの実装方法と、要件定義時のポイント JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on
Rails勉強会 @hidetaka_dev Npv 2022 1
今日のトピック • サブスクリプション契約をどう実装するか • サブスクリプションサービスは、 「契約してから」が本番 • Webhookを利用した「イベント駆動アーキテクチャ」で、 顧客との関係や契約内容などの「状態変化」を積極的にサポートしよう 2
JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
岡本 秀高 ( @hidetaka_dev ) • Stripe Developer Advocate (ex-developer
in Digitalcube) • JavaScript / TypeScript developer ◦ AWS Lambda / CDK ◦ Next.js / React ◦ WordPress / Alexa / etc • AWS Samurai 2017 / AWS Community Day APAC 2017 • QiitaでStripeに関する Dev blogを週2/3本で更新中 ◦ https://qiita.com/hideoka moto ◦ 年間120記事ペース 3 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jawsdays2022
今日のトピック • サブスクリプション契約をどう実装するか • サブスクリプションサービスは、 「契約してから」が本番 • Webhookを利用した「イベント駆動アーキテクチャ」で、 顧客との関係や契約内容などの「状態変化」を積極的にサポートしよう 4
JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
サブスクリプション契約は、SaaS API呼び出しで作れる • Stripeをはじめとする さまざまな決済プロバイダ • Shopifyなど、 サブスク系APIを持つSaaS • 顧客の情報(メアドなど)と
契約内容(プラン・期間)を システムに渡して契約作成 • 決済は決済手段や契約フロー によってタイミングが異なる 5 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 Stripe::Subscription.create({ customer: 'cus_MmSiMyF3vDdf1v', items: [ {price: 'price_1KP0LPB9L6GiXTODpIaMZnUr'}, ], })
https://github.com/pay-rails/pay 6 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on
Rails勉強会
サブスクリプション契約は、どこで管理すべきか? • 基本的には「SaaSに任せる」方が、開発・運用コストが低い ◦ 契約更新や請求などの、スケジュールジョブ ◦ 未払いや超過振込などの、イレギュラーイベントへの対応 ◦ 配送・請求先住所などの個人情報管理など •
マーケットプレイスSaaSや「EC構築システム」などでは、自社管理も ◦ 例: WooCommerce + WooCommerce Subscription ◦ 「出店者が、決済プロバイダを選びたい」ケース ◦ 決済プロバイダ毎のサブスクAPIをラップするのではなく、 自前で管理して都度都度の決済処理だけ移譲する 7 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
SaaSによっては、API以上の機能提供も 8 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on
Rails勉強会 Stripeがホストする顧客マイページ 埋め込み型の料金表 https://twitter.com/rdlabo/status/1585532646859358209 https://stripe.com/docs/customer-management/activate-no-code-customer-p ortal <script async src="https://js.stripe.com/v3/pricing-table.js" ></script> <stripe-pricing-table pricing-table-id="prctbl_xxxxx" publishable-key="pk_test_xxxxx" ></stripe-pricing-table>
契約情報とユーザー情報の紐付け方 • Stripeの場合、「同一メールアドレス」で「複数のCustomer」が作れる -> メールアドレスをキーにStripeデータを検索する方法はお勧めしない • ユーザーDBにcustomer.idを保存できるようにするのがベター • SQLでの検索などで取りたい情報がある場合、 Stripe
Webhookで新しい情報を取得してUPDATEが理想 • 管理やバッチ目的なら、StripeのSearch APIを使って検索するのも手 9 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
サブスクリプションを組み込む方法 • 基本的には、利用する決済プロバイダやSaaSのAPIを使おう ◦ 決済プロバイダに依存したくない場合は、 自前での請求システム構築も検討する必要がある • システムのユーザー情報と、Stripeなどの顧客・契約情報を紐づけよう ◦ 「システムの外」で契約が変わることもあるため、
Webhookでのsyncを推奨 • 決済プロバイダ・SaaSの便利機能で開発工数を圧縮しよう 10 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
今日のトピック • サブスクリプション契約をどう実装するか • サブスクリプションサービスは、 「契約してから」が本番 • Webhookを利用した「イベント駆動アーキテクチャ」で、 顧客との関係や契約内容などの「状態変化」を積極的にサポートしよう 11
JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
サブスクリプションは、「契約してからが本番」 • サブスクリプションは、「契約し続けてもらう」必要がある ◦ 使わないサブスクサービスは、解約される ▪ 競合他社への乗り換え: 「もっと安いor便利なサービスにしよう」 ▪ 需要の消失:
「子どもが成長したので、もう使わない」 ◦ 物理的に「解約させない」のは、特商法違反になる恐れ ▪ 令和4年6月1日施行 ▪ トライアルから有料への移行に関する情報や、 キャンセル・解約フローに関する条項の事前告知が必須に ▪ https://www.caa.go.jp/policies/policy/consumer_transaction/specified_commercial_t ransactions/assets/consumer_transaction_cms202_220601_05.pdf 12 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
13 令和3年に改正された特定商取引法への対応 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on
Rails勉強会 令和3年特定商取引法・預託法の改正について https://www.caa.go.jp/policies/policy/consumer_transaction/amendment/2021/ 最終確認画面に 右の6情報を表示する ・トライアル終了後の請求額 ・期間限定商品の販売期間 ・解約方法や医薬品 誤認を与える表示がある場合 申込の撤回が可能になる事も
完全に解約したいのか、「今は使いたくない」なのか • 解約ユーザーには、「今は必要ない(また使うかも)」ケースもある ◦ 長期出張が決まったので、ジムや食品の定期注文を解約したい ◦ 今期は見たい番組・作品が少ないので、解約したい ◦ 花粉症がひどいので、春先だけは利用できない •
「休会」のオプションで、ユーザーが帰ってきやすい環境を作る ◦ 解約 -> 入会はステップが多い ▪ カード情報や個人情報などの再入力が必要 ◦ 休会で、「請求」と「システムの利用」だけを停止する 14 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
Stripeを利用して、休会機能を組み込む • “Subscriptionの更新”で処理 • 契約自体は残るため、 DB側のID更新などは不要 • 請求書そのものは 継続して発行される点に注意 ◦
請求書を発行後、 「無効」として処理 • 再開時は、pause_collection をnilにするだけ • 休会期間の指定も可能 15 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 https://qiita.com/hideokamoto/items /1a5f8549d862f7fc9d4b Stripe::Subscription.update( 'sub_123456789', { pause_collection: { behavior: 'void' } }, )
Webhookイベントで、休会開始・終了を検知 • subscription更新のイベントを Webhook APIで受信 • 休会開始と終了を検知し、 システム側のDB情報を更新 • 「問い合わせベースでの休会」など
APIを通さないケースに備える • 休会ユーザーは、 「カスタマーポータル」に飛ばす手も 16 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 https://qiita.com/hideokamoto/items /1a5f8549d862f7fc9d4b
17 26% の顧客が、サブスクリプションの 変更やキャンセル (自己管理) をオンラインで実行できない場合、 サブスクリプションの購入を 「思いとどまる」と回答している。 グローバルなサブスクリプション体験で特に改善が可能な項目 From:
EC サイトにおける決済フローの現状 アジア太平洋地域 2022 年版 https://go.stripe.global/apac-state-of-checkouts-2022-ja
「一度解約したら終わり」じゃない関係づくりを目指す • 「解約 = 永遠にさようなら」とは限らない ◦ 体調・環境などによる、一時的な離脱のケースを考慮 • 解約からの復帰よりも、休会からの復帰のほうがハードルは低い ◦
データの連続性、過去の契約情報の引き継ぎetc.. • 長く使ってもらうSaaSを目指すためにも、 「今使うのをやめること」を検討している人へのフォローを忘れずに 18 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
今日のトピック • サブスクリプション契約をどう実装するか • サブスクリプションサービスは、 「契約してから」が本番 • Webhookを利用した「イベント駆動アーキテクチャ」で、 顧客との関係や契約内容などの「状態変化」を積極的にサポートしよう 19
JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
休会・解約以外にも、さまざまな状態変化がある • サブスクリプション = 長期的な顧客との関係構築 • さまざまなイベントや状態変化が発生する ◦ カードの更新忘れや銀行振込の入金忘れ ◦
月額プランユーザーが年単位で契約を継続している ◦ 担当者の異動によるアカウント・契約情報の引き継ぎ ◦ 運用会社の変更による、契約内容の移譲・移管 • 「契約や顧客の状態」が変わったことの検知と、 それに対応するフローの自動化が社内の運用コストや顧客体験を改善する 20 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会 #jp_stripes
21 Webhookで、決済の「状態変化」を検知する JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on
Rails勉強会 https://qiita.com/hideokamoto/items/76e7b92416fd9beeff66 システムでの状態変化を 別システムに通知する仕組み 非同期決済の「状態変化」を システムに通知する ・決済の成功 ・振り込み期限の超過 ・入金額の過不足 ・不正利用の疑いを検知 カード決済のみを考慮すると 後からの決済手段追加が hard
Webhook活用例1: フリートライアルのフォローアップ • 「customer.subscription.trial_will_end」イベントを利用 ◦ 3日前または手動でトライアルを終了させた場合に発火 • サブスクリプションデータを確認し、手動終了でないことを確認 • メールやUIへの通知で、顧客にトライアル終了3日前をお知らせ
◦ 本契約に切り替わる場合: 課金が発生することの告知 ◦ 自動キャンセルの場合: リソースの削除や停止についての告知 • 本契約への切り替えなどのCTAを用意しよう 22 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会
Webhook活用例2: 長期利用顧客のアップグレード提案 • シナリオに応じてイベントを変更 ◦ 次回請求の前に案内したい場合: invoice.upcoming ◦ 今回の請求で条件を満たしたら連絡: customer.subscription.updated
◦ etc.. • サブスクリプションの開始日と現在を比較 ◦ 休会期間を除外したい場合は、請求履歴をカウントする方法も • より長期のプランを取得 or その顧客用にプランを作成 • CRMツールやメールSaaSなどを利用して、顧客にコンタクト 23 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会
未払いや契約更新などの「状態」を監視する • サブスクリプションは、契約してからが本番 ◦ 競合他社への移行や解約、トライアルの途中解約や本契約切り替え ◦ 未払いが発生した場合の連絡やアカウントの停止・回復処理 ◦ 請求書・領収書の発行、カードの有効期限更新 •
決済プロバイダやプラグインから送られる「状態変化」を監視する ◦ Webhookやメール通知を利用 ◦ 「契約・決済がXXしたらYYの処理を行う」 ◦ 運用開始後に判明するケースも多いので、拡張・柔軟性が大切 24 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会
Webhookで、ユーザーとの関係を構築しよう • サブスクリプションは、「顧客との関係構築」がとても重要 • それぞれのWebhookイベントで、 「顧客がなにをしたか」「契約が今どうなっているか」を システムや人間が簡単に把握・対処できるようになる • ダッシュボードや、 AWSやGCPなどを使ったビジネス分析で、顧客への理解を深めよう
25 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会
One more thing 成功施策の「横展開」 26
Stripe Appsで、自動化・効率化の「横展開」 • Webhookを利用した「仕組み化」に成功すると、 成功施策の横展開やパッケージ化が可能になることも • Stripe Appsで、 StripeとWebhookの処理システムとの連携や配布が簡単に ◦
必要なもの ▪ Webhookを処理するAPIシステム(AWSやGCP・Vercelで構築) ▪ React + TypeScript + 専用UI FWでダッシュボードウィジェット 27 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会
Stripe Appsの例: kintoneとStripeで顧客データ連携 28 JP_Stripes in 岡山 Vol.3 × 岡山Ruby,
Ruby on Rails勉強会
サブスクリプションシステムからDXをはじめよう • 決済系SaaSを活用して、サブスクリプションの組み込みを効率的に ◦ 効率化した分、 「契約し続けてもらうための施策」を決済方面からもトライしよう • Webhookを活用して、「顧客や契約の状態変化」へ システムや社員がスムーズな対応ができる環境を目指そう •
成功した施策や企画を抽象化して、 Stripe Appsなどで新しいas a Service化を目指そう 29 JP_Stripes in 岡山 Vol.3 × 岡山Ruby, Ruby on Rails勉強会