すべての記事
Playbook読了まで 8 分

App がまだ App Store Server Notifications V1 で動いているなら、Apple はサブスクリプションの返金についてあなたに何も尋ねません

Apple は 2023 年 6 月に App Store Server Notifications V1 を非推奨にしましたが、V1 にはサブスクリプション向けの CONSUMPTION_REQUEST、REFUND_DECLINED、REFUND_REVERSED が追加されませんでした。V1 のサーバーが受け取れないもの、その損失、そして返金を一件も取りこぼさずに V2 へ移行する方法を解説します。

未開封の手紙があふれる古い郵便受けと、その横に置かれた最新のサーバーラック。App Store Server Notifications V1 で失われる返金シグナルを表している

要点

  • Apple は 2023 年 6 月 5 日に App Store Server Notifications V1 と verifyReceipt エンドポイントを非推奨にしました。どちらも現在も動作しますが、新機能は追加されず、提供終了日も発表されていません。
  • Apple の V1 ドキュメントでは、CONSUMPTION_REQUEST は消耗型の App 内課金についてのみ記載されています。自動更新サブスクリプション向けの消費情報リクエストは、2024 年 4 月に App Store Server Notifications V2 に追加されました。
  • REFUND_DECLINED と REFUND_REVERSED は App Store Server Notifications V2 にしか存在しないため、V1 のサーバーは Apple が返金を却下したことも、返金を取り消したことも知ることができません。
  • V1 では、自動更新サブスクリプションに対する Apple の返金は CANCEL として届きます。V2 では REFUND として届き、署名付きトランザクションに revocationDate と revocationReason が含まれます。
  • V2 の通知が失敗すると、Apple は約 1 週間かけて 1、12、24、48、72 時間後の計 5 回再送します。V1 の通知が失敗した場合の再送は 6、24、48 時間後の 3 回だけで、Get Notification History で取り戻すこともできません。
  • App Store Connect で App を V2 に切り替えると、新しい通知はすぐに V2 形式で届くようになります。一方、すでに再送中の V1 通知は約 78 時間にわたって届き続けることがあります。

App Store Server Notifications の Version 1 は今も返金を通知してくれますが、サブスクリプションの返金に反論できる唯一の通知が含まれていません。Apple は 2023 年 6 月 5 日に verifyReceipt エンドポイントとあわせて V1 を非推奨にし、それ以降に追加された返金関連の機能はすべて V2 だけに入っています。App Store Connect の設定がまだ Version 1 のままなら、Apple はあなたのサーバーに CONSUMPTION_REQUEST を一度も送らずにサブスクリプションの返金を判断できます。議論に負けるのではありません。議論の場に呼ばれることすらないのです。

Apple による App Store Server Notifications V1 の非推奨化が意味すること

非推奨は停止を意味しません。Apple のエンジニアは 2023 年 6 月に開発者フォーラムで、verifyReceipt と V1 通知は提供終了日が発表されるまで動作し続けること、その日付はまだ決まっていないこと、そして開発者には事前に知らされることを書いています。3 年以上たった今も、App Store Connect ではサーバー URL を設定する際に "Version 1 (deprecated)" が選択肢として表示されます。

非推奨が実際に意味するのは凍結です。2023 年 6 月以降、Apple の通知に関する変更履歴に載った変更はすべて V2 のものです。署名付きトランザクションの新しいフィールド、新しい通知タイプ、そして 2026 年 4 月に追加された 12 か月のコミットメントデータ。V1 のサーバーにはどれも届きません。

V1 のサーバーが決して受け取れない返金シグナル

Apple の各バージョンのドキュメントによると、同じ返金イベントは V1 のサーバーと V2 のサーバーに次のように届きます。

返金イベントVersion 1Version 2
顧客が消耗型アイテムの返金を Apple に申請するCONSUMPTION_REQUESTCONSUMPTION_REQUEST
顧客が自動更新サブスクリプションの返金を Apple に申請するV1 のドキュメントに記載なしCONSUMPTION_REQUEST(2024 年 4 月以降)
Apple が自動更新サブスクリプションを返金するCANCELREFUND
Apple が消耗型、非消耗型、または非更新サブスクリプションを返金するREFUNDREFUND
顧客が App 内で開始した返金を Apple が却下する利用不可REFUND_DECLINED
一度認めた返金を Apple が取り消す利用不可REFUND_REVERSED
障害中に取りこぼした通知を取り戻す利用不可Get Notification History

V1 でも CONSUMPTION_REQUEST は届くのか

はい、消耗型アイテムについては届きます。Apple の V1 リファレンスでは、CONSUMPTION_REQUEST は顧客が消耗型の App 内課金について返金リクエストを開始したときに送られる通知と説明されています。Apple のエンジニアも 2023 年にフォーラムで、対象となる返金では V1 の消費情報リクエストが送られることを確認しています。問題はサブスクリプションです。Apple の変更履歴では、サブスクリプション向けの消費情報リクエストは 2024 年 4 月 11 日に V2 で導入されたとされており、Send Consumption Information のドキュメントにも、Apple はこのリクエストを V2 エンドポイント経由で送ると書かれています。

V1 の CANCEL が誤解されやすい理由

V1 では、Apple がサブスクリプションを返金すると、通知タイプは CANCEL になり、多くの場合 DID_CHANGE_RENEWAL_STATUS も一緒に届きます。多くのサーバーはあらゆるキャンセルを顧客が自動更新をオフにしたものとして扱うため、期間が終わるまでアクセスが残ってしまいます。V2 ではこのあいまいさがなくなります。返金は REFUND として届き、顧客が更新をオフにした場合は DID_CHANGE_RENEWAL_STATUS にサブタイプ AUTO_RENEW_DISABLED が付いて届きます。

V1 にとどまることの金銭的コスト

App Store の返金はすべて Apple が判断します。CONSUMPTION_REQUEST は、あなたの利用データがその判断に届く唯一の機会であり、Apple は 12 時間以内の回答を求めています。V1 では、サブスクリプションの返金はこのステップを飛ばしてしまいます。

説明用の数字で具体例を見てみましょう。あなたの App が、AI 画像生成を含む月額 $9.99 のサブスクリプションを販売しているとします。ある登録者が 1 か月に 400 回の生成を行い、そのたびにモデル推論の実費がかかります。その後、その登録者が Apple に返金を申請します。

コスト項目V1 サーバーV2 サーバー
支払いのうちあなたの取り分Apple が承認すれば返金されるApple が承認すれば返金される
その月に使われたコンピュート、API コール、ストレージ支払い済みで回収不可支払い済みで回収不可
400 回の生成を Apple に示す機会なしCONSUMPTION_REQUEST 1 回、12 時間
Apple が返金を却下したことを知る知ることはないREFUND_DECLINED
返金が取り消されたことを知る知ることはないREFUND_REVERSED

失う支払いは定価ではなく、あなたの取り分です。Apple は登録者の有料サービス 1 年目にはサブスクリプション価格の 70%(該当する税金を除く)を、それ以降、または App Store Small Business Program の参加者には 85% を支払います。しかしコンピュートの請求額は減りません。推論、外部 API の呼び出し、ファイルストレージの費用は、顧客が使った時点ですでに支払われています。

欠けている 2 つの結果通知もまた損失につながります。REFUND_REVERSED がないと、返金時にアクセスを取り消したサーバーは、Apple が返金を取り消してもアクセスを戻しません。そのため支払いを続けている顧客が締め出されたままになり、サポートに問い合わせることになります。REFUND_DECLINED がないと、まだ保留中の返金と Apple が却下した返金を区別できません。

開いたノートパソコンの横で、開発者の手がネットワークケーブルを古いパッチパネルのポートから新しいポートへ差し替えている様子

返金を取りこぼさずに V1 から V2 へ移行する方法

V2 への移行は、サーバーの変更と 1 つの設定変更で済みます。2025 年 12 月に App Store Commerce エンジニアがフォーラムで示した Apple 公式のガイダンスが、切り替え当日に何が起きるかを説明しています。

設定を切り替える前に V2 エンドポイントを用意する

  • 本文に signedPayload を含む POST を受け付けます。V2 のペイロードは Apple が署名した JWS なので、中身を信頼する前に必ず署名を検証してください。Apple の App Store Server Library を使えばこの処理を任せられます。
  • CANCEL の処理を REFUND に対応付け、REFUND_DECLINED と REFUND_REVERSED を新しいケースとして処理します。
  • サブスクリプションの CONSUMPTION_REQUEST には Send Consumption Information で回答します。ただし、顧客が Apple とのデータ共有に同意している場合に限ります。Apple は、同意がない場合は回答すべきではないとしています。
  • 成功時は HTTP 200 から 206 を返します。40x や 50x を返すと Apple は再送します。

App Store Connect で設定を切り替える

App Store Connect で App を開き、"General" の下にある "App Information" を選択し、App Store Server Notifications の項目で "Production Server URL" に V2 エンドポイントを設定して Version 2 を選びます。テストしたい場合は、先にサンドボックス URL で同じ設定を行い、Request a Test Notification でサーバーが応答することを確認してください。

V1 のハンドラーは約 3 日間残しておく

切り替え後、新しい通知は新旧すべてのサブスクリプションについて、すぐに V2 形式で届きます。すでに再送中の V1 通知は、成功するか再送回数を使い切るまで V1 形式で届き続けます。Apple によると、V1 の最後の再送は約 78 時間後、つまり 6 足す 24 足す 48 です。古いハンドラーはそれを過ぎるまで動かしておき、その後で削除してください。

ついでに verifyReceipt も置き換える

verifyReceipt も同じ日に非推奨になりました。今も応答はしますが、Apple はサーバーに App Store Server API への移行を勧めています。Get Transaction Info は署名付きトランザクションを 1 件返し、Get Transaction History は顧客の履歴を返し、Get Refund History は顧客の返金済み購入をすべて一覧にします。V2 通知と組み合わせれば、かつてレシートで返金を示していた cancellation_date フィールドも含め、ほとんどのサーバーがレシートで行っていたことをカバーできます。

RefundHalt は App Store Server Notifications V2 に接続し、あなたの App がすでに記録している利用状況を使って、すべての CONSUMPTION_REQUEST に 12 時間の期限内で回答します。まだ V1 を使っているなら、切り替えこそがそれを可能にする一歩です。

よくある質問

App Store Server Notifications V1 は停止されるのですか?
まだ停止されません。Apple は 2023 年 6 月 5 日に V1 と verifyReceipt を非推奨にしましたが、どちらも現在も動作しています。Apple は提供終了日はまだ決まっておらず、開発者には事前に通知するとしています。それまでの間、V1 に新機能は追加されません。
V1 で CONSUMPTION_REQUEST 通知は届きますか?
Apple の V1 ドキュメントによると、消耗型アイテムについてのみ届きます。自動更新サブスクリプション向けの消費情報リクエストは 2024 年 4 月に V2 に追加され、Apple は V2 エンドポイント経由で送信します。サブスクリプションを販売していて V1 のままだと、こうした返金リクエストに回答できません。
サブスクリプションの返金は V1 と V2 でどう違って見えますか?
V1 では CANCEL として届き、多くの場合 DID_CHANGE_RENEWAL_STATUS を伴います。V2 では REFUND として届き、署名付きトランザクションに revocationDate と revocationReason が含まれます。さらに V2 では、App 内で開始された返金を Apple が却下すると REFUND_DECLINED が、認めた返金を Apple が取り消すと REFUND_REVERSED が送られます。
V1 から V2 に切り替えると、通知はどうなりますか?
切り替えて間もなく、すべてのサブスクリプションの新しい通知が V2 形式で届くようになります。すでに再送中の V1 通知は、成功するか再送回数を使い切るまで V1 形式で届き続け、Apple によるとそれは切り替えから約 78 時間後までです。その期間は両方のハンドラーを動かしておいてください。
V2 に切り替えた後で V1 に戻せますか?
はい。Apple のテクニカルノート TN3180 にあるとおり、App Store Connect API の Modify an App エンドポイントを使えば戻せます。ただし Apple はこれを例外的なケースとしており、V1 は引き続き非推奨扱いです。元に戻すと、サブスクリプションの消費情報リクエストと新しい返金通知を手放すことになります。

出典と参考資料

RefundHalt

App Store と Google Play の返金を自動処理

続きを読む

次の返金リクエストは、すでに向かってきています。

異議を申し立てられなかった返金について、もう 1 通のサポートメールを読む時間で RefundHalt を設定できます。