iOS SDK for cross-platform in-app purchase and subscription infrastructure, revenue analytics, engagement automation, and integrations

Overview

Qonversion is the data platform to power in-app subscription revenue growth.

  • fast in-app subscriptions implementation
  • back-end infrastructure to validate user receipts
  • manage cross-platform user access to paid content on your app
  • comprehensive subscription analytics
  • out-of-the-box integrations with the leading marketing, attribution, and product analytics platforms
  • push notifications and in-app messaging to win back lapsed subscribers
  • A/B Testing for in-app purchases

Platform Version Carthage compatible SwiftPM compatible MIT License

How It Works: Product Center

  1. Application calls the purchase method of Qonversion SDK.
  2. Qonversion SDK communicates with StoreKit or Google Billing Client to make a purchase.
  3. If a purchase is successful, the SDK sends a request to Qonversion API for server-to-server purchase validation. Qonversion server receives accurate information on the in-app purchase status and user entitlements.
  4. SDK returns control to the application with a processing state.

Analytics

Monitor your in-app revenue metrics. Understand your customers and make better decisions with precise subscription revenue data.

Integrations

Send subscription data to your favorite platforms Share your mobile and web subscription data using our powerful integrations.

Personalized push notifications & in-app messaging

Qonversion allows sending automated, personalized push notifications and in-app messages initiated by in-app purchase events. This feature is designed to increase your app's revenue and retention, provide cancellation insights, reduce subscriber churn, and improve your subscribers' user experience.

See more in the documentation

A/B Testing for in-app purchases

Boost conversion rates with paywalls and in-app purchases A/B testing. Find the best pricing and paywall variations. Be flexible to prove hypotheses without app releases.

Why Qonversion?

  • No headaches with Apple's StoreKit & Google Billing. Qonversion provides simple methods to handle Apple StoreKit & Google Billing purchase flow.
  • Receipt validation. Qonversion validates user receipts with Apple and Google to provide 100% accurate purchase information and subscription statuses. It also prevents unauthorized access to the premium features of your app.
  • Track and increase your revenue. Qonversion provides detailed real-time revenue analytics including cohort analysis, trial conversion rates, country segmentation, and much more.
  • Integrations with the leading mobile platforms. Qonversion allows sending data to platforms like AppsFlyer, Adjust, Branch, Tenjin, Facebook Ads, Amplitude, Mixpanel, and many others.
  • Change promoted in-app products. Change promoted in-app products anytime without app releases.
  • Win back lapsed subscribers. Qonversion allows sending highly targeted push notifications triggered by server-side subscription events. You can send special offers to users who just canceled a free trial or a subscription. Plus you can deliver in-app messages with a beautiful native design that you create in Qonversion.
  • A/B test and identify winning in-app purchases, subscriptions or paywals.
  • Cross-device and cross-platform access management. If you provide user authorization in your app, you can easily set Qonversion to provide premium access to authorized users across devices and operating systems.
  • SDK caches the data. Qonversion SDK caches purchase data including in-app products and permissions, so the user experience is not affected even with the slow or interrupting network connection.
  • Webhooks. You can easily send all of the data to your server with Qonversion webhooks.
  • Customer support. You can always reach out to our customer support and get the help required.

Convinced? Let's go!

Getting Started

  1. Create a project and register your app
  2. Configure entitlements
  3. Install the SDK
  4. Use all SDK features in a few lines

Documentation

Check the documentation to learn details on implementing and using Qonversion SDKs.

Help us improve the documentation

Whether you’re a core user or trying it out for the first time, you can make a valuable contribution to Qonversion by improving the documentation. Help us by:

  • sending us feedback about something you thought was confusing or simply missing
  • sending us a pull request via GitHub
  • suggesting better wording or ways of explaining certain topics in the Qonversion documentation. Use SUGGEST EDITS button in the top right corner.

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/SuperFeature)
  3. Commit your Changes. Use small commits with separate logic. (git commit -m 'Add some super feature')
  4. Push to the Branch (git push origin feature/SuperFeature)
  5. Open a Pull Request

Have a question?

Contact us via issues on GitHub or ask a question on the site.

License

Qonversion SDK is available under the MIT license.

Comments
  • Subscription status for different sandbox account on same device

    Subscription status for different sandbox account on same device

    opened by saqibomer 14
  • SKProduct always null

    SKProduct always null

    I fetched list of products and noticed that SKProduct inside QNProduct always null. I try to make purchase and get error - Error Domain=com.qonversion.io Code=2 "(null)".

     po self.products
    ▿ 1 element
      ▿ 0 : 2 elements
        - key : "sounds_monthly_7days_trial"
        - value : <QNProduct: id=sounds_monthly_7days_trial,
    storeID=TygerSoundsMonthly,
    type=0,
    duration=1,
    skProduct=(null),
    >
    
    Qonversion.purchase(product.qonversionID) { [weak self] (result, error, flag) in
                guard let self = self else { return }            
                if let error = error {
                    completion(error)
                    print(error.localizedDescription)
      }
    
    help wanted question 
    opened by xhardcorex 10
  • iOS 15 SDK support

    iOS 15 SDK support

    Can't build for iOS 15 got error 'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based solutions where appropriate instead.

    opened by andrey-krukovskiy 7
  • Same Permissions for different Login User ID's

    Same Permissions for different Login User ID's

    Use case: I logged with UserA & I purchased subscription(3 months) using UserA. After that I logged out and logged in with UserB. When I called Qonversion.checkPermissions it shows same permissions for UserA as well as UserB.

    I need to link my app's user id with Apple ID, how can I link that? I tried to set below Qonversion.setProperty(.userID, value: user.uid) Qonversion.identify(user.uid) but permissions are same for different UserID's.

    awaiting answers 
    opened by atrsarankumar 5
  • Disable automatic finishing of transactions

    Disable automatic finishing of transactions

    Hello! In our application, we use our own server for receipt validation and the Qonversion library for analytics. In the event that the consumable purchase was successful, we send a receipt to our server. We would like to finish a transaction only if the server has successfully processed the purchase and rewarded the user. However, the handlePurchasedTransaction method of the QNProductCenterManager class automatically finishes the transaction, and therefore, even if the check was not successfully sent to our server, the transaction is finished, that is, it is deleted from the PaymentQueue and from the receipt, that is, we lose the purchase and cannot try to process it again, for example, the next time the application is restarted, when the paymentQueue(_:updatedTransactions:) method is called. Please tell me if there is any way to bypass this behavior.

    opened by denis15yo 4
  • App freezes in iOS 15 on storefront call

    App freezes in iOS 15 on storefront call

    From your code:

    if (@available(iOS 13.0, macos 10.15, tvOS 13.0, *)) {
        NSString *countryCode = SKPaymentQueue.defaultQueue.storefront.countryCode ?: @"";
        purchaseDict[@"country"] = countryCode;
      }
    

    Calling storefront on iOS freezes the app. It seems it is inner iOS bug but what about to add a possibility to disable countryCode to avoid such situations?

    opened by gerchicov-bp 4
  • Force update user properties

    Force update user properties

    In documentation it says

    How It Works

    Qonversion SDK gets user properties and sends data every 15 seconds, as well as when closing the app.

    How can I force update user properties without waiting for 15 seconds or closing the app?

    duplicate 
    opened by saqibomer 4
  • Offerings with SPM

    Offerings with SPM

    I have Qonversion installed with SPM. On version 2.9.0 atm.

    When trying to use the offerings call. I get Type 'Qonversion' has no member 'offerings', but all my other calls seem to work fine. I've tried cleaning, clearing derived data, and even removing and re-adding the library.

    Screen Shot 2022-09-20 at 12 11 12 PM

    Any help with this would be appreciated.

    opened by drewg233 3
  • InApp purchase via Qonversion in TestFlight doesn't work

    InApp purchase via Qonversion in TestFlight doesn't work

    We are testing our App in TestFlight and we found an issue. I paid one of the subscription plan in the App but I still cannot have premium service, in other words, Qonversion don't return any active status for me. I tested with our real apple Ids and also with Sandbox apple ids. None of them works in TestFlight.

    This scenario works in the Non-TestFlight build or the debug build I deployed from Xcode.

    solution found 
    opened by DreamSkyMXDan 3
  • Invalid duration of products - iOS SDK

    Invalid duration of products - iOS SDK

    Product list shows invalid duration. I have an annual and quarterly product defined in product centre. Response shows duration as 2 and 4.

    Qonversion.products { productsList, error in
         print(productsList)
    }
    

    And here is response

    key: "premium_plan_quarterly", value: <QNProduct: id=premium_plan_quarterly,
    storeID=premium_plan_quarterly,
    type=1,
    duration=2,
    skProduct=<SKProduct: 0x28075ccf0>,
    >
    
    help wanted 
    opened by saqibomer 3
  • Free trial duration shows as

    Free trial duration shows as "Other" instead of "week"

    I have created two premium subscriptions.

    1. Monthly with 1 Week free trial
    2. yearly with 1 Month free trial

    Both of these are configured the same way with introductory offers on the App store. The yearly subscription has the right info whereas the monthly one doesn't show it correctly.

    Why is QNTrialDuration for 1 Week free trial is set to QNTrialDurationOther and not QNTrialDurationWeek?

    ▿ Optional<Array<QNProduct>>
      ▿ some : 2 elements
        - 0 : <QNProduct: id=premium_yearly_with_trial,
    storeID=com.my_app.premium.yearly,
    offeringID=main,
    type=trial (enum value = 0),
    duration=annual (enum value = 4),
    trial duration=month (enum value = 4),
    skProduct=<SKProduct: 0x280755ab0>,
    >
        - 1 : <QNProduct: id=premium_monthly_with_trial,
    storeID=com.my_app.premium.monthly,
    offeringID=main,
    type=trial (enum value = 0),
    duration=monthly (enum value = 1),
    trial duration=other (enum value = 9),
    skProduct=<SKProduct: 0x2807559e0>,
    >
    
    Screenshot 2021-09-05 at 8 08 00 PM question 
    opened by akshaynhegde 2
  • It is not possible to pass the quantity of the product in the purchase method

    It is not possible to pass the quantity of the product in the purchase method

    I'm using SwiftyStoreKit and I can't replace it with qonversion because it's not possible to send the amount when buying the product.

    Today I have a tip product in the Apple Store, and I use this product over and over again to make the value more flexible by using multiple amounts to be able to buy several of the same product. SwiftyStoreKit and StoreKit support this.

    It would be great if it was possible to send the quantity of the product that my users will buy.

    enhancement 
    opened by pgneri 2
Releases(3.0.0-RC1)
  • 3.0.0-RC1(Nov 23, 2022)

    First candidate for the new major SDK release

    It contains a lot of changes, which will be described in our migration guide soon.

    Please, note that future releases may be backward incompatible with release candidates.

    These release notes will be updated.

    Source code(tar.gz)
    Source code(zip)
  • 2.21.1(Nov 7, 2022)

  • 2.21.0(Sep 21, 2022)

    What's new

    • Added a source property to the Permission object - use it to know where this permission is originally from - App Store, Play Store, Stripe, etc.
    • Added a method getNotificationCustomPayload to get the extra data you've added to automation notifications.
    • Purchase tracking error handling improved to guarantee delivery.
    Source code(tar.gz)
    Source code(zip)
  • 2.20.1(Aug 31, 2022)

  • 2.20.0(Aug 24, 2022)

    What's new

    • Added support of network connection lack or unexpected backend errors. Now Qonversion SDK will handle user permissions correctly even if it can't reach out to the API and will actualize them with the next successful request. Also, products and offerings become permanently available after the first successful launch - nothing will interfere user from the purchase.
    • Added method setPermissionsCacheLifetime to configure the lifetime of permissions cache. It is used if we faced any error trying to get permissions from our API. Defaults to one month.
    • Added a new defined property FirebaseAppInstanceId for Firebase integration.
    Source code(tar.gz)
    Source code(zip)
  • 2.19.1(Jul 25, 2022)

  • 2.19.0(Jun 29, 2022)

    What's new

    Observer mode update

    New function to disable transactions finishing for observer mode. You can call this function if you want to finish StroreKit transactions by yourself, after handling the purchase on your own backend, for example. Qonversion.disableFinishTransactions()

    Source code(tar.gz)
    Source code(zip)
  • 2.19.0-storekit2-beta(Jun 19, 2022)

    What's new

    Support StoreKit 2 in the Observer mode

    From now, you can use our SDK in the Observer mode if your own implementation of the purchase logic is based on StoreKit 2. Use QonversionPurchasesHandler.handle(transaction) to track a transaction that appears as a result of StoreKit 2 Product.purchase() function. The following transactions will be handled automatically.

    Source code(tar.gz)
    Source code(zip)
  • 2.18.4(Apr 13, 2022)

  • 2.18.3(Feb 17, 2022)

  • 2.18.2(Dec 22, 2021)

  • 2.18.1(Dec 3, 2021)

  • 2.18.0(Aug 31, 2021)

    What's new

    Qonversion Strict Mode SDK without IDFA collection

    Qonversion Strict Mode iOS SDK does not collect IDFA. Developers can choose this SDK, for example, in the case of kids apps. Following Apple's policy, apps in the kids category must not collect IDFA. You can install the Strict Mode SDK with CocoaPods: pod 'Qonversion/NoIdfa'

    Source code(tar.gz)
    Source code(zip)
  • 2.17.2(Aug 16, 2021)

  • 2.17.1(Aug 11, 2021)

  • 2.17.0(Aug 10, 2021)

    What’s new

    Automations

    • New AutomationsDelegate method shouldHandleEvent. The method allows getting the event that triggers the Automation. Override the function and return false if you want to handle the event by yourself (for example, show your custom screen). Otherwise, Qonversion will handle this event and show the Automation screen (if it’s configured).
    extension YourCustomClass: Qonversion.AutomationsDelegate {
        func shouldHandle(_ event: QONAutomationsEvent, payload: [String : Any]) -> Bool {
            // check event.type here
            // return false if you want to handle event yourself
        }
    }
    
    • Updated push notifications token store logic
    Source code(tar.gz)
    Source code(zip)
  • 2.16.2(Jul 29, 2021)

  • 2.16.1(Jul 28, 2021)

    What's new

    Errors details

    From now Qonversion SDK returns more details about the error received. Check the details in QNAPIError enum and in the documentation Error details contain information on receipt validation error, project configuration issues, invalid or fraud purchases, wrong credentials, etc.

    Source code(tar.gz)
    Source code(zip)
  • 2.16.0(Jul 5, 2021)

    What's new

    Automation

    Automation update. Use showScreen() method that allows you to show the screen whenever you need it.

    Qonversion.Automations.showScreen(withID: "screen_id") { success, error in
        // handle result here
    }
    
    Source code(tar.gz)
    Source code(zip)
  • 2.15.0(Jun 17, 2021)

    What's new

    A/B Testing

    A/B testing makes it easy to run and analyze in-app subscription experiments to quickly find the best subscription price, duration, and other parameters that maximize your app's revenue in the long run. It is an out-of-the-box solution that does not require any third-party service. You can roll out the winning version of the experiment to all users instantly without releasing a new app version.

    See the details in our documentation to set up your first subscription pricing A/B experiment

    Source code(tar.gz)
    Source code(zip)
  • 2.14.1(Jun 8, 2021)

    What's new

    Deprecations

    • Qonversion.resetUser() deprecated. You can reinstall the app if you need to reset the user ID.

    Minor improvements

    • Improved request and retries logic for user identity functionality
    Source code(tar.gz)
    Source code(zip)
  • 2.14.0(Jun 4, 2021)

    What's new

    User info

    Now you can get the user info by calling Qonversion.userInfo()

    Qonversion.userInfo { userInfo, error in
        // handle user info here
    }
    

    Minor improvements

    Updated requests and retries logic

    Source code(tar.gz)
    Source code(zip)
  • 2.13.4(May 3, 2021)

  • 2.13.3(Apr 22, 2021)

  • 2.13.2(Apr 9, 2021)

    What's new

    • IDFA On iOS 14.5+, after requesting the app tracking permission using ATT, you need to notify Qonversion if tracking is allowed and IDFA is available. Just call Qonversion.setAdvertisingID()
    Source code(tar.gz)
    Source code(zip)
  • 2.13.1(Apr 8, 2021)

  • 2.13.0(Apr 2, 2021)

    What's new

    Automations macroses

    See details in the documentation

    Offer codes

    Function presentCodeRedemptionSheet shows up a sheet for users to redeem AppStore offer codes

    Qonversion.presentCodeRedemptionSheet()
    
    Source code(tar.gz)
    Source code(zip)
  • 2.12.0(Mar 25, 2021)

    What's new

    Identity

    Call this function to link a user to his unique ID in your system and share purchase data.

    Qonversion.identify("your_custom_user_id")
    

    Call this function to unlink a user from his unique ID in your system and his purchase data.

    Qonversion.logout()
    
    Source code(tar.gz)
    Source code(zip)
  • 2.11.3(Mar 12, 2021)

  • 2.11.2(Feb 23, 2021)

Owner
Qonversion
The subscription data platform for mobile-first companies
Qonversion
In App Purchase Manager framework for iOS

InAppFramework In App Purchase Manager framework for iOS Disclaimer I know it's been too long since the last update, quite a few things happened in my

Sándor Gyulai 40 May 23, 2020
A jailed in-app purchase cracker for iOS 12.2-15.6

Satella Jailed For, um, educational purposes only or something. Definitely don't use this to pirate in-app purchases in apps to which you don't have l

Lilly 252 Nov 16, 2022
TPInAppReceipt is a lightweight, pure-Swift library for reading and validating Apple In App Purchase Receipt locally.

TPInAppReceipt is a lightweight, pure-Swift library for reading and validating Apple In App Purchase Receipt locally. Features Read all

Pavel T 513 Nov 22, 2022
Ruby Gem for Rails - Easy iTunes In-App Purchase Receipt validation, including auto-renewable subscriptions

Monza is a ruby gem that makes In-App Purchase receipt and Auto-Renewable subscription validation easy. You should always validate receipts on the ser

Gabriel 156 Jun 12, 2022
Square In-App Payments iOS SDK SwiftUI

Square In-App Payments iOS SDK SwiftUI Build remarkable payments experiences in

Ashley Bailey 2 Mar 8, 2022
In-app purchases and subscriptions made easy. Support for iOS, iPadOS, watchOS, and Mac.

In-app purchases and subscriptions made easy. Support for iOS, iPadOS, watchOS, and Mac.

RevenueCat 1.6k Nov 25, 2022
Lightweight In App Purchases Swift framework for iOS 8.0+, tvOS 9.0+ and macOS 10.10+ ⛺

SwiftyStoreKit is a lightweight In App Purchases framework for iOS, tvOS, watchOS, macOS, and Mac Catalyst. Features Super easy-to-use block-based API

Andrea Bizzotto 6.1k Nov 15, 2022
Make and accept payments in your iOS app via Venmo

Venmo iOS SDK The Venmo iOS SDK lets you make and accept payments in your app using Venmo. Installation If you're using CocoaPods: If you don't have a

Venmo 168 Sep 29, 2022
Accept credit cards and PayPal in your iOS app

Important: PayPal Mobile SDKs are Deprecated. The APIs powering them will remain operational long enough for merchants to migrate, but the SDKs themse

PayPal 972 Nov 4, 2022
Easily integrate Credit Card payments module in iOS App. Swift 4.0

MFCard Buy me a coffee MFCard is an awesome looking Credit Card input & validation control. Written in Swift 3. YOoo, Now MFCard is on Swift 5. Swift

MobileFirst 361 Nov 20, 2022
A lightweight iOS library for In-App Purchases

#RMStore A lightweight iOS library for In-App Purchases. RMStore adds blocks and notifications to StoreKit, plus receipt verification, content downloa

Robot Media 2.4k Nov 17, 2022
A modern In-App Purchases management framework for iOS.

MerchantKit A modern In-App Purchases management framework for iOS developers. MerchantKit dramatically simplifies the work indie developers have to d

Benjamin Mayo 1.1k Nov 17, 2022
SwiftUI BusinessCard - Created iOS Business card app to practice SwiftUI

SwiftUI_BusinessCard Created iOS Business card app to practice SwiftUI

null 0 Jan 29, 2022
Handle in-app purchases in iOS in a convenient way

InAppPurchases Handle in-app purchases in iOS in a convenient way. Overview InAppPurchases covers all the basic aspects of in-app purchases in swift i

Umar Awais 4 Nov 8, 2022
OnTime - OnTime App is for Scheduling your day and prioritizing your task and also for saving notes

OnTime OnTime App is for Scheduling your day and prioritizing your task and also

Mohammed Sulaiman 1 Jan 29, 2022
With SwiftUI payment share app

Splitpayment With SwiftUI payment share app.

Ahmet Onur Şahin 3 Apr 18, 2022
Implement donate to Ukraine inside your app, with Apple Pay

DonateToUkraine gives you a simple way to provide "donate to Ukraine" functionality in your app via an official donation service (endorsed here). The service will be opened inside the app, keeping a native feel. Apple Pay is supported.

Oleg Dreyman 22 Aug 2, 2022
Ios-card-transition - iOS CocoaPod to create beautiful card transitions

CSCardTransition CSCardTransition is a small library allowing you to create wond

Creastel 12 Oct 31, 2022
A credit card reader and parser for iOS Using Native Vision/VisionKit

card-reader-ios A credit card reader and parser for iOS Using Native Vision/VisionKit May-14-2021.00-43-17.mp4 Instructions Hold camera up to a card a

Khalid Asad 103 Nov 7, 2022