Guides
GuidesLog In
Guides

App Release Checklist

This guide will describe the necessary steps you need to do before releasing your app with Apphud SDK.

Install Apphud SDK

First of all add Apphud SDK to your app binary as described in the SDK Installation guide.

Once you've successfully installed the SDK, you will need to initialize it. Basic initialization looks like this:

Apphud.start(apiKey: "YOUR_API_KEY")
[Apphud startWithApiKey:@"YOUR_API_KEY" userID:nil observerMode:NO];
Apphud.start(this, "YOUR_API_KEY")
await Apphud.start(apiKey: "YOUR_API_KEY", observerMode: false);
await ApphudSdk.start({ apiKey: "YOUR_API_KEY" });
ApphudSDK.Start("YOUR_API_KEY", (ApphudUser user) => { });

For more details, check our Initialization and Identification guide.

Log Paywall Shown Events

If you're planning to use A/B Experiments, logging Paywall Shown event is highly recommended, as it influences the calculation of 'Affected Users' and major Paywall Conversion Rates metrics, which are key components in Paywall Analytics, Placement Analytics, and A/B Experiments.

Apphud.paywallShown(paywall)
ApphudSDK.PaywallShown(paywall)
Apphud.paywallShown(paywall)

Collect Device Identifiers

iOS

Since version 3.3.0, the iOS SDK no longer collects the Identifier For Vendor (IDFV) automatically. Failing to pass the IDFV might disrupt some of your MMP integration setups.

Call setDeviceIdentifiers(idfa: String?, idfv: String?) method immediately after the SDK initialization. If the advertising identifier (IDFA) is not available, pass only the IDFV.
When IDFA becomes available, you can call setDeviceIdentifiers(idfa: String?, idfv: String?) again.

For more details, refer to Device Identifiers guide.

Android

Call Apphud.collectDeviceIdentifiers() method after the SDK initialization.
When targeting Android 13 and above, you must also declare AD_ID permission in the manifest file.

For more details, refer to Device Identifiers guide.

Match Device Identifiers

This step is required for some integrations such as Amplitude, Firebase, Mixpanel, or others. Please read the documentation for corresponding third-party integration.

// example for Amplitude
Amplitude.instance()?.initializeApiKey("AMPLITUDE_API_KEY", userId: Apphud.userID())

Collect Attribution Data

Passing attribution data is required for MMP integrations such as AppsFlyer, Adjust, etc. Please read the documentation for corresponding third-party integration.

// example for AppsFlyer
func onConversionDataSuccess(_ conversionInfo: [AnyHashable : Any]!) {
    Apphud.addAttribution(data: conversionInfo, from: .appsFlyer, identifer: AppsFlyerLib.shared().getAppsFlyerUID()) { _ in }
}
func onConversionDataFail(_ error: Error) {
    Apphud.addAttribution(data: ["error" : error.localizedDescription], from: .appsFlyer, identifer: AppsFlyerLib.shared().getAppsFlyerUID()) { _ in }
}

Collect Apple Search Ads Attribution Data (iOS)

If you are running or planning to run Apple Search Ads campaigns, collecting Apple Search Ads attribution tokens is essential for analyzing campaign data in Apphud.

import AdServices

// call this method after SDK initialization
func trackAppleSearchAds() {
        if #available(iOS 14.3, *) {
            Task {
                if let asaToken = try? AAAttribution.attributionToken() {
                    Apphud.addAttribution(data: nil, from: .appleAdsAttribution, identifer: asaToken, callback: nil)
                }
            }
        }
    }

Purchase Products

Use Placements to extract your products from the placement's paywall object. Each ApphudPlacement contains a single ApphudPaywall object, which includes an ordered list of ApphudProduct objects. To make a purchase, pass one of these ApphudProduct instances into the Apphud.purchase(...) method.

Observer Mode Setup

If you are using Apphud SDK in Analytics (Observer) Mode in your Android App, it is recommended to pass Obfuscated Account ID in the BIlling Flow parameters:

BillingFlowParams.newBuilder().setObfuscatedAccountId(Apphud.deviceId())

You can find more details in the Observer Mode guide.

Final Checks