RORK LABEN
MAX — Rork MaxはClaude CodeとClaude Opus 4.6を基盤に、React NativeではなくネイティブSwiftアプリを直接生成しますAPPLE — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageまでAppleエコシステム全体を対象にしますWORKFLOW — 実運用ではAIに足場を作らせ、状態管理とデータ層は自分で書き直す分担に落ち着いてきたという声が目立ちますSEED — 4月にLeft Lane Capital主導で$15Mのシードを調達しました(Peak XV・True Ventures・a16z Speedrunが参加)PAPERLINE — アプリビルダーPaperlineを買収。エンジニア人材の獲得へ今後も買収を続ける方針ですREVIEW — 3ヶ月使ったユーザーの再訪レビューが増え、得意・不得意と向く用途の見極めが進んでいますMAX — Rork MaxはClaude CodeとClaude Opus 4.6を基盤に、React NativeではなくネイティブSwiftアプリを直接生成しますAPPLE — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageまでAppleエコシステム全体を対象にしますWORKFLOW — 実運用ではAIに足場を作らせ、状態管理とデータ層は自分で書き直す分担に落ち着いてきたという声が目立ちますSEED — 4月にLeft Lane Capital主導で$15Mのシードを調達しました(Peak XV・True Ventures・a16z Speedrunが参加)PAPERLINE — アプリビルダーPaperlineを買収。エンジニア人材の獲得へ今後も買収を続ける方針ですREVIEW — 3ヶ月使ったユーザーの再訪レビューが増え、得意・不得意と向く用途の見極めが進んでいます
記事一覧/開発ツール
開発ツール/2026-06-12上級

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

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

RevenueCat27App Store77Google Play21サブスクリプション63アプリ内課金9

プレミアム記事

壁紙アプリの月次レポートを確認していたとき、売上の一覧に小さなマイナスの行が並んでいることに気づきました。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-06-25
機内モードで開くと有料会員にペイウォールが出る — RevenueCat の権限をオフラインでも保つキャッシュ設計
電波の弱い場所でアプリを開いた有料会員に、一瞬ペイウォールが見えてしまう。RevenueCat の customerInfo がオフライン起動で揺れる仕組みと、最後の正解を信頼期限つきでキャッシュして権限を維持する設計を、Expo アプリの動くコードで整理します。
開発ツール2026-06-15
解約だと思って権限を切ったユーザーは、まだ払う気だった — 支払い猶予期間と権限維持の実装
購読の支払いが失敗しても、それは解約ではありません。猶予期間中に権限を切ると復帰可能な売上を自分で捨てます。Rork(Expo)アプリで猶予・課金リトライ・アカウントホールドを取り違えず、権限維持と復帰導線を出す実装をまとめます。
開発ツール2026-06-14
Rork のサブスクを RevenueCat の Entitlement で組む — アクセス判定・Offering 駆動のペイウォール・復元の実装メモ
Rork(Expo)アプリの課金を RevenueCat で実装する際の設計メモです。Entitlement を唯一の真実とするアクセス判定、Offering 駆動でハードコードを避けるペイウォール、購入復元とリスナーの実装、サンドボックスで詰まりやすい点まで動くコードで整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →