Build, Measure and Grow iOS subscription business

Overview

Apphud

Apphud SDK

Apphud SDK is a lightweight open-source Swift library to manage auto-renewable subscriptions and other in-app purchases in your iOS app. No backend required.

Visit our website for details: https://apphud.com

Features

👍 Integrating subscriptions using our SDK is very easy.
Apphud takes care of a subscription purchase process. Integrate SDK in just a few lines of code.

🧾 App Store receipts validation.
Apphud validates and periodically refreshes App Store receipts to give you real-time data.

🕗 View subscription details and transactions history.
Get expiration date, autorenew status in our SDK.

🕗 View non-renewing purchase details and transactions history.

🔍 Determine for trial, introductory and promotional offer eligibility using our SDK.

🔔 Receive a real-time notification when a user gets billed.
We will send you a message to Slack and Telegram immediately when a user gets billed or started trial.

📊 View key subscription metrics in our dashboard and charts.
Apphud has a convenient dashboard with key metrics of your subscriptions.

🔌 Integrations. Are available on all plans. Send subscription renewal events to other mobile analytics.
Apphud reduces pain in sending all subscription events to external mobile analytics: Amplitude, Mixpanel, AppsFlyer, etc.

🎨 Create subscription purchase screens without coding in our visual web editor.
You don't need to develop purchase screens. Just pick a template and modify it. So easy!

Promotional subscription offers support.
Use Apphud to easily give a discount for existing and lapsed customers. No backend required.

💱 User local currency real-time conversion.

🏆 Increase app revenue using our Rules.
Apphud will automatically offer a promotional discount based subscription events.

🕵️ Subscription cancellation insights tool.
Understand why you customers cancel a subscription to make right product decisions.

💸 Handle billing grace period and billing issues.
Apphud will automatically ask a user to update his billing details in case of billing issue during renewal.

👏 Great documentation.

🏃‍♂️ Fast support. We are online.

SDK Requirements

Apphud SDK requires minimum iOS 11.2, Xcode 10 and Swift 5.0.

Installation

Please feel free to read our SDK Integration Guide.

Having troubles?

If you have any questions or troubles with SDK integration feel free to contact us. We are online.

https://apphud.com/contacts

Like Apphud? Place a star at the top 😊

Comments
  • iOS 14 Beta Failed to load SKProducts from the App Store

    iOS 14 Beta Failed to load SKProducts from the App Store

    [12:15:06 PM] [Apphud] Failed to load SKProducts from the App Store, error: Error Domain=SKErrorDomain Code=0 "UNKNOWN_ERROR" UserInfo={NSLocalizedDescription=UNKNOWN_ERROR, NSUnderlyingError=0x6000008b4870 {Error Domain=ASDErrorDomain Code=507 "Error decoding object" UserInfo={NSLocalizedDescription=Error decoding object, NSLocalizedFailureReason=Attempted to decode store response}}}

    opened by uniqby 7
  • A lot of errors after update to 2.5.0

    A lot of errors after update to 2.5.0

    The application is not buildable after updating to version 2.5.0 via SPM. There are no such problems with version 2.4.4. Xcode Version 13.2.1 (13C100)

    Screen Shot 2022-01-04 at 16 25 23
    opened by uniqby 4
  • Deferred purchase

    Deferred purchase

    Hey! I am trying to test deferred purchases. When I click the Buy button, I see the "Ask Permission" alert, when I click "Cancel" or "Ask", nothing happens, the ApphudDelegate does not fire and my activityIndicator is visible always. I have to process these purchases in func paymentQueue (_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {}

    How do I know if a deferred purchase has been used through the ApphudDelegate? Снимок экрана 2022-01-11 в 19 38 34

    opened by fury21 2
  • Corner case when user is not registered and products not loaded automatically

    Corner case when user is not registered and products not loaded automatically

    1. first launch after install without wifi
    2. wait 5 minutes
    3. enable wifi
    4. try to subscribe

    because of the max number of attempts Apphud will give up on trying to register user and fetch products.

    I use refreshStoreKitProducts to force it but with SwiftUI it's a bit awkward.

    I think there shouldn't be a limit, also 30+ seconds retry is too much to wait for the user if he goes online. I understand that you try to reduce load on your servers but there is no load if there's no connection. Maybe you should check the error generated by the request.

    opened by ulitiy 2
  • Disable IDFA collection

    Disable IDFA collection

    I call Apphud.disableIDFACollection() before Apphud.start(apiKey: ""), but when I submit app to app store connect, app store connect still says that my app contains IDFA, is there any way to solve this ?

    opened by Panl 2
  • ApphudDelegate Bug?

    ApphudDelegate Bug?

    newest 2.8.8 code

    internal func submitReceipt(product: SKProduct?, apphudProduct: ApphudProduct?, transaction: SKPaymentTransaction?, receiptString: String?, notifyDelegate: Bool, eligibilityCheck: Bool = false, callback: ApphudErrorCallback?) {
            self.submitReceipt(product: product,
                               apphudProduct: apphudProduct,
                               transactionIdentifier: transaction?.transactionIdentifier,
                               transactionProductIdentifier: transaction?.payment.productIdentifier,
                               transactionState: transaction?.transactionState,
                               receiptString: receiptString,
                               notifyDelegate: eligibilityCheck,
                               callback: callback)
    }
    

    error

    notifyDelegate: eligibilityCheck,
    

    should be?

    notifyDelegate: notifyDelegate,
    eligibilityCheck: eligibilityCheck 
    
    opened by ztdr 1
  • iPhone SE (14.4) simulator, AppHud 2.5.7 not loading SKProducts

    iPhone SE (14.4) simulator, AppHud 2.5.7 not loading SKProducts

    Hi! I try to get SKProducts from ApphudProduct, but got nil in iPhone SE 14.4, before all worked fine.

    My steps: Apphud.paywallsDidLoadCallback { paywalls in // retrieve default paywall let paywall = paywalls.first(where: { $0.isDefault }) var products: [ApphudProduct] = []

            // retrieve the products [ApphudProduct] from current paywall
            if let paywall = paywall {
                products = paywall.products
                
                for product in paywall.products {
                    print("test:", product.productId, product.skProduct) 
                }
            }
        }
    

    what i get: "test: com.kushman.nevergame.annual nil", but in other simulators, like iPhone 13 pro max 15.2 i got: "com.kushman.nevergame.annual Optional(<SKProduct: 0x600002905270>)"

    Can u help me?

    opened by fury21 1
  • Delegate method apphudNonRenewingPurchasesUpdated don't work correct with refunded purchase

    Delegate method apphudNonRenewingPurchasesUpdated don't work correct with refunded purchase

    Hi! When i refnding purchase in storeKit manager i expect that delegate will called, but nothing to happening. In explanation of this method written: "Called when any of non renewing purchases changes. Called when purchase is made or has been refunded."

    May be i don't understand somthink?

    opened by fury21 1
  • How to use example?

    How to use example?

    I open example project, select StoreKitApphudSDKDemo, build project and in console see err: [Apphud] Failed to load SKProducts from the App Store, because product identifiers are invalid: ["com.apphud.gold", "com.apphud.monthly_promo"]

    and what i see in simulator https://ibb.co/17ZJfPQ

    How can i fix it?

    opened by fury21 1
  • Delegate method for API call errors.

    Delegate method for API call errors.

    Please add delegate methods for errors in API calls because it's completely not transparent when and why these issues happen. I.e. when paywalls/products cannot be loaded.

    opened by ulitiy 1
  • Apphud.isNonRenewingPurchaseActive(productIdentifier:

    Apphud.isNonRenewingPurchaseActive(productIdentifier: "productID") cache issue

    if I purchase a non-renewable subscription in testflight environment and then install the AppStore version without uninstalling the testflight version let active = Apphud.isNonRenewingPurchaseActive(productIdentifier: "productID") always return true

    opened by Panl 1
Releases(2.8.8)
  • 2.8.8(Aug 24, 2022)

  • 2.8.6(Aug 18, 2022)

    What’s new in 2.8.6:

    • Added func userDidLoad(rawPaywalls: [ApphudPaywall]) in ApphudDelegate. This method called when user is registered in Apphud
    • Added func paywallsDidFullyLoad(paywalls: [ApphudPaywall]) in ApphudDelegate. This method called when paywalls are fully loaded with their SKProducts.
    Source code(tar.gz)
    Source code(zip)
  • 2.8.5(Aug 8, 2022)

    What’s new in 2.8.5:

    • hasActiveSubscription(), hasPremiumAccess() improvements and bug fixes
    • Methods descriptions improvements
    • Added purchasePromo() logging
    • Added checkTransactions logic for force receipt sending if a new transaction was found.
    Source code(tar.gz)
    Source code(zip)
  • 2.8.2(Jun 10, 2022)

  • 2.8.1(Apr 29, 2022)

    What's new in 2.8.1:

    • Added new method willPurchaseProductFromPaywall(_ identifier: String) which allows you to specify paywall id in observer mode. This will allow you to use our A/B experiments in Observer Mode.
    • Deprecated facebook integration from SDK because it is now redundant.
    • Significant improvements and lots of refactoring related to request handling, logging and purchase tracking.
    Source code(tar.gz)
    Source code(zip)
  • 2.7.0(Apr 6, 2022)

    What’s new in 2.7.0:

    • WatchOS/tvOS support
    • Added new willPurchaseProductFromPaywall method, which allows to use A/B experiments in Observer Mode
    • Internal cache improvements and bug fixes
    • Now you can delete or update promotionals using the same SDK method grantPromotional or via web interface. Pass 0 daysCount to delete active promotional.
    Source code(tar.gz)
    Source code(zip)
  • 2.6.1(Mar 14, 2022)

    What’s new in 2.6.1:

    • Fixed a bug when unstable internet connection could affect to products groups request
    • Fixed a bug when update user method could send nil id
    Source code(tar.gz)
    Source code(zip)
  • 2.6.0(Mar 11, 2022)

    What’s new in 2.6.0:

    • Update paywalls and products groups cache
    • Add new func hasPremiumAccess - returns true if user has active subscription or non renewing purchase (lifetime)
    • Update methods descriptions
    Source code(tar.gz)
    Source code(zip)
  • 2.5.7(Feb 22, 2022)

    What’s new in 2.5.7:

    • Fixed 403 server error bug, when user could be blocked from sever 403 error code
    • Change func paywallShown(_ paywall: ApphudPaywall) and func paywallClosed(_ paywall: ApphudPaywall) to non optional paywall parameter
    • Add push token cache
    • Update general cache time
    • Update some Logs
    Source code(tar.gz)
    Source code(zip)
  • 2.5.6(Feb 10, 2022)

  • 2.5.5(Jan 28, 2022)

    What's new in 2.5.5:

    • Added new delegate method apphudDidObservePurchase, which can be useful to intercept purchases made using Promo Codes for in-app purchases. If user redeems promo code for in-app purchase in the App Store, then opens the app, this delegate method will be called, so you will be able to handle successful payment on your side.
    • Updated documentation for Apphud.swift file.
    Source code(tar.gz)
    Source code(zip)
  • 2.5.4(Jan 23, 2022)

  • 2.5.3(Jan 12, 2022)

  • 2.5.2(Jan 7, 2022)

    What's new in Apphud iOS SDK 2.5.2:

    • Fixed a crash which occurred while saving AppsFlyer attribution data cache
    • Fixed build errors for SPM

    What's new in Apphud iOS SDK 2.5.0:

    • MacOS Support. Finally you can add Apphud SDK to your Mac app and track your purchases easily! What is supported in MacOS: * Subscriptions tracking * A/B experiments * Charts and Dashboard * Integrations and S2S webhooks
    • Significantly improved SDK performance and caching. Now SDK will send much less requests to Apphud server.
    • Prepared SDK for upcoming Rules update.
    • productsDidFetchCallback and refreshStoreKitProducts callbacks now return optional Error.
    • Other important internal improvements.
    Source code(tar.gz)
    Source code(zip)
  • 2.4.4(Oct 22, 2021)

  • 2.4.3(Oct 18, 2021)

  • 2.4.2(Oct 16, 2021)

    What's new in 2.4.2:

    • Fixed important bug when User Properties sometimes may not be saved when submitted simultaneously with initialisation.
    Source code(tar.gz)
    Source code(zip)
  • 2.4.1(Oct 13, 2021)

    What’s new in 2.4.1:

    • Fix grantPromotional() callback bug
    • Change ApphudPaywall experiments functional properties: experimentId -> experimentName, variationId -> variationName
    Source code(tar.gz)
    Source code(zip)
  • 2.4.0(Oct 1, 2021)

  • 2.3.0(Aug 2, 2021)

    What’s new in 2.3.0:

    • Added Experiments. Run Experiments(A/B tests) to test different in-app purchases prices in order to find the best.
    • Improve Apple search Ads logic. Submit Apple Attribution Token to Apphud with Apphud.addAttribution().
    • Improve paywalls methods. Paywalls are already exist after SDK initialization. Use var paywalls: [ApphudPaywall] method.
    • Method getPaywalls() is deprecated in favor of func paywallsDidLoadCallback. This callback is called when paywalls are fully loaded with their StoreKit products.

    MIGRATION GUIDE from previous versions to 2.3.0:

    • Method getPaywalls() is deprecated in favor of func paywallsDidLoadCallback
    • Use var paywalls: [ApphudPaywall], to get your cashed paywalls. Apphud.paywalls
    Source code(tar.gz)
    Source code(zip)
  • 2.2.1(Jul 13, 2021)

    What’s new in 2.2.1:

    • added Promotionals. You can grant free promotional subscription to user with new method grantPromotional()

    MIGRATION GUIDE from previous versions to 2.0.0 - 2.2.1:

    • Rename Apphud.products() to Apphud.products.
    • If you still want to make purchases using SKProduct model but not new ApphudProduct class, then use Apphud.purchase(product.productIdentifier) method.
    Source code(tar.gz)
    Source code(zip)
  • 2.2.0(Jul 9, 2021)

    What’s new in 2.2.0:

    • add setOnes option for Apple Attribution Token
    • add Firebase integration
    • improve paywalls events methods

    MIGRATION GUIDE from previous versions to 2.0.0 - 2.2.0:

    • Rename Apphud.products() to Apphud.products.
    • If you still want to make purchases using SKProduct model but not new ApphudProduct class, then use Apphud.purchase(product.productIdentifier) method.
    Source code(tar.gz)
    Source code(zip)
  • 2.1.2(Jun 17, 2021)

    What’s new in 2.1.2:

    • add appleSearchAds key for submit Apple Attribution Token to Apphud with Apphud.addAttribution()
    • update example app

    MIGRATION GUIDE from previous versions to 2.0.0 - 2.1.2:

    • Rename Apphud.products() to Apphud.products.
    • If you still want to make purchases using SKProduct model but not new ApphudProduct class, then use Apphud.purchase(product.productIdentifier) method.
    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(Jun 8, 2021)

    What’s new in 2.1.1:

    • Fixed paywall_id usage.

    MIGRATION GUIDE from previous versions to 2.0.0 - 2.1.1:

    • Rename Apphud.products() to Apphud.products.
    • If you still want to make purchases using SKProduct model but not new ApphudProduct class, then use Apphud.purchase(product.productIdentifier) method.
    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Jun 4, 2021)

    What’s new in 2.1.0:

    • Add user logs paywallShown, paywallClosed, use it for improve your paywalls analytics.
    • Improved error tracking.
    • Rename obj-c method purchase -> purchaseApphudProduct.

    MIGRATION GUIDE from previous versions to 2.0.0 - 2.0.1:

    • Rename Apphud.products() to Apphud.products.
    • If you still want to make purchases using SKProduct model but not new ApphudProduct class, then use Apphud.purchase(product.productIdentifier) method.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(May 17, 2021)

    What's new in 2.0.1:

    • Update methods for usage without sdk initialise.

    MIGRATION GUIDE from previous versions to 2.0.0 - 2.0.1:

    • Rename Apphud.products() to Apphud.products.
    • If you still want to make purchases using SKProduct model but not new ApphudProduct class, then use Apphud.purchase(product.productIdentifier) method.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(May 6, 2021)

    What's new in 2.0.0:

    • Added new method func getPaywalls, which fetches paywalls configured in Apphud Products Hub.
    • Method productsDidFetchCallback is deprecated in favor of func getPaywalls.
    • Method refreshStoreKitProducts is deprecated in favor of func getPaywalls.
    • Method product(productIdentifier) is deprecated in favor of func getPaywalls.
    • Method products: [SKProduct] is deprecated in favor of func getPaywalls.
    • Method purchase(product: SKProduct) has been removed in favor of purchase(product: ApphudProduct). You can still use Apphud.purchase(product.productIdentifier) method to make payments with SKProduct model.
    • Apphud.products() renamed to Apphud.products.
    • Internal improvements

    MIGRATION GUIDE from previous version to 2.0.0:

    • Rename Apphud.products() to Apphud.products.
    • If you still want to make purchases using SKProduct model but not new ApphudProduct class, then use Apphud.purchase(product.productIdentifier) method.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.3(May 4, 2021)

  • 1.2.1(Apr 16, 2021)

    What's new in 1.2.1:

    • Fixed a bug where ApphudPurchaseResult.error was always nil when using Apphud.purchaseWithoutValidation method.
    • Improved retries logic when there is no Internet Connection.
    • Improved products fetch and refresh callbacks; implemented array of blocks instead of overwriting a block variable. Now you can use as many productsDidFetchCallback or refreshStoreKitProducts callbacks as you want. All of them will be fired.
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Mar 31, 2021)

Owner
Apphud
Build, Measure and Grow in-app subscription business
Apphud
MbientLab 2 Feb 5, 2022
Build a workout app from scratch using SwiftUI and HealthKit

Build a workout app for Apple Watch Build a workout app from scratch using SwiftUI and HealthKit during this code along. Learn how to support the Alwa

paigeshin 5 Nov 28, 2022
The Gini Bank SDK provides components for capturing, reviewing and analyzing photos of invoices and remittance slips.

Gini Bank SDK for iOS The Gini Bank SDK provides components for capturing, reviewing and analyzing photos of invoices and remittance slips. By integra

Gini GmbH 0 Dec 16, 2021
Zilla connect is an easy, fast and secure way for your users to buy now and pay later from your app

Zilla Checkout iOS SDK Zilla connect is an easy, fast and secure way for your us

null 0 Jan 19, 2022
Alter SDK is a cross-platform SDK consisting of a real-time 3D avatar system, facial motion capture, and an Avatar Designer component built from scratch for web3 interoperability and the open metaverse.

Alter SDK is a cross-platform SDK consisting of a real-time 3D avatar system, facial motion capture, and an Avatar Designer component built from scratch for web3 interoperability and the open metaverse.

Alter 45 Nov 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 973 Dec 18, 2022
Unopinionated and flexible library for easily integrating Tumblr data into your iOS or OS X application.

Tumblr SDK for iOS An unopinionated and flexible library for easily integrating Tumblr data into your iOS or OS X application. The library uses ARC re

Tumblr 420 Dec 8, 2022
Sample app to demonstrate the integration code and working of Dyte SDK for iOS, using Objective-C.

iOS sample app (using Objective-C) by dyte Sample app to demonstrate the usage of Dyte iOS SDK Explore the docs » View Demo · Report Bug · Request Fea

Dyte 8 Nov 26, 2021
📲 The curated list of iOS Developer interview questions and answers, Swift & Objective-C

Awesome iOS interview questions and answers ?? Get started by picking interview's language and start preparing right now Install the app Prepare for t

Dasha Korneichuk 996 Dec 28, 2022
A very simple way to implement Backbone.js style custom event listeners and triggering in Swift for iOS development.

Swift Custom Events A very simple way to implement Backbone.js style custom event listeners and triggering in Swift for iOS development. This provides

Stephen Haney 98 Dec 25, 2022
All in one eKYC (Electronic Know Your Customer) solution available for android and ios

WideKYC All in one eKYC (Electronic Know Your Customer) solution available for android and ios. Wide Technologies provides an SDK for you to implement

Wide Technologies Indonesia 5 Nov 2, 2022
A Flutter plugin to wrap HyperPay SDK for iOS and Android.

HyperPay Flutter Plugin This plugin is a wrapper around HyperPay iOS and Android SDK, it's still in alpha release, and supports limited set of functio

NyarTech 11 Nov 27, 2022
A simple to use iOS/tvOS/watchOS SDK to help get you off the ground quickly and efficiently with your Elastic Path Commerce Cloud written in Swift.

Elastic Path Commerce Cloud iOS Swift SDK A simple to use iOS/tvOS/watchOS SDK to help get you off the ground quickly and efficiently with your Elasti

Moltin 36 Aug 1, 2022
A framework that enhances HealthKit and the Fitbit API for iOS

VitoKit ?? Welcome to VitoKit... A framework that enhances HealthKit and the Fitbit API for iOS ✅ Features Wonderfully crafted animations Speedy setup

Vito 6 Nov 26, 2022
A PocketBase client for iOS, macOS, watchOS, and tvOS

PocketBase A pure Swift client for interfacing with a PocketBase instance. Getting Started Development Environment Easiest way to get started with Poc

Brianna Zamora 10 Dec 24, 2022
Project Flat iOS is the iOS client of Agora Flat open source classroom.

Agora Flat iOS Project flat is the iOS client of Agora Flat open source classroom. 中文 Features Open sourced front-end and back-end [Flat Web][flat-web

netless 24 Dec 12, 2022
Native iOS implementation of RadarCOVID tracing client using DP3T iOS SDK

RadarCOVID iOS App Introduction Native iOS implementation of RadarCOVID tracing client using DP3T iOS SDK Prerequisites These are the tools used to bu

Radar COVID 146 Nov 24, 2022
Hyperledger Sawtooth is an enterprise solution for building, deploying, and running distributed ledgers (also called blockchains).

Hyperledger Sawtooth SDK Hyperledger Sawtooth is an enterprise solution for building, deploying, and running distributed ledgers (also called blockcha

Ann 1 Oct 29, 2021
A platform where NYUAD students can both Help and Seek Help.

A platform where NYUAD students can both Help and Seek Help.

Omar Rayyan 0 Nov 7, 2021