こんにちは、freeeのPublic APIチームでエンジニアをしているまっつーです。
ビールの美味しい季節ですが外で飲めないのが残念です。
僕らのチームは2021年7月にfreeeアプリストアに決済機能をリリースしました。 https://corp.freee.co.jp/news/paid-app.html
この記事では決済の基盤としてStripeを利用した理由、どこに使ったのか、よかった点 / 仕様に合わなかった点を書きます。
アプリストアについて
freeeアプリストアとはfreeeのPublic APIを利用したアプリを公開できるマーケットプレイスです。
2021年4月には掲載アプリ数が100を突破しました。 https://corp.freee.co.jp/news/appstore-100.html
freeeと他サービスの連携を行うアプリや、freeeの機能を拡張するアプリをアプリストア内で検索し、自分の所属するfreeeの事業所とアプリを連携することで、より業務を効率化することができます。
また、開発者はfreeeアプリストア上でアプリを作成し、公開することでfreeeユーザーに対してアプリを提供することができます。
今まではfreeeアプリストアには決済機能がなかったので、開発者は無料でアプリを提供するか、自分でアプリ内に課金機能を実装する必要があり、マネタイズが難しい状況でした。
実現したかったビジネスモデル
freeeアプリストアの決済機能は、プラットフォーム型のビジネスモデルを実現するために実装しました。
アプリ開発者は、決済機能を利用してアプリ販売が可能になります。ユーザーがアプリを購入し、決済を行なったタイミングで、freeeの手数料を差し引いた金額をアプリ開発者が受け取ります。

Stripeを選んだ理由
freeeでは社内でも決済基盤をもっていて、freee会計やfreee人事労務上での決済は社内の決済基盤を利用して行っています。
なのでfreeeアプリストアに決済機能を実装するとなった時も、Stripeを利用する方法の他に社内の決済基盤を利用する選択肢もありました。
しかし、今後どんどん増えていく予定の3rd party製のアプリの課金情報を自社の課金基盤に登録すると管理が複雑になってしまうことが予想されたのと、後述するStripeの用意しているStripe Connectという仕組みがプラットフォーム型のビジネスモデルを素早く実現するのに適しているという主に2点から、Stripeを利用して実装することを決定しました。
Stripeを利用した部分
決済機能のリリースでfreeeアプリストアでは、アプリ開発者とアプリ利用者のそれぞれにたいして以下の機能を実装しました。
- アプリオーナー
- Stripeアカウントfreeeアカウントを連携できる
- Stripeダッシュボードで作成したPrice を使って、アプリストア上でアプリに商品を登録できる
- アプリストア上でトライアル期間の設定ができる
- アプリユーザー
- アプリストアホームで無料、有料のアプリの判別ができる
- アプリ詳細ページでプランの詳細がわかる
- 有料アプリのトライアルができる
- 有料アプリの購入ができる
- 契約中プランの変更ができる
- 契約中プランの解約ができる
- 請求書、領収書のダウンロードができる
Stripeを利用したのは太字の部分の機能です。
開発者側の商品、料金の設定、利用者側の購入、プランの変更、解約など決済まわりの機能はほとんどStripeを利用して実装しました。
アプリ開発者がアプリを有料販売をするときは、Stripe上でPriceと呼ばれる商品を作成し、そのidをfreeeアプリストアのフォームに入力して公開申請するだけで、有料アプリとして公開することができます。

アプリ開発者は、アプリ内で決済処理を実装することなく、有料販売することができます。Stripeを利用するメリットの一つです。
また、freeeアプリストアとStirpeでの二重管理を避けるため、商品の金額などの情報はfreeeアプリストアでは保存せず、Stripe APIを叩いて取得するようにしました。
一方でアプリを購入する前に一定期間無料でアプリを利用できる、いわゆるトライアルの機能はfreeeアプリストアに独自で実装しました。
Stripeにもトライアルの機能はあります。 https://stripe.com/docs/billing/subscriptions/trials
しかしStripeを利用してトライアルを行う場合には、アプリを利用する前にクレジットカード番号の登録が必要でした。
B to Cのビジネスであればトライアル前にカード番号を入力させることは一般的だと思います。
しかし、B to Bのビジネスにおいてはクレジットカード番号を入力するというのはハードルが高いです。
会社のクレジットカードを使う場合、社内申請が必要になることでしょう。
もっと気軽にトライアルをしてもらいたいと考えたので、結果freeeアプリストアではトライアル機能を自前で実装することにしました。
Stripeの良かった点
Stripe Connectをつかうことによってcredentialの考慮が減る
freeeアプリストアに決済機能を実装するにあたって、商品の情報やアプリユーザーの情報をアプリ開発者のStripeアカウントに紐づけるため、アプリ開発者が持っているStripeアカウントに紐づくリソースをStripe APIを使って操作する必要がありました。
他人のアカウントに紐づくリソースを操作する場合は、API IDやSecretなど、慎重な取り扱いが求められる情報を預かる必要があります。
しかしStripe Connectを利用していると、Stripe上でプラットフォームアカウント (=freee)とConnctedアカウント (=アプリ開発者)として紐づいていれば、freeeの所有するStripeアカウントのclient secret + アプリ開発者のStripeアカウントのidをheaderに指定することで、アプリ開発者のStripeアカウントのリソースを操作することができます。
https://stripe.com/docs/api/connected_accounts
アプリ開発者からcredentialを預からなくてすむため、実装する上ではかなり楽でした。
実装コスト0でユーザーにリッチなダッシュボードを利用してもらうことができる
アプリ開発者にはStripeにログインして、ダッシュボードから販売管理や売り上げの入金を行ってもらう必要があります。
ダッシュボードではユーザーごとの契約者の情報、契約状況、請求状況などを確認することができます。

決済基盤にStripeを採用したことで、freee側で実装を行うことなくアプリ開発者にリッチなダッシュボードを利用してもらうことができるようになりました。
仕様に合わなかった点
トライアルにクレジットカードの登録が必要だった
上ですでに述べましたが、Stripeのトライアル機能を利用しようとするとクレジットカードの登録が必要でした。
これは今回のfreeeの要件とはマッチしませんでした。
dashboardからの操作の考慮が必要だった
決済基盤としてStripeを利用しているので、商品や契約のデータはStripe側に保存されています。
基本はfreeeアプリストアからStripe APIを叩いてデータを取得する実装にしていますが、アプリ開発者がStripeダッシュボード上からデータを削除したり、プラットフォームアカウントとConnectedアカウントの紐付きを解除してしまうとAPI callがエラーになってしまいます。
Stripe APIを叩く処理は常に異常系として上記のパターンを考慮しながら実装する必要がありました。
これらの仕様はStripeの利点と表裏一体だと思います。
最後に
freeeアプリストアに決済機能がついたことによって、Stripeアカウントがあればアプリ側で決済機能を実装することなくアプリを販売することができるようになりました。
ぜひfreeeのPublic APIを利用してアプリを作成し、freeeアプリストアで販売してみて下さい!