Google App Campaigns webinar. Register now

Subscription
management
for Mobile and Web

Implement and manage subscriptions with a single low-code solution across iOS, Android, Web, MacOS, Apple and Google TV.
No complex back-end infrastructure required.
img
img img img

Launch subscriptions
in one day

Save months of engineering time on implementing and maintaining in-app subscriptions.
Simple subscription billing implementation in 3 steps:

  • Create app store products
  • Link the products in Qonversion dashboard
  • Add 3 Qonversion SDK methods to your app to get product details, make purchases, and check subscription statuses
Check the docs here.

Qonversion.offerings { (offerings, error) in
  if let products = offerings?.main?.products {
    // Display products for sale
  }
}

Qonversion.purchaseProduct(product) {
  (permissions, error, isCancelled)
      in if let premium : Qonversion.Permission =
      permissions["premium"],
                          premium.isActive {
    // Flow for success state
  }
}

Qonversion.checkPermissions { (permissions, error) in
  if let error = error {
    // handle error
    return
  }

  if let premium: Qonversion.Permission =
    permissions["premium"], premium.isActive
  {
    // handle active permission
  }
}             

[Qonversion
    offerings:^(QNOfferings* _Nullable offerings,
                NSError* _Nullable error) {
      if (offerings.main.products.count > 0) {
        // Display products for sale
      }
    }];

[Qonversion
    purchaseProduct:product
         completion:^(
             NSDictionary
                 *_Nonnull permissions,
             NSError *_Nullable error, BOOL cancelled) {
           QNPermission *premiumPermission =
               permissions[@"premium"];

           if (premiumPermission &&
               premiumPermission.isActive) {
             // Flow for success state
           }
         }];

[Qonversion
    checkPermissions:^(
        NSDictionary
            *_Nonnull permissions,
        NSError *_Nullable error) {
      QNPermission *premiumPermission =
          permissions[@"premium"];
      if (premiumPermission &&
          premiumPermission.isActive) {
        // handle active permission
      }
    }];                 

Qonversion.offerings(
    new QonversionOfferingsCallback() {
      @Override
      public void onSuccess(
          @NotNull QOfferings offerings) {
        if (offerings.getMain() != null
            && !offerings.getMain()
                    .getProducts()
                    .isEmpty()) {
          // Display products for sale
        }
      }
      @Override
      public void onError(
          @NotNull QonversionError error) {
        // handle error here
      }
    });

Qonversion.purchase(
    this, product,
    new QonversionPermissionsCallback() {
      @Override public void onSuccess(
          @NotNull Map
              permissions) {
        QPermission premiumPermission =
            permissions.get("premium");

        if (premiumPermission != null &&
            premiumPermission.isActive()) {
          // handle active permission here
        }
      }

      @Override public void onError(
          @NotNull QonversionError error) {
        // handle error here
      }
    });

Qonversion.purchase(this, product,
    new QonversionPermissionsCallback() {
      @Override
      public void onSuccess(@NotNull
          Map permissions) {
        QPermission premiumPermission =
            permissions.get("premium");

        if (premiumPermission != null
            && premiumPermission.isActive()) {
          // handle active permission here
        }
      }

      @Override
      public void onError(
          @NotNull QonversionError error) {
        // handle error here
      }
    });         

Qonversion.offerings(
    object
    : QonversionOfferingsCallback{
        override fun onSuccess(offerings
                               : QOfferings){
            val mainOffering =
                offerings.main if (mainOffering
                        != null
                    && mainOffering.products
                           .isNotEmpty()){
                    // Display products for sale
                }} override fun
            onError(error
                    : QonversionError){
                // handle error here
            }})

Qonversion.purchase(
    this, product, callback = object
    : QonversionPermissionsCallback{
        override fun onSuccess(
            permissions
            : Map){
            val premiumPermission =
                permissions["premium"] if (
                    premiumPermission != null
                    && premiumPermission
                           .isActive()){
                    // handle active permission
                    // here
                }}

        override fun onError(error
                             : QonversionError){
            // handle error here
        }})

Qonversion.checkPermissions(
    object
    : QonversionPermissionsCallback{
        override fun onSuccess(
            permissions
            : Map){
            // Handle new permissions here
        }

        override fun onError(error
                             : QonversionError){
            // Handle the error
        }})         

try {
  final QOfferings offerings =
      await Qonversion.offerings();
  final List products =
      offerings.main.products;
  if (products.isNotEmpty) {
    // Display your products
  }
} catch (e) {
  print(e);
}

try {
  final Map permissions = 
    await Qonversion.purchaseProduct(product);
} on QPurchaseException catch (e) {
  print(e);
}

try {
  final Map permissions = 
    await Qonversion.checkPermissions();
  final main = permissions['main'];
  if (main != null && main.isActive) {
    // handle active permission here
  }
} catch (e) {
  // handle error here
}

try {
  const offerings = await Qonversion.offerings();
  if (offerings.main != null && 
    offerings.main.products.length > 0) {
    // Display products for sale
  }
} catch (e) {
  // handle error here
}

try {
  const permissions: Map = 
    await Qonversion.purchaseProduct(product);
} catch (e) {
  if (e.userCanceled) {
    // purchase canceled by the user
  }
  console.log(e);
}

try {
  const permission =
      await Qonversion.checkPermissions();

  const premiumPermission =
      permissions.get('premium');
  if (premiumPermission != null) {
    // handle active permission here
  }
} catch (e) {
  // handle error here
}

Qonversion.Offerings((offerings, error) => {
  if (error == null) {
    Offering mainOffering = offerings.Main;
    if (mainOffering != null) {
      List products = mainOffering.Products;
      if (products.Any()) {
        // Display your products
      }
    }
  } else {
    // Handle the error
    Debug.Log("Error" + error.ToString());
  }
});

Qonversion.PurchaseProduct(product, (permissions,
                                     error) => {
  if (error == null) {
    if (permissions.TryGetValue(
            "premium", out Permission premium) &&
        premium.IsActive) {
      // Handle the active permission here
    }
  } else {
    // Handle the error
    Debug.Log("Error" + error.ToString());
  }
});

Qonversion.CheckPermissions((permissions,
                             error) => {
  if (error == null) {
    if (permissions.TryGetValue(
            "plus", out Permission plus) &&
        plus.IsActive) {
      // handle active permission here
    }
  } else {
    // handle error here
  }
});

const purchase =
    await Qonversion.getSharedInstance()
        .sendStripePurchase(stripeData);

                    

const entitlements =
    await Qonversion.getSharedInstance()
        .getEntitlements();
                    

Trusted by companies across the globe:

Check out our reviews

img

How Y Combinator App Fitia solved Infrastructure complexity with Qonversion

Connect Stripe
to manage
access within
the app

Quickly share subscription data from Stripe or other acquiring platforms and have it available in your app with Qonversion SDK.
img
MM/YY
CVC
09/32
234
1234 1234 1234 1234
John Smith
Pay now
img
img img img
Get started for free Schedule a demo

Real-time data
on every
subscription event

Get accurate subscription data even when the app is not running thanks to server-side validation provided by Qonversion. Receive details on subscription status changes with Qonversion API, web-hooks, and raw data export. All corner cases covered.
STATUS Product Transaction ID SUM Date
Trial started main 123578 01/01/2022, 10:10:10
Trial billing retry main 145682 08/01/2022, 11:15:10
Subscription started main 124532 $5,69 08/02/2022, 12:00:00
Subscription renewed main 201342 $5,69 08/03/2022, 13:27:15
Subscription canceled main 203451 07/04/2022, 13:00:00
Subscription expired main 204682 11/04/2022, 15:04:14

Analytics to power
your subscription
revenue growth

Make decisions based on subscription analytics available at your fingertips.
Discover analytics details.
img

Reliable and Safe
solution

GDPR-compliant solution running on SOC2-compliant cloud infrastructure by Microsoft Azure and Digital Ocean. Monitor infrastructure health status with our public status page.

We are supported by Microsoft for Startups global program.

img

Scaling?
We are ready

3M
active subscribers
150M
monthly active users
$250M
managing revenue
15TB
data served per month
Automation
Send personalized notifications with promotional offers triggered by a subscription or in-app events.
Apple Search Ads Attribution
See exactly how much revenue each Apple Search Ads campaign and keyword generates for your app.
Integrations
Send purchase and subscription events to your favorite tools.
Analytics
Understand your users better with built-in, real-time dashboards, cohorts, and revenue analytics.
Get started for free Schedule a demo