Connect Server Notifications
Overview
RevenueCat に Apple App Store の Server Notifications(S2S通知)を連携するための手順と仕組みについて、詳しく解説します。
S2Sは Server to Server(サーバー間)の略
🔍 なぜ S2S 通知を設定するのか?
App Store の S2S 通知を RevenueCat に連携すると、以下のメリットがあります
- Webhook やライセンス処理の即時反映
- チャート・メトリクスのラグの軽減
- 払い戻しリクエスト(refund)処理のサポート
RevenueCat は通知がなくても動作しますが、通知を使うことでトラッキングの精度と即時性が大きく向上します。
AppleのASN(App Store Server Notifications)は、過去にはレシートが2日後に届くこともあるほど不安定でした。
現在はV2通知により大幅に改善されていますが、まれにレイテンシや到達失敗が起こることもあります。
これに対処するために、以下のような冗長化手段を取ることが推奨されます
- ユーザー操作による
restorePurchases()の提供 - アプリ起動時の
getCustomerInfo()による状態再同期 - RevenueCat Webhookのリトライ・冪等処理設計
- 自サーバーでもApple通知を受け取り、フォールバック処理を設計
これにより、S2S通知が失敗・遅延した際もユーザー体験を損なわず、整合性も保てます。
🛠 設定手順
1. RevenueCat 側で通知 URL を取得
- RevenueCat のダッシュボードにログイン
- 対象アプリを選択
Project Settings > Platforms > Apple Server to Server Notificationsに進む- 「Apple Server Notification URL」をコピー
2. App Store Connect に URL を設定
- App Store Connect にログイン
- 対象アプリの「App Information」ページへ
- 「App Store Server Notifications」の項目に移動
- Production と Sandbox 両方のフィールドに、RevenueCatの通知URLを貼り付ける
🔁 購入トラッキングを有効化する設定
RevenueCat はデフォルトでは SDK または API 経由での購入だけを記録します。
しかし、以下の設定を有効にすることで、Apple 通知だけで購入を検出できるようになります:
- ダッシュボードから
Track new purchases from server-to-server notificationsを ON
これにより、SDK が未導入の古いアプリバージョンや通信失敗時でも、S2S通知経由で確実にトラッキングされます。
👤 ユーザー識別:appAccountToken とは?
Apple の取引データには appAccountToken(UUID)が含まれます。
RevenueCat SDK はこの値を自動で設定し、S2S通知でもユーザーを識別できるようにします。
ただし、以下の注意が必要です:
appUserIdに UUID 以外を使うと、appAccountTokenが設定されない場合がある- SDK よりも先に S2S 通知が届くと、一時的な匿名ユーザーとして登録されることがある
🚨 通知の転送(Webhook forwarding)
通知を自分のバックエンドでも受け取りたい場合、RevenueCat の「Forwarding URL」機能を使うことで可能です。
- RevenueCat ダッシュボードで、
Apple Server Notification Forwarding URLにサーバーのURLを入力 - Apple 通知 → RevenueCat → 自サーバー に転送される
この方法により、Apple 通知の一次受け取り・管理は RevenueCat に任せつつ、自前処理も実現できます。
✅ 推奨設定まとめ
| 項目 | 推奨設定 |
|---|---|
| 通知バージョン | Apple Server Notifications V2 |
| URL設定場所 | App Store Connect(Prod / Sandbox 両方) |
| 通知受信者 | RevenueCat の通知URLを使用 |
| 新規購入の追跡 | 「Track new purchases from server notifications」を ON |
| ユーザー識別 | SDKで identify() + UUID形式を使用する |