gplay-ppp-pricing について
gplay-ppp-pricingは、購買力に応じた倍率でGoogle Playの地域別価格を設定するスキルです。アプリ内商品やサブスクリプションを管理する開発者向けで、既存の地域設定を保つ取得・マージ方式を含め、旧版と新版の商品APIを扱います。
主な機能
- 01地域別PPP倍率による価格計算
- 02アプリ内商品と買い切り商品の管理
- 03サブスクリプション価格の調整
- 04既存の地域設定を保つマージ更新
- 05地域バージョンと更新マスクの要件説明
活用シーン
- 01国ごとの商品価格の設定
- 02既存サブスクリプションの地域価格調整
- 03地域価格付き買い切り商品の作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tamtom/ gplay-cli-skills --skill gplay-ppp-pricingインストール後、Claude Code で/gplay-ppp-pricingを入力して読み込まれたか確認します。
詳細
PPP 価格設定(地域別価格設定)
このスキルを使用すると、購買力平価や独自の価格設定戦略に基づいて、国ごとに異なる価格を設定できます。
前提条件
- 認証情報が設定されていることを確認してください(
gplay auth login --service-accountまたはGPLAY_SERVICE_ACCOUNT環境変数)。 GPLAY_PACKAGEを使用するか、--packageを明示的に指定してください。- 基準地域(通常は US)と基準価格を把握してください。
重要:必須フラグ
価格設定を変更するサブスクリプションまたは一回限りの商品を更新する場合は、次のフラグを必ず指定してください。
--regions-version:地域別価格設定の更新時に、Google Play API で必須です。最新のバージョンを使用してください。現在のバージョンがわからない場合は、任意の値(例:"2022/02")を送信してください。API エラーで最新の値が通知されます(例:latest value is ExternalRegionLaunchVersionId{versionId=2025/03})。その後、正しいバージョンを指定して再試行してください。--update-mask "basePlans":サブスクリプションの更新時に必須です。指定しないと、API は次のエラーを返します:"update_mask must contain at least one path."- 一回限りの商品の場合は、
--update-mask "purchaseOptions"を使用してください。
重要:既存のすべての地域を維持する(取得してからマージ)
Google Play API は、既存の地域別設定を削除する更新を拒否します。 サブスクリプションにすでに 173 地域が設定されていて、PPP 対象の 30 地域のみを送信すると、API は次のエラーを返します:"Regional configs were removed from the base plan: BM, BO, CI..."
必ず、取得してからマージする手順に従ってください。
- 現在の商品を取得し、既存の地域別設定をすべて確認します
- 計算した価格で PPP 対象地域のみを上書きします
- マージ後の完全なリスト(元のすべての地域+PPP による上書き)を送信します
これは次の場合にも当てはまります。
- サブスクリプションの**
otherRegionsConfig:ベースプランに以前設定されていた場合、更新 JSON に必ず**含めてください。 - 一回限りの商品の購入オプションの**
newRegionsConfig**:以前に設定されていた場合(usdPrice、eurPrice、availabilityを含む)、必ず含めてください。省略すると、次のエラーが発生します:"Cannot remove currency for new regions once it has been added: EUR."
重要:通貨コードは推測ではなく Google Play から取得する
通貨と地域の対応をハードコードしないでください。 通貨コードは --regions-version の値によって異なります(例:ブルガリア BG は、ユーロ導入前の古いバージョンでは BGN ですが、新しいバージョンでは EUR です)。
必ず取得した既存の地域別設定の通貨コードを使用してください。 価格を上書きする PPP 対象地域では、以下の倍率表に記載された通貨を使用してください。その他すべての地域では、Google Play から返された既存の通貨をそのまま維持してください。
PPP 倍率表
基準となる USD 価格に以下の倍率を適用してください。すべての価格の端数は .99 に丸めてください(例:$4.73 → $4.99、₹249.37 → ₹249.99)。
ティア 1 — 全額(1.0x~1.1x)
| 地域 | コード | 倍率 | 通貨 |
|---|---|---|---|
| 米国 | US | 1.0x | USD |
| 英国 | GB | 1.0x | GBP |
| ドイツ | DE | 1.0x | EUR |
| オーストラリア | AU | 1.0x | AUD |
| スイス | CH | 1.1x | CHF |
| カナダ | CA | 1.0x | CAD |
| オランダ | NL | 1.0x | EUR |
| スウェーデン | SE | 1.0x | SEK |
| ノルウェー | NO | 1.05x | NOK |
| デンマーク | DK | 1.0x | DKK |
ティア 2 — 中程度(0.6x~0.8x)
| 地域 | コード | 倍率 | 通貨 |
|---|---|---|---|
| フランス | FR | 0.8x | EUR |
| スペイン | ES | 0.7x | EUR |
| イタリア | IT | 0.7x | EUR |
| 日本 | JP | 0.8x | JPY |
| 韓国 | KR | 0.7x | KRW |
| ポーランド | PL | 0.6x | PLN |
| ポルトガル | PT | 0.7x | EUR |
| チェコ共和国 | CZ | 0.6x | CZK |
| ギリシャ | GR | 0.65x | EUR |
| チリ | CL | 0.6x | CLP |
| サウジアラビア | SA | 0.8x | SAR |
| UAE | AE | 0.8x | AED |
Tier 3 — 低(0.3x–0.5x)
| 地域 | コード | 倍率 | 通貨 |
|---|---|---|---|
| インド | IN | 0.3x | INR |
| ブラジル | BR | 0.5x | BRL |
| メキシコ | MX | 0.45x | MXN |
| インドネシア | ID | 0.3x | IDR |
| トルコ | TR | 0.35x | TRY |
| ベトナム | VN | 0.3x | VND |
| フィリピン | PH | 0.35x | PHP |
| エジプト | EG | 0.3x | EGP |
| コロンビア | CO | 0.4x | COP |
| アルゼンチン | AR | 0.3x | ARS |
| ナイジェリア | NG | 0.3x | NGN |
| パキスタン | PK | 0.25x | PKR |
| タイ | TH | 0.4x | THB |
| マレーシア | MY | 0.45x | MYR |
| 南アフリカ | ZA | 0.4x | ZAR |
| ウクライナ | UA | 0.3x | UAH |
ワークフロー:PPP ベースの IAP 価格を設定する(レガシー inappproducts API)
gplay iap で作成したレガシーの管理対象商品には、このワークフローを使用します。これらの商品は priceMicros/currency 形式を使用します。
1. アプリ内商品を一覧表示する
gplay iap list --package "PACKAGE"
2. 現在の商品詳細を取得する
gplay iap get --package "PACKAGE" --sku "SKU"
現在の defaultPrice を基準価格として記録し、既存の prices エントリーをすべて保存します。
3. PPP 調整済み価格の JSON を作成する(取得してからマージ)
PPP 対象地域だけでなく、既存の地域価格をすべて含める必要があります。 現在の商品を取得してから、PPP 対象地域を上書きします。
{
"sku": "premium_upgrade",
"defaultPrice": {
"priceMicros": "9990000",
"currency": "USD"
},
"prices": {
"US": { "priceMicros": "9990000", "currency": "USD" },
"IN": { "priceMicros": "2499900", "currency": "INR" },
"BR": { "priceMicros": "24990000", "currency": "BRL" },
"GB": { "priceMicros": "9990000", "currency": "GBP" },
"DE": { "priceMicros": "9990000", "currency": "EUR" }
}
}
4. 商品を更新する
gplay iap update \
--package "PACKAGE" \
--sku "SKU" \
--json @ppp-prices.json
5. 価格を確認する
gplay iap get --package "PACKAGE" --sku "SKU"
ワークフロー:PPP 価格を設定した新しい買い切り商品を作成する
PPP 価格を設定した新規の買い切り商品を一から作成するときは、このワークフローを使用します。
1. 地域設定の構造を確認するため、既存の商品を参照する
既存の OTP がある場合は、地域設定の形式をテンプレートとして使うために取得します。
gplay onetimeproducts get --package "PACKAGE" --product-id "EXISTING_PRODUCT_ID"
regionsVersion と regionalPricingAndAvailabilityConfigs の構造を確認します。
2. PPP 価格を設定した商品 JSON を作成する
リスティング、購入オプション、すべての地域別価格設定を含む完全な商品 JSON を作成します。価格形式には units/nanos/currencyCode を使用します(以下の形式の説明を参照)。
{
"productId": "premium_lifetime_50off",
"listings": [
{ "languageCode": "en-US", "title": "Premium (50% off)", "description": "Lifetime access at 50% off" }
],
"purchaseOptions": [
{
"buyOption": { "legacyCompatible": true },
"newRegionsConfig": {
"availability": "AVAILABLE",
"usdPrice": { "currencyCode": "USD", "units": "14", "nanos": 990000000 },
"eurPrice": { "currencyCode": "EUR", "units": "13", "nanos": 990000000 }
},
"regionalPricingAndAvailabilityConfigs": [
{ "regionCode": "US", "availability": "AVAILABLE", "price": { "currencyCode": "USD", "units": "14", "nanos": 990000000 } },
{ "regionCode": "IN", "availability": "AVAILABLE", "price": { "currencyCode": "INR", "units": "373", "nanos": 990000000 } },
{ "regionCode": "BR", "availability": "AVAILABLE", "price": { "currencyCode": "BRL", "units": "37", "nanos": 990000000 } }
]
}
]
}
3. 商品を作成する
作成時も --regions-version が必要です — create コマンドは内部で allowMissing=true を指定した PATCH を使用します。
gplay onetimeproducts create \
--package "PACKAGE" \
--product-id "premium_lifetime_50off" \
--json @new-otp.json \
--regions-version "2025/03"
商品は DRAFT 状態で作成されます。
4. 購入オプションを有効にする
新しい商品は DRAFT 状態で開始します。purchase-options batch-update-states を使って有効にします。
gplay purchase-options batch-update-states \
--package "PACKAGE" \
--product-id "premium_lifetime_50off" \
--json '{"requests":[{"activatePurchaseOptionRequest":{"packageName":"PACKAGE","productId":"premium_lifetime_50off","purchaseOptionId":"default"}}]}'
5. 商品を確認する
gplay onetimeproducts get --package "PACKAGE" --product-id "premium_lifetime_50off"
状態が ACTIVE で、すべての地域の価格が正しいことを確認します。
ワークフロー:既存の買い切り商品の PPP 価格を更新する(新しい収益化 API)
gplay onetimeproducts で作成した既存の買い切り商品には、このワークフローを使用します。これらの商品は units/nanos/currencyCode 形式を使用し、regionalPricingAndAvailabilityConfigs を含む purchaseOptions を持ちます。
1. 買い切り商品を一覧表示する
gplay onetimeproducts list --package "PACKAGE"
2. 現在の商品を取得し、すべての地域設定を保存する
gplay onetimeproducts get --package "PACKAGE" --product-id "PRODUCT_ID"
JSON 全体を保存します。以下を確認してください。
purchaseOptions[].regionalPricingAndAvailabilityConfigs配列 — すべてのエントリーが必要ですpurchaseOptions[].newRegionsConfig— 以前に設定されていた場合は必ず含める必要があります(usdPrice、eurPrice、availabilityを含みます)
3. PPP 調整済み JSON を作成する(取得してからマージ)
既存の regionalPricingAndAvailabilityConfigs をすべて含めた状態から始め、計算した価格で PPP 対象地域を上書きします。その他の地域はすべて変更せずに残します。
価格形式では、units(整数部を文字列で指定)と nanos(小数部を整数で指定、0~999999999)を使用します。
- $5.99 →
"units": "5", "nanos": 990000000 - ₹149.99 →
"units": "149", "nanos": 990000000 - ¥719 →
"units": "719", "nanos": 0
{
"productId": "premium_lifetime",
"purchaseOptions": [
{
"purchaseOptionId": "EXISTING_OPTION_ID",
"buyOption": { "legacyCompatible": true },
"newRegionsConfig": {
"availability": "AVAILABLE",
"usdPrice": { "currencyCode": "USD", "units": "29", "nanos": 990000000 },
"eurPrice": { "currencyCode": "EUR", "units": "27", "nanos": 990000000 }
},
"regionalPricingAndAvailabilityConfigs": [
{ "regionCode": "US", "availability": "AVAILABLE", "price": { "currencyCode": "USD", "units": "29", "nanos": 990000000 } },
{ "regionCode": "IN", "availability": "AVAILABLE", "price": { "currencyCode": "INR", "units": "746", "nanos": 990000000 } },
{ "regionCode": "BR", "availability": "AVAILABLE", "price": { "currencyCode": "BRL", "units": "74", "nanos": 990000000 } },
{ "regionCode": "AE", "availability": "AVAILABLE", "price": { "currencyCode": "AED", "units": "109", "nanos": 990000000 } }
]
}
]
}
重要:
regionalPricingAndAvailabilityConfigs配列には、既存の商品に含まれる地域をすべて含める必要があります。PPP 対象地域の価格のみを上書きしてください。- 既存の商品に
newRegionsConfigが設定されていた場合は、必ず含めてください。省略すると、「追加済みの新しい地域の通貨は削除できません」というエラーが発生します。
4. 商品にパッチを適用する
gplay onetimeproducts patch \
--package "PACKAGE" \
--product-id "PRODUCT_ID" \
--json @ppp-otp.json \
--regions-version "2025/03" \
--update-mask "purchaseOptions"
5. 価格を確認する
gplay onetimeproducts get --package "PACKAGE" --product-id "PRODUCT_ID"
ワークフロー:PPP ベースのサブスクリプション価格を設定する
1. サブスクリプションを一覧表示する
gplay subscriptions list --package "PACKAGE"
2. 現在のサブスクリプションを取得し、すべての地域設定を保存する
gplay subscriptions get --package "PACKAGE" --product-id "PRODUCT_ID"
完全な JSON を保存します。各基本プランについて、次の項目を記録してください。
otherRegionsConfig(USD と EUR の基本価格)— 以前に設定されている場合は必ず含めてくださいregionalConfigs配列 — 既存のすべての地域を含めてくださいautoRenewingBasePlanTypeまたはprepaidBasePlanType
3. PPP 調整済みのサブスクリプション JSON を作成する(取得してからマージ)
各基本プランの既存の regionalConfigs をすべて含めたうえで、PPP 対象地域を上書きします。その他すべての地域は変更しないでください。
サブスクリプションの価格は units/nanos/currencyCode 形式を使用します。
{
"productId": "premium_monthly",
"basePlans": [
{
"basePlanId": "monthly",
"otherRegionsConfig": {
"newSubscriberAvailability": true,
"usdPrice": { "currencyCode": "USD", "units": "5", "nanos": 990000000 },
"eurPrice": { "currencyCode": "EUR", "units": "5", "nanos": 70000000 }
},
"regionalConfigs": [
{ "regionCode": "US", "newSubscriberAvailability": true, "price": { "currencyCode": "USD", "units": "5", "nanos": 990000000 } },
{ "regionCode": "IN", "newSubscriberAvailability": true, "price": { "currencyCode": "INR", "units": "149", "nanos": 990000000 } },
{ "regionCode": "BR", "newSubscriberAvailability": true, "price": { "currencyCode": "BRL", "units": "14", "nanos": 990000000 } },
{ "regionCode": "AE", "newSubscriberAvailability": true, "price": { "currencyCode": "AED", "units": "22", "nanos": 990000000 } }
],
"autoRenewingBasePlanType": { "billingPeriodDuration": "P1M" }
}
]
}
重要: regionalConfigs 配列には、既存の基本プランにあるすべての地域を含める必要があります。サブスクリプションにすでに 173 の地域がある場合は、173 すべてを含めてください。価格を上書きするのは PPP 対象地域のみです。
4. サブスクリプションを更新する
gplay subscriptions update \
--package "PACKAGE" \
--product-id "PRODUCT_ID" \
--json @ppp-subscription.json \
--regions-version "2025/03" \
--update-mask "basePlans"
次の 3 つのフラグはすべて必須です。
--json:マージ済みの地域設定を含むサブスクリプション JSON--regions-version:最新バージョンを使用します(下記の「地域バージョンの確認」を参照)--update-mask "basePlans":更新するフィールドを API に指定します
5. 価格を確認する
gplay subscriptions get --package "PACKAGE" --product-id "PRODUCT_ID"
すべての基本プランに含まれる regionalConfigs を確認し、PPP 対象地域の価格が更新され、その他すべての地域が保持されていることを確認します。
地域バージョンの確認
価格の更新には --regions-version フラグが必須です。最新バージョンを確認するには、次の手順を実行します。
- 任意のバージョン(例:
"2022/02")を指定して更新を試します - バージョンが古い場合、API エラーに最新バージョンが表示されます。
Invalid regions version 2024/01, latest value is ExternalRegionLaunchVersionId{versionId=2025/03} - エラーメッセージに記載されたバージョンで再試行します
バージョン間で通貨コードが変更される場合があります(例:ユーロ圏への国の加盟)。ハードコードされた対応表ではなく、必ず取得した既存データの通貨コードを使用してください。
ワークフロー:既存の購読者価格を移行する
アクティブな購読者がいるサブスクリプションの PPP 価格を更新した場合、新しい価格が適用されるのは新規購読者のみです。既存の購読者を移行するには、次の手順を実行します。
1. 価格を更新する(上記の手順)
2. 既存の購読者を新しい価格に移行する
gplay baseplans migrate-prices \
--package "PACKAGE" \
--product-id "PRODUCT_ID" \
--base-plan-id "BASE_PLAN_ID" \
--json @migration.json
3. 基本プランごとに繰り返す
価格を変更したすべての基本プランに移行を適用します。
# Monthly plan
gplay baseplans migrate-prices \
--package "PACKAGE" \
--product-id "PRODUCT_ID" \
--base-plan-id monthly \
--json @migration.json
# Yearly plan
gplay baseplans migrate-prices \
--package "PACKAGE" \
--product-id "PRODUCT_ID" \
--base-plan-id yearly \
--json @migration.json
4. 移行を確認する
gplay subscriptions get --package "PACKAGE" --product-id "PRODUCT_ID"
既存の PPP 価格を更新する
地域の価格を変更するには、次の手順を実行します。
- 現在の商品/サブスクリプションを取得し、既存の地域設定をすべて確認します。
- 新しい基本価格または新しい倍率を使って、PPP 調整済みの価格を再計算します。
- 完全な地域設定リストに新しい PPP 価格をマージします。
- マージ済みの JSON で更新します(変更した地域だけでなく、すべての地域を含める必要があります)。
- アクティブな購読者がいるサブスクリプションでは、影響を受ける基本プランごとに
migrate-pricesを実行します。 - 取得後に概要を確認して検証します。
複数の商品に対する一括 PPP
複数の従来型 IAP
gplay iap batch-update \
--package "PACKAGE" \
--json @ppp-all-iaps.json
複数の買い切り商品
一括更新では、regionsVersion と updateMask を CLI フラグではなく、JSON 内の各リクエストに指定します。
gplay onetimeproducts batch-update \
--package "PACKAGE" \
--json @ppp-all-otps.json
一括処理の JSON 形式:
{
"requests": [
{
"oneTimeProduct": { "productId": "product_1", "purchaseOptions": [...] },
"regionsVersion": { "version": "2025/03" },
"updateMask": "purchaseOptions"
},
{
"oneTimeProduct": { "productId": "product_2", "purchaseOptions": [...] },
"regionsVersion": { "version": "2025/03" },
"updateMask": "purchaseOptions"
}
]
}
複数のサブスクリプション
各サブスクリプションを個別に更新します。
gplay subscriptions update --package "PACKAGE" --product-id "sub_1" --json @ppp-sub1.json --regions-version "2025/03" --update-mask "basePlans"
gplay subscriptions update --package "PACKAGE" --product-id "sub_2" --json @ppp-sub2.json --regions-version "2025/03" --update-mask "basePlans"
一般的な PPP 戦略
ビッグマック指数に基づく方法
相対的な購買力に基づいて価格を調整します。
- USA:$9.99(基準)
- India:$2.99(約 70% 割引)
- Brazil:$4.99(約 50% 割引)
- UK:$9.99(同程度)
- Switzerland:$10.99(プレミアム)
地域別の段階的価格設定
国を価格帯ごとにグループ分けします。
- Tier 1(通常):USA、UK、Germany、Australia、Switzerland、Canada
- Tier 2(中程度):France、Spain、Italy、Japan、South Korea、Saudi Arabia
- Tier 3(低価格):India、Brazil、Mexico、Indonesia、Turkey、Vietnam、Egypt
収益の最適化
- 価格に敏感な市場で販売数を伸ばすため、Tier 3 の割引から始めます。
- PPP 適用後は地域ごとのコンバージョン率をモニタリングします。
- 実際の収益データに基づいて倍率を調整します。
よくある落とし穴
- PPP 地域のみを送信する — API は、既存の地域を削除する更新を拒否します。必ず先に取得してからマージしてください。
--regions-versionの指定漏れ — 価格を更新する際は必須です。誤った値を指定すると、最新バージョンが API エラーで通知されます。--update-maskの指定漏れ — サブスクリプションには"basePlans"、買い切り商品には"purchaseOptions"を使用してください。otherRegionsConfigの指定漏れ — サブスクリプションのベースプランに以前otherRegionsConfigが設定されていた場合は、更新時にも含める必要があります。newRegionsConfigの指定漏れ — 買い切り商品の購入オプションに以前newRegionsConfigが設定されていた場合は、更新時にも含める必要があります。省略すると、次のエラーが発生します:"Cannot remove currency for new regions once it has been added."- 通貨コードの誤り — 通貨を決めつけないでください。地域バージョンによって変更されるため、Google Play から取得してください。
- API 形式の混同 — レガシー IAP では
priceMicros/currencyを使用します。新しいサブスクリプションと買い切り商品ではunits/nanos/currencyCodeを使用します。混在させないでください。 --dry-runはグローバルフラグです — サブコマンドの前に指定します:gplay --dry-run subscriptions update ...。gplay subscriptions update --dry-run ...のように指定すると、「flag provided but not defined」エラーが発生します。- 一括更新時の JSON 形式 —
onetimeproducts batch-updateとsubscriptions batch-updateでは、regionsVersionとupdateMaskを CLI フラグではなく、JSON 内の各リクエストオブジェクトに指定します。 - 商品 ID は永久に予約されます — Google Play は、削除後も商品 ID を永久に予約します。
gplay iap createで商品を作成してから削除すると、その ID はgplay onetimeproducts createでも再利用できません。商品 ID は必ず慎重に選んでください。レガシー API で商品を作成してから、新しい API で再作成しようとしないでください。 - 新しい OTP 商品は DRAFT 状態で開始します —
gplay onetimeproducts createの実行後、購入オプションは DRAFT 状態になります。ユーザーが利用できるようにするには、gplay purchase-options batch-update-statesで有効化する必要があります。 - 作成時にも
--regions-versionが必要です —onetimeproducts createは内部でallowMissing=trueを指定して PATCH を使用するため、更新時だけでなく、新しい商品を作成する場合にも--regions-versionが必要です。 gplay --helpでコマンドを確認する — 購入オプションの有効化はgplay onetimeproductsではなく、gplay purchase-optionsにあります。すべてのトップレベルコマンドグループを確認するには、必ずgplay --helpを実行してください。
補足
- サブスクリプションの価格変更は、新規加入者に直ちに適用されます。
- 既存の加入者には、
migrate-pricesによる明示的な価格移行が必要です。 - 通貨換算の参考には
gplay pricing convertを使用しますが、その上に PPP 乗数を適用してください。 - 更新後は必ず商品を取得し、概要を確認して価格を検証してください。
- PPP 乗数の表は出発点として使用し、市場データと収益目標に基づいて調整してください。