gplay-iap-setup
In-app products, subscriptions, base plans, and offers setup for Google Play monetization, including bulk-localizing subscription display names, descriptions, and benefits across all locales. Use when configuring in-app purchases or subscription products.
By tamtom · 354 installs
npx skills add tamtom/gplay-cli-skills --skill gplay-iap-setup
Source repository · Upstream listing
In App Purchase Setup for Google Play
Use this skill when you need to set up monetization for your Android app.
Two APIs: Legacy vs New Monetization
Google Play has two APIs for one time products:
Legacy ( gplay iap ) New Monetization ( gplay onetimeproducts )
API inappproducts monetization.onetimeproducts
Price format priceMicros / currency units / nanos / currencyCode
Structure Flat prices map purchaseOptions with regionalPricingAndAvailabilityConfigs
States active / inactive DRAFT → ACTIVE (requires explicit activation)
Regional pricing auto convert prices flag regions version required
Prefer the new monetization API ( gplay onetimeproducts ) for new products. It supports purchase options, better regional pricing control, and is the actively developed API.
Use the legacy API ( gplay iap ) only for managing existing legacy products.
Never mix the two APIs for the same product. A product created via gplay iap create cannot be managed via gplay onetimeproducts and vice versa.
Critical: Product IDs Are Permanent
Google Play permanently reserves product IDs after deletion. If you create premium unlock and later delete it, the ID premium unlock can never be reused — not even with a different API. Choose product IDs carefully.
This means:
Do NOT create a "test" product with a good ID and then delete it
Do NOT create via the legacy API and then try to recreate via the new API
If you burn an ID, you must choose a new one (e.g., premium unlock v2 )
One Time Products (New Monetization API)
List products
Create product
regions version is required — the create command uses PATCH with allowMissing=true internally:
product.json (new monetization format)
Activate the purchase option
New products start in DRAFT state. You must activate before users can purchase:
Update product
Get product
Delete product
Batch operations
Legacy In App Products (IAP)
Use only for managing existing legacy products.
List products
Create product
iap create has no sku flag — the SKU/productId lives in the JSON body:
product.json (legacy format)
Update / Batch / Delete
Subscriptions
List subscriptions
Create subscription
subscription.json
Subscriptions use the units / nanos / currencyCode price format:
Bulk localize subscriptions across locales
Subscription listings are an array of per locale objects (not an object
keyed by locale). Each entry uses languageCode , title , benefits (array,
max 4), and description . One subscriptions update call sets every locale
atomically — use update mask listings so base plans and pricing are left
untouched.
1. Discover the locales your app already ships (cover at least these):
2. Build a listings only JSON file ( subscription listings.json ):
3. Apply to one subscription:
4. Loop over every subscription in the app:
Verify with gplay subscriptions get package com.example.app product id premium monthly pretty
and confirm every languageCode appears in the listings array. Constraints:
title max 55 chars, description max 80 chars, benefits max 4 items. When the
user gives a single display name, reuse it for all locales; when they give
per locale translations, use each locale's own text.
Base Plans
Base plans define the billing period and price for subscriptions.
Activate base plan
Deactivate base plan
Migrate prices
Subscription Offers
Offers provide discounts, free trials, or introductory pricing.
List offers
Create offer
offer.json (Free trial)
offer.json (Introductory price)
Activate/Deactivate offer
OTP Purchase Option Offers
Manage offers on one time product purchase options:
Regional Pricing
Convert prices
price request.json (ConvertRegionPricesRequest)
The body is a single base price as Money — units is the whole currency
amount as a string, nanos is the fractional part (990000000 = .99):
The response returns converted prices for all supported regions plus a
regionVersion you can pass as regions version to subscriptions, base
plans, offers, and one time product commands.
Common Monetization Patterns
Pattern 1: New One Time Product (recommended)
Pattern 2: Subscription with Free Trial
Pattern 3: Multi Tier Subscription
Testing
Use test purchases
In your app code, use test product IDs:
android.test.purchased
android.test.canceled
android.test.refunded
android.test.item unavailable
License testing
Add test accounts in Play Console:
Settings → License Testing → Add license testers
Best Practices
1. Use clear product IDs e.g., premium monthly , not prod 001 . IDs are permanent and cannot be reused after deletion.
2. Prefer the new monetization API Use gplay onetimeproducts for new products, not gplay iap .
3. Localize descriptions Provide listings for all supported languages.
4. Set up regional pricing Use PPP pricing (see gplay ppp pricing skill) instead of same price everywhere.
5. Activate after creation New OTP products start in DRAFT. Use gplay purchase options batch update states to activate.
6. Discover commands Run gplay help to see all command groups. Purchase option management is under gplay purchase options , not under gplay onetimeproducts .
7. Test thoroughly Use test accounts and test product IDs.
8. Monitor conversions Track which products/offers perform best.
9. Update prices carefully Price changes affect existing subscribers.
Billing Periods
P1W 1 week
P1M 1 month
P3M 3 months
P6M 6 months
P1Y 1 year