[Jan 2026] Migration guide. Capacitor 1.

In this major release of the Qonversion Capacitor Plugin, we've made crucial changes to support No-Codes along with the new purchase method, plugin migration to the Qonversion organization in NPM, and some others.

No-Codes support

Qonversion No-Codes are now officially released! For integration steps, please follow our documentation.

Capacitor 8 support

We are now supporting the new Capacitor 8. For that purpose, we've upgraded the minimal supported native versions:

  • iOS version - 13.0 -> 14.0,
  • Android version - 22 -> 23,
  • Java version - 17 -> 21.

New purchase method

We have refactored the purchase method - now it returns comprehensive information, including status, entitlements after the purchase, error information if it happened, and also stores transaction info. After upgrading to this version, rewrite your purchase calls as follows:

try {
  // Old method returned only Map<string, Entitlement>
  const entitlements = await Qonversion.getSharedInstance().purchaseProduct(product, purchaseOptions);
  
  // Check for entitlement
  const premiumEntitlement = entitlements.get('premium');
  if (premiumEntitlement?.isActive) {
    console.log('Purchase successful! Premium access granted.');
  }
} catch (error) {
  // All errors, including user cancellation, were handled via catch
  if (error.code === QonversionErrorCode.CanceledPurchase) {
    console.log('User canceled the purchase');
  } else {
    console.error('Purchase failed:', error.message);
  }
}
const result = await Qonversion.getSharedInstance().purchase(product, purchaseOptions);

if (result.isSuccess) {
  // Purchase succeeded
  const premiumEntitlement = result.entitlements?.get('premium');
  if (premiumEntitlement?.isActive) {
    console.log('Purchase successful! Premium access granted.');
  }
  
  // Access transaction details
  console.log('Transaction ID:', result.storeTransaction?.transactionId);
  console.log('Product ID:', result.storeTransaction?.productId);
  
} else if (result.isCanceled) {
  // User canceled — not an error, just a status
  console.log('User canceled the purchase');
  
} else if (result.isPending) {
  // Purchase awaiting confirmation (e.g., parental controls, deferred payments)
  console.log('Purchase is pending approval');
  
} else if (result.isError) {
  // An actual error occurred
  console.error('Purchase failed:', result.error?.description);
  console.error('Error code:', result.error?.code);
}

Google Play Billing Library upgrade to version 8

In this version, we've upgraded Google Play Billing Library on Android to version 8.1.0, which results in skuDetails removal from Product and also requires setting up Base Plan ID for all the subscription products in the Qonversion Dashboard, if you haven't set them yet. Read more here.

Properties renamings

We've made a couple of renamings of our DTO properties to sync them with the rest codestyle. If you were using these fields, simply upgrade their names as described in the table below

Old nameNew name
Product.qonversionIDProduct.qonversionId
Product.storeIDProduct.storeId
Product.basePlanIDProduct.basePlanId