サーバーがすでに受け取っている返金理由コードを読めば、アプリを修正すべきか顧客と争うべきかがわかる
Apple と Google がサーバーに送るすべての返金には理由コードが付いています。Google Play は各無効化に9つの理由のうち1つとソースを刻印し、Apple は返金がアプリのせいかどうかを示します。各コードの意味、修正・対抗・容認への振り分け方、そして金額としての価値を解説します。

要点
- Apple や Google がサーバーに送るすべての返金には返金理由コードが付いており、お金がすでに動いた後でも読み取れる返金の唯一の要素です。なぜ返金が起きたかを教えてくれ、それが次に何をすべきかを示します。
- Google Play の Voided Purchases API はすべての無効化に2つの数値を刻印します。0 から 8 の voidedReason(その他、後悔、未受領、欠陥、誤購入、詐欺、身内による詐欺、チャージバック、未承認購入)と、0 ユーザー、1 開発者、または 2 Google の voidedSource です。
- Apple はより狭いが鋭いシグナルを与えます。返金されたトランザクションでは、App Store がアプリ内の実際のまたは知覚された問題を理由に返金した場合 revocationReason は 1、誤購入などの別の理由で返金した場合は 0 になります。
- コードは3つの山に分かれます。欠陥、未受領、未承認、そして Apple のアプリ内問題コードは製品を指し示すので、修正します。詐欺、身内による詐欺、チャージバックは、争うか防ぐかの紛争です。後悔と誤購入は、そもそも止められるものではありませんでした。
- voidedReason 8、未承認購入は、自分で自分に請求した返金です。Google はアプリが 3日以内 に承認しなかった購入を自動的に返金して取り消します。このコードは、自分の連携にあるそのバグを見つける手がかりです。
- voidedReason 7、チャージバックは高くつくものです。August 3, 2026 以降に行われた Google Play の注文では、チャージバックに負けると開発者は購入価格から Play のサービス手数料を差し引いた額に加えて銀行のチャージバック手数料を負担します。そのため、チャージバックとコード付けされた無効化を数えることは、実際に上乗せされたコストを数えることになります。
- Voided Purchases API は 30日 しか遡りません。しかも購入がいつ起きたかではなく、Google が無効化をいつ認識したかでフィルタリングします。そのため、その期間内に取得しない理由コードは、永久に失う理由コードです。
Apple や Google があなたの顧客の一人に返金するとき、お金はたいてい、あなたが意見を言う前に消えています。その後サーバーに届くものはレシートのように見え、ほとんどのチームはそれをレシートとして扱います。それ以上のものです。すべての返金には返金理由コードが付いており、決定が下された後でもなお読み取れる返金の唯一の部分です。Google Play は、その返金がチャージバックだったのか、後悔による申請だったのか、あるいは自分のアプリが一度も承認しなかった購入だったのかを教えてくれます。Apple は、その返金がアプリ内の何かを責めたものかどうかを教えてくれます。そのコードを読めば、返金はレポートの一行であることをやめ、指示になります。これを修正せよ、これに対抗せよ、あるいはこれは手放せ、と。各コードの意味、それらの振り分け方、そしてそれぞれのコストを解説します。
返金理由コードとは実際に何か
返金理由コードとは、購入が取り消された理由に対するストア独自のラベルです。あなたが設定するものではなく、反論もできません。事後に返金へ付随して届き、2つのストアはそれぞれ異なる形で、まったく異なる粒度で公開します。
Google Play はすべての無効化に理由とソースを刻印する
Google Play の Voided Purchases API は、取り消された購入ごとに1件のレコードを返し、各レコードには重要な2つの整数が含まれます。voidedReason は購入が無効化された理由を示します。voidedSource はそれを動かしたのが誰かを示します。この2つが合わさると、ただの返金が一つの文になります。この注文はチャージバックのため Google によって開始されて無効化された、あるいは後悔としてユーザーによって開始されて無効化された、というふうに。これらは API をポーリングするか、無効化が届いたときに発火するリアルタイムのデベロッパー通知を購読することで読み取ります。いずれにせよ、この2つの数値こそ保持する価値のあるペイロードです。
Apple はより狭いが鋭いシグナルを与える
Apple は9通りの理由を渡してはくれません。返金されたトランザクションでは、Apple は revocationReason を2つの値のいずれかに設定します。1 は、App Store がアプリ内の実際のまたは知覚された問題を理由にそのトランザクションを返金したことを意味します。0 は、たとえば誤購入など、別の理由で返金したことを意味します。このフィールドは返金または取り消しがなされたトランザクションにのみ、revocationDate とともに、REFUND App Store Server Notification の署名済みトランザクション情報の中に現れます。2つの値は多くありませんが、重要なほうの 1 は、その返金が顧客の心変わりではなくあなたの製品に関するものだと Apple が告げているのです。
Google Play が与える9つの理由
Google の voidedReason は2つのうちより豊かなほうで、どの値もそれぞれ別の場所を指し示すため、ひと目で分かるようにしておく価値があります。VoidedPurchase リソースからそのまま取り出した全リストと、各コードが実際にあなたに何をせよと告げているのかを示します。
| voidedReason | Google のラベル | このコードが伝えていること |
|---|---|---|
| 0 | その他 | 具体的な理由は記録されていません。個々の事例ではなく、まとめて件数を注視しましょう。 |
| 1 | 後悔 | 顧客が気を変えました。アプリには何の問題もありませんでした。 |
| 2 | 未受領 | 顧客が、支払ったものを受け取っていないと述べています。確認すべき配信の問題です。 |
| 3 | 欠陥 | 購入が機能しませんでした。製品のバグであり、このリストで最も対処しやすいコードです。 |
| 4 | 誤購入 | 誤クリックまたは意図しない購入です。より明確な確認ステップを検討しましょう。 |
| 5 | 詐欺 | Google がそのトランザクションを不正と判定しました。あなたの顧客ではなく、あなたが得るべき収益でもありません。 |
| 6 | 身内による詐欺 | 購入者が、自分で行い受け取った請求に異議を申し立てました。これは証拠がまだ効き得る唯一のものです。 |
| 7 | チャージバック | 銀行が請求を取り消しました。最も高くつく経路で、いまや手数料が付きます。 |
| 8 | 未承認購入 | アプリが購入を一度も承認しなかったため、Google が自動返金しました。あなたのコードのバグです。 |
voidedSource は誰が引き金を引いたかを教える
理由の隣には voidedSource があり、別の問いに答えます。これを取り消したのは誰か。0 はユーザーが、セルフサービスまたは銀行を通じて行ったことを意味します。1 は開発者、つまりあなたやあなた自身のツールが返金を発行したことを意味します。2 は Google が独自の判断で行ったことを意味し、未承認購入に対する自動返金もこれに含まれます。無効化の急増を見たとき、ソースが最初の切り分けです。source 2 の壁は、Google があなたのアカウントに対して動いているということで、それはたいてい、顧客ではなくあなたの連携を指し示すシグナルです。
すべての返金を修正・対抗・容認に振り分ける
コードが役立つ理由は、その返金が3つの対応のうちどれに値するかを教えてくれるからです。ほとんどのチームはすべての返金を同じように扱い、決して勝てないものに労力を燃やします。コードはきれいに分かれます。
修正:製品が引き起こした返金
いくつかのコードは、返金の服をまとったバグ報告です。Google の欠陥(3)と未受領(2)、そして Apple の revocationReason 1 は、すべて同じことを言っています。顧客は支払ったのに、アプリが届けなかった、と。未承認購入(8)はその中で最も鋭いものです。落ち度が完全にあなたの請求コードにあるからです。これらは最も安く根絶できる返金です。誰かを説得することによってではなく、自分が持つものを修正することで根絶できるからです。この山で件数が増えることは、金額の付いた製品欠陥です。
対抗:誰かが仕掛けている返金
詐欺(5)、身内による詐欺(6)、チャージバック(7)は紛争です。純粋な詐欺(5)はあなたの顧客ではなく、そもそも得られるはずのない収益です。身内による詐欺(6)は、購入者が支払ったとおりのものをきちんと受け取ってから異議を申し立てるもので、あなたの証拠がなお動かし得る唯一の紛争です。そしてチャージバック(7)は、その証拠が提出される場です。これらのいずれかが届いたら、まだであればアクセスを取り消し、審査の窓が開いている場合はそのアカウントについて分かっていることで応じます。
容認:そもそも止められなかった返金
後悔(1)と誤購入(4)は、顧客自身の心変わりです。Apple の revocationReason 0 もここに入ります。機能が失敗したわけでも、詐欺が起きたわけでもありません。より明確な購入確認によって誤購入の山は和らげられますが、後悔による返金を言い負かすことはできません。それに費やす時間は、実際にお金がある修正の山から奪われた時間です。
| 山 | Google コード | Apple のシグナル | とるべき行動 |
|---|---|---|---|
| 修正 | 2 未受領、3 欠陥、8 未承認 | revocationReason 1 | 背後にある製品または請求のバグを根本原因まで突き止める |
| 対抗 | 5 詐欺、6 身内による詐欺、7 チャージバック | (理由ではなく REFUND で表面化する) | アクセスを取り消し、審査の窓に証拠で応じる |
| 容認 | 1 後悔、4 誤購入 | revocationReason 0 | 記録し、購入フローを調整し、先へ進む |

理由コードを失いやすくする30日の落とし穴
Google の側には、これをレポート機能から締め切りへと変える厳格な制限があります。コードを継続的に取得していなければ、失っています。
Voided Purchases API は30日しか遡らない
Google は、この API が過去 30日 の無効化された購入しか表示できないと明言しています。それより古い無効化は、どんな startTime を渡しても返されず、startTime の値そのものも 30日 前より過去には設定できません。素朴な連携にとってさらに厄介なのは、この 30日 の窓が、購入がいつ行われたか、あるいはレコードの voidedTimeMillis によってではなく、Google のシステムが購入を無効化とみなした時点で測られることです。そのため、その窓の中で取得しない返金理由コードは失われ、少しでも隙間のある月次エクスポートのジョブは、追いつくのが遅すぎて捕まえ損ねた無効化を静かに取りこぼします。
理由コードが金額としてどれだけの価値を持つか
2つのコードには具体的な価格が付いており、それらを読むことが、そうでなければ集計された返金率の中に隠れてしまう問題に数字を付ける方法です。
あるコードは自分で書いた請求書
voidedReason 8、未承認購入は、あなたが引き起こした返金の最もわかりやすい例です。Google Play は、権利を付与してから 3日以内 に購入を承認することをアプリに求めており、そうしなければ Google は自動的に注文を返金し、アイテムを取り消します。8 が刻印されたすべての無効化は、製品を欲しがった顧客からの本物の売上であり、購入を承認する呼び出しが一度も発火しなかったために返されたものです。失われた金額は、満額の販売価格に加え、それを届けるためにすでに費やした計算資源、API 呼び出し、ストレージです。これは交渉する返金ではありません。閉じるべきバグであり、コードはそれを見つける手がかりです。
チャージバックのコードには今や手数料が付く
voidedReason 7、チャージバックは、August 3, 2026 にコストが変わりました。その日以降に行われた Google Play の注文では、チャージバックに負けると開発者は購入価格から Play のサービス手数料を差し引いた額に加えて銀行のチャージバック手数料を負担し、Google は自らのサービス手数料のみを負担します。チャージバック手数料は定額で製品価格はそうではないため、安価なアプリ内購入では手数料だけで顧客の支払額を上回ることがあります。コード 7 の無効化を数えることは、いまや単なる失われた売上ではなく費目を数えることであり、まさにそれこそ、あなたが作るどんな返金レポートでもチャージバックの山が独自の行に値する理由です。
| 理由コード | あなたが負担するコスト | そのコードが重要な理由 |
|---|---|---|
| 8 未承認購入 | 顧客が欲しがった売上に対する、満額の販売価格に加えた配信コスト | 自ら招いたものなので、コードはバグトラッカー |
| 7 チャージバック(Aug 3, 2026 以降の注文) | 購入価格から Play のサービス手数料を差し引いた額に加えた銀行のチャージバック手数料 | 失われた売上の上に手数料を上乗せする唯一のコード |
| 3 欠陥 | 販売価格に加えた配信コストが、そのバグに当たる顧客ごとに繰り返される | このコードの件数が製品欠陥をドル建てで見積もる |
| 1 後悔 | 販売価格と、すでに費やした配信コスト | 実際のコストだが、コードの変更で取り戻せるものではない |
Apple と Google はどう並ぶか
2つのストアは同じ問いに異なる解像度で答えるため、ストア横断の返金レポートは、両者が一致すると期待するのではなく、正規化しなければなりません。
| 問い | App Store | Google Play |
|---|---|---|
| コードのある場所 | REFUND 通知の署名済みトランザクション内の revocationReason | Voided Purchases API とその通知内の voidedReason |
| 理由の数 | 2つ:1 アプリ内の問題、0 その他 | 9つ、0 その他から 8 未承認購入まで |
| 誰が行ったか | 内訳なし | voidedSource:0 ユーザー、1 開発者、2 Google |
| どこまで遡って読めるか | 照会すればいつでもトランザクション上で利用可能 | 過去 30日 の無効化のみ |
| 最も鋭いシグナル | 1 は返金が製品に関するものであることを意味する | コード 3、8、7 はそれぞれ別個の、修正可能なコストを指す |
ストアが同じ返金に対して同じコードをくれることは決してありませんが、それで構いません。重要なのは、どちらも機械可読な理由を渡してくれること、そしてどちらもそれを読むチームに報いることです。Apple の1ビットは、返金が製品の落ち度であるときを教えてくれます。Google の9つの理由とソースのフラグは、どの製品バグ、どの紛争、そしてどの自ら招いた請求の穴を見ているのかを教えてくれます。どちらのコードも返金を止めはしません。どちらも、次の一件が起きないように何をすべきかを教えてくれます。
RefundHalt は、両方のストアで、すべての返金の理由コードを届いた瞬間に取得し、Google の 30日 の窓の十分内側で保持するので、何も取りこぼしません。各無効化を修正・対抗・容認に振り分けるので、コード 3 欠陥の急増は製品アラートとして、コード 8 未承認の急増は、あいまいな収益の落ち込みとしてではなく連携のバグとしてあなたに届きます。Apple の CONSUMPTION_REQUEST には 12時間 以内、Google Play のチャージバック審査には 24時間 以内に応じ、返金やチャージバックが届いた瞬間にアクセスを取り消します。ストアが返金に刻印するコードを変えることはできません。すべてを読み、実際に自分が修正すべきものに対して行動することはできます。
よくある質問
- App Store と Google Play における返金理由コードとは何ですか?
- 購入が取り消された理由に対するストア独自のラベルで、返金とともにサーバーに届きます。Google Play の Voided Purchases API は 0 から 8 の voidedReason と、0 ユーザー、1 開発者、または 2 Google の voidedSource を返します。Apple は、返金がアプリ内の問題によるものであれば revocationReason を 1 に、誤購入などの別の理由であれば 0 に設定します。コードは自分で設定するものでも変更できるものでもありませんが、それを読めば、返金が製品を指しているのか、紛争を指しているのか、それとも顧客の心変わりを指しているのかがわかります。
- Google Play の voidedReason の値は何ですか?
- 9つあります。0 その他、1 後悔、2 未受領、3 欠陥、4 誤購入、5 詐欺、6 身内による詐欺、7 チャージバック、8 未承認購入です。それぞれは、無効化を開始したのが誰かを示す voidedSource とともに、Voided Purchases API によって無効化された購入ごとに返されます。コード 2、3、8 は自分のアプリの問題を指し、コード 5、6、7 は紛争、コード 1 と 4 は顧客自身の決定です。
- Apple の revocationReason が 1 であることは何を意味しますか?
- App Store が、アプリ内の実際のまたは知覚された問題を理由にそのトランザクションを返金したことを意味します。これは値 0 とは対照的で、0 は誤購入などの別の理由で返金が起きたことを意味します。このフィールドは、返金または取り消しがなされたトランザクションにのみ、revocationDate とともに、REFUND App Store Server Notification の署名済みトランザクション情報の中に現れます。1 は、その返金が製品に関するものだと Apple が告げているのです。
- なぜ Google は未承認の理由コードで購入を返金したのですか?
- アプリが購入を期限内に承認しなかったからです。Google Play は、権利を付与してから 3日以内 に購入を承認することを求めており、そうしなければ Google は自動的に注文を返金してアイテムを取り消し、その無効化に voidedReason 8 を刻印します。これは顧客の要求ではなく、請求のバグによってあなたが引き起こした返金なので、対策は交渉ではなく購入処理コードの中にあります。
- 返金理由コードはどこまで遡って読めますか?
- Google Play では 30日 だけです。Voided Purchases API は過去 30日 の無効化を返し、それより古い startTime は無視します。そして窓を、購入が行われた時点ではなく Google が無効化を認識した時点で測ります。30日 以内に取得しないコードは失われるので、リアルタイムの無効化購入通知を購読するか、窓の十分内側のスケジュールでポーリングすべきです。Apple の revocationReason は、照会すればいつでもトランザクション上に残ります。
出典と参考資料
- Google Play Developer API: REST Resource purchases.voidedpurchases (voidedReason and voidedSource values)
- Google Play Developer API: Method purchases.voidedpurchases.list (30-day lookback window)
- Google Play: Voided Purchases API overview
- Apple Developer: revocationReason (App Store Server Notifications)
- Apple Developer: Transaction.RevocationReason (StoreKit)
- Apple Developer: Handling refund notifications (revocationDate and revocationReason on REFUND)
- Google Play Console Help: Updates to refund protection and chargeback cost responsibility (August 3, 2026)
- Google Play Billing: Integrate the Google Play Billing Library (acknowledge within three days or auto-refund)
RefundHalt
App Store と Google Play の返金を自動処理
続きを読む
子どもによる無断アプリ内課金はほぼ必ず親へ返金され、その負担は開発者が負う
子どもが親のスマートフォンでコインパックを買うと、Apple も Google もそれを返金し、どちらも事前に開発者へ確認しません。規制当局がそう設計させたのです。こうした無断アプリ内課金の返金が各ストアでどう処理されるのか、お金が動く15分の猶予、そして実際にいくらの損失になるのかを解説します。
アプリ返金の税金はもともとあなたのものではないので、返金で失うのはあなたの取り分であって、レシートに載る合計額ではありません
アプリ内購入を返金すると、レシートには価格と税金が戻ったように表示されます。その税金は最初からあなたのお金ではありませんでした。Apple と Google が merchant of record として税金を集めて納付し、返金時にはあなたの取り分に触れることなく元に戻します。返金が実際にいくらかかるのか、そして税金があなたのものになる唯一の設定について解説します。