Skip to main content
Question

Android purchase fails with “subscription plan not available” despite valid offerings

  • January 19, 2026
  • 0 replies
  • 17 views

Forum|alt.badge.img+2

 

Hello,

I’m having an issue with Android purchases in my app and would appreciate guidance.

Current status:

  • Subscriptions are fully configured in RevenueCat and Google Play.

  • Offerings are fetched successfully on both platforms.

  • Purchases work correctly on:

    • iOS production

    • Test environments both on ios/android

  • On Android production, the app successfully retrieves offerings and packages, but attempting to purchase always fails with:

“subscription plan not available”

What I have already confirmed:

  • Android app is installed directly from Google Play (closed testing track).

  • Tester Google account is properly added and opted into the test track.

  • Correct Android public SDK key is used.

  • Products are published in Google Play:

    • noor_monthly_premium

    • noor_annual_premium

  • These products appear correctly in RevenueCat Android products and offerings.

  • Offerings are returned correctly from Purchases.getOfferings() on Android.

  • The same code path works on iOS without any issues.

Purchase logic used in the app example :

// Find package by product identifier
const targetProductId = selectedPlan === 'monthly'
? PRODUCT_IDS.MONTHLY
: PRODUCT_IDS.YEARLY;

// Try to find by product identifier first
let pkg = packages.find(p => p.product.identifier === targetProductId);

// Fallbacks
if (!pkg) {
pkg = packages.find(
p =>
p.identifier.toLowerCase().includes(selectedPlan) ||
p.product.identifier.toLowerCase().includes(selectedPlan)
);
}

if (!pkg) {
pkg = packages.find(p => {
const id = p.identifier.toLowerCase();
return selectedPlan === 'monthly'
? id.includes('month')
: id.includes('annual') || id.includes('year');
});
}

if (!pkg) {
fireToast.error(t('subscription.errors.packageNotFound'));
return;
}

const result = await purchase(pkg);

Observed behavior:

  • getOfferings() returns the correct production packages on Android.

  • When calling Purchases.purchasePackage(pkg), Google Play rejects with “subscription plan not available”.

  • The exact same flow works on iOS production.