◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り27日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り27日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-06-12上級

サブスクの返金にアプリが気づかない — REFUND 通知と Voided Purchases で権限を失効させる実装メモ

返金が成立してもアプリ側のフラグは立ったままで、Premium 機能は使われ続けます。App Store Server Notifications V2 の REFUND、Google Play の Voided Purchases、RevenueCat の照合で権限を確実に失効させる実装を記録しました。

RevenueCat30App Store93Google Play44サブスクリプション66アプリ内課金10

✦ プレミアム記事

壁紙アプリの月次レポートを確認していたとき、売上の一覧に小さなマイナスの行が並んでいることに気づきました。App Store の返金です。金額そのものは大きくありませんでしたが、引っかかったのはそこではありません。返金したユーザーの端末で、買い切りの Premium 解除がそのまま有効になっている可能性に思い当たったのです。

調べてみると、案の定でした。当時の私のアプリは購入成功時に「Premium 済み」のフラグをローカルに保存し、起動時はそれを参照するだけの設計になっていました。返金が成立しても、Apple や Google からアプリへ自動で連絡が来るわけではありません。サーバー側で通知を受け取り、自分で権限を失効させない限り、返金後も機能は使われ続けます。

個人開発では返金は月に数件あるかないかの世界なので、後回しにしがちな領域です。ただ、買い切りやサブスクの単価が上がるほど無視しにくくなります。ここでは、私が自分のアプリ群に返金検知を組み込んだときの実装と、その過程でつまずいた点を記録としてまとめておきます。

返金がアプリに伝わらない構造

App Store の返金は、ユーザーと Apple の間で完結します。ユーザーが「問題を報告する」から申請し、Apple が承認すれば返金は成立しますが、その瞬間にアプリへ何かが届くわけではありません。StoreKit 2 では該当トランザクションに revocationDate が記録されますが、これはアプリが能動的にトランザクションを照合して初めて分かる情報です。

Google Play も同様です。Play Console や API 経由の返金で「アクセス権の取り消し」を選ぶと購入は無効化されますが、クライアントに反映されるのは Billing Library が次に購入状態を照合したタイミングになります。

問題は、購入成功時にローカルフラグを立てて終わり、という設計のアプリが少なくないことです。私のアプリもかつてそうでした。この設計では返金が成立してもフラグは立ったままで、ユーザーは Premium 機能を使い続けられます。私の壁紙アプリ群では返金は売上件数の 0.5% 前後と少ないものの、買い切り型の上位プランほど単価が高く、放置すれば「返金してから使い続ける」抜け道として定着しかねません。

失効までの経路を先に決める — 3つの構成

実装に入る前に、返金情報がどの経路で自分のシステムへ届くのかを決めておくと、後の作業で迷いません。選択肢は実質3つです。

構成A: RevenueCat に集約する

Rork で生成したアプリに RevenueCat を組み込む構成は課金実装の定番ですが、返金検知の観点でも有力です。RevenueCat は Apple と Google の両ストアからサーバー通知を受け取り、返金を検知すると entitlement を自動で失効させてくれます。アプリ側の仕事は CustomerInfo の照合だけになります。

構成B: 自前サーバーで Server Notifications を受ける

サブスク管理を自前で持っている場合は、App Store Server Notifications V2 と Google Play の Real-time Developer Notifications(RTDN)を直接受けます。実装量は増えますが、返金以外の通知(請求リトライ・解約予約・オファー利用)も一次情報として扱えるようになります。

構成C: サーバーなしでクライアント照合だけにする

バックエンドを持たない小規模アプリなら、起動時に StoreKit 2 の currentEntitlements(Android は queryPurchasesAsync)を照合し、取り消し済みトランザクションを除外する方法もあります。検知は「次回起動時」までずれ込みますが、ローカルフラグ放置と比べれば大きな前進です。

私は課金実装を RevenueCat に寄せているアプリが多いこともあり、構成Aを基本にして、自社ユーザーIDと購入を紐づけたいアプリにだけ構成Bを足しています。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦App Store Server Notifications V2 の REFUND を署名検証して権限を失効させる Node.js 実装(@apple/app-store-server-library 使用)
✦RevenueCat 構成で返金がクライアントに届くまでの経路と、キャッシュした Premium フラグが生き残る落とし穴の塞ぎ方
✦Google Play の SUBSCRIPTION_REVOKED と Voided Purchases API による失効処理、返金率 0.5% 前後を保つ運用の工夫
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-04-28
Family Sharing で IAP が消える4つのトリガー — Rork で子ども向けアプリの課金を安全に設計する
Family Sharing 経由の購入で IAP 収益が突然消える原因と、Rork で実装する StoreKit 2・Server Notifications V2 を組み合わせた安全な課金設計を、実コードと StoreKit Testing での確認手順まで順に整理します。
⟐ ビジネス2026-04-14
Rork Maxで個人開発アプリ月収100万円を達成する:収益設計・実装・データ分析の設計書
Rork Maxで月収100万円を目指す収益設計をまとめます。勝てるジャンルを選ぶ5つの判断基準、3層構造の収益モデル、RevenueCatで実装する課金フロー、広告費ゼロからのユーザー獲得、KPIの読み方と改善サイクル、よくある失敗の回避策までを体系的に扱います。
⟐ ビジネス2026-04-04
Rork アプリの収益設計 — 広告と課金が食い合う地点をどう避けるか
Rork で作ったアプリに AdMob・サブスクリプション・単発課金をどう重ねるか。広告と課金のカニバリゼーションを設計で避ける方法、RevenueCat の Entitlement 中心設計、ペイウォールを出すタイミングの決め方を実装コードとともにまとめました。