mcpField
R
rc-catalog-management

rc-catalog-management

github.com/revenuecat開発76643 回インストール1 日前に更新
リポジトリ

rc-catalog-management について

Android 開発者向けに、Google Play Console と RevenueCat を使ったサブスクリプションカタログ管理を案内するスキルです。商品登録、権利やオファリングの設定、ターゲティング、変更確認を扱います。

主な機能

  1. 01商品登録と権利・オファリング設定の分離
  2. 02商品のインポートと権利への紐付け
  3. 03オファリング、パッケージ、ターゲティングの設定
  4. 04変更確認のチェックリスト

活用シーン

  1. 01Android アプリへのサブスクリプション商品の追加
  2. 02アプリ更新なしでのオファリングやターゲティング変更
  3. 03商品が想定した権利を付与するかの確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/revenuecat/ai-toolkit --skill rc-catalog-management

インストール後、Claude Code で/rc-catalog-managementを入力して読み込まれたか確認します。

詳細

カタログ管理

Google Play Console(商品の信頼できる唯一の情報源)とRevenueCatダッシュボード(エンタイトルメント、オファリング、ターゲティング)の2つの場所で、Androidの商品カタログを管理します。アプリやバックエンドから、Google Play Developerのmonetization.subscriptionsまたはmonetization.onetimeproductsエンドポイントを呼び出すことはありません。

フェーズ1:理解する

何かに手を加える前に、このフェーズを読んでください。

2つの場所を使う理由
場所管理対象例
Google Play Console基本となる商品、ベースプラン、オファー、価格premium_monthly、ベースプランp1m、初回オファー
RevenueCatダッシュボードエンタイトルメント、オファリング、パッケージ、ターゲティングproエンタイトルメント、defaultオファリング、$rc_monthlyパッケージ

Play Consoleは課金対象のSKUを管理します。どのSKUをどのユーザーに表示するか、またどのエンタイトルメントキーに紐付けるかはRevenueCatが決定します。

アプリを更新せずに変更できる内容

アプリがawaitOfferings()を呼び出すと、RevenueCatダッシュボードで設定された内容を取得します。オファリングの編集、パッケージの入れ替え、ターゲティングルールは、次回アプリを起動したときに反映されます。バイナリのリリースは必要ありません。

REST APIを使う場合

バックエンドからカタログの編集を自動化する必要がある場合(たとえば、複数の環境に数十件のオファリングを登録する場合)は、商品、エンタイトルメント、オファリングにRevenueCat REST APIを使用します。Googleに直接アクセスすることはありません。Play Consoleが引き続き商品の信頼できる唯一の情報源です。

フェーズ2:計画する

変更を加える前に、次の点を決めてください。

  1. 新しい商品ですか。それとも既存商品の再パッケージですか?
    • 新しい商品:Play Consoleから始めます。
    • 再パッケージ(新しいオファリング、新しいターゲティング、新しいエンタイトルメントの紐付け):RevenueCatで作業します。
  2. その商品でどのエンタイトルメントを利用できるようにしますか? 対応するエンタイトルメントがない場合は、先に作成してください。
  3. オファリングとパッケージの識別子は何ですか? 識別子(たとえば$rc_monthly、$rc_annual)を決め、ペイウォールのコードが引き続き動作するようにします。
  4. ターゲティングを変更する必要がありますか? 異なるユーザーに異なるオファリングを表示する場合は、配置名とターゲティングルール(OSバージョン、国、カスタム属性)を計画してください。

フェーズ3:実行する

新しいサブスクリプション商品を追加する一連の手順です。

ステップ1:Play Consoleで商品を追加する
  1. Play Console -> アプリ -> 収益化 -> 商品 -> サブスクリプションを開きます。
  2. サブスクリプションを作成をクリックします。
  3. 商品ID(たとえばpremium_monthly)、名前、説明を設定します。
  4. ベースプラン(請求期間、更新タイプ、価格)を追加します。
  5. 必要に応じてオファー(初回価格、無料トライアル)を追加します。
  6. サブスクリプションを有効化します。

Playで商品が反映されるまで、数分待ちます。

ステップ2:RevenueCatにインポートし、エンタイトルメントを紐付ける
  1. RevenueCatダッシュボード -> プロジェクト -> 商品を開きます。
  2. インポートをクリックしてPlay Consoleから同期します。新しい商品が一覧に表示されます。
  3. 商品を開き、既存のエンタイトルメントに紐付けるか、新しく作成します。
    • エンタイトルメントの例:pro。pro機能を利用可能にするすべての商品をproに紐付けます。

クライアントコードでは、キーを使ってエンタイトルメントを確認します。

val isPro = customerInfo.entitlements["pro"]?.isActive == true
ステップ3:商品をオファリングのパッケージとして組み込む
  1. ダッシュボードでオファリングを開きます。
  2. 編集するオファリングを選ぶか、新しいオファリング(たとえばdefault)を作成します。
  3. パッケージを追加します。ペイウォールに合ったパッケージ識別子を選びます。
    • 月額の場合は$rc_monthly
    • 年額の場合は$rc_annual
    • またはカスタム識別子
  4. Play Consoleの商品をパッケージに紐付けます。
  5. 保存します。デフォルトにする場合は、オファリングをCurrentに設定します。

クライアントコードは変更不要です。

val offerings = Purchases.sharedInstance.awaitOfferings()
val monthly = offerings.current?.monthly
Step 4(任意):ターゲティング

ユーザーによって異なるオファーを表示する場合は、プレースメントを使用します。

  1. ダッシュボードで Targeting -> Placements を開きます。
  2. プレースメントを作成します(例:paywall_upsell)。
  3. ルール(OS バージョン、国、カスタム属性)を追加して、ユーザーを特定のオファーに振り分けます。

クライアントコード:

val offering = offerings.getCurrentOfferingForPlacement("paywall_upsell")
    ?: offerings.current

後でターゲティングルールを変更しても、アプリのアップデートは必要ありません。

フェーズ 4:確認

タスクを完了する前に、変更が反映されたことを確認します。

チェック項目方法
Play に商品が存在するPlay Console -> Subscriptions に商品が Active として表示されている
商品が RC にインポートされているダッシュボード -> Products に商品が表示されている
エンタイトルメントの紐付けダッシュボード -> Entitlements に、正しいエンタイトルメントの配下で商品が表示されている
オファーの設定ダッシュボード -> Offerings に、想定されるパッケージに商品が紐付けられている
実行時の取得アプリを起動して awaitOfferings() を呼び出し、パッケージが解決されることを確認する
エンタイトルメントの有効化テスト購入を完了し、customerInfo.entitlements["pro"].isActive が true であることを確認する

awaitOfferings() が想定されるパッケージに対して null を返す場合、最も一般的な原因は、オファーが Current に設定されていない、商品がパッケージに紐付けられていない、または Play で商品が反映されていないことです。

よくある間違い

  • バックエンドから monetization.subscriptions を呼び出す。代わりに RevenueCat を使用してください。
  • 商品をインポートする前にオファーを作成する。まずインポートしてから、紐付けてください。
  • ペイウォール UI にハードコードした商品 ID を含める。アプリをリリースせずに商品を切り替えられるよう、パッケージ識別子を使用してください。
  • オファーを Current に設定し忘れる。offerings.current を呼び出すクライアントには、切り替えるまで古いオファーが表示されます。

参考資料

コメント