Google Play Subscriptions (Flutter) – FAQ & Lessons Learned

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:

Subscription: premium_remove_ads
├── Base plan: monthly_sub
└── Base plan: yearly_sub

Incorrect structure:

Subscription: monthly_sub
Subscription: yearly_sub

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

Also READ  Lease vs. Rent: Understanding the Differences

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_ads is the subscription container

  • monthly_sub and yearly_sub are 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:

  • productId

  • offerToken (derived from base plan / offer)

However:

  • Flutter’s in_app_purchase plugin abstracts this

  • When you receive a ProductDetails object, 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

Also READ  Winter Elegance: January Home Decor Inspirations for a Cozy Retreat

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.

Scroll to Top