Google Play Billing: subscriptions/base plans not loading in Cordova/Capacitor app (no BillingClient logs, only Finsky)
09:21 04 Sep 2025
  • Hybrid app (Vue 3 + Capacitor 5) with cordova-plugin-purchase v13 for Google Play subscriptions.
  • App is installed from Google Play Internal testing (opt-in link). The tester account is added to License testing.
  • In Play Console the subscription exists and has Active base plans (monthly/yearly). Availability is set to 173 regions.

Problem

  • The app never receives products/offers from Google Play. No base plans are loaded, so I cannot obtain offerToken and cannot start a purchase.
  • In logcat I only see Finsky lines like “Billing preferred account via installer…”, but I never see any BillingClient/ProxyBillingActivity logs when I trigger catalog refresh or purchase.

Logs

  • Example logcat:
    • I/Finsky: [XXXX] Billing preferred account via installer for com.stablemanager.app …
    • No lines for BillingClient / ProxyBillingActivity even when pressing the “Buy” button.

What I expect

  • After initialization, store.update() should return the subscription product with base plans/offers so I can pick an offerToken and call order(). When starting the purchase flow I expect to see ProxyBillingActivity and the Play purchase sheet (with Test card, always approves).

What happens instead

  • store.update() leaves products empty.
  • No BillingClient logs at all (only Finsky “preferred account…”).
  • In this plugin version, store.on is not available, so I also tried a polling fallback (periodic store.update), but still no products.

Minimal code (TypeScript)

// init (after deviceready)
await store.initialize([
  {
    id: 'stable_manager.test.sub',
    type: Cdv.ProductType.PAID_SUBSCRIPTION,
    platform: Cdv.Platform.GOOGLE_PLAY,
  },
]);

await store.update(); // expecting products/offers here
const p = store.get?.('stable_manager.test.sub'); // returns undefined

// later, on button click
const payment = new Cdv.Payment();
payment.platform = Cdv.Platform.GOOGLE_PLAY;
payment.productId = 'stable_manager.test.sub';
payment.offerToken = '...'; // cannot get because offers are empty
await store.order(payment); // nothing happens, no BillingClient logs

What I tried

  • Installed strictly from Internal testing (not via adb). Verified correct applicationId equals the one with the subscription.
  • Tester account added to License testing; Play Store shows the same account.
  • Cleared cache for Google Play Store and Google Play Services; rebooted.
  • Waited >24h after creating/activating base plans.
  • Created a simple Active base plan without any offer restrictions.
  • Ensured Play Store/Services are up to date.
  • Started logcat before opening the app; also filtered by process PID. Still no BillingClient/ProxyBillingActivity lines.

Environment

  • Android, app from Internal testing track.
  • cordova-plugin-purchase: 13.12.1
  • @awesome-cordova-plugins/in-app-purchase-2: 8.1.0
  • Capacitor: 5.7.8
  • Vue: 3.4.21
  • Google Play Billing client is whatever the plugin bundles (no direct dependency in my code).
  • Product ID: stable_manager.test.sub
  • Base plans: active, available in 173 regions.

Questions

  1. Why would BillingClient never log anything when I trigger catalog refresh or start an order? Does this indicate the native billing client is not initialized/linked by the plugin in release builds from Play?

  2. Are there known issues with cordova-plugin-purchase v13 where store.on is missing and products don’t populate on some minor versions?

  3. What else can prevent products from loading despite:

    • app installed from Play Internal testing,
    • matching applicationId,
    • active base plans,
    • tester account properly configured?
  4. How can I reliably verify (from logs or code) that the native BillingClient is actually created and queried in this setup?

android cordova google-play capacitor subscription