技術本部 Mobile Application Groupの山本です。名刺アプリEightの開発を行っています。今回はGoogle Playでの定期購入の値上げについてお話しします。
値上げはただ価格を上げればいいのではと思うかもしれません。しかしGoogle Playでは定期購入の既存ユーザーの値上げには基本的にユーザーの明示的な同意が必要です。値上げに同意いただけなかった場合は自動的に解約されてしまいます。本エントリでは値上げの同意についてわかりにくい部分について記載します。
ユーザーが値上げ分の価値がないと判断した場合は解約に至っても仕方がないのですが、気が付かずに意図せずに解約されてしまった場合、ユーザーに不都合が生じてしまいます。本エントリではその状態をなるべく避けるために、効果的にサービスから同意のリマインドを送る方法についても記載します。
注意点として本内容は2023年7月現在のものであり、これ以降に変更される可能性があります。実際に行う場合は現在の状態を必ず公式のドキュメントで確認してください。
定期購入の価格変更の概要
定期購入の価格変更については以下の公式ドキュメントに書かれています。 このうち要点と分かりにくい点についてのみ解説します。
定期購入の価格を変更する | Google Play の課金システム | Android Developers
新規と既存の契約者の違い
定期購入の価格を変更した場合、新規の定期購入の価格は変更されますが、既存の定期購入者の価格はそのままでは変更されません。逆に言うと、新規の定期購入の価格は上げたいが、既存顧客の継続の料金を変えない場合には、アイテムを新規に作る必要はありません。
ここで"価格コホート"という概念が出てきます。これは旧価格の既存の定期購入者のグループのことです。この"価格コホートを終了する"ことによって、旧価格の既存の定期購入者を新価格にすることができます。
これ以降の文章において"値上げ"とは既存ユーザーの値上げである"価格コホートの終了"を指します。特に明示しないかぎり、新規ユーザーの値上げではありません。
値上げの同意
値上げの場合はユーザーの明示的な同意が必要です。同意がない状態で値上げ後の価格が適用される最初の支払日になると、自動的に解約されます。値下げの場合はこの同意は不要です。
同意はGoogle Playの定期購入画面から行います。Billing Libraryを使用してアプリ内で行うことはできません。アプリから同意を促したい場合は https://play.google.com/store/account/subscriptions のディープリンクで遷移させる必要があります。PC版のGoogle Playからでも同意は可能です。
値上げであっても同意が不要な場合もあります。以下の"オプトアウトによる値上げ"がそれに該当します。問題はこのオプトアウトによる値上げか可能かどうかを事前にチェックする方法はなく、実際に価格コホートの移行を行う時に、"ユーザーのオプトアウト"のチェックボックスが使用できるかで判別するしかありまません。今回はこのケースは扱いません。
定期購入の価格を変更する | Google Play の課金システム | Android Developers
値上げに伴うイベントのタイムテーブル
値上げに伴うイベントのタイムテーブルについて説明します。イベントは3つあります。
- 値上げ後の価格が適用される最初の支払日
- Googleから値上げの通知がユーザーに送られる日
- ユーザーが定期購入画面から値上げの同意ができるようになる日
以下に詳しく書いてあるので、この図に沿って説明します
定期購入の価格を変更する | Google Play の課金システム | Android Developers
値上げ後の価格が適用される最初の支払日
"値上げ後の価格が適用される最初の支払日"は非常に重要です。この日までに同意がないと解約されてしまいます。 定期購入の支払日はユーザーによって異なります。"値上げ後の価格が適用される最初の支払日"は値上げから38日目以降の最初の支払日です。 Googleの例におけるEffective Dateの後の最初のRenewalになります。
Googleから値上げの通知がユーザーに送られる日
"Googleから値上げの通知がユーザーに送られる日"は上記の"値上げ後の価格が適用される最初の支払日"の30日前です Googleの例におけるNotification Dateになります。
ユーザーが定期購入画面から値上げの同意ができるようになる日
"ユーザーが定期購入画面から値上げの同意ができるようになる日"はドキュメントには明確に書かれていません。
実際に確認したところ、値上げを行ってから8日後以降となります。 つまり"Googleから値上げの通知がユーザーに送られる日"以前でも値上げを行ってから8日後以降であれば同意は可能です。値上げ後7日間は定期購入画面に遷移しても値上げはできないので、同意を行ってもらうことはできません。
価格の変更作業
実際の定期購入価格の変更における注意点を説明します。
新規購入の価格の変更作業
Play Consoleの定期購入の"基本プランの編集"から価格を変更できます。 直接編集する場合は国ごとに価格を変更するのですが、まとめて変更したい場合はこの"Set prices"で選択した国をまとめて変更できます。この場合1つの国の価格を元に、その時点のレートで他の国に価格も変更できます。
注意点として、ここで設定する価格は"税抜き価格"であるということです。 例えば変更前の価格が日本円で600円だとします。この場合"Set prices"での現在の価格は550円と表示されます。これは50円が消費税10%分になるからです。変更後の価格も税抜き価格で指定する必要があります。
Google側の都合で微妙に誤差もあるので、実際の販売価格がいくらになるかは、"Set prices"で一度設定した後で各国の販売価格を見るしかありません。"Set prices"で設定しただけではまだ実際の価格には反映されず、変更を破棄することもできるので、実際に変えてみることを勧めます。
既存ユーザーのための価格コホートの終了
既存ユーザーの価格を変更するための価格コホートの終了のためには、上記で新規の価格変更を行った後で、基本プランのメニューを開きます。 メニューに"以前の価格を表示"というメニューが追加されています。これを選択すると"以前の価格"という画面が表示され、この画面から国を選択して、価格コホートを終了して新価格に移行することができます。
注意点としては、変更の確認画面において"ユーザーのオプトアウト"というチェックボックスが表示されます。説明は"値上げを避けるにはユーザーのオプトアウトが必要です"という文言でわかりにくいのですが、意味的にはチェックすればユーザーの同意なしのオプトアウトの値上げができるという意味のようです。なおオプトアウトができない場合もこのチェックボックスが表示されますが、チェックはできません。
同意のリマインドをサービスから送る
上記に書いた通り値上げ後の請求が行われる30日前にはGoogleから値上げの同意を促すメールと通知が送信されます。一方でサービス側としては1回だけの通知では見逃されてしまう可能性があるため、同意いただけていないユーザーに対して再度リマインドを送付したいという要求があります。
この場合以下の要件が発生します。この対応方法について記載します
- ユーザーが値上げに同意できる状態になってから送付したい
- 既に値上げに同意されたユーザーは送付対象から除外したい
- 既に解約済みのユーザーを送付対象から除外したい
ユーザーが値上げに同意できる状態になってから送付したい
ユーザーが値上げの同意ができる日については既に上で書きました。この日以降に送付すれば大丈夫です。
既に値上げに同意されたユーザーは送付対象から除外したい
アプリ側からBilling Libraryを使用して値上げの同意を取得する方法はありません。値上げの同意を取得するには以下のどちらかを使ってサーバー側で取得する必要があります。
リアルタイムデベロッパー通知を使用する
公式の推奨の方法は以下にあるようにRTDN、リアルタイムデベロッパー通知を使用する方法です。
定期購入の価格を変更する | Google Play の課金システム | Android Developers
リアルタイムデベロッパー通知の設定方法については以下を参照してください。
今回Eightではこのためにリアルタイムデベロッパー通知を設定しましたが、設定で特に難しい部分はありませんでした。
準備する | Google Play の課金システム | Android Developers
同意が行われると、以下のSubscriptionNotificationのnotificationTypeでSUBSCRIPTION_PRICE_CHANGE_CONFIRMEDが送信されます。
リアルタイム デベロッパー通知のリファレンス ガイド | Google Play の課金システム | Android Developers
Google Play Developer APIを使用する
Google Play Developer APIを使用している場合、purchases.subscriptions.getのレスポンスのSubscriptionPurchaseから同意状態を知ることもできます。
Method: purchases.subscriptions.get | Google Play Developer API | Google for Developers
値上げ対象の場合のみpriceChangeが含まれます。このstateが0の場合はまだ同意しておらず、1の場合は既に同意済みとなります。
REST Resource: purchases.subscriptions | Google Play Developer API | Google for Developers
既に解約済みのユーザーが送付対象から除外したい
ポイントはユーザーがGoople Play上で定期購入を解約しても、次回の支払い日までは契約が続くことです。今回の要求は既にGoople Play上で定期購入を解約したが、契約は続いているユーザーも除外したいということになります。
リアルタイムデベロッパー通知を使用する
ユーザーがGoople Play上で定期購入を解約するとSUBSCRIPTION_CANCELEDイベントが送信されると思われます。こちらはEightでは使用しませんでしたので未確認となります。
リアルタイム デベロッパー通知のリファレンス ガイド | Google Play の課金システム | Android Developers
Google Play Developer APIを使用する
purchases.subscriptions.getのレスポンスにcancelReasonが入っていれば解約済みと判断できます。Eightではこちらで判定しています。
REST Resource: purchases.subscriptions | Google Play Developer API | Google for Developers
テスト
定期購入の値上げの同意は複雑なので事前にテストをしてから実際の値上げ作業を行いたいです。しかしテストは簡単ではありません。
ライセンステスターでは値上げの同意のテストはできない
通常Google Playのアプリ内課金のテストでは以下のライセンステスターを使用します。ライセンステスターであれば、実際の課金を行うことなく購入することができます。
Google Play Billing Library 統合をテストする | Google Play の課金システム | Android Developers
しかしライセンステスターによる定期購入の場合、更新期間が1年のアイテムでも30分で更新が行われ、最大6回までしか更新できません。つまり最大でも3時間半で必ず解約されてしまいます。
一方で既に購入済みのユーザーに対する価格変更を行った場合、値上げへの同意が行うことができるのは値上げの1週間後です。つまりライセンステスターによる定期購入では、値上げへの同意のテストは行えません。
ライセンステスター用に値上げの同意までの期間を短くする方法がないか調べましたが、見つかりませんでした。
実際のユーザーが購入しているアイテムでテストのために値上げすることは推奨されていない
公式ドキュメントには“テスト目的でアクティブな定期購入者が所有している商品の定期購入価格を変更しないでください。”と書かれています。
定期購入の価格を変更する | Google Play の課金システム | Android Developers
テストはどうしても行いたかったため、今回は一般ユーザーは購入できないテスト専用の定期購入アイテムを作成して、自身のみ購入してテストを行いました。その場合の注意点について記載します。
価格の上限と下限に注意
Google Playでは購入可能な定期購入アイテムの一覧がユーザーから直接見えることはありませんので、テスト用のアイテムを追加しただけでは、ユーザーからそれが見えることはありません。
一方でアイテム価格の上限と下限はGoogle Playのアプリの詳細に表示されます。そのためテスト用アイテムの価格だからといって、現在販売しているアイテムの価格範囲と異なる範囲に設定すると、ユーザーからは不審に思われる可能性があります。
テストは1ヶ月前以上から余裕を持って行う
値上げの同意に伴う手順は時間がかかります。同意がGoogle Playの定期購入画面で行えるようになるまででも1週間かかります。
値上げした価格で実際に購入されるまでには、新規にテストアイテムを購入して、その直後に値上げをした場合でも、2ヶ月かかります。
例えば7/1に月更新のテストアイテムを新規購入して、7/2に値上げをした場合でも、8/1の更新日ではまだ値上げされません。値上げされるのは9/1の更新日になります。
値上げのフローを自身で確認したい場合は余裕をもってテスト計画を立てる必要があります。
Googleアカウントにクレジットカードを紐づける場合の注意
これについては明確なことは言えないのですが、テストを行う目的で同じクレジットカートを短期間で複数のGoogleアカウントに登録しようとしすると、クレジットカード番号の流出と判断される場合があります。
この場合、同じクレジットカードを登録しているGoogleアカウント全てに影響が出る場合があるようですので御注意ください。
まとめ
定期購入の値上げの際にユーザーの同意を必要とするという仕様は、ユーザーが知らないうちに不合理な値上げをされるという問題を防ぐ意味で、ユーザー保護という観点からは望ましいと考えます。
一方でサービス提供者の側から見ると、意図して価格に対してサービス価値が見合わなないと判断されて継続しないなら仕方ないのですが、見落としによる意図しない解約が発生する事態が発生することは避けたいところです。
定期購入の値上げの同意はテストを行われることが想定されておらず、テストを行うときにはさまざまな制限があります。事前に十分な調査と準備をしてから値上げを行いましょう。