Google Play 定期購入 比例配分モード完全攻略ガイド

Taichi Sato (syarihu)
25 min readJun 23, 2022

--

DroidKaigi 2021で発表した「Google Play 定期購入 比例配分モード完全攻略ガイド」を記事にしました。

基本的に下記の発表と同じ内容なので、動画のほうが良いという方はぜひ下記のYouTubeの発表動画をご覧ください。

ドキュメントとして社内に展開したいなどのケースで必要であれば、ぜひ本記事をお使いください。

注意点として、本記事 / 発表に出てくるサンプルコードはPlay Billing Library 4.xまでのSkuDetailsのコードとなっており、5.xからはProductDetailsを利用する必要があります。
しかし比例配分モードの考え方は変わらないので、サンプルコードについては適宜ProductDetailsに読み替えてください。

目次

  1. Google Playの定期購入
  2. 定期購入の切り替え
  3. 定期購入の比例配分モードとは
  4. 比例配分モードの種類
  5. 無料試用における比例配分モード
  6. シナリオ別に推奨する比例配分モード

1. Google Playの定期購入

はじめに、Google Playの定期購入についてです。

Google Playには、ユーザーに定期的に請求を行うアプリ内コンテンツまたはアプリ内サービスについて、その支払いや通知、管理を行う仕組みが用意されています。
Google Playではそれを定期購入といいます。

Google Playの定期購入の期間は、Play Consoleでの定期購入の作成時に設定できます。期間は、1週間、4週間、1ヶ月、3ヶ月、6ヶ月、1年のいずれかを選択できます(DroidKaigi 2021の発表時点)。

2. 定期購入の切り替え

Google Playでは、ひとつのアプリで定期購入を複数提供している場合、すでに契約中の定期購入から別の定期購入に切り替えできる仕組みが用意されています。
定期購入の切り替えにおけるダウングレードやアップグレードといった定期購入同士の関連付けについては、Play Console上には設定はありません。
そのため、契約中の定期購入から別の定期購入への切り替えはアプリの実装で設定することになります。

3. 定期購入の比例配分モードとは

定期購入を切り替える際に、契約中の定期購入の残りの期間や、すでに支払っているクレジットをどのように扱うかを設定できます。
その設定のことを比例配分モードと言います。

比例配分モードにはいくつかの種類があり、状況に応じて使い分けるのが望ましいです。
比例配分モードの種類と各モードの違いについては後ほど解説します。

比例配分モードは、定期購入の切替時にアプリの実装で設定します。定期購入から定期購入への切り替えの実装は次のようになっています。

setReplaceSkusProrationMode(PBL 5.0からはsetReplaceProrationMode)で比例配分モードを指定します。指定しない場合はデフォルトの比例配分モードであるIMMEDIATE_WITH_TIME_PRORATIONが設定されます。

比例配分モードについて簡単にわかったところで、次に比例配分モードの種類と各モードの違いについて解説します。

4. 比例配分モードの種類

比例配分モードには、次の5種類あります。各モードについてそれぞれ解説します。

  • IMMEDIATE_WITH_TIME_PRORATION
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE
  • IMMEDIATE_WITHOUT_PRORATION
  • DEFERRED
  • IMMEDIATE_AND_CHARGE_FULL_PRICE

比例配分モードの種類 ~ IMMEDIATE_WITH_TIME_PRORATION ~

IMMEDIATE_WITH_TIME_PRORATIONは、比例配分モードを指定しないときにデフォルトで設定される比例配分モードです。このモードでは定期購入はすぐにアップグレードまたはダウングレードされます。

支払い済みの料金を残りの定期購入期間で日割りした額が、新しい定期購入の支払いに充当されます。古い定期購入の料金を使い切ったあとに新しい定期購入が請求されるため、定期購入の更新日が変わります。

文字だけだと分かりにくいので図を使って見ていきましょう。

月額600円の定期購入Aから年額10,950円の定期購入Bに切り替えるケースを考えてみます。
定期購入Aの支払い開始日は9月1日で、9月15日に定期購入Bに切り替えるとします。

定期購入Bに変更した時点で、定期購入Aの契約はすぐに終了し、定期購入Bに切り替わります。

15日に切り替えたので、定期購入Aの支払い済の600円のうち、15日分がまだ残っています。
この15日分のクレジットは定期購入Bに充当されるので、定期購入Bの何日分になるのか計算して求めてみましょう。

定期購入Aを日割りしたとき、600円割る30日なので1日20円使えることになります。

定期購入Aを日割りしたときの額が1日20円、定期購入Bへの切り替え日が15日なので、使用済みのクレジットは20円かける15日で300円です。

定期購入Aの月額は600円、使用済クレジットは300円なので、600円ひく300円で残りは300円です。

定期購入Bは年額なので、定期購入Bを日割りすると10,950円わる365日で1日30円です。

定期購入Aの残りクレジットは300円なので、定期購入Aの残りで払える定期購入Bの日数は300円わる30円で10日となります。

定期購入Aの本来の更新日は30日でしたが、定期購入Bに切り替わり、定期購入Aの残りクレジットはBの10日分になるため、

定期購入Bの支払い開始日は9月26日になります。

9月26日に定期購入Bの10,950円が請求されるため、このあとは毎年9月26日に定期購入Bの金額が請求されることになります。

これが、IMMEDIATE_WITH_TIME_PRORATIONの仕組みです。

比例配分モードの種類 ~ IMMEDIATE_AND_CHARGE_PRORATED_PRICE ~

IMMEDIATE_AND_CHARGE_PRORATED_PRICEはアップグレードにのみ使用できます。定期購入はすぐにアップグレードされます。

ここでいうアップグレードとは、変更前の定期購入よりも時間単位の料金が高い定期購入への変更のことを言います。

たとえば、次のようなケースを考えてみましょう。

  • 定期購入A(200円 / 月)
  • 定期購入B(3,600円 / 年 = 300円 / 月)

定期購入Aは月額200円、定期購入Bは年額3,600円です。定期購入Bは年額を月で割って月額に直すと300円となります。

定期購入Aから定期購入Bへの変更は、定期購入Aは200円、定期購入Bは300円で、定期購入Bの方が単位時間あたりの価格が高いため、アップグレードとなるので、このモードを使用できます。

このモードでは、新しい定期購入と古い定期購入のそれぞれで、定期購入の請求日までの残り日数分の金額を計算し、その差額をすぐに請求します。そのため、定期購入の更新日は変わりません。

図を使って詳しくみていきましょう。

先ほどと同様に定期購入Aは月額600円、定期購入Bは10,950円の定期購入のケースを考えてみましょう。
定期購入Aは9月1日に購入し、9月15日に定期購入Bに変更、定期購入Aの更新日は10月1日とします。

定期購入Aを日割りしたときの残りクレジットと定期購入Bを日割りしたときの金額は先ほどの解説と同じなので割愛します。

違うのはここからです。このモードは、変更日からの残り日数分の料金から定期購入Aの残りクレジットを引いた料金をすぐに請求します。

定期購入Bの15日分の料金は30かける15で450円、定期購入Aの残りは300円なので、450円引く300円で150円分が差額になります。

なのでこのケースでは定期購入Bへの変更時に150円がすぐに請求されます。

差額がすぐに請求されるため、定期購入の期間は変わらず、10月1日のままとなります。

なので次回更新のタイミングの10月1日には定期購入Bの10,950円が請求され、その後毎年10月1日にBの金額が請求されます。

これが、IMMEDIATE_AND_CHARGE_PRORATED_PRICEの仕組みです。

比例配分モードの種類 ~ IMMEDIATE_WITHOUT_PRORATION ~

IMMEDIATE_WITHOUT_PRORATIONは、追加料金なしですぐにアップグレードまたはダウングレードされます。
そのため新しい定期購入と古い定期購入の差額は請求されず、定期購入の更新日も変わりません。
定期購入の次回更新日に新しい定期購入の価格が請求されます。

図を使ってみていきましょう。

先ほどと同様に定期購入Aは月額600円、定期購入Bは年額10,950円、9月1日にAを購入し、9月15日に定期購入Bに変更するケースを考えます。

このモードでは、新しい定期購入への変更日に追加料金なしで新しい定期購入にアップグレードされます。

支払いサイクルも変わらず、定期購入Aの更新日であった10月1日に定期購入Bの支払いが開始されます。

そのため、10月1日に定期購入Bの料金が初めて請求されます。

これが、IMMEDIATE_WITHOUT_PRORATIONの仕組みです。
これまで解説したモードと違ってだいぶシンプルであることが分かりますね。

比例配分モードの種類 ~ DEFERRED ~

DEFERREDは古い定期購入の期間終了後に新しい定期購入にアップグレードまたはダウングレードされます。
古い定期購入は、有効期限が切れるまで継続するため、新しい定期購入の購入予約のような状態になります。

購入予約をした時点では、新しい定期購入の料金は請求されないため、新しい定期購入のレシートは返ってきません。
新しい定期購入のレシートが取得できないため、新しい定期購入に切り替わるまで、定期購入の変更はできなくなります。

古い定期購入の有効期限が切れたら新しい定期購入が有効になり、新しい定期購入に切り替わります。
新しい定期購入は古い定期購入の有効期限が切れてから請求が行われるため、アプリ外購入のような挙動になります。

この場合、アプリ側で購入を検知するにはユーザーがアプリを開く必要がありますが、acknowledgeの仕組みがあるため、購入から3日以内にアプリが開かれないと払い戻しが行われてしまいます。

ユーザーが購入から3日以内にアプリを開く保証が無いため、DEFERREDでは新しい定期購入への更新通知はRealtime Developer Notificationsを使って検知し、サーバー側でacknowledgeすることを強く推奨しています

DEFERREDも図を使って見ていきましょう。

これまでの説明と同様に定期購入Aは月額600円、定期購入Bは年額10,950円、9月1日に定期購入Aを購入し、9月15日に定期購入Bに変更するケースを考えます。

定期購入Bへの変更後、定期購入Aの有効期限が切れるまでは定期購入Aの利用が継続します。

そのため、定期購入Aの有効期限が切れるまでは定期購入Bには切り替わりません。

定期購入Aの有効期限が切れてから定期購入Bの料金が請求され、定期購入Bの利用が開始されます。

これが、DEFERREDの仕組みです。

比例配分モードの種類 ~ IMMEDIATE_AND_CHARGE_FULL_PRICE ~

IMMEDIATE_AND_CHARGE_FULL_PRICEは定期購入はすぐにアップグレードまたはダウングレードされます。

変更したその日に新しい定期購入の全額が請求されます。
古い定期購入の金額の残り期間の日割り分が新しい定期購入期間に追加されます。
そのため、定期購入の更新日が変わります。

図を使ってみていきましょう。

これまでの説明と同様に定期購入Aは月額600円、定期購入Bは年額10,950円、9月1日に定期購入Aを購入し、9月15日に定期購入Bに変更するケースを考えます。

このモードでは、定期購入Bへの変更時にすぐに定期購入Bの全額が請求されます。

すぐに定期購入Bに切り替わるので、定期購入Bの本来の更新日は1年後の9月15日になります。

しかしこのモードでは、古い定期購入の金額の残り期間の日割り分を新しい定期購入期間に追加します。

定期購入Aの残りクレジットと定期購入Bの日割り額についてはこれまでの説明と同様です。

定期購入Aの残りクレジットで払える定期購入Bの日数は300円わる30円で10日です。

なので、定期購入Bの期間の1年に10日を加えた日が更新日になります。

これが、IMMEDIATE_AND_CHARGE_FULL_PRICEの仕組みです。

5. 無料試用における比例配分モード

ここまで比例配分モードの種類について解説してきました。
比例配分モードは無料試用では少し挙動が違うため、次に無料試用における比例配分モードについて解説します。

定期購入の無料試用には2つのパターンがあります。

無料試用が定期購入ごとに1回使えるパターンと、アプリのすべての定期購入で1回しか使えないパターンです。
各パターンで比例配分モードの挙動が違うケースがあるため、比例配分モードを利用する場合は自身のアプリがどちらの設定になっているのか確認しておくとよいでしょう。

この設定はPlay Consoleの設定から確認、変更できます。

無料試用における比例配分モードもそれぞれ解説します。

無料試用における比例配分モード ~IMMEDIATE_WITH_TIME_PRORATION~

定期購入ごとに1回の場合は、ユーザーは直ちに無料試用を失いますが、すぐに新しい定期購入の無料試用が開始されます。
古い定期購入の残りの無料試用期間は、新しい定期購入と同等の無料期間に変換され、新しい定期購入の無料試用期間に追加されます。

アプリのすべての定期購入で1回の場合、直ちに無料試用を失うのは変わりませんが、無料試用はアプリで1回しか使えないため、新しい無料試用が開始されることはありません。
古い定期購入の残りの無料試用期間は、価格差に基づいて新しい定期購入の無料期間に換算されます。

これらの仕組みについて図を使って詳しく見ていきましょう。

定期購入Aは月額600円で9月1日に無料試用が開始され、定期購入Bは月額900円で9月15日に定期購入Aから定期購入Bに変更します。

このモードの定期購入ごとに1回の場合は、定期購入Aの無料試用分の残クレジットを定期購入Bの日割り額で割った日数分を、定期購入Bの無料期間として追加します。

今回、定期購入Bの無料試用期間は30日なので、

定期購入Aの無料試用分で利用可能な定期購入Bの日数は30日の前に追加されます。

それを計算すると、定期購入Aを日割りしたときの残りクレジットは300円、定期購入Aの残りクレジットで払える定期購入Bの日数は10日です。

そのため、定期購入Bの無料試用の前に追加される日数は10日になります。

定期購入Aの残りと定期購入Bの無料試用を使い切ったあとに定期購入Bの支払いが開始することになるので、

定期購入Bの支払開始日は10月26日に変更されます。

これが、定期購入ごとに1回の無料試用におけるIMMEDIATE_WITH_TIME_PRORATIONの仕組みです。

定期購入ごとに1回では、定期購入Bの無料試用期間の30日分が追加されますが、アプリごとに1回ではこの部分が無くなります。

アプリのすべての定期購入で1回の場合のIMMEDIATE_WITH_TIME_PRORATIONの仕組みを図を使ってみてみましょう。

追加される無料期間が10日だけとなり、定期購入Aの残りを使い切ったら定期購入Bの支払いが発生します。

そのため、定期購入Bへの変更をした10日後の9月26日が定期購入Bの支払い開始日となります。

これが、アプリのすべての定期購入で 1回の無料試用におけるIMMEDIATE_WITH_TIME_PRORATIONの仕組みです。

無料試用における比例配分モード ~IMMEDIATE_AND_CHARGE_PRORATED_PRICE~

IMMEDIATE_AND_CHARGE_PRORATED_PRICEでは、無料試用のパターンでの違いはありません。
無料試用でないときと同様、アップグレードでのみ利用できます。
ユーザーは直ちに無料試用を失います。
ユーザーには定期購入の残りの期間の差額が請求されます。
そのため、次回の請求日は変更されません。

図を使ってみていきましょう。

定期購入Aは月額600円で9月1日に無料試用が開始され、定期購入Bは月額900円で9月15日に定期購入Aから定期購入Bに変更します。

このモードでは定期購入Bがすぐに利用できますが、

ユーザーは定期購入Aの無料試用を失い、定期購入の残り日数分の定期購入Bの価格をすぐに請求します。

定期購入Bを日割りしたときの30円に残りの日数の15日をかけた価格が450円になるので、ユーザーには450円がすぐに請求されます。

残り期間の料金をすぐに支払うため、定期購入の請求日は変更されません。

これが無料試用におけるIMMEDIATE_AND_CHARGE_PRORATED_PRICEの仕組みです。

無料試用における比例配分モード ~IMMEDIATE_WITHOUT_PRORATION~

IMMEDIATE_WITHOUT_PRORATIONでは、無料試用のパターンでの違いはありません。
すぐに新しい定期購入に変更されます。
以前の定期購入期間が終了するまで、新しい定期購入への無料試用のアクセス権は保持されます。

図を使ってみていきましょう。

定期購入Aは月額600円で9月1日に無料試用が開始され、定期購入Bは月額900円で9月15日に定期購入Aから定期購入Bに変更します。

新しい定期購入はすぐに利用できます。

定期購入Aの無料試用期間を保持したまま定期購入Bがそのまま利用できるため、追加の請求はされません。

定期購入Aの無料期間が継続されるため、定期購入の更新日は変更されず、10月1日に定期購入Bの請求が始まります。

これが無料試用におけるIMMEDIATE_WITHOUT_PRORATIONの仕組みです。

無料試用における比例配分モード ~DEFERRED~

DEFERREDでは、無料試用のパターンでの違いはありません。
次回の請求日まで、以前の定期購入の無料試用を利用できます。

図を使ってみていきましょう。

定期購入Aは月額600円で9月1日に無料試用が開始され、定期購入Bは月額900円で9月15日に定期購入Aから定期購入Bに変更します。
このモードでは、次の請求日まで定期購入Bへは変更されず、定期購入Aの無料試用が利用できます。

定期購入Bは購入予約のような状態になります。

定期購入Aの無料試用期間が終わったら定期購入Bに切り替わり、定期購入Bの請求が始まります。

これが無料試用におけるDEFERREDの仕組みです。

無料試用における比例配分モード ~IMMEDIATE_AND_CHARGE_FULL_PRICE~

IMMEDIATE_AND_CHARGE_FULL_PRICEは、無料試用のパターンでの違いはありません。
ユーザーは直ちに無料試用を失います。新しい定期購入の全額がユーザーに請求されます。
次回の請求日は、新しい定期購入の期間に残りの期間を加えた日付になります。

図を使って見ていきましょう。

定期購入Aは月額600円で9月1日に無料試用が開始され、定期購入Bは月額900円で9月15日に定期購入Aから定期購入Bに変更します。

定期購入Bへの変更日にユーザーは無料試用を失います。

定期購入Bへの変更日に、定期購入Bの全額である900円がすぐに請求されます。

そのため支払い済みの定期購入Bの1ヶ月分が、まずは定期購入Bの期間として利用できます。

定期購入Aの無料期間の残りを定期購入Bに換算した日数分が、支払い済の定期購入Bの期間に追加されます。

定期購入Aの残りクレジットは計算すると300円、定期購入Aの残りクレジットで払える定期購入Bの日数は計算すると10日になります。

そのため、定期購入Aの残りを定期購入Bに換算した10日分が後ろに追加されるので、1ヶ月と10日が定期購入Bが利用できる期間となります。

その期間が終わると定期購入Bの請求が始まるため、定期購入Bの更新日は定期購入Aから定期購入Bへの変更日から1ヶ月と10日後の10月26日になります。

これが無料試用におけるIMMEDIATE_AND_CHARGE_FULL_PRICEの仕組みです。

6. シナリオ別に推奨する比例配分モード

最後に、定期購入のドキュメントに記載されている、シナリオ別に推奨される比例配分モードについて紹介します。

契約中の定期購入とは違う機能を提供する定期購入にアップグレードする場合

契約中の定期購入とは違う機能を提供する定期購入にアップグレードする場合は、IMMEDIATE_AND_CHARGE_PRORATED_PRICEが推奨されます。

IMMEDIATE_AND_CHARGE_PRORATED_PRICEでは、定期購入の請求日までの残りの日数分のみがすぐに請求されますが、定期購入の請求対象期間は変わらず、すぐに新しい定期購入が利用できるために推奨されています。

契約中の定期購入とは違う機能を提供する定期購入にダウングレードする場合

契約中の定期購入とは違う機能を提供する定期購入にダウングレードする場合は、DEFERREDが推奨されています。

ユーザーは、より高額な定期購入の料金を支払い済みであり、高額な定期購入を次の請求日いっぱいまで利用できるためです。

同じ機能を持つ定期購入の契約期間の変更(月単位から年単位など)

契約期間のみの変更の場合、ややこしい差額計算などがなく次回の請求日に新しい契約期間の料金を支払うだけでよいDEFERREDが推奨されています。

無料試用期間中のアップグレードをする場合

無料試用期間中のアップグレードをする場合、IMMEDIATE_WITHOUT_PRORATIONが推奨されています。

古い定期購入の試用期間を保持したまま、残りの試用期間は新しい定期購入が利用できるというメリットがあるためです。

無料試用期間中のアップグレードで無料試用へのアクセスを終了させたい場合

無料試用期間中のアップグレードで無料試用へのアクセスを終了させたい場合は、IMMEDIATE_AND_CHARGE_PRORATED_PRICEが推奨されています。

変更日から残り期間の料金のみの請求となり、新しい定期購入がすぐに利用できるためです。

おわりに

こんなにも長い解説記事を見てくださり、ありがとうございました。おつかれさまでした。

何か資料に間違いなどありましたら、@syarihuまでご連絡いただけますと幸いです。

参考資料

--

--