この記事はNikkei Advent Calendar 2021の2日目の記事です。
アプリチームでAndroidアプリを開発しているやまんだ(@ymnd)です。 本日12月2日、日本経済新聞社は創刊145年を迎えました。 引き続き価値ある情報を高品質なサービスを通じてお届けできるよう邁進して参ります。
日経電子版ではそんなサービスを長く使っていただくために様々な施策を行っています。 本稿ではAndroidのアプリ内課金で定期購入を行っているユーザーが、意図しない形でサービスを解約してしまう状態を減らすための機能について紹介します。
紹介する各機能は、今後のアップデートにより変更される可能性があります。 実装にあたり公式ドキュメントを必ず参照ください。
定期購入の解約
アプリ内課金の定期購入の解約には、自発的解約と非自発的解約の2種類[1]があります。 自発的な解約は、ユーザーの明示的な操作による解約で、Play ストアを通じて行えます。 非自発的な解約は、ユーザーの支払いができなかったことによるものです。 たとえば、クレジットカードの有効期限が切れていたり、残高が不足するなどの支払い上の問題に起因します。 本来解約するつもりはないため、決済に失敗している状況を解決すれば再び定期購入を継続される可能性があります。
非自発的な解約を防ぐ機能
非自発的な解約を防ぐ機能には、猶予期間 (Grace Period)とアカウントの一時停止 (Account Hold)の2つがあります。
猶予期間は、ユーザーの支払いが失敗した場合に購読をすぐに解約させるのではなく、これまでと同様に購読状態を一定期間保ち続ける機能です。
猶予期間期間後は購読状態が停止するアカウントの一時停止に入ります。 アカウントの一時停止の期間内に支払い状態が更新された場合、定期購入で提供されているサービスに再びアクセスできるようにする必要があります。
これらの機能により、ユーザーの意図にそわない解約を防ぎ、効果的に購読期間を継続できます。
\ | 期間[2] |
---|---|
Grace Period | 3, 7, 14, 30日間 |
Account Hold | 30日間 |
Play ストアでは定期購入期間が長くなるごとに選択肢が増えていきます。 1週間では3日か7日、4週間では14日が追加、1ヶ月以上では30日と選択肢が増えます。 アカウントの一時停止は最大30日間で期間を変更できません。
なお、2020年11月1日から猶予期間はデフォルトでオン、アカウントの一時停止は必須の設定となっております[3]。
Googleによれば、アカウントの一時停止を有効にすると、自発的でない離脱を8%減少させ、支払いの失敗からの復帰率を35%上昇できます[3]。
日経は2020年に猶予期間とアカウントの一時停止の状態をアプリ内で訴求するような施策を導入しました。 施策導入前後で比較した場合に、自発的でない離脱を10%以上改善されました。 すなわち、定期購入の継続率の向上につながり、収益への大きなインパクトが得られました。
実装について
猶予期間とアカウントの一時停止は、特に何も実装をしなくても機能が有効であれば、支払いの失敗時にはそれぞれメールとストアアプリによる通知が行われます。 しかし、より気づいてもらうためにアプリ内でユーザーへ支払情報の更新を促す実装が必要です。
猶予期間とアカウントの一時停止の実装では、定期購入のライフサイクルへの理解がかかせません。 定期購入中に解約が発生したケースをReal-time developer notificationsの通知[4]をもとに図示すると次のようになります。

ちなみにPaused(一時的な購読の保留)と組合わせた場合はアカウントの一時停止のライフサイクルで考慮する事項が増えます。すなわち、購読が再びスタートした場合にアカウントの一時停止となる状況を想定しなければなりません。
各ライフサイクルにおけるReal-time developer notificationsとGoogle Play Developer APIの値についてはドキュメント[5]やブログ[6]をご参照ください。
アプリ内での判別
猶予期間とアカウントの一時停止はGoogle Play Billing Libraryでは判別できません。
BillingClient.queryPurchasesAsync()
[7]のライフサイクルごとの返り値は次の表のとおりです。
\ | Is returned? | isAutoRenewing |
---|---|---|
Active(有効) | Yes | True |
Cancelled(解約済み) | Yes | False |
Grace Period(猶予期間) | Yes | True |
Account Hold(アカウントの一時停止) | No | N/A |
Paused(一時的な購読の保留) | No | N/A |
Expired(期限切れ) | No | N/A |
すなわち、有効と猶予期間が、アカウントの一時停止と一時的な購読の保留、期限切れのステータスはすべて同じ値となります。
アプリ内の表示
アプリ内での表示は、アプリを使用しているユーザーに訴求できます。 日経ではダイアログでの表示とバナーでの表示を行いました。 サーバーから契約ステータスの情報を受け取り、アプリ内でユーザーに支払いが失敗している旨を伝えます。

猶予期間期間中は購読中と同じ機能が使えるため、有料機能の画面にバナーの形で常駐した表示を行いました。 また、契約の状況を強調するために1日1回ダイアログを表示するようにしました。
アプリ内での表示は、専用のUIを用意する必要がある他、支払い方法の問題を修正するためにはIntentでhttps://play.google.com/store/account/subscriptions?sku={sku_id}&package={package_id}
を開きアプリの外に遷移しなければなりません[8]。
修正はGoogle Play ストア上で行う必要がありアプリ内に完結しません。
今後in-app messaging[9]という機能が導入予定で、支払いに失敗していることをアプリ内で通知でき、その場で修正できるような機能が提供されます。 今までよりも簡便に非自発的な解約を防ぐための導線が提供できることが期待されます。
検証について
非自発的な解約の検証は状況を再現するステップが少し複雑です[10]。 検証を行うにあたりアカウントがライセンステスターとして登録され、テストカードが使えることをご確認ください。
検証は次のような操作を行い整えていきます。
- アプリ内課金を行います。
- Play ストア アプリのドロワーから定期購入を選択し、購入商品をタップします。
- メインのお支払い方法の
更新する
をタップし、 テストカード、常に不承認 を選択します。 - 5分ほど経過後、メールとPlay ストア アプリから
お支払いは承認されませんでした
という通知が来ます。これがGrace Period(猶予期間)です。 - 更に5分ほど経過すると、メールとPlay ストア アプリから
定期購入は一時停止中です
という通知がきます。これがAccount Hold(アカウントの一時停止)です。
各ステップでは次のような画面が表示されています。

定期購入の検証は、実際の課金の流れの中で検証を行う必要があり、大体一回あたり15分以上かかります。 より効率的に検証ができるように事前に準備を進めておきましょう。
さいごに
アプリ内課金の定期購入の非自発的な解約を防ぐための実装について紹介しました。 非自発的な解約は、本来は継続的に購読される可能性のあるユーザーです。
今回ご紹介した独自の実装に加え、今後解約防止の機能は強化されていきます。 ユーザーの流入施策の両輪として、まずは出ていってしまう可能性を減らしておくことは重要です。
明日は3日目、髙木さんによる「Bitrise CIを用いたCIキャッシング・並行実行テクニック」です。お楽しみに!!
[1]: 解約理由についてのPlay Console上の分類, https://support.google.com/googleplay/android-developer/answer/7391949?hl=ja#zippy=%2C%E8%A7%A3%E7%B4%84%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88
[2]: 定期購入の各種設定値について, https://support.google.com/googleplay/android-developer/answer/140504?hl=ja
[3]: アカウントの一時停止の効果について, https://developers-jp.googleblog.com/2020/06/new-features-to-acquire-and-retain-subscribers.html
[4]: 定期購入の通知ステータス, https://developer.android.com/google/play/billing/rtdn-reference#sub
[5]: 定期購入のドキュメント, https://developer.android.com/google/play/billing/subscriptions
[6]: 【2020年版】Play Commerceアップデート対応, https://syarihu.medium.com/2020%E5%B9%B4%E7%89%88-play-commerce%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E5%AF%BE%E5%BF%9C-682716d240fd
[7]: ライフサイクルの返り値の表から抜粋, https://developer.android.com/google/play/billing/subscriptions#lifecycle
[8]: 定期購入の管理画面への遷移, https://developer.android.com/google/play/billing/subscriptions#deep-link
[9]: Google Play updates from #AndroidDevSummit, https://android-developers.googleblog.com/2021/10/whats-new-in-google-play.html
[10]: 定期購入の検証について, https://developer.android.com/google/play/billing/test