Google Play のサブスクリプションアドオンは1件ずつ返金できるが、ユーザーはバンドル全体しか解約できない
Google Play では、1つの基本サブスクリプションに最大 49 個のアドオンを同じ購入トークンでまとめられます。サブスクリプションアドオンの返金の仕組み、他のアイテムに影響を与えずに1件だけ返金する API 呼び出し、Google がそれをブロックするケース、そして返金方法ごとのコストを解説します。

要点
- Google Play のアドオン付きサブスクリプション機能では、基本サブスクリプションと最大 49 個のアドオン、合計 50 アイテムを1回の購入にまとめます。すべてのアイテムは同じ請求期間で更新される必要があります。
- Google Play のユーザーは、Play の定期購入センターから個別のアドオンを解約できません。解約できるのは基本サブスクリプションとアドオンをまとめた全体だけなので、アドオンを1つだけ外す操作はデベロッパーのアプリ内で提供する必要があります。
- purchases.subscriptionsv2.revoke メソッドは、productId を1つ指定した itemBasedRefund を受け付けます。他のアイテムが有効なままであれば、Google はそのアイテムだけを取り消して全額返金し、サブスクリプションは継続します。
- サブスクリプションが支払い拒否の状態にあるとき、アイテムが期限切れか未所有のとき、そしてプリペイドのサブスクリプションでは、Google はアイテム単位の返金をブロックします。
- アドオン付きサブスクリプションに proratedRefund を使うと、すべてのアイテムの最新注文が次回更新までの残り期間に応じて日割りで返金され、すべてのアイテムへのアクセスが一度に取り消されます。
- アドオン付きサブスクリプションのリアルタイム デベロッパー通知には subscriptionId が含まれません。そのため、バックエンドは purchases.subscriptionsv2.get を呼び出し、各 lineItem を読んで、どのアイテムがまだ利用可能かを確認する必要があります。
- Google Play でデベロッパーに証拠の提出を求める返金フローは、orders.reviewrefund による審査対象としてフラグが付いたチャージバックだけで、期限は24時間です。2026年8月3日より後の注文では、チャージバックに負けると、購入価格から Play のサービス手数料を差し引いた額と、銀行の手数料をデベロッパーが負担します。
Google Play で3つのアドオン付きの基本サブスクリプションを販売している場合、残りを解約せずに、そのうちどれか1つのアドオンだけを返金できます。ところがユーザー側からは同じことができません。Google はユーザーにバンドル全体の解約しか認めていないため、Google Play のサブスクリプションアドオン返金を細かく扱う手段は、デベロッパーであるあなたの手元にあり、しかも API 経由でしか使えません。正しく使えば、問題のあった行だけを返金できます。呼び出しを間違えると、すべてを返金するか、すべてを取り消すことになります。
アドオン付きサブスクリプションの構造
Google は I/O 2025 で、サブスクリプションの複数商品チェックアウトを発表しました。1回の購入フローで基本サブスクリプションと任意のアドオンを販売し、同じスケジュールでまとめて請求します。Google のデベロッパーガイドには明確な制限があります。
- アドオンを付けられるのは自動更新の基本プランだけです。プリペイドプランには付けられません。
- すべてのアイテムは同じ請求期間で更新される必要があります。年額の基本プランに月額のアドオンを付けることはできません。
- 1回の購入に含められるのは最大 50 アイテム、つまり基本プラン1つとアドオン最大 49 個です。
- この機能は韓国では利用できません。
これらはすべて1つの購入トークン上にあります。purchases.subscriptionsv2.get を呼び出すと、レスポンスには lineItems リストが含まれ、アイテムごとに1つのエントリがあります。各 line item は、それぞれ独自の productId、expiryTime、latestSuccessfulOrderId を持ちます。最後のフィールドこそがアイテム単位の返金を可能にしています。各アイテムが独自の最新注文を持っているからです。
日割り計算は初日から始まる
ユーザーが請求期間の途中でアドオンを追加すると、Google はすぐに日割り額を請求し、アドオンが基本プランと同じ日に更新されるようにします。Google 自身の例では、7日間の試用のあと8月15日に追加された $10 の月額アドオンに、8月の残り分として $2.90 が請求されます。つまり1つのアドオンでも、最初の通常注文の前に、期間が短く半端な金額の初回注文が存在することがあります。返金がどの注文に当たるかを調べるときは、この点に注意してください。
ユーザーはバンドル全体しか解約できない
Google の一般ユーザー向けヘルプページははっきり書いています。ユーザーは基本サブスクリプションとアドオンをまとめてしか解約できず、現時点では Google Play から個別のアドオンを解約することはできません。一時停止も利用できません。ユーザーが値上げを承認しなかった場合、Google は基本サブスクリプションとすべてのアドオンをまとめて解約します。
その結果、アドオンを1つだけやめたいユーザーには、Play Store で2つの選択肢しか残りません。すべてを解約するか、返金を求めるかです。どちらもあなたにとって望ましくありません。Google のガイドによれば、代わりにアプリ側で削除機能を提供できます。削除されたアドオンは現在の請求期間の終わりに期限切れとなり、バンドルの残りは更新され続けます。
Google Play のサブスクリプションアドオン返金ツールの比較
アドオン付きサブスクリプションでお金を返す方法は、Google が5つ用意しています。違いは、何が返金されるかと、アクセスが終了するかどうかです。
| ツール | 返金される対象 | アクセスへの影響 |
|---|---|---|
| Play Console で特定の注文を返金 | その注文に対してあなたが指定した金額 | 何も取り消されない |
| orders.refund(revoke 未設定) | 1件の注文の全額 | 何も取り消されない |
| subscriptionsv2.revoke と itemBasedRefund | 1アイテムの最新請求の全額 | そのアイテムだけが終了する。ただし最後の有効アイテムだった場合を除く |
| subscriptionsv2.revoke と proratedRefund | 各アイテムの最新注文を残り期間で日割り | すべてのアイテムが即時に終了する |
| subscriptionsv2.revoke と fullRefund | 各アイテムの最新請求の全額 | すべてのアイテムが即時に終了する |
Google はアドオンのガイドで1つ強い警告を出しています。アドオン付きサブスクリプションに対して、非推奨の purchases.subscriptions.refund を呼び出してはいけません。また、orders.refund は3年より古い注文には使えません。
itemBasedRefund の動作
itemBasedRefund オブジェクトには必須フィールドが1つだけあり、取り消すアイテムを指定する productId です。Google は2つの結果を説明しています。
- 他のアイテムがまだ有効な場合: 指定したアイテムだけが取り消されて全額返金され、サブスクリプションは継続します。
- 他に有効なアイテムがない場合: そのアイテムが取り消されて全額返金され、サブスクリプション全体が解約されます。
1回のリクエストで指定できるアイテムは1つです。アドオンを2つ返金するなら、2回呼び出します。
Google がアイテム単位の返金をブロックするケース
Google は3つのケースで itemBasedRefund を拒否します。サブスクリプションが何らかの支払い拒否の状態にあるとき。これには猶予期間とアカウントの一時停止が含まれます。指定したアイテムが所有されていないか、すでに期限切れのとき。そして購入がプリペイドのサブスクリプションであるとき。プリペイドではアイテム単位の停止そのものがサポートされていません。
注文 ID による返金の動作
Google のガイドによると、orders.refund の revoke フラグがアクセスを終了させるのは、その注文がサブスクリプションの最新注文である場合だけです。古い注文の場合、返金は成功しますが、何も取り消されません。Play Console も同じ動作です。最新の注文を返金するとサブスクリプションは削除され、古い注文を返金するとサブスクリプションは有効なままです。アドオンがある場合は、正しい line item の latestSuccessfulOrderId から注文を選んでください。そうしないと、意図したものとは別の請求を返金してしまう可能性があります。
返金を決めるのは誰か、証拠を求められるのはいつか
アドオン付きサブスクリプションの返金のほとんどは、他の Play サブスクリプションと同じく、あなたの関与なしに決まります。購入から48時間以内なら、ユーザーは「問題を報告」から Google に申請でき、Google が判断します。それを過ぎると、Google はユーザーをあなたに案内します。また、新しいサブスクリプション購入を3日以内に承認しないと、Google は自動的にユーザーに返金し、購入を取り消します。
あなたの言い分を聞いてくれるフローは1つだけです。カード所有者がチャージバックを申し立て、Google がそれをデベロッパー審査の対象としてフラグを付けると、PendingRefundReviewNotification が届きます。あなたには24時間の猶予があり、その間に orders.reviewrefund を呼び出して返金の希望と利用状況の証拠を提出します。チャージバック自体は銀行が判断し、銀行の判断が最終決定です。
サーバーでアドオンの返金を追跡する
Google の RTDN リファレンスには、サブスクリプションバンドル内のアイテムが変更されたときの SUBSCRIPTION_ITEMS_CHANGED と、有効期限前に取り消されたサブスクリプションの SUBSCRIPTION_REVOKED が記載されています。Google のガイドによると、subscriptionsv2.revoke による取り消しは SUBSCRIPTION_REVOKED 通知と VoidedPurchaseNotification の両方を発生させ、Voided Purchases API にも記録されます。
問題は subscriptionId です。Google によると、アドオン付きサブスクリプションの RTDN にはこのフィールドが含まれません。したがって、どのアイテムが変わったかを通知に頼って判断してはいけません。バンドルの通知を受け取るたびに、次のことを行います。
- purchaseToken を使って purchases.subscriptionsv2.get を呼び出す。
- すべての lineItem とその expiryTime を読む。Google は、想定しているアイテムだけでなく、すべてのアイテムの expiryTime を更新するよう求めています。
- アクセスの付与や削除は、購入トークン単位ではなく productId 単位で行う。
- 予備策として Voided Purchases API をポーリングする。過去30日分が対象です。
猶予期間とアカウントの一時停止はバンドル全体に適用される
支払いのトラブルはすべてのアイテムに同時に影響します。Google は有効なアイテムの中で最も短い猶予期間を選び、更新全体に適用します。猶予期間中、ユーザーはすべてのアイテムを使い続けられます。アカウントの一時停止中は、すべてのアイテムへのアクセスが停止されます。支払いが最後まで回復しなければ、支払いが拒否されたアイテムは期限切れとなり、他のアイテムはそれぞれの請求期間の残りについて再開されます。

返金方法ごとに失うお金
アドオンは通常、あなたが費用を払っている何かに対応しています。追加のクラウドストレージは、ストレージ事業者から請求されます。AI クレジットパックは、モデルの API 呼び出しとして請求されます。追加のシートは計算資源の増加を意味し、クリエイター向けのプランでは支払いが発生することもあります。こうしたコストはユーザーがアドオンを使った時点で発生しており、返金で価格は戻っても、コストは1つも戻りません。
返金しすぎる
高くつく失敗は、苦情がアドオン1つについてなのに fullRefund や proratedRefund を使ってしまうことです。どちらもすべてのアイテムを取り消すので、基本プランの料金まで返すことになり、続けたかったはずの購読者まで失います。itemBasedRefund なら、そのアドオンの最新請求だけが返金されます。それがブロックされた場合は、そのアイテムの最新注文に orders.refund を使えば、何も終了させずにお金を返せます。
一部返金と手数料
Play Console ではサブスクリプションの注文に一部返金を行えます。Google によると、返金の割合はあなたの収益とサービス手数料にも適用されます。注文の半額を返金すれば、Google の手数料の半分も戻ってきます。しかし、そのアドオンを提供するためにかかった自社のコストは戻りません。
バンドルのチャージバック
2026年8月3日より後の注文について、Google はチャージバックのコストをデベロッパー負担に移します。チャージバックが成立すると、購入価格から Play のサービス手数料を差し引いた額と、銀行が請求する手数料を支払うことになります。複数のアドオンを含むバンドルの注文は、失ったときの金額もそれだけ大きくなります。難読化されたアカウント ID にひも付けた、アドオンごとの利用ログこそが、24時間の審査で提出する材料です。
アドオン返金のチェックリスト
- Google Play には用意されていないので、アドオンを1つだけ外す手段をアプリ内に用意する。
- 通知を受け取るたびに、各 lineItem の productId、expiryTime、latestSuccessfulOrderId を保存する。
- 問題がアドオン1つに限られるときは、itemBasedRefund を基本にする。
- サブスクリプションが猶予期間中またはアカウントの一時停止中なら、代わりに orders.refund でそのアイテムの注文を返金する。
- バンドルに対して、非推奨の purchases.subscriptions.refund を決して呼び出さない。
- チャージバック審査に24時間以内に回答できるよう、アカウントごとにアドオンの利用状況を記録する。
- 返金率はサブスクリプション単位だけでなくアドオン単位でも集計し、成績の悪いアドオンが基本プランの数字に埋もれないようにする。
よくある質問
- ユーザーは Google Play のサブスクリプションでアドオンを1つだけ解約できますか?
- Google Play からはできません。Google のヘルプページによると、ユーザーは基本サブスクリプションとアドオンをまとめてしか解約できません。アプリ側でアドオンを1つだけ外す機能を提供でき、外したアドオンは現在の請求期間の終わりに期限切れになります。
- サブスクリプションを解約せずにアドオンを1つだけ返金するには?
- アドオンの productId を指定した itemBasedRefund を付けて purchases.subscriptionsv2.revoke を呼び出します。他のアイテムが有効なままなら、Google はそのアイテムだけを取り消して全額返金します。revoke フラグなしの orders.refund でそのアイテムの最新注文を返金することもできます。この場合、お金は返りますがアクセスはそのまま残ります。
- itemBasedRefund の呼び出しが失敗したのはなぜですか?
- サブスクリプションが支払い拒否の状態にあるとき、アイテムが所有されていないか期限切れのとき、そしてプリペイドのサブスクリプションでは、Google がブロックします。呼び出す前に、line item の expiryTime とサブスクリプションの状態を確認してください。
- アドオン付きサブスクリプションで日割り返金は使えますか?
- 使えますが、すべてが取り消されます。Google は各アイテムの最新注文を次回更新までの残り期間に応じて日割りで返金し、すべてのアイテムへのアクセスは即時に終了します。
- アドオンが返金されたことはどの RTDN でわかりますか?
- Google のガイドによると、取り消しによって SUBSCRIPTION_REVOKED と VoidedPurchaseNotification が発生し、バンドル内のアイテムの変更は SUBSCRIPTION_ITEMS_CHANGED が対象です。バンドルでは subscriptionId が含まれないため、purchases.subscriptionsv2.get を呼び出して各 lineItem を読み、何が変わったかを確認してください。
出典と参考資料
- Google Play Billing: Subscription with add-ons
- Google Play Help: Subscriptions with add-ons
- Google Play Developer API: purchases.subscriptionsv2.revoke
- Google Play Developer API: orders.refund
- Google Play Billing: Manage subscriptions and one-time purchases
- Play Console Help: Issue refunds and cancel orders
- Google Play Billing: Real-time developer notifications reference
- Google Play Billing: Subscription lifecycle
- Google Play Help: Request a refund on Google Play
- Google Play Developer API: orders.reviewrefund
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
App Store と Google Play の返金を自動処理
続きを読む
過剰な返金リクエストは返金額以上の損失を招く。両ストアがそれを品質シグナルとして扱うからだ
Apple のガイドライン 5.6.4 は、過剰な返金リクエストをアプリが品質基準を満たしていない兆候として挙げています。Google のデベロッパー販売契約も、返金率を根拠に新規デベロッパーのアプリを削除できると定めています。各ストアの規定、削除の実際のコスト、そしてリスクを避ける方法を解説します。
返金に対応する前に App Store サーバー通知を検証する。webhook URL には誰でも POST できるからです
返金通知は、署名を確認するまではただの HTTPS リクエストにすぎません。App Store サーバー通知と Google Play の RTDN メッセージを検証する方法、各ストアが何に署名しているか、そして偽造された返金や誤って拒否された返金がどれだけの損失になるかを解説します。