
You built the app. Users are downloading it. But turning those downloads into revenue means setting up in-app purchases correctly on Google Play, and the process is full of gotchas that waste days.
This guide walks you through the complete setup: creating products in Play Console, choosing between one-time purchases and subscriptions, testing without real charges, and pricing based on what works for indie developers. You will also learn about billing API changes from 2025 that break older tutorials.
Google Play hosts more than 400 million subscriptions, and the setup needs to be right.
Why most billing tutorials from 2024 are already outdated
Older guides may break your implementation because Google changed both the API and Console model. Targeting the current billing setup matters before you create products or test purchases.
Google Play Billing Library 9.0.0 is the current stable release. Code relying on querySkuDetailsAsync or the parameter-free enablePendingPurchases() will not compile against newer billing versions.
Google also introduced a three-level hierarchy for one-time products:
- Product
- Purchase Option
- Offer
The legacy one-time product interface still works on older billing versions, but new features like discount offers and rental periods are available only in the new model.
Treat any tutorial written before mid-2025 with caution. The API surface, Console UI, and pricing infrastructure have changed. Start with the latest version of the Google Play Billing Library and the current Console layout described below.
Creating products in Google Play Console
Product setup fails fast when account prerequisites are missing. A few basics need to be in place before products appear correctly and can be purchased.
You need:
- the app
- the payments profile
- the right release state
You must create your app in Play Console and set up a payments profile before you can sell purchasable products. To use Google Play Billing, your app must include the com.android.vending.BILLING permission, though current versions of the Google Play Billing Library typically add this permission automatically through the library manifest instead of your app manifest. To create in-app products or subscriptions in Google Play Console, your app generally must be published or have a release artifact uploaded in a track, such as internal testing. You also need merchant registration configured in Play Console Settings.
One-time products
Go to Monetize with Play, then Products, then In-app products (legacy) or One-time products (new model).
For the legacy model on older billing versions:
- Click Create product and enter a unique Product ID. This ID can not be changed or reused after creation.
- Add a title, description, and icon.
- Set pricing in your local currency.
- If distributing to EEA users, set the Withdrawal Right Type to either
DIGITAL_CONTENTorSERVICE. - Save, then click Activate.
That last step matters. If you skip activation, users who tap "buy" will see nothing. Products must be in Active status for the purchase flow to appear.
Subscriptions
Subscriptions use a strict hierarchy: Subscription Product contains Base Plans, which contain optional Offers. Users purchase a base plan, not the subscription product directly.
Go to Monetize with Play, then Products, then Subscriptions. Create a subscription with a unique Product ID, then add at least one base plan. Each base plan defines a billing period and a renewal type: auto-renewing or prepaid.
Optional offers sit on top of auto-renewing base plans only. Three eligibility types exist: New Customer Acquisition, Upgrade, and Developer Determined. You can create up to 250 plans and offers per subscription, with a maximum of 50 active at once.
One warning on price changes: editing a price after activation creates a legacy price cohort. Existing subscribers keep paying the old price until they switch plans or you end the cohort.
Picking the right product type
Product type affects how billing works in your app and what users expect after they pay. Pick the model that matches how often users receive value and how your app grants access.
- Consumables (credit packs, AI generations, game coins): your app calls
consumeAsync()after granting the item, which makes it available for repurchase. - Non-consumables (remove ads, pro unlock, lifetime access): your app calls
acknowledgePurchase(), and Google Play treats the purchase as owned unless it is refunded or revoked. - Auto-renewing subscriptions (content apps, SaaS tools, productivity apps): best when you deliver continuous or refreshed value and have ongoing server costs.
- Prepaid subscriptions: users buy access for a fixed period rather than an automatically renewing term.
For credit-based apps, consumable credit packs paired with an optional subscription fit usage-based value well. In most cases, the right choice comes down to how often users receive new value.
Testing purchases without real charges
Test purchases fail unless both the account setup and the app release setup are correct. Two separate configurations must both be active, and this trips up solo developers more than almost anything else. License testers can make test in-app purchases without being charged.
License testing (account level)
Go to Play Console, then Settings, then License Testing. Add the Gmail addresses of anyone who should test without being charged. Your publishing account is automatically a license tester, but a second device logged into a different Google account needs that account explicitly added here. This list supports up to 2,000 addresses.
Test track membership (app level)
Upload a signed APK or App Bundle with release keys to the internal test track. The internal track is fastest for development and has no country restrictions.
Your applicationId in the test build must exactly match what is registered in Play Console. A mismatch breaks IAP discovery entirely. All products must be in Active status. Draft is not sufficient.
New account requirement
Some newer personal developer accounts must run a closed test before applying for production access. The linked guidance describes a requirement of at least 12 opted-in testers for 14 days. Plan for this timeline early.
License testers get access to these test payment instruments:
- a test card that completes instantly
- a slow card that approves after a few minutes
- a slow card that declines after a few minutes
Use these to verify that your app handles all three states correctly. For subscription testing, sandbox renewals happen at accelerated rates and automatically cancel after 6 renewals.
What Google keeps from each transaction
Your margin depends on the service fee that applies to your account and product type. Enrollment timing also affects when a lower rate starts showing up in payments.
Of developers who pay a service fee, 99% are eligible for a 15% rate or lower, which applies to the first earnings tier per developer account. Above that tier, the service fee is higher. Auto-renewing subscriptions carry a flat 15% rate regardless of revenue level.
Enrollment is required. Complete the steps in Play Console, and the rate takes effect in the next monthly payment cycle. For a solo developer with one account, create an Account Group containing that single account.
Google Play documentation describes billing fees and service fees separately, including arrangements for alternative billing in Europe.
The one rule you can not afford to forget
A completed sale can still be reversed if you do not acknowledge the purchase in time. That deadline directly affects whether the user keeps access and whether you keep the revenue.
Acknowledge every purchase within 72 hours. If you do not, Google automatically refunds the user and revokes the entitlement. Call consumeAsync() for consumables and acknowledgePurchase() for non-consumables and initial subscription purchases. Only acknowledge purchases in PURCHASED state, not PENDING.
Get the setup right once, and your app can keep collecting revenue without manual billing work. Get it wrong, and you lose purchases you already made. Start with one product type, test it using the two-layer configuration, and expand from there.
If you are building with an AI app builder, try Anything free to go from idea to working app without starting your billing setup from scratch.


