mcpField
G
gplay-iap-setup

gplay-iap-setup

github.com/tamtomマーケティング・グロース52413 回インストール13 週間前に更新
リポジトリ

gplay-iap-setup について

gplay-iap-setupは、`gplay`コマンドラインでGoogle Playのアプリ内商品やサブスクリプションを設定するスキルです。Androidアプリの収益化に向け、商品管理、価格、オファー、掲載情報のローカライズを案内します。

主な機能

  1. 01一回限りの商品作成と管理
  2. 02サブスクリプション、プラン、オファーの管理
  3. 03地域別価格の変換
  4. 04掲載情報の一括ローカライズ
  5. 05旧・新の収益化APIの使い分け

活用シーン

  1. 01新しい一回限りの商品を設定
  2. 02トライアルやオファー付きのサブスクリプション作成
  3. 03複数言語の掲載情報を更新

インストール

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

$npx skills add https://github.com/tamtom/gplay-cli-skills --skill gplay-iap-setup

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

詳細

Google Play のアプリ内購入の設定

Android アプリの収益化を設定する必要がある場合に、このスキルを使用します。

2 つの API:レガシーと新しい収益化 API

Google Play には、1 回限りの商品向けの API が 2 つあります。

レガシー(gplay iap)新しい収益化 API(gplay onetimeproducts)
APIinappproductsmonetization.onetimeproducts
価格形式priceMicros/currencyunits/nanos/currencyCode
構造フラットな prices マップregionalPricingAndAvailabilityConfigs を含む purchaseOptions
状態active/inactiveDRAFT → ACTIVE(明示的な有効化が必要)
地域別価格設定--auto-convert-prices フラグ--regions-version が必須

新しい商品には、新しい収益化 API(gplay onetimeproducts)を優先してください。購入オプションに対応し、地域別価格をより細かく管理できるほか、現在も積極的に開発されている API です。

既存のレガシー商品を管理する場合に限り、レガシー API(gplay iap)を使用してください。

同じ商品に 2 つの API を混在させないでください。 gplay iap create で作成した商品は gplay onetimeproducts では管理できず、その逆も同様です。

重要:商品 ID は永久に使用できません

Google Play では、削除後も商品 ID が永久に予約されます。 premium_unlock を作成して後から削除した場合、別の API を使っても、ID premium_unlock を再利用することはできません。商品 ID は慎重に選んでください。

つまり、以下のことはしないでください。

  • 適切な ID で「テスト」商品を作成してから削除しないでください
  • レガシー API で作成してから、新しい API で作り直そうとしないでください
  • ID を使い切ってしまった場合は、新しい ID(例:premium_unlock_v2)を選ぶ必要があります

1 回限りの商品(新しい収益化 API)

商品の一覧表示
gplay onetimeproducts list --package com.example.app
商品の作成

--regions-version は必須です — create コマンドでは、内部で allowMissing=true を指定して PATCH が使用されます。

gplay onetimeproducts create \
  --package com.example.app \
  --product-id premium_unlock \
  --json @product.json \
  --regions-version "2025/03"
product.json(新しい収益化形式)
{
  "productId": "premium_unlock",
  "listings": [
    { "languageCode": "en-US", "title": "Premium Unlock", "description": "Unlock all premium features" },
    { "languageCode": "es-ES", "title": "Desbloqueo Premium", "description": "Desbloquea todas las funciones premium" }
  ],
  "purchaseOptions": [
    {
      "buyOption": { "legacyCompatible": true },
      "newRegionsConfig": {
        "availability": "AVAILABLE",
        "usdPrice": { "currencyCode": "USD", "units": "9", "nanos": 990000000 },
        "eurPrice": { "currencyCode": "EUR", "units": "9", "nanos": 990000000 }
      },
      "regionalPricingAndAvailabilityConfigs": [
        { "regionCode": "US", "availability": "AVAILABLE", "price": { "currencyCode": "USD", "units": "9", "nanos": 990000000 } },
        { "regionCode": "GB", "availability": "AVAILABLE", "price": { "currencyCode": "GBP", "units": "7", "nanos": 990000000 } },
        { "regionCode": "IN", "availability": "AVAILABLE", "price": { "currencyCode": "INR", "units": "249", "nanos": 990000000 } }
      ]
    }
  ]
}
購入オプションの有効化

新しい商品は DRAFT 状態で開始します。ユーザーが購入できるようにするには、有効化する必要があります。

gplay purchase-options batch-update-states \
  --package com.example.app \
  --product-id premium_unlock \
  --json '{"requests":[{"activatePurchaseOptionRequest":{"packageName":"com.example.app","productId":"premium_unlock","purchaseOptionId":"default"}}]}'
商品の更新
gplay onetimeproducts patch \
  --package com.example.app \
  --product-id premium_unlock \
  --json @product-updated.json \
  --regions-version "2025/03" \
  --update-mask "purchaseOptions"
商品の取得
gplay onetimeproducts get --package com.example.app --product-id premium_unlock
商品の削除
gplay onetimeproducts delete \
  --package com.example.app \
  --product-id premium_unlock \
  --confirm
一括操作
# Get multiple products
gplay onetimeproducts batch-get \
  --package com.example.app \
  --product-ids "premium_unlock,coins_100"

# Update multiple products (regionsVersion goes inside JSON)
gplay onetimeproducts batch-update \
  --package com.example.app \
  --json @products-batch.json

レガシーのアプリ内商品(IAP)

既存のレガシー商品を管理する場合に限り使用してください。

商品の一覧表示
gplay iap list --package com.example.app
商品の作成

iap create には --sku フラグがありません。SKU/productId は JSON 本文に記述します。

gplay iap create \
  --package com.example.app \
  --json @product.json
product.json(レガシー形式)
{
  "sku": "premium_upgrade",
  "status": "active",
  "purchaseType": "managedUser",
  "defaultPrice": {
    "priceMicros": "990000",
    "currency": "USD"
  },
  "prices": {
    "US": { "priceMicros": "990000", "currency": "USD" },
    "GB": { "priceMicros": "799000", "currency": "GBP" }
  },
  "listings": {
    "en-US": { "title": "Premium Upgrade", "description": "Unlock all premium features" },
    "es-ES": { "title": "Actualización Premium", "description": "Desbloquea todas las funciones premium" }
  }
}
更新/一括処理/削除
# Update
gplay iap update --package com.example.app --sku premium_upgrade --json @product-updated.json

# Batch update
gplay iap batch-update --package com.example.app --json @products.json

# Batch get
gplay iap batch-get --package com.example.app --skus "premium,coins_100,coins_500"

# Delete (permanent — ID cannot be reused)
gplay iap delete --package com.example.app --sku premium_upgrade --confirm

サブスクリプション

サブスクリプションの一覧表示
gplay subscriptions list --package com.example.app
サブスクリプションの作成
gplay subscriptions create \
  --package com.example.app \
  --json @subscription.json
subscription.json

サブスクリプションでは、価格に units/nanos/currencyCode 形式を使用します。

{
  "productId": "premium_monthly",
  "basePlans": [
    {
      "basePlanId": "monthly",
      "state": "ACTIVE",
      "regionalConfigs": [
        {
          "regionCode": "US",
          "newSubscriberAvailability": true,
          "price": { "currencyCode": "USD", "units": "4", "nanos": 990000000 }
        }
      ],
      "autoRenewingBasePlanType": {
        "billingPeriodDuration": "P1M"
      }
    },
    {
      "basePlanId": "yearly",
      "state": "ACTIVE",
      "regionalConfigs": [
        {
          "regionCode": "US",
          "newSubscriberAvailability": true,
          "price": { "currencyCode": "USD", "units": "49", "nanos": 990000000 }
        }
      ],
      "autoRenewingBasePlanType": {
        "billingPeriodDuration": "P1Y"
      }
    }
  ],
  "listings": [
    { "languageCode": "en-US", "title": "Premium Subscription", "description": "Get all premium features" }
  ]
}
サブスクリプションを各ロケールに一括ローカライズする

サブスクリプションのリスティングは、ロケールごとのオブジェクトを格納した配列です(ロケールをキーとするオブジェクトではありません)。各エントリーでは、languageCode、title、benefits(配列、最大 4 項目)、description を使用します。1 回の subscriptions update 呼び出しで、すべてのロケールがアトミックに設定されます。基本プランと価格に影響しないよう、--update-mask listings を使用してください。

1. アプリで現在提供しているロケールを確認します(少なくとも以下を網羅します)。

EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id')
gplay listings list --package com.example.app --edit "$EDIT_ID" --output table

2. リスティングのみを含む JSON ファイル(subscription-listings.json)を作成します。

{
  "listings": [
    { "languageCode": "en-US", "title": "Premium Monthly", "benefits": ["Unlimited access", "No ads"], "description": "Premium access to all features." },
    { "languageCode": "de-DE", "title": "Premium Monatlich", "benefits": ["Unbegrenzter Zugang", "Keine Werbung"], "description": "Premium-Zugang zu allen Funktionen." },
    { "languageCode": "es-ES", "title": "Premium Mensual", "benefits": ["Acceso ilimitado", "Sin anuncios"], "description": "Acceso premium a todas las funciones." },
    { "languageCode": "ja-JP", "title": "プレミアム月額", "benefits": ["無制限アクセス", "広告なし"], "description": "すべての機能にプレミアムアクセス。" }
  ]
}

3. 1 つのサブスクリプションに適用します。

gplay subscriptions update \
  --package com.example.app \
  --product-id premium_monthly \
  --json @subscription-listings.json \
  --update-mask listings

4. アプリ内のすべてのサブスクリプションに対して繰り返し適用します。

PACKAGE="com.example.app"
gplay subscriptions list --package "$PACKAGE" --paginate \
  | jq -r '.[].productId' \
  | while read -r PRODUCT_ID; do
      gplay subscriptions update \
        --package "$PACKAGE" \
        --product-id "$PRODUCT_ID" \
        --json @subscription-listings.json \
        --update-mask listings
    done

gplay subscriptions get --package com.example.app --product-id premium_monthly --pretty で確認し、すべての languageCode が listings 配列に含まれていることを確認してください。制約:title は最大 55 文字、description は最大 80 文字、benefits は最大 4 項目です。ユーザーから表示名が 1 つだけ指定された場合は、すべてのロケールでその名前を再利用します。ロケールごとの翻訳が指定された場合は、各ロケール固有のテキストを使用します。

基本プラン

基本プランでは、サブスクリプションの請求期間と価格を定義します。

基本プランの有効化
gplay baseplans activate \
  --package com.example.app \
  --product-id premium_monthly \
  --base-plan-id monthly
基本プランの無効化
gplay baseplans deactivate \
  --package com.example.app \
  --product-id premium_monthly \
  --base-plan-id monthly
価格の移行
gplay baseplans migrate-prices \
  --package com.example.app \
  --product-id premium_monthly \
  --base-plan-id monthly \
  --json @migration.json

サブスクリプションの特典

特典では、割引、無料トライアル、または導入時価格を提供します。

特典の一覧表示
gplay offers list \
  --package com.example.app \
  --product-id premium_monthly \
  --base-plan-id monthly
特典の作成
gplay offers create \
  --package com.example.app \
  --product-id premium_monthly \
  --base-plan-id monthly \
  --json @offer.json
offer.json(無料トライアル)
{
  "offerId": "trial_7day",
  "state": "ACTIVE",
  "phases": [
    {
      "duration": "P7D",
      "pricingType": "FREE_TRIAL"
    }
  ],
  "regionalConfigs": [
    {
      "regionCode": "US"
    }
  ]
}
offer.json(導入価格)
{
  "offerId": "intro_50_off",
  "state": "ACTIVE",
  "phases": [
    {
      "duration": "P1M",
      "pricingType": "SINGLE_PAYMENT",
      "price": {
        "priceMicros": "2490000",
        "currency": "USD"
      }
    }
  ]
}
オファーの有効化/無効化
# Activate
gplay offers activate \
  --package com.example.app \
  --product-id premium_monthly \
  --base-plan-id monthly \
  --offer-id trial_7day

# Deactivate
gplay offers deactivate \
  --package com.example.app \
  --product-id premium_monthly \
  --base-plan-id monthly \
  --offer-id trial_7day

OTP 購入オプションのオファー

1 回限りの商品の購入オプションに関するオファーを管理します:

# List offers
gplay otp-offers list --package com.example.app --product-id premium_unlock --purchase-option-id default

# Activate offer
gplay otp-offers activate --package com.example.app --product-id premium_unlock --purchase-option-id default --offer-id promo_50off

# Deactivate offer
gplay otp-offers deactivate --package com.example.app --product-id premium_unlock --purchase-option-id default --offer-id promo_50off

地域別価格

価格の換算
gplay pricing convert \
  --package com.example.app \
  --json @price-request.json
price-request.json(ConvertRegionPricesRequest)

本文は、Money 型の単一の基本priceです。unitsは通貨の整数部分を文字列で表し、nanosは小数部分を表します(990000000 = .99):

{
  "price": {
    "currencyCode": "USD",
    "units": "9",
    "nanos": 990000000
  }
}

レスポンスには、サポートされているすべての地域の換算価格と、サブスクリプション、基本プラン、オファー、1 回限りの商品の各コマンドで--regions-versionとして指定できるregionVersionが含まれます。

よくある収益化パターン

パターン 1:新しい 1 回限りの商品(推奨)
# 1. Create product
gplay onetimeproducts create \
  --package com.example.app \
  --product-id premium_unlock \
  --json @premium.json \
  --regions-version "2025/03"

# 2. Activate purchase option
gplay purchase-options batch-update-states \
  --package com.example.app \
  --product-id premium_unlock \
  --json '{"requests":[{"activatePurchaseOptionRequest":{"packageName":"com.example.app","productId":"premium_unlock","purchaseOptionId":"default"}}]}'

# 3. Verify
gplay onetimeproducts get --package com.example.app --product-id premium_unlock
パターン 2:無料トライアル付きサブスクリプション
# 1. Create subscription
gplay subscriptions create \
  --package com.example.app \
  --json @sub.json

# 2. Create free trial offer
gplay offers create \
  --package com.example.app \
  --product-id premium \
  --base-plan-id monthly \
  --json @trial.json
パターン 3:複数段階のサブスクリプション
{
  "productId": "premium",
  "basePlans": [
    {
      "basePlanId": "basic_monthly",
      "regionalConfigs": [{ "regionCode": "US", "newSubscriberAvailability": true, "price": { "currencyCode": "USD", "units": "2", "nanos": 990000000 } }],
      "autoRenewingBasePlanType": { "billingPeriodDuration": "P1M" }
    },
    {
      "basePlanId": "premium_monthly",
      "regionalConfigs": [{ "regionCode": "US", "newSubscriberAvailability": true, "price": { "currencyCode": "USD", "units": "4", "nanos": 990000000 } }],
      "autoRenewingBasePlanType": { "billingPeriodDuration": "P1M" }
    },
    {
      "basePlanId": "premium_yearly",
      "regionalConfigs": [{ "regionCode": "US", "newSubscriberAvailability": true, "price": { "currencyCode": "USD", "units": "49", "nanos": 990000000 } }],
      "autoRenewingBasePlanType": { "billingPeriodDuration": "P1Y" }
    }
  ]
}

テスト

テスト購入を使用する

アプリのコードでは、次のテスト商品 ID を使用します:

  • android.test.purchased
  • android.test.canceled
  • android.test.refunded
  • android.test.item_unavailable
ライセンスのテスト

Play Console でテストアカウントを追加します: 設定 → ライセンス テスト → ライセンステスターを追加

ベストプラクティス

  1. わかりやすい商品 ID を使用する - 例:prod_001ではなくpremium_monthly。ID は永続的で、削除後に再利用できません。
  2. 新しい収益化 API を優先する - 新しい商品にはgplay iapではなくgplay onetimeproductsを使用します。
  3. 説明をローカライズする - サポートされているすべての言語の掲載情報を用意します。
  4. 地域別価格を設定する - どこでも同じ価格にするのではなく、PPP 価格を使用します(gplay-ppp-pricingスキルを参照)。
  5. 作成後に有効化する - 新しい OTP 商品は DRAFT 状態で作成されます。有効化するにはgplay purchase-options batch-update-statesを使用します。
  6. コマンドを確認する - gplay --helpを実行すると、すべてのコマンドグループを確認できます。購入オプションの管理はgplay onetimeproductsではなく、gplay purchase-optionsにあります。
  7. 十分にテストする - テストアカウントとテスト商品 ID を使用します。
  8. コンバージョンを監視する - どの商品やオファーの実績が最も良いかを追跡します。
  9. 価格を慎重に変更する - 価格変更は既存のサブスクライバーに影響します。

請求期間

  • P1W - 1 週間
  • P1M - 1 か月
  • P3M - 3 か月
  • P6M - 6 か月
  • P1Y - 1 年

コメント