RevenueCatからの移行
RevenueCatからの移行は8つのステップで構成されています。コーディングエージェントが大部分の作業を担当します。具体的には、Adapty CLIを通じて移行を実行し、アプリ内のRevenueCat SDKを置き換えます。エージェントが対応できない部分、つまりシークレットの設定やRevenueCat、App Store Connect、Google Cloudでの設定はあなたが行います。
- コアの違いを理解する。
- カタログをAdaptyに移行する。
- オファリングがフローになる場合は、ペイウォールのデザインを移行する。
- コーディングエージェントを使ってRevenueCat SDKを置き換える。
- インテグレーションを移行する。
- ストアイベントをAdaptyに転送する。
- アプリの新バージョンをテストしてリリースする。
- (オプション)トランザクション履歴をインポートする。
サブスクライバーは自動的に移行されます
サブスクリプションを一度でも有効化したユーザーは、Adapty SDK を組み込んだ新バージョンのアプリを開いた瞬間に自動的に Adapty へ移行されます。サブスクリプションステータスの検証とプレミアムアクセスは自動的に復元されます。
Adapty SDK を組み込んだ新バージョンのアプリをリリースする前に、リリースチェックリストをご確認ください。
コアとなる違いを把握する
Adapty と RevenueCat の SDK は、設計が似ています。最大の違いはネットワークの使い方と速度です。Adapty SDK は、要求があった際にできる限り素早く情報を提供できるよう設計されています。たとえば、ペイウォールをリクエストする際、まずリモートコンフィグを取得してオンボーディングやペイウォールを事前に構築し、その後プロダクトを専用のリクエストで取得します。
命名規則には若干の違いがあります:
| RevenueCat | Adapty |
|---|---|
| Package | プロダクト |
| Offering | ペイウォール |
| Paywall | フロー |
| Entitlement | アクセスレベル |
Adaptyにはプレースメントというコンセプトがあります。これはアプリ内でユーザーが購入を行う論理的な場所です。多くの場合、プレースメントは1つか2つです:
- オンボーディング(全購入の80%はここで発生します);
- 一般(オンボーディング後、設定画面やアプリ内で表示します)。
カタログを Adapty に移行する
カタログの移行により、RevenueCat プロジェクトから新しい Adapty アプリが作成されます。エンタイトルメントからアクセスレベル、パッケージからプロダクト、そして各オファリングにはペイウォールまたはフローを持つプレースメントが作成されます。
始める前に
- ターミナルコマンドを実行できるコーディングエージェント(Claude Code、Codex、Cursor など)を使用してください。
- エージェントが使用するターミナルで、Adapty CLI をインストールし、ログインします。
- RevenueCat で、移行するプロジェクトのシークレット API キー(v2)を作成します。
- ストアを確認してください。この移行は App Store と Google Play アプリのみに対応しています。
RevenueCat シークレット API キーの作成
Adapty は、移行するプロジェクトのシークレット API キーを使用して RevenueCat のカタログを読み取ります。RevenueCat のシークレットキーはプロジェクトごとに設定されるため、該当プロジェクト内でキーを作成してください。
- キーの一覧を開くには、RevenueCat ダッシュボードでプロジェクトを開き、API keys に移動します。
- キーを作成するには、New secret API key をクリックします。
- キーを設定するには、名前(例:
Adapty migration)を入力し、API version で V2 を選択します。 - Adapty がカタログを読み取れるようにするには、Project configuration permissions を Read only に設定します。Adapty に必要な権限はこれだけです。
- キーを作成するには、Generate をクリックし、コピーします。
公開キーではなく、シークレット API キーを使用してください。アプリ固有の公開キーはプロジェクト設定を読み取ることができません。
マイグレーション時にキーの入力を求められたら、開いた Adapty ダッシュボードのページに貼り付けてください。
カタログの移行を実行する
-
移行を開始するには、エージェントに次のように依頼します:
Migrate my RevenueCat project to a new Adapty app called "Acme Fitness" with the Adapty CLI. -
RevenueCat を接続するには、エージェントが開く Adapty ダッシュボードのページにシークレット API キーを貼り付けてください。このキーは Adapty に直接送信され、エージェントや CLI を経由することはありません。
-
移行対象を選択するには、どの RevenueCat アプリをまとめるかをエージェントに伝えてください。通常は同じプロダクトのプラットフォームごとに 1 つずつです。それらをまとめて 1 つの Adapty アプリにします。
-
マッピングを確定するには、Adapty が自動でマッピングできなかったエンティティについてエージェントの質問に答えてください。各オファリングについて、そのプレースメントに何を設定するかを選択します。アプリが独自に描画するペイウォールか、フロー & ペイウォールビルダーのフローかです。Adapty は RevenueCat のペイウォールがあるオファリングにはフローを提案します。
Warning
決定は最終的なものです。すべてのエンティティに決定が下されると、Adapty はカタログを作成します。その後、マッピングを変更することはできません。 :::
Adapty はアクセスレベル、プロダクト、ペイウォールとフロー、プレースメントをこの順番で作成します。一部の作成に失敗した場合、エージェントがその理由を説明します。すべてのエンティティが Adapty に登録されると、移行が完了します。
- 新しいアプリが購入を検証できるようにするため、Adapty ダッシュボードでアプリをストアに接続してください: App Store および Google Play。
エージェントを使わずに移行を実行するには、マイグレーションコマンドを使用してください。adapty migrations status を実行すると、次のアクションとその入力内容が表示されます。
RevenueCat エンティティと Adapty のマッピング
- エンタイトルメント識別子はアクセスレベル ID になります。つまり、
customerInfo.entitlements["premium"]はprofile.accessLevels["premium"]に対応します。 - エンタイトルメントを付与しないプロダクトは、
premiumアクセスレベルを付与します。 - オファリング識別子はプレースメント ID になります。
- オファリングのメタデータは、ペイウォールまたはフローのリモートコンフィグ(最大 256 KB)になります。
カタログ移行で除外されるもの
- プロダクトが設定されていないオファリング。
- AdaptyがApp StoreのプロダクトIDを拒否する場合(例:コロンやスペースを含むIDなど)。エージェントがどれかを教えてくれるため、判断不要です。
- App StoreおよびGoogle Play以外のストアのアプリ。
- Integrations:別途移行してください。
ペイウォールデザインを移行する
カタログの移行で作成される各フローは、オファリングのプロダクトの上に空のスクリーンが配置された状態で公開されます。これらのフローに RevenueCat のペイウォールデザインを再構築するには、エージェントに次のように依頼してください:
Migrate my RevenueCat paywall designs to my Adapty app "Acme Fitness" with the Adapty CLI.
エージェントは一度に1つずつフローを再構築し、あなたが承認した後にそれぞれを公開します。動画やカスタムフォントなど、自分で追加が必要な項目も一覧表示されます。デザインの読み取りには RevenueCat のシークレット API キーを使用するため、デザインの移行が完了するまでキーを保持しておいてください。
デザインが設定されるまで、フローは空白の画面を表示します。このようなフローを表示するアプリバージョンはリリースしないでください。
RevenueCat SDK の置き換え
コーディングエージェントが、マイグレーションで作成したカタログの ID を使って、アプリのコード内の RevenueCat SDK を Adapty SDK に置き換えます。1 回の実行で 1 つのコードベースがマイグレーションされます。iOS と Android のプロジェクトが分かれているアプリの場合は、それぞれのプロジェクトで実行してください。
開始前に、アプリのリポジトリでの変更をコミットまたはスタッシュしておいてください。マイグレーションを 1 つのレビュー可能な差分にまとめるためです。
-
コードのマイグレーションを開始するには、アプリのリポジトリのルートでエージェントを開き、次のように入力します。
Migrate the app code in this repository from RevenueCat to Adapty with the Adapty CLI, for my Adapty app "Acme Fitness".エージェントが Adapty スキルを読み込むために再起動を求めてきたら、再起動して同じリクエストを繰り返してください。
-
フローのデザインがまだ移行されていない場合は、移行完了までアプリがそのフローを表示するのか、それとも独自のペイウォール画面を維持するのかをエージェントに伝えてください。
-
コードの移行を完了するには、
adapty-migrateブランチの変更内容を確認し、プロジェクトのルートにあるADAPTY_SETUP.mdを参照してください。エージェントが残した作業内容が記載されています。
インテグレーションの移行
エージェントはアプリのコード内でアナリティクス、アトリビューション、メッセージングツールを検出し、Adapty でそれぞれをセットアップする方法をレポートします。ファイルの変更は行いません。次のように聞いてみましょう:
Find the integrations in my app code to set up in my Adapty app "Acme Fitness", with the Adapty CLI.
リポジトリに1つのプラットフォームのコードのみが含まれている場合は、もう一方のプラットフォームの場所をエージェントに伝えてください。次に、Adaptyへのインテグレーションの移行に記載されている手順に従ってインテグレーションをセットアップします。Webhook、Slack、クラウドストレージのエクスポートはアプリのコードには含まれていません。RevenueCatのIntegrationsページで確認してください。
ストアのイベントをAdaptyに転送する
App StoreとGoogle Playは、アプリ外で発生するものも含め、更新・キャンセル・返金をサーバー通知でレポートします。2つの移行設定によってAdaptyがこれらの通知を受け取れるようになり、RevenueCatも引き続きすべてのイベントを受信するため、ユーザーが新しいアプリバージョンに移行する間も両方のシステムが最新の状態を保ちます。
カタログの移行が完了した後に開始してください。AdaptyはバンドルIDとパッケージ名を、そこで選択したRevenueCatアプリから取得します。
App Storeイベントの転送
AdaptyはApp Storeの通知を受信し、それぞれをRevenueCatに転送します。
始める前に、App Store Connectでアプリ内課金キーを作成し、Issuer IDとKey IDを控えておいてください。
-
転送を開始するには、エージェントに次のように依頼します:
Forward App Store events for my Adapty app "Acme Fitness" to Adapty, and keep RevenueCat receiving them. -
Adapty が App Store イベントにアクセスできるよう、エージェントが開いた Adapty ダッシュボードのページで
.p8ファイルをアップロードし、Issuer ID と Key ID を入力します。キーは Adapty に直接送信され、エージェントや CLI を経由することはありません。 -
RevenueCat が引き続き App Store イベントを受信できるよう、エージェントに RevenueCat の通知 URL を伝えます。RevenueCat で iOS アプリを開き、Apple Server to Server notification settings から Apple Server Notification URL をコピーします。URL は
https://api.revenuecat.com/v1/incoming-webhooks/から始まります。 -
App Store が Adapty を向くよう、App Store Connect でアプリを開き、App Information > App Store Server Notifications に進みます。Production Server URL と Sandbox Server URL の両方を、エージェントが提示した Adapty の URL に設定し、通知は Version 2 を選択します。詳細は App Store サーバー通知を有効にする を参照してください。この時点で RevenueCat へのフォワーディングはすでに有効になっているため、イベントが失われることはありません。
-
接続を確認するには、URL が設定済みであることをエージェントに伝えます。Adapty が App Store にテスト通知をリクエストし、受信を待ちます。通知が届かない場合、エージェントがその理由を説明します。
Google Play イベントを転送する
Google Play は Pub/Sub トピックに通知を送信します。Adapty は RevenueCat がすでに使用しているトピックに 2 番目のサブスクライバーとして登録するため、RevenueCat は引き続きイベントを受信できます。
Google Play Console でトピックを変更したり、このアプリに対して RTDN の有効化 の手順を実行したりしないでください。新しいトピックを作成すると、RevenueCat への通知が停止します。
-
転送を開始するには、エージェントに次のように依頼してください:
Forward Google Play events for my Adapty app "Acme Fitness" to Adapty, and keep RevenueCat receiving them. -
AdaptyにトピックへのアクセスをAnonymousするには、RevenueCatが使用するサービスアカウントのJSONキーを作成します。Google Cloud コンソールで IAM & Admin > Service Accounts を開き、通常
revenuecat-service-accountというアカウントを選択して、Keys > Add key に進み JSON を選択します。新しいキーはRevenueCatに影響しません。詳細については、Googleのサービスアカウントキーの作成ガイドを参照してください。 -
キーをアップロードするには、エージェントが開いたAdaptyダッシュボードのページで、ファイルを Google Play service account key (JSON) にアップロードします。キーはAdaptyに直接送信され、エージェントやCLIを経由することはありません。
-
AdaptyをトピックにサブスクライブするにはAdaptyにそのIDを渡します。RevenueCatでGoogle Playアプリの設定を開き、Google developer notifications から Topic ID をコピーします。Google Play コンソールでも同じ値を Monetize > Monetization setup > Topic name で確認できます。
Adaptyはトピックをサブスクライブし、テスト通知を発行して待機します。届かない場合、エージェントがその理由を教えてくれます。
-
権限の問題でテストが失敗した場合は、サービスアカウントにトピックのプロジェクトで Pub/Sub Editor ロールを付与するか、トピックに Pub/Sub Subscriber ロール、キーのプロジェクトに Pub/Sub Editor ロールを付与してください。その後、エージェントに再度確認を依頼してください。
アプリの新バージョンをテストしてリリースする
ここまで読んでいるなら、すでに次の手順を完了しているはずです:
- カタログを Adapty に移行済み
- フローを使用している場合はペイウォールのデザインを移行済み
- RevenueCat SDK を Adapty に置き換え済み
- コーディングエージェントが生成した
ADAPTY_SETUP.mdの内容を実施済み - Adapty でインテグレーションを設定済み
- App Store および Google Play のイベントを Adapty に転送済み
- サンドボックス購入のテスト
- 新しいアプリリリース
上記の項目を確認済みであれば、サンドボックスでテスト購入を行い、アプリをリリースしてください。
リリースチェックリストを確認してください。
既存のインテグレーションの検証や、アトリビューション・アナリティクスインテグレーションなどの追加機能の設定は、このリストを使って最終確認を行ってください。
(任意)トランザクション履歴のインポート
インポートを行うと、ユーザーの支払い履歴がプロファイルとチャートに反映されます。誰かのアクセス権には影響しません。
履歴データのインポートは焦らないでください
履歴データのインポートは、SDK を含むリリースを公開してから少なくとも1週間待つ必要があります。その間に SDK から購入価格に関する情報がすべて収集されるため、インポートされるデータの精度が高まります。
2つの移行によって、カタログ移行で作成したアプリに履歴がインポートされます。RevenueCat のプランに Cloud Export が含まれている場合はそちらを利用してください。
RevenueCat クラウドエクスポートを使用する場合
RevenueCat は毎日、Adapty がアプリ向けに用意したバケットにエクスポートを配信し、Adapty は受信したすべてのファイルをインポートします。
-
インポートを開始するには、エージェントに次のように依頼します。
Import the RevenueCat transaction history into my Adapty app "Acme Fitness" with a Cloud Export. -
エクスポートを接続するには、RevenueCat の External ID をエージェントに渡します。RevenueCat で Scheduled Data Exports 設定を開き、認証タイプとして IAM Role (ARN) を選択し、RevenueCat に表示される External ID をコピーします。External ID は秘密情報ではありません。
-
エクスポート設定を完了するには、RevenueCat にエージェントが提供したバケット、リージョン、ロール ARN を入力します。Receive new and updated transactions only をオンにします。オフのままにすると、RevenueCat は毎日全履歴をエクスポートし、Adapty はすべてのファイルをインポートしてしまいます。
RevenueCat が最初のファイルを配信するまでに最大 24 時間かかる場合があり、Adapty はバケット内の新しいファイルを 1 時間ごとに確認します。移行は、Adapty が最初のファイルをインポートしてから 1 週間後に自動的に完了します。インポートされた各プロファイルの Customer User ID は rc_last_seen_app_user_id_alias です。
サポートを通じた方法
RevenueCat のプランにクラウドエクスポートが含まれていない場合は、この方法を使用してください。RevenueCat のサポートがエクスポートを送信し、Adapty のサポートがインポートします。
-
インポートを開始するには、エージェントに次のように依頼してください。
Import the RevenueCat transaction history into my Adapty app "Acme Fitness" through support. -
エクスポートをリクエストするには、エージェントが提示する2つのメッセージのうち最初のものをRevenueCatサポートに送信します。
-
エクスポートをインポートするには、RevenueCatから届いたファイルを2番目のメッセージとともにAdaptyサポートに転送します。ファイルはRevenueCatから届いた状態のまま添付してください。開いたり、再保存したり、マージしたりすると、インポートが想定する列のフォーマットが変わってしまいます。
インポートで取り込まれるデータ
すべてのトランザクションについて、以下のデータが Adapty にインポートされます:
| パラメーター | 説明 |
|---|---|
| user_id | カスタマーユーザーID。Adaptyおよびあなたのシステムにおけるユーザーの主要な識別子です。 |
| apple_original_transaction_id | サブスクリプションチェーンにおいて、store_original_transaction_id で紐づけられたオリジナルトランザクションの購入日です。 |
| google_product_id | Google Play ストアのプロダクトIDです。 |
| google_purchase_token | Google Play が各トランザクションに対して発行する一意の識別子で、検証に必要です。 |
| country | ユーザーの国です。 |
| created_at | ユーザーが作成された日時です。 |
| subscription_expiration_date | サブスクリプションの有効期限の日時です。 |
| エンドユーザーのメールアドレスです。 | |
| phone_number | エンドユーザーの電話番号です。 |
| idfa | Apple がユーザーのデバイスに割り当てる広告識別子(IDFA)です。 |
| idfv | 1つのデベロッパーが提供するすべてのアプリに割り当てられ、デバイス上のそれらのアプリ間で共有されるベンダー識別子(IDFV)です。 |
| advertising_id | 広告主がトラッキングに使用できる、Android OS が提供する一意の識別子です。 |
| attribution_channel | マーケティングチャネル名です。 |
| attribution_campaign | マーケティングキャンペーン名です。 |
| attribution_ad_group | アトリビューションの広告グループです。 |
| attribution_ad_set | アトリビューションの広告セットです。 |
| attribution_creative | アトリビューションのクリエイティブキーワードです。 |
さらに、以下のインテグレーションの識別子もインポートされます: Amplitude、Mixpanel、AppsFlyer、Adjust、FacebookAds。
引き継がれないもの
- インポート中にすべてのトランザクションがストアで再検証されるため、ストアが認識しなくなった行は除外されます。
- 実際のストアトランザクションIDを持たない行(例:RevenueCat のプロモーションや手動付与のエンタイトルメント)は、トランザクションなしのプロファイルとしてインポートされます。該当ユーザーのアクセスを復元するには、サーバーサイド API でアクセスレベルを付与してください。
- 返金および請求エラーの履歴はそのまま引き継がれません。返金はキャンセル日のみが保持され、サブスクリプションの請求エラー状態はインポート時点のものとして記録され、過去の日付は記録されません。
よくある質問
Adapty SDKのインストールとAdapty SDK搭載の新バージョンのリリースが完了しました。Adapty SDKを含む新バージョンにアップデートしていない既存のサブスクライバーはどうなりますか?
ほとんどのユーザーは夜間に充電する際にApp Storeが全アプリを自動更新するため、問題にはならないでしょう。アップデートしていない有料サブスクライバーが若干残る可能性はありますが、引き続きプレミアムコンテンツにアクセスできます。強制的にアップデートさせる必要はありません。
RevenueCatの過去データはすぐにエクスポートしないと失われますか?
急いで対応する必要はありません。まずAdapty SDKを組み込んだリリースを行い、その後で履歴をインポートしてください。ユーザーの支払い履歴を復元し、プロファイルとチャートに反映します。
MMPツール(AppsFlyer、Adjustなど)やアナリティクスツール(Mixpanel、Amplitudeなど)を使っています。正しく動作させるにはどうすればよいですか?
まず、データを送信したいサードパーティサービスのIDをSDKを通じてAdaptyに渡す必要があります。アトリビューション連携とアナリティクス連携のガイドをご確認ください。過去データや既存ユーザーについては、RevenueCatからエクスポートしたデータからそれらのIDを渡すようにしてください。