This post may contains affiliate links. As an amazon associate I earn from qualifying purchases.
This FAQ is based on real-world troubleshooting while implementing monthly and yearly subscriptions in a Flutter app using Google Play Billing.
1. I created monthly and yearly subscriptions in Play Console, but users only see the monthly option. Why?
Because monthly and yearly were created as separate subscriptions instead of base plans under a single subscription.
Google Play only shows multiple options (monthly/yearly) when they are base plans of the same subscription product. If they are separate subscriptions, Play treats them as unrelated, and users can only purchase one.
2. What is the correct way to structure subscriptions in Play Console?
You must create:
ONE subscription product, for example:
premium_remove_ads
Under that subscription, create multiple base plans, for example:
monthly_sub(1 month)yearly_sub(1 year)
Correct structure:
Incorrect structure:
3. If I fix the subscription structure in Play Console, will it work immediately?
No.
Google Play binds subscription structure to an app release.
If you change subscription hierarchy (separate → base plans), you must publish a new release.
Even if:
Your code is already correct
You don’t change a single line of Dart code
You still need to:
Upload a new AAB (can be identical)
Increment
versionCode/versionName
4. Why is a new release required if the code didn’t change?
Because Google Play caches subscription configuration per app version.
Play does not retroactively update:
Purchase UI
Subscription options
Base-plan availability
for already-published versions.
This behavior is poorly documented and causes many developers to get stuck.
5. My Flutter code only references monthly_sub and yearly_sub. Where is premium_remove_ads used?
At the Google Play Billing level, not explicitly in your Flutter code.
premium_remove_adsis the subscription containermonthly_subandyearly_subare the sellable base plans
Your Flutter app interacts with base plans, while Google Play internally maps them to the subscription product.
6. Don’t I need both the product ID and base plan ID according to Google Play Billing docs?
Yes — at the native Play Billing level, both are required:
productIdofferToken(derived from base plan / offer)
However:
Flutter’s
in_app_purchaseplugin abstracts thisWhen you receive a
ProductDetailsobject, it already contains:product ID
base plan
offer token
So your app uses both, just not explicitly.
7. Is querying only monthly_sub and yearly_sub valid in Flutter?
Yes.
With in_app_purchase:
Querying base plan IDs works
The plugin resolves the subscription product internally
Google Play shows the correct monthly/yearly chooser
This is valid and supported behavior.
8. Why was my app “stuck” showing only monthly for days?
Because:
You originally created separate subscriptions
Google Play cached that structure
No new release was published after restructuring
So:
Code looked correct
Console looked correct
Phone behavior stayed wrong
This is a Play Console lifecycle issue, not a Flutter or code issue.
9. If I restructure subscriptions correctly, do existing users see yearly immediately?
Not always.
For testing:
Use a fresh test account, or
Cancel the existing subscription and wait for it to expire
Google Play will not always show alternate plans to users with an active subscription.
10. Was my original Flutter IAP code wrong?
No.
Your code:
Correctly queries products
Correctly listens to purchases
Correctly unlocks premium for either plan
The issue was entirely Play Console configuration and release lifecycle, not logic.
11. What are the key lessons to avoid this problem in the future?
Always design subscriptions as:
One subscription → multiple base plans
After changing subscription structure:
Publish a new release
Test with:
Fresh accounts
Internal testing tracks
Don’t assume console-only changes propagate automatically
This post may contains affiliate links. As an amazon associate I earn from qualifying purchases.