> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.qonversion.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Launch analytics mode

<Info>
  Replace `[projectKey]` with your Qonversion project key. You can find it in the [Qonversion dashboard](https://dash.qonversion.io) under **Project Settings → Project Key**. See [Creating a project](/docs/creating-a-project) for details.
</Info>

## 1. Launch SDK

Initialize the SDK:

```swift theme={null}
import Qonversion

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let config = Qonversion.Configuration(projectKey: "[projectKey]", launchMode: .analytics)
    Qonversion.initWithConfig(config)
  	return true
}
```

```objectivec theme={null}
#import "Qonversion.h"
  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    QONConfiguration *configuration = [[QONConfiguration alloc] initWithProjectKey:@"[projectKey]" launchMode:QONLaunchModeAnalytics];
    [Qonversion initWithConfig:configuration];
    
    return YES;
}
```

```java theme={null}
import com.qonversion.android.sdk.Qonversion;
import com.qonversion.android.sdk.QonversionConfig;
import com.qonversion.android.sdk.dto.QLaunchMode;

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        final QonversionConfig qonversionConfig = new QonversionConfig.Builder(
                this,
                "[projectKey]",
                QLaunchMode.Analytics
        ).build();
        Qonversion.initialize(qonversionConfig);
    }
}
```

```kotlin theme={null}
import com.qonversion.android.sdk.Qonversion
import com.qonversion.android.sdk.QonversionConfig
import com.qonversion.android.sdk.dto.QLaunchMode

public class App : Application {
    override fun onCreate() {
        super.onCreate()
        val qonversionConfig = QonversionConfig.Builder(
            this,
            "[projectKey]",
            QLaunchMode.Analytics
        ).build()
        Qonversion.initialize(qonversionConfig)
    }
}
```

```javascript Flutter theme={null}
import 'package:qonversion_flutter/qonversion_flutter.dart';

final config = new QonversionConfigBuilder(
  '[projectKey]',
  QLaunchMode.analytics
).build();
Qonversion.initialize(config);
```

```javascript React Native theme={null}
import Qonversion, {
  QonversionConfigBuilder,
  LaunchMode,
  UserPropertyKey,
} from '@qonversion/react-native-sdk';

const config = new QonversionConfigBuilder(
  '[projectKey]',
  LaunchMode.ANALYTICS
).build();
Qonversion.initialize(config);
```

```csharp Unity theme={null}
using QonversionUnity;

private void Start()
{
    QonversionConfig config = new QonversionConfigBuilder(
            "[projectKey]",
            LaunchMode.Analytics
        ).Build();
    Qonversion.Initialize(config);
}
```

```typescript Cordova theme={null}
const config = new Qonversion.ConfigBuilder(
  '[projectKey]',
  Qonversion.LaunchMode.ANALYTICS
).build();
Qonversion.initialize(config);
```

```typescript Capacitor theme={null}
import Qonversion, {
  QonversionConfigBuilder,
  LaunchMode,
  UserPropertyKey,
} from '@qonversion/capacitor-plugin';

const config = new QonversionConfigBuilder(
  '[projectKey]',
  LaunchMode.ANALYTICS
).build();
Qonversion.initialize(config);
```

## 2. Sync Purchases (Android only)

1. Check whether you have set your products up correctly. Make your GooglePlay subscriptions backwards compatible with having the best possible accuracy in Qonversion. <a href="/docs/android-in-app-products" target="_blank">Learn more here</a>

2. While you are using Qonversion SDKs in Analytics Mode, in-app purchases implementation is entirely on your side. Please remember to make sure you consume and acknowledge purchases to attribute them to users. **Otherwise, the purchases will be automatically refunded in 3 days.** See the official Android Developer documentation for <a href="https://developer.android.com/google/play/billing/integrate#process" target="_blank">processing purchase details</a>.

3. Sync data with Qonversion in your current purchase flow. Call `syncPurchases()` after every purchase.

```java theme={null}
Qonversion.getSharedInstance().syncPurchases();
```

```kotlin theme={null}
Qonversion.shared.syncPurchases()
```

```javascript Flutter theme={null}
Qonversion.getSharedInstance().syncPurchases();
```

```javascript React Native theme={null}
Qonversion.getSharedInstance().syncPurchases();
```

```csharp Unity theme={null}
Qonversion.GetSharedInstance().SyncPurchases();
```

```typescript Cordova theme={null}
Qonversion.getSharedInstance().syncPurchases();
```

```typescript Capacitor theme={null}
Qonversion.getSharedInstance().syncPurchases();
```

> 📘
>
> Please, do not use the [Google Play Billing AIDL](https://developer.android.com/google/play/billing/integrate) library to integrate Qonversion SDK with your application. It was deprecated and is not supported by Qonversion SDK.

<Info>
  **iOS:** there is no `syncPurchases()` on iOS. Call `Qonversion.shared().syncHistoricalData()` once on the very first launch after integrating Qonversion to backfill existing subscribers. If your app uses StoreKit2, forward each transaction with `Qonversion.shared().handlePurchases([...])` to keep analytics in sync.
</Info>

## 3. (Optional) Set User ID

If you want to implement cross-platform (Android, IOS, and Web) user entitlement management, please, follow the [User Identity guide](/docs/user-identifiers#3-user-identity).

To match Qonversion revenue events to users in <a href="/docs/integrations-overview" target="_blank" rel="noopener">third-party tools</a>, you need to set the identical user IDs in all of them:

```swift theme={null}
Qonversion.shared().setUserProperty(.userID, value: "yourSideUserId")
```

```objectivec theme={null}
[[Qonversion sharedInstance] setUserProperty:QONUserPropertyKeyUserID value:@"yourSideUserId"];
```

```java theme={null}
import com.qonversion.android.sdk.dto.properties.QUserPropertyKey;

Qonversion.getSharedInstance().setUserProperty(QUserPropertyKey.CustomUserId, "yourSideUserID");
```

```kotlin theme={null}
import com.qonversion.android.sdk.dto.properties.QUserPropertyKey

Qonversion.shared.setUserProperty(QUserPropertyKey.CustomUserId, "yourSideUserID")
```

```dart Flutter theme={null}
Qonversion.getSharedInstance().setUserProperty(QUserPropertyKey.customUserId, 'yourSideUserId');
```

```javascript React Native theme={null}
Qonversion.getSharedInstance().setUserProperty(UserPropertyKey.CUSTOM_USER_ID, 'yourSideUserId');
```

```csharp Unity theme={null}
Qonversion.GetSharedInstance().SetUserProperty(UserPropertyKey.CustomUserId, "yourSideUserId");
```

```typescript Cordova theme={null}
Qonversion.getSharedInstance().setUserProperty(Qonversion.UserPropertyKey.CUSTOM_USER_ID, 'yourSideUserId');
```

```typescript Capacitor theme={null}
Qonversion.getSharedInstance().setUserProperty(UserPropertyKey.CUSTOM_USER_ID, 'yourSideUserId');
```

The user ID improves the quality of events matching to the platforms where event attribution is not exclusively based on IDFA or GAID.

## 4. (Optional) Set IDFA (Identifier for Advertisers, iOS 14.5+ only)

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. This will help to have precise attribution in Adjust, AppsFlyer, Singular and other <a href="/docs/integrations-overview" target="_blank" rel="noopener">Qonversion integrations</a>.

```swift theme={null}
ATTrackingManager.requestTrackingAuthorization { status in
    switch status {
    case .authorized:
        Qonversion.shared().collectAdvertisingId()
      
    // handle other states below
    }
}
```

```objectivec theme={null}
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
    switch (status) {
        case ATTrackingManagerAuthorizationStatusAuthorized:
            [[Qonversion sharedInstance] collectAdvertisingId];
            break;
        
        // handle other states if needed
        
        default:
          break;
    }
}];
```

```javascript Flutter theme={null}
Qonversion.getSharedInstance().collectAdvertisingId();
```

```javascript React Native theme={null}
Qonversion.getSharedInstance().collectAdvertisingId();
```

```csharp Unity theme={null}
Qonversion.GetSharedInstance().CollectAdvertisingId();
```

```javascript Cordova theme={null}
Qonversion.getSharedInstance().collectAdvertisingId();
```

```typescript Capacitor theme={null}
Qonversion.getSharedInstance().collectAdvertisingId();
```

## 5. (Optional) Set ASID (App set ID, Android 12+ only)

On Android 12+, you can provide an App set ID to have it used in <a href="/docs/integrations-overview" target="_blank" rel="noopener">Qonversion integrations</a>.

Add `com.google.android.gms:play-services-appset` as the dependency to your project and write the following code.

```java theme={null}
import com.qonversion.android.sdk.dto.properties.QUserPropertyKey;

final AppSetIdClient client = AppSet.getClient(context);
final Task<AppSetIdInfo> task = client.getAppSetIdInfo();
task.addOnSuccessListener(info -> {
    final String id = info.getId();
    Qonversion.getSharedInstance().setUserProperty(QUserPropertyKey.AppSetId, id);
});
```

```kotlin theme={null}
import com.qonversion.android.sdk.dto.properties.QUserPropertyKey

val client = AppSet.getClient(requireContext())
client.appSetIdInfo.addOnSuccessListener { info: AppSetIdInfo ->
    Qonversion.shared.setUserProperty(QUserPropertyKey.AppSetId, info.id)
}
```

```dart Flutter theme={null}
Qonversion.getSharedInstance().setUserProperty(QUserPropertyKey.appSetId, appSetId);
```

```javascript React Native theme={null}
Qonversion.getSharedInstance().setUserProperty(UserPropertyKey.APP_SET_ID, appSetId);
```

```csharp Unity theme={null}
Qonversion.GetSharedInstance().SetUserProperty(UserPropertyKey.AppSetId, appSetId);
```

```typescript Cordova theme={null}
Qonversion.getSharedInstance().setUserProperty(Qonversion.UserPropertyKey.APP_SET_ID, appSetId);
```

```typescript Capacitor theme={null}
Qonversion.getSharedInstance().setUserProperty(UserPropertyKey.APP_SET_ID, appSetId);
```
