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

# Unreal SDK

<img alt="Maven metadata URL" src="https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Fsdk-download.airbridge.io%2Funreal%2Fmetadata.xml&versionPrefix=4&label=Airbridge%20Unreal%20SDK" />

Install the Airbridge SDK and implement the necessary settings by following the steps below.

<h2 id="install-sdk">
  Install SDK
</h2>

<Note>
  The Airbridge Unreal SDK supports the Unreal Engine v.4.23 and later.
</Note>

The Airbridge Unreal SDK can be installed using the method below. After installation, you can confirm whether the SDK has been properly installed through the [Unreal SDK Test](/en/developers/testing-unity-sdk-v4).

1. Download the latest version of the [Airbridge Unreal SDK](https://sdk-download.airbridge.io/unreal/index.html?latest).

2. Create the `Plugins` folder in the root directory of your Unreal Engine project.

3. Locate the Airbridge Unreal SDK within the `Plugins` folder like in the following structure.

```
<YOUR_UE_PROJECT>
  ├── Plugins
          └── AirbridgeUnrealSDK
              ├── Resources
              ├── Source
              └── AirbridgeUnrealSDK.uplugin
```

4. Navigate to \[Settings]>\[Plugins] in the Unreal Engine toolbar and enable the Airbridge Unreal SDK.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/1J3gaHyw7IY6gp2d/images/ca4fk0iik512/64wTbT9XFm63vEUHy5mqMc/93f4888f7a6afa25f740461ce522d964/unreal-sdk-01.png?fit=max&auto=format&n=1J3gaHyw7IY6gp2d&q=85&s=1bd76ea2d766fd25b9a1a6a42928f0d6" alt="unreal-sdk-01" width="1920" height="367" data-path="images/ca4fk0iik512/64wTbT9XFm63vEUHy5mqMc/93f4888f7a6afa25f740461ce522d964/unreal-sdk-01.png" />
</Frame>

5. Add `AirbridgeUnreal` to the PublicDependencyModuleNames array within the app's Build.cs file (`<YOUR_UE_PROJECT>.Build.cs`).

```c# lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
public class <YOUR_UE_PROJECT> : ModuleRules
{
    public <YOUR_UE_PROJECT>(ReadOnlyTargetRules Target) : base(Target)
    {
        ...
        PublicDependencyModuleNames.AddRange(new string[] { ... , "AirbridgeUnreal" });   // ADD DEPENDENCY 
        ...
    }
}
```

<h3 id="install-restricted-sdk">
  Install Restricted SDK
</h3>

<div id="note" />

<Info>
  **Note**

  Install only one version of the SDK, either the general SDK or the restricted SDK.
</Info>

Depending on policies and environments, restrictions on collecting [device ID](/en/guides/identifiers)s like GAID and IDFA may be required. When installing the Restricted SDK version, the device IDs are not collected.

Install the Restricted SDK using the method below.

1. Download the latest version of the[ Airbridge Unreal SDK.](https://sdk-download.airbridge.io/unreal/index.html?latest-restricted)

2. Create a `Plugins` folder in the root directory of your Unreal Engine project.

3. Locate the Airbridge Unreal SDK within the `Plugins` folder like in the following structure.

```
<YOUR_UE_PROJECT>
  ├── Plugins
          └── AirbridgeUnrealSDK
              ├── Resources
              ├── Source
              └── AirbridgeUnrealSDK.uplugin
```

4. Navigate to \[Settings]>\[Plugins] in the Unreal Engine toolbar and enable the Airbridge Unreal SDK.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/1J3gaHyw7IY6gp2d/images/ca4fk0iik512/64wTbT9XFm63vEUHy5mqMc/93f4888f7a6afa25f740461ce522d964/unreal-sdk-01.png?fit=max&auto=format&n=1J3gaHyw7IY6gp2d&q=85&s=1bd76ea2d766fd25b9a1a6a42928f0d6" alt="unreal-sdk-01" width="1920" height="367" data-path="images/ca4fk0iik512/64wTbT9XFm63vEUHy5mqMc/93f4888f7a6afa25f740461ce522d964/unreal-sdk-01.png" />
</Frame>

5. Add `AirbridgeUnreal` to the PublicDependencyModuleNames array within the app's Build.cs file (`<YOUR_UE_PROJECT>.Build.cs`).

```c# lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
public class <YOUR_UE_PROJECT> : ModuleRules
{
    public <YOUR_UE_PROJECT>(ReadOnlyTargetRules Target) : base(Target)
    {
        ...
        PublicDependencyModuleNames.AddRange(new string[] { ... , "AirbridgeUnreal" });   // ADD DEPENDENCY 
        ...
    }
}
```

<h3 id="initialize-sdk">
  Initialize SDK
</h3>

Enter the correct App Name and App Token values in the [SDK Settings](#configure-sdk-settings) window. The App Name and App Token can be found on the **\[Settings]>\[Tokens]** page in the Airbridge dashboard.

<h3 id="configure-sdk-settings">
  Configure SDK settings
</h3>

1. Open the `Project Settings` window in the Unreal Engine.

2. Under the \[Plugins] section, click Airbridge Unreal SDK to open the SDK settings window. You may fill in the fields or click on the checkboxes that are necessary for your service.

3. After filling in the required fields, click the `Set as Default` button.

See below for a guide to the settings.

<Accordion title="References for configuring the SDK settings">
  <div style={{ overflowX: 'auto' }}>
    <table style={{ display: 'table' }}>
      <thead>
        <tr>
          <th>
            Value
          </th>

          <th>
            Reference
          </th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td>
            App Name
          </td>

          <td>
            [Initialize SDK](#initialize-sdk)<br />[Enable app launch with Airbridge deep links](#enable-app-launch-with-airbridge-deep-links)
          </td>
        </tr>

        <tr>
          <td>
            App Token
          </td>

          <td>
            [Initialize SDK](#initialize-sdk)
          </td>
        </tr>

        <tr>
          <td>
            Log Level
          </td>

          <td>
            [SDK Log Setting](#sdk-log-setting)
          </td>
        </tr>

        <tr>
          <td>
            iOS URI Scheme
          </td>

          <td>
            [Enable app launch with Airbridge deep links](#enable-app-launch-with-airbridge-deep-links)
          </td>
        </tr>

        <tr>
          <td>
            Android URI Scheme
          </td>

          <td>
            [Enable app launch with Airbridge deep links](#enable-app-launch-with-airbridge-deep-links)
          </td>
        </tr>

        <tr>
          <td>
            Custom Domain
          </td>

          <td>
            [Set up custom domain](#set-up-custom-domain)
          </td>
        </tr>

        <tr>
          <td>
            Session Timeout Seconds
          </td>

          <td>
            [Configure in-app event sessions](#configure-in-app-event-sessions)
          </td>
        </tr>

        <tr>
          <td>
            User Info Hash Enabled
          </td>

          <td>
            [Hash user information](#hash-user-information)
          </td>
        </tr>

        <tr>
          <td>
            Track Airbridge Link Only
          </td>

          <td>
            [Track Airbridge deep links only](#track-airbridge-deep-links-only)
          </td>
        </tr>

        <tr>
          <td>
            Auto Start Tracking Enabled
          </td>

          <td>
            [SDK Opt-In](#sdk-opt-in)<br />[SDK Opt-Out](#sdk-opt-out)
          </td>
        </tr>

        <tr>
          <td>
            Facebook Deferred App Link Enabled
          </td>

          <td>
            [Set Up Meta Deferred App Links](#set-up-meta-deferred-app-links)
          </td>
        </tr>

        <tr>
          <td>
            iOS Tracking Authorize Timeout Seconds
          </td>

          <td>
            [Configure ATT Prompt](#configure-att-prompt)
          </td>
        </tr>

        <tr>
          <td>
            SDK Signature Secret ID
          </td>

          <td>
            [SDK Signature](#sdk-signature)
          </td>
        </tr>

        <tr>
          <td>
            SDK Signature Secret
          </td>

          <td>
            [SDK Signature](#sdk-signature)
          </td>
        </tr>

        <tr>
          <td>
            Track In Session Life Cycle Event Enabled
          </td>

          <td>
            [Collect in-session lifecycle events](#collect-in-session-lifecycle-events)
          </td>
        </tr>

        <tr>
          <td>
            Clear Event Buffer On Initialize Enabled
          </td>

          <td>
            [Clear unsent in-app events](#clear-unsent-in-app-events)
          </td>
        </tr>

        <tr>
          <td>
            SDK Enabled
          </td>

          <td>
            [Initialize the Airbridge SDK in Deactivation Mode](#initialize-the-airbridge-sdk-in-deactivation-mode)
          </td>
        </tr>

        <tr>
          <td>
            Event Buffer Count Limit
          </td>

          <td>
            [Configure in-app event storage](#configure-in-app-event-storage)
          </td>
        </tr>

        <tr>
          <td>
            Event Buffer Size Limit In Gibibyte
          </td>

          <td>
            [Configure in-app event storage](#configure-in-app-event-storage)
          </td>
        </tr>

        <tr>
          <td>
            Event Transmit Interval Seconds
          </td>

          <td>
            [Configure in-app event transmission frequency](#configure-in-app-event-transmission-frequency)
          </td>
        </tr>

        <tr>
          <td>
            Meta Install Referrer (Facebook App ID)
          </td>

          <td>
            [Meta Install Referrer collection settings](#meta-install-referrer-collection-settings)
          </td>
        </tr>

        <tr>
          <td>
            Is Handle Airbridge Deeplink Only
          </td>

          <td>
            [Receive Airbridge Deep Link only](#receive-airbridge-deep-links-only)
          </td>
        </tr>

        <tr>
          <td>
            Calculate SKAdNetwork By Server Enabled
          </td>

          <td>
            [Calculating SKAdNetwork Conversion Value on the Server](#calculating-skadnetwork-conversion-value-on-the-server)
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</Accordion>

<h3 id="configure-att-prompt">
  Configure ATT Prompt
</h3>

<div id="note-2" />

<Info>
  **Note**

  The functions necessary to ensure compliance with privacy policies should be reviewed with legal counsel.
</Info>

In the iOS environment, the [IDFA](https://developer.apple.com/documentation/adsupport/asidentifiermanager/advertisingidentifier) can only be collected when users consent to data tracking through the [App Tracking Transparency (ATT)](https://developer.apple.com/app-store/user-privacy-and-data-use/) prompt.

Event collection should be delayed until the user allows tracking. If the install event is collected before the user allows tracking through the ATT prompt, the install event data will lack an identifier, making performance measurement difficult. We recommend setting a sufficient delay time for event collection to collect identifiers.

1. Prepare the text you will use in the ATT prompt.

2. Provide the ATT prompt following this [guide](https://developer.apple.com/documentation/apptrackingtransparency) provided by Apple.

3. If the install event is not collected, the Airbridge React Native SDK delays collecting install events for 30 seconds until the user allows tracking each time the app is launched. If the user exits the app before deciding whether to allow tracking, the SDK will not collect the install event and will try again at the next app launch.

In the [SDK settings](#configure-sdk-settings), configure the `iOS Tracking Authorize Timeout Seconds` to set a sufficient delay time for collecting install events. The default value is 30 seconds, and it can be set to up to 3600 seconds (1 hour).

<div id="attention" />

<Danger>
  **Attention**

  Set a sufficient delay time to collect the app install event. If the SDK collects install events before users can allow tracking on the ATT prompt, the IDFA won't be collected along with the install events.
</Danger>

<h3 id="opt-in-setup">
  Opt-in setup
</h3>

<div id="attention-2" />

<Info>
  **Attention**

  Optional settings. Configure only if necessary.
</Info>

The opt-in policy requires user consent before using user data.

After setting the `Auto Start Tracking Enabled` in the [SDK settings](#configure-sdk-settings) to `false`, call the `StartTracking` function at the time when you can collect events. The SDK will start collecting events when the `startTracking` function is called.

```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
FAirbridge::StartTracking();
```

<h3 id="opt-out-setup">
  Opt-out setup
</h3>

<div id="attention-3" />

<Info>
  **Attention**

  Optional settings. Configure only if necessary.
</Info>

The opt-out policy allows the use of user information until the user explicitly declines.

After setting the `Auto Start Tracking Enabled` in the [SDK settings](#configure-sdk-settings) to `true`, call the `StopTracking` function at the time when you can no longer collect events. The SDK will stop collecting events when the `stopTracking` function is called.

```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
FAirbridge::StopTracking();
```

<h3 id="sdk-signature">
  SDK Signature
</h3>

<div id="attention-4" />

<Info>
  **Attention**

  Optional settings. Configure only if necessary.
</Info>

With the SDK Signature, you can prevent SDK spoofing and use verified events to measure ad performance.

The SDK Signature credentials, which are the Secret ID and the Secret, are required for the SDK Signature setup. They can be found on the **\[Management]>\[Fraud Validation Rules]>\[SDK Signature]** page in the Airbridge dashboard. For more details on how to find the SDK Signature credentials, refer to this [Airbridge guide](/en/guides/sdk-signature).

Once you have the credentials, go to the [SDK settings](#configure-sdk-settings) and enter the Secret ID as sdkSignatureID and the Secret as `sdkSignatureSecret`.

<h2 id="deep-linking">
  Deep Linking
</h2>

[Deep linking allows you to redirect users from ads to specific locations within your app. The data collected from the tracking link enables you to monitor the performance of the deep link in Airbridge.](/en/guides/understanding-deep-link)

* [Understanding Tracking Links (User Guide)](/en/guides/understanding-tracking-link)
* [Understanding Deep Links (User Guide)](/en/guides/understanding-deep-link)

<h3 id="how-airbridge-deep-links-work">
  How Airbridge Deep Links work
</h3>

When a user clicks on the Airbridge tracking link, the scheme deep link embedded in the tracking link is converted into an Airbridge Deep Link, which can be either an HTTP deep link or a scheme deep link. This Airbridge Deep Link redirects the user to the desired app location. Then, the Airbridge SDK converts the Airbridge Deep Link back to the original scheme deep link embedded in the tracking link and passes it to the app.

* Example scheme deep link embedded in the tracking link: YOUR\_SCHEME://product/12345
* Examples of Airbridge Deep Links

  * HTTP deep link format 1: https<span>://</span>YOUR\_APP\_NAME.airbridge.io/\~\~\~
  * HTTP deep link format 2: https<span>://</span>YOUR\_APP\_NAME.abr.ge/\~\~\~
  * Scheme deep link format: YOUR\_SCHEME://product/12345?airbridge\_referrer=\~\~\~

When the app is installed on the device and the tracking link is clicked, the app opens through the Airbridge Deep Link. The Airbridge SDK converts the Airbridge Deep Link into the scheme deep embedded in the tracking link and passes it to the app.

When the app is not installed on the device and the tracking link is clicked, the Airbridge SDK saves the Airbridge Deep Link. After the user is redirected to the app store or website and the app is installed and launched, the Airbridge SDK converts the saved Airbridge Deep Link into the scheme deep link embedded in the tracking link and passes it to the app.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/Htx4FOCjbD1i8oed/images/ca4fk0iik512/1zFsKkUhhtquqQxMlTXiNm/fef1b56be608e57abea15b0b341acd45/AirbridgeDeeplinkSimpleStructure.drawio.png?fit=max&auto=format&n=Htx4FOCjbD1i8oed&q=85&s=af84ad3d507781bbcaa67fb51910c8f4" alt="Simple structure of Airbridge Deeplink" width="2216" height="748" data-path="images/ca4fk0iik512/1zFsKkUhhtquqQxMlTXiNm/fef1b56be608e57abea15b0b341acd45/AirbridgeDeeplinkSimpleStructure.drawio.png" />
</Frame>

<h3 id="set-up-deep-linking">
  Set up deep linking
</h3>

For the deep linking setup, the following information is required.

* Deep link information submitted in the Airbridge dashboard
* In-app location address for user redirection

First, submit the deep link information to the Airbridge dashboard.

<Accordion title="How to enter the deep link information into Airbridge dashboard">
  For the deep linking setup, the following information must be entered into the Airbridge dashboard.

  #### iOS

  * iOS URI scheme: The Airbridge Deep Link is converted to a scheme deep link using the iOS URI scheme.
  * iOS App ID: The universal link domain of the Airbridge Deep Link is set using the iOS App ID.

  #### Android

  * Android URI scheme: The Airbridge deep link is converted to a scheme deep link using the Android URI scheme. This information is necessary for the App Link and URI scheme.
  * Package name: This is the Android app identifier necessary for the App Link and URI scheme.
  * [Android sha256\_cert\_fingerprints](https://developer.android.com/training/app-links/verify-android-applinks): This is used for setting the App Link domain. This information is necessary for the App Link.

  <div id="attention-5" />

  <Danger>
    **Attention**

    To properly redirect users as intended, submit different information for the production app and the development app.
  </Danger>

  Follow the steps below to submit the necessary information to the Airbridge dashboard.

  #### iOS

  1. Navigate to **\[Tracking Link]>\[Deep Links]** in the Airbridge dashboard.

  2. Enter the iOS URI scheme in the **iOS URI Scheme** field. Include `://`. For example, if the iOS URI scheme is `demo`, enter `demo://`.

  3. In the [Apple Developer Dashboard](https://developer.apple.com/account/resources), navigate to **\[Identifier]** of the app you want to set up the deep link. Find the **App ID Prefix** and **Bundle ID**.

  4. The iOS App ID is in the format of `App ID Prefix+ . + Bundle ID`. Enter the iOS App ID into the **iOS App ID** field. For example, if the App ID Prefix is `prefix` and the Bundle ID is `example`, the iOS App ID is `prefix.example`.

  #### Android

  For apps that use Google Play's Play App Signing, Google's servers re-sign the APK after the developer uploads it. This changes the Android sha256\_cert\_fingerprints, so you must register the final signing value from the Google Play Console—not from your local keystore—for App Links to work correctly. Register the Android URI scheme, package name, and Android sha256\_cert\_fingerprints in Airbridge according to your signing method.

  <Tabs>
    <Tab title="Play App signing">
      1. Naviagate to **\[Tracking Link]>\[Deep Links]** in the Airbridge dashboard.
      2. Enter the Android URI scheme into the **Android URI Scheme** field. Include `://`. For example, if the URI scheme is `demo`, you must enter `demo://`.
      3. Enter the package name in the **Package name** field.
      4. Go to the Google Play Console and select your app.
      5. Navigate to **\[App integrity]**.
      6. Copy the SHA-256 certificate fingerprint from the **App signing key certificate** section.

               <div id="attention-6" />

               <Danger>
                 **Attention**

                 Make sure to copy from the correct section. This page contains two certificate entries:

                 * **App signing key certificate** ← Use this value
                 * **Upload key certificate** ← Do NOT use this value

                 These are two different values. Registering the upload key certificate will cause App Links to stop working.
               </Danger>
      7. Enter the SHA256 value into the **sha256\_cert\_fingerprints** field.
    </Tab>

    <Tab title="using original key">
      1. Naviagate to **\[Tracking Link]>\[Deep Links]** in the Airbridge dashboard.
      2. Enter the Android URI scheme into the **Android URI Scheme** field. Include `://`. For example, if the URI scheme is `demo`, you must enter `demo://`.
      3. Enter the package name in the **Package name** field.
      4. You need to find the sha256\_cert\_fingerprints. Run the following command from the keystore file you are deploying.

         ```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
         keytool -J-Duser.language=en -list -v -keystore YOUR_KEYSTORE.keystore
         ```
      5. Find the SHA256 value in the results. The SHA256 value is the  sha256\_cert\_fingerprints.

         ```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
         Certificate fingerprints:
             MD5:  4C:65:04:52:F0:3F:F8:65:08:D3:71:86:FC:EF:C3:49
             SHA1: C8:BF:B7:B8:94:EA:5D:9D:38:59:FE:99:63:ED:47:B2:D9:5A:4E:CC
             SHA256: B5:EF:4D:F9:DC:95:E6:9B:F3:9A:5E:E9:D6:E0:D8:F6:7B:AB:79:C8:78:67:34:D9:A7:01:AB:6A:86:01:0E:99
         ```
      6. Enter the SHA256 value into the **sha256\_cert\_fingerprints** field.
    </Tab>
  </Tabs>
</Accordion>

After entering the deep link information into the Airbridge dashboard, an additional setup is required to enable the following.

* App launch with Airbridge Deep Links
* Airbridge Deep Link event collection
* User redirection with Airbridge Deep Links

For detailed instructions, refer to the information below.

<AccordionGroup>
  <Accordion title="Enable app launch with Airbridge Deep Links">
    Perform the following setup to enable app launch with Airbridge Deep Links after the user clicks on a tracking link.

    #### iOS

    **Unreal setup**

    1. Navigate to [SDK settings](/en/developers/unity-sdk-v4#configure-sdk-settings) in Unity.
    2. Enter the iOS URI scheme that you entered on the **\[Tracking Link]>\[Deep Links]** page in the Airbridge dashboard into the `iOS URI Scheme` field.

    **Xcode setup**

    1. Navigate to **\[YOUR\_PROJECT]>\[Signing & Capabilities]** in Xcode.
    2. Click **+ Capability** to add Associated Domains.
    3. Add `applinks:YOUR_APP_NAME.airbridge.io` and `applinks:YOUR_APP_NAME.abr.ge` to Associated Domains. `YOUR_APP_NAME` is the [Airbridge App Name](/en/guides/default-app-settings#app-name).

    #### Android

    **Unreal setup**

    1. Navigate to [SDK settings](/en/developers/unity-sdk-v4#configure-sdk-settings) in Unity.
    2. Enter the Android URI scheme that you entered on the **\[Tracking Link]>\[Deep Links]** page in the Airbridge dashboard into the `Android URI Scheme` field. The App Name value in the [SDK settings](/en/developers/unity-sdk-v4#configure-sdk-settings) will be used to set up the App Links automatically.
  </Accordion>

  <Accordion title="Route users with collected Airbridge deep links">
    <div id="attention-7" />

    <Note>
      **Attention**

      Airbridge Unreal SDK versions earlier than 4.10.0 do not support deep link collection on Xcode 27. Airbridge Unreal SDK 4.10.0 or later is required to collect deep links on Xcode 27.
    </Note>

    To collect deep links from SceneDelegate on Xcode 27 or later, use the following code in the added SceneDelegate. Deep links collected with the code below are delivered to C++ through `FAirbridge::SetOnDeeplinkReceived([](const FString& Url)`.

    ```cpp lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    #import "AirbridgeIOSAppDelegate.h"

    - (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions
    {
        /* ... Scene Initialize Codes ... */

        [self airbridgePerformOnMainThread:^{
            if (@available(iOS 13.0, *)) {
                if (![scene isKindOfClass:[UIWindowScene class]]) {
                    [IOSAppDelegate trackDeeplinkWithConnectionOptions:connectionOptions];
                    return;
                }

                [IOSAppDelegate trackDeeplinkWithConnectionOptions:connectionOptions];
            }
        }];
    }

    - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts
    {
        [self airbridgePerformOnMainThread:^{
            if (@available(iOS 13.0, *)) {
                [IOSAppDelegate trackDeeplinkWithOpenURLContexts:URLContexts];
            }
        }];
    }

    - (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity
    {
        [self airbridgePerformOnMainThread:^{
            [IOSAppDelegate trackDeeplinkWithUserActivity:userActivity];
        }];
    }

    // Airbridge MainThread Helper functions
    - (void)airbridgePerformOnMainThread:(dispatch_block_t)block
    {
        if ([NSThread isMainThread]) {
            block();
            return;
        }

        dispatch_sync(dispatch_get_main_queue(), block);
    }
    ```
  </Accordion>

  <Accordion title="Redirect the user through the collected Airbridge Deep Link">
    * When the Airbridge Deep Link is executed, it is converted into a scheme deep link and passed to the `onDeeplinkReceived` callback. And if a deep link that is not an Airbridge Deep Link is executed, it is passed to the callback without being converted.
    * Use the received deep link to redirect the user to the intended destination.

    1. Navigate to `Content Browser > Add/Import > New C++ Class...` and specify the parent class as `Game Mode Base` to create a Game Mode Base class.

    2. Proceed with the deep link callback setup through the following method in the source code of the created Game Mode Base class.

    ```c ExampleGameModeBase.cpp lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    ...
    #include "AirbridgeUnreal.h"

    void AExampleGameModeBase::BeginPlay()
    {
        ...
        
        FAirbridge::SetOnDeeplinkReceived([](const FString& Url)
        {
            // show proper content using url
        });

        ...
    }
    ```

    3. In the Unreal Editor Project Settings window, navigate to `Project > Maps & Modes > Default Modes` and set the `Default GameMode` field value as the game mode after the deep link callback setup is completed.
  </Accordion>
</AccordionGroup>

<h3 id="set-up-deferred-deep-linking">
  Set up deferred deep linking
</h3>

When a user clicks on a tracking link with deferred deep linking capabilities and the app is not installed on the device, the Airbridge SDK collects the deep link as follows.

<Accordion title="How the Airbridge SDK collects deferred deep links">
  After initialization, the Airbridge SDK attempts to collect a deep link when all of the following conditions are met. When the app is closed before collection, the Airbridge SDK considers it as if there has not been an Airbridge Deep Link.

  * The `FAirbridge::StartTracking` function is called with the opt-in settings in place. Or, opt-in has not been set.
  * The user's response to the ATT prompt has been determined. Or, the event collection delay time configured regarding the ATT prompt has expired.
</Accordion>

Deferred deep links are automatically passed to [onDeeplinkReceived callback](/en/developers/unity-sdk-v4#redirect-the-user-through-the-collected-airbridge-deep-link), so no additional settings are required.

<h3 id="set-up-custom-domain">
  Set up custom domain
</h3>

<div id="attention-8" />

<Info>
  **Attention**

  Optional settings. Configure only if necessary.
</Info>

1. Enter the custom domain address into the Airbridge dashboard by referring to this [article](/en/guides/custom-domain)
2. In the [SDK Settings](#configure-sdk-settings), enter the custom domain address in the `Custom Domain`.

   <div id="attention-9" />

   <Danger>
     **Attention**

     The custom domain address you add to the SDK should be the same as the custom domain address entered into the Airbridge dashboard.
   </Danger>

<h2 id="in-app-events">
  In-app events
</h2>

The Airbridge SDK collects user actions from the app as per settings and sends them as in-app events.

* [Understanding Airbridge Events ](/en/guides/airbridge-event)

<h3 id="send-in-app-events">
  Send in-app events
</h3>

<div id="setting-up-a-hybrid-app" />

<Note>
  **Setting up a Hybrid App**

  You can set up the Unreal SDK to handle Airbridge-related work occurring on in-app websites in hybrid apps without changing the website code.

  * [Setting Up Hybrid App (v4)](/en/developers/hybrid-app-settings-unreal-sdk-v4)
</Note>

The `Airbridge.TrackEvent` function must be called to send events. Refer to the information below about the required  `Airbridge.TrackEvent` function components and their types.

```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
static void TrackEvent(
	const FString& Category,
	const UAirbridgeMap* SemanticAttributes = nullptr,
	const UAirbridgeMap* CustomAttributes = nullptr
);
```

| Name               | Required | Type          | Description                   |
| ------------------ | -------- | ------------- | ----------------------------- |
| category           | Required | String        | Name of the event             |
| semanticAttributes | Optional | UAirbridgeMap | Semantic attributes of events |
| customAttributes   | Optional | UAirbridgeMap | Custom attributes of events   |

Refer to the component definition and available strings below.

<AccordionGroup>
  <Accordion title="Event Category">
    The Standard Event Categories provided by the Airbridge SDK can be found in the AirbridgeCategory. You can also enter the Event Categories from the list of Standard Events.

    * [Lists of Standard Events](/en/guides/airbridge-event-types#list-of-standard-events)

    Custom events can be sent by entering the event name set in the [event taxonomy](/en/guides/airbridge-event-taxonomy).

    Refer to the example below.

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    // track standard event (provided by sdk)
    FAirbridge::TrackEvent(AirbridgeCategory::ORDER_COMPLETED);
    // track standard event (not provided by sdk)
    FAirbridge::TrackEvent("airbridge.ecommerce.order.canceled");
    // track custom event
    FAirbridge::TrackEvent("eventViewed");
    ```
  </Accordion>

  <Accordion title="Attributes">
    <div id="attention-10" />

    <Danger>
      **Attention**

      The Airbridge SDK v4 attributes differ from the previous version. The previous version's attributes do not include action, label, and value.
    </Danger>

    Additional information about the event can be collected using attributes.

    * Action, Label: Collect information that can be used as GroupBys in the Airbridge reports
    * Value: Collect information that can be used for sales analysis. Airbridge can perform calculations using the collected data.
    * Semantic Attribute: Collect predefined attributes by Airbridge.
    * Custom Attributes: Collect attributes defined by Airbridge users.

    In the `FAirbridge::TrackEvent` function, you can enter Action, Label, Value, and Semantic Attributes using the `semanticAttributes` parameter and Custom Attributes using the `customAttributes` parameter.

    The semantic attributes predefined by Airbridge can be found in the user guide below.

    * [List of semantic attributes](/en/guides/airbridge-event-elements#list-of-semantic-attributes)

    Please refer to the example below.

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    UAirbridgeList* Products = UAirbridgeList::CreateObject();
    UAirbridgeMap* PlasticHammer = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::PRODUCT_ID, 12345);
    Products->Add(PlasticHammer);

    UAirbridgeMap *SemanticAttributes = UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::ACTION, "Tool")
        ->Set(AirbridgeAttribute::LABEL, "Hammer")
        ->Set(AirbridgeAttribute::VALUE, 10)
        ->Set(AirbridgeAttribute::CURRENCY, "USD")
        ->Set(AirbridgeAttribute::PRODUCTS, Products)
        ->Set("totalQuantity", 1);

    UAirbridgeMap *CustomAttributes = UAirbridgeMap::CreateObject()
        ->Set("promotion", "FirstPurchasePromotion")

    FAirbridge::TrackEvent(
        "airbridge.ecommerce.order.canceled",
        SemanticAttributes,
        CustomAttributes
    );
    ```

    <div id="attention-11" />

    <Danger>
      **Attention**

      Semantic attributes and custom attributes only allow JSON as a data type.

      * JSON types: String, Number, Boolean, Object\<String, JSON>, Array\<JSON>
      * Types that cannot be used in semantic attributes and custom attributes: Struct, Class, etc.
    </Danger>
  </Accordion>
</AccordionGroup>

The standard event categories and semantic attributes provided by the SDK are as follows.

<AccordionGroup>
  <Accordion title="Event Category of Standard Events provided by the SDK (AirbridgeCategory)">
    | Key                     | Data                                     |
    | ----------------------- | ---------------------------------------- |
    | SIGN\_UP                | airbridge.user.signup                    |
    | SIGN\_IN                | airbridge.user.signin                    |
    | SIGN\_OUT               | airbridge.user.signout                   |
    | HOME\_VIEWED            | airbridge.ecommerce.home.viewed          |
    | PRODUCT\_LIST\_VIEWED   | airbridge.ecommerce.productList.viewed   |
    | SEARCH\_RESULTS\_VIEWED | airbridge.ecommerce.searchResults.viewed |
    | PRODUCT\_VIEWED         | airbridge.ecommerce.product.viewed       |
    | ADD\_PAYMENT\_INFO      | airbridge.addPaymentInfo                 |
    | ADD\_TO\_WISHLIST       | airbridge.addToWishlist                  |
    | ADDED\_TO\_CART         | airbridge.ecommerce.product.addedToCart  |
    | INITIATE\_CHECKOUT      | airbridge.initiateCheckout               |
    | ORDER\_COMPLETED        | airbridge.ecommerce.order.completed      |
    | ORDER\_CANCELED         | airbridge.ecommerce.order.canceled       |
    | START\_TRIAL            | airbridge.startTrial                     |
    | SUBSCRIBE               | airbridge.subscribe                      |
    | UNSUBSCRIBE             | airbridge.unsubscribe                    |
    | AD\_IMPRESSION          | airbridge.adImpression                   |
    | AD\_CLICK               | airbridge.adClick                        |
    | COMPLETE\_TUTORIAL      | airbridge.completeTutorial               |
    | ACHIEVE\_LEVEL          | airbridge.achieveLevel                   |
    | UNLOCK\_ACHIEVEMENT     | airbridge.unlockAchievement              |
    | RATE                    | airbridge.rate                           |
    | SHARE                   | airbridge.share                          |
    | SCHEDULE                | airbridge.schedule                       |
    | SPEND\_CREDITS          | airbridge.spendCredits                   |
  </Accordion>

  <Accordion title="Semantic Attributes provided by the SDK (AirbridgeAttribute)">
    | Key                                   | Data                            | Data type |
    | ------------------------------------- | ------------------------------- | --------- |
    | ACTION                                | action                          | string    |
    | LABEL                                 | label                           | string    |
    | VALUE                                 | value                           | float     |
    | CURRENCY                              | currency                        | string    |
    | PRODUCTS                              | products                        | array     |
    | PRODUCT\_ID                           | productID                       | string    |
    | PRODUCT\_NAME                         | name                            | string    |
    | PRODUCT\_PRICE                        | price                           | float     |
    | PRODUCT\_QUANTITY                     | quantity                        | int       |
    | PRODUCT\_CURRENCY                     | currency                        | string    |
    | PRODUCT\_POSITION                     | position                        | int       |
    | PRODUCT\_CATEGORY\_ID                 | categoryID                      | string    |
    | PRODUCT\_CATEGORY\_NAME               | categoryName                    | string    |
    | PRODUCT\_BRAND\_ID                    | brandID                         | string    |
    | PRODUCT\_BRAND\_NAME                  | brandName                       | string    |
    | PERIOD                                | period                          | string    |
    | IS\_RENEWAL                           | isRenewal                       | boolean   |
    | RENEWAL\_COUNT                        | renewalCount                    | int       |
    | PRODUCT\_LIST\_ID                     | productListID                   | string    |
    | CART\_ID                              | cartID                          | string    |
    | TRANSACTION\_ID                       | transactionID                   | string    |
    | TRANSACTION\_TYPE                     | transactionType                 | string    |
    | TRANSACTION\_PAIRED\_EVENT\_CATEGORY  | transactionPairedEventCategory  | string    |
    | TRANSACTION\_PAIRED\_EVENT\_TIMESTAMP | transactionPairedEventTimestamp | int       |
    | TOTAL\_QUANTITY                       | totalQuantity                   | int       |
    | QUERY                                 | query                           | string    |
    | IN\_APP\_PURCHASED                    | inAppPurchased                  | boolean   |
    | CONTRIBUTION\_MARGIN                  | contributionMargin              | float     |
    | LIST\_ID                              | listID                          | string    |
    | RATE\_ID                              | rateID                          | string    |
    | RATE                                  | rate                            | float     |
    | MAX\_RATE                             | maxRate                         | float     |
    | ACHIEVEMENT\_ID                       | achievementID                   | string    |
    | SHARED\_CHANNEL                       | sharedChannel                   | string    |
    | DATE\_TIME                            | datetime                        | string    |
    | DESCRIPTION                           | description                     | string    |
    | IS\_REVENUE                           | isRevenue                       | boolean   |
    | PLACE                                 | place                           | string    |
    | SCHEDULE\_ID                          | scheduleID                      | string    |
    | TYPE                                  | type                            | string    |
    | LEVEL                                 | level                           | string    |
    | SCORE                                 | score                           | float     |
    | AD\_PARTNERS                          | adPartners                      | array     |
    | IS\_FIRST\_PER\_USER                  | isFirstPerUser                  | boolean   |
  </Accordion>
</AccordionGroup>

Refer to the example codes for each type of data below.

```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
FAirbridge::TrackEvent(
    "event",
    UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::VALUE, 10),
    UAirbridgeMap::CreateObject()
        ->Set("string", "string")
        ->Set("number", 1000)
        ->Set("boolean", true)
        ->Set("object", UAirbridgeMap::CreateObject()->Set("key", "value"))
        ->Set("array", UAirbridgeList::CreateObject()->Add("value"))
);
```

<h3 id="additional-in-app-event-settings">
  Additional in-app event settings
</h3>

<div id="attention-12" />

<Info>
  **Attention**

  The default settings will apply if no additional settings are configured. Proceed after reviewing whether additional settings are necessary.
</Info>

Configure additional settings for sending in-app events if necessary.

<AccordionGroup>
  <Accordion title="Configure in-app event sessions">
    The Airbridge SDK includes session information when sending event data.

    When the app moves to the background or the process is terminated, the background entry time is recorded. When the app returns to the foreground or the process is restarted, the re-entry time is recorded. If the time difference between the last background entry and re-entry exceeds the session timeout, the previous session ends and a new session begins.

    The default session timeout is 300 seconds (5 minutes). In the [SDK settings](#configure-sdk-settings), you can configure `Session Timeout Seconds` up to 604,800 seconds (7 days).

    <div id="attention-13" />

    <Danger>
      **Attention**

      The Airbridge SDK collects Open events and Foreground events that initiate a new session. However, those events are not collected during a session. To collect them while the session is being maintained, [additional settings](#collect-in-session-lifecycle-events) are required.
    </Danger>
  </Accordion>

  <Accordion title="Configure in-app event transmission frequency">
    The default transmission interval is set to 0 seconds. In the [SDK settings](/en/developers/flutter-sdk-v4#configure-sdk-settings), you can adjust `Event Transmit Interval Seconds` to modify it to a maximum of 86,400 seconds (1 day).
  </Accordion>

  <Accordion title="Configure in-app event storage">
    The following table shows the default and maximum values for the number of events and storage size.

    |                       | Number of Events | Storage Size |
    | --------------------- | ---------------- | ------------ |
    | Default Value         | INT\_MAX         | 1024 GiB     |
    | Maximum Value Allowed | INT\_MAX         | 1024 GiB     |

    In the [SDK settings](#configure-sdk), If you want to limit the number of events the SDK stores, use the `Buffer Count Limit`, and to limit the storage size of the SDK, use the `Event Buffer Size Limit In Gibibyte`.
  </Accordion>

  <Accordion title="Clear unsent in-app events">
    When the event deletion option is activated, all in-app events that are not transmitted during the Airbridge SDK's initialization process are deleted. By default, the event deletion option is inactive.

    In the [SDK settings](/en/developers/flutter-sdk-v4#configure-sdk-settings), set `Clear Event Buffer On Initialize Enabled` to `true` to activate the event deletion option.
  </Accordion>

  <Accordion title="Configure device IDs">
    The Airbridge SDK supports functions to include device identifiers in all events for transmission.

    <div style={{ overflowX: 'auto' }}>
      <table style={{ display: 'table' }}>
        <thead>
          <tr>
            <th>
              Function
            </th>

            <th>
              Description
            </th>
          </tr>
        </thead>

        <tbody>
          <tr>
            <td>
              `FAirbridge::SetDeviceAlias`
            </td>

            <td>
              Adds additional device identifiers. Up to 10 identifiers can be entered.<br />- Key: Maximum 128 characters. It must satisfy the regular expression `^[a-zA-Z_][a-zA-Z0-9_]*$`.<br />- Value: Maximum 128 characters.
            </td>
          </tr>

          <tr>
            <td>
              `FAirbridge::RemoveDeviceAlias`
            </td>

            <td>
              Deletes only specified device identifiers.
            </td>
          </tr>

          <tr>
            <td>
              `FAirbridge::ClearDeviceAlias`
            </td>

            <td>
              Deletes all device identifiers.
            </td>
          </tr>
        </tbody>
      </table>
    </div>

    Refer to the example below.

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::SetDeviceAlias("string", "string");
    FAirbridge::RemoveDeviceAlias("string");
    FAirbridge::ClearDeviceAlias();
    ```
  </Accordion>
</AccordionGroup>

<h3 id="example-codes">
  Example Codes
</h3>

Airbridge collects in-app events that are classified as Standard Events and Custom Events. Standard Events are events predefined by Airbridge. Refer to the example codes below.

<AccordionGroup>
  <Accordion title="Sign Up, Sign In, Sign Out, Home viewed, Product list viewed">
    ###### Sign Up

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::SetUserID("string");
    FAirbridge::SetUserAlias("string", "string");
    FAirbridge::SetUserEmail("string");
    FAirbridge::SetUserPhone("string");
    FAirbridge::SetUserAttribute("string", "string");
    	
    FAirbridge::TrackEvent(AirbridgeCategory::SIGN_UP);
    ```

    ###### Sign In

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::SetUserID("string");
    FAirbridge::SetUserAlias("string", "string");
    FAirbridge::SetUserEmail("string");
    FAirbridge::SetUserPhone("string");
    FAirbridge::SetUserAttribute("string", "string");
    	
    FAirbridge::TrackEvent(AirbridgeConstant::AirbridgeCategory::SIGN_IN);
    ```

    ###### Sign Out

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(AirbridgeCategory::SIGN_OUT);
    	
    FAirbridge::ClearUser();
    ```

    ###### Home viewed

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(AirbridgeCategory::HOME_VIEWED);
    ```

    ###### Product list viewed

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::PRODUCT_LIST_VIEWED,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::LIST_ID, "84e6e236-38c4-48db-9b49-16e4cc064386")
        ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```
  </Accordion>

  <Accordion title="Search result viewed, Product viewed, Add payment info, Add to wishlist, Add to cart">
    ###### Search result viewed

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::SEARCH_RESULTS_VIEWED,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::QUERY, "Plastic")
        ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```

    ###### Product viewed

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::PRODUCT_VIEWED,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```

    ###### Add payment info

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::ADD_PAYMENT_INFO,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::TYPE, "CreditCard")
    );
    ```

    ###### Add to wishlist

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::ADD_TO_WISHLIST,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::LIST_ID, "189a2f8b-83ee-4074-8158-726be54e57d4")
        ->Set(AirbridgeAttribute::CURRENCY, "USD")
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```

    ###### Add to cart

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
    	AirbridgeCategory::ADDED_TO_CART,
    	UAirbridgeMap::CreateObject()
    	->Set(:AirbridgeAttribute::CART_ID, "421eaeb7-6e80-4694-933e-f2e1a55e9cbd")
    	->Set(AirbridgeAttribute::CURRENCY, "USD")
    	->Set(AirbridgeAttribute::PRODUCTS,
    		UAirbridgeList::CreateObject()
    		->Add(
    			UAirbridgeMap::CreateObject()
    			->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
    			->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
    			->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
    			->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
    			->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
    		)
    	)
    );
    ```
  </Accordion>

  <Accordion title="Initiate checkout, Order completed, Order canceled, Start trial, Subscribe, Unsubscribe">
    ###### Initiate checkout

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::INITIATE_CHECKOUT,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::TRANSACTION_ID, "0a7ee1ec-33da-4ffb-b775-89e80e75978a")
        ->Set(AirbridgeAttribute::CURRENCY, "USD")
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```

    ###### Order completed

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::ORDER_COMPLETED,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::VALUE, 11)
        ->Set(AirbridgeAttribute::TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5")
        ->Set(AirbridgeAttribute::CURRENCY, "USD")
        ->Set(AirbridgeAttribute::IN_APP_PURCHASED, true)
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```

    ###### Order canceled

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::ORDER_CANCELED,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::VALUE, 11)
        ->Set(AirbridgeAttribute::TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5")
        ->Set(AirbridgeAttribute::CURRENCY, "USD")
        ->Set(AirbridgeAttribute::IN_APP_PURCHASED, true)
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```

    ###### Start trial

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::START_TRIAL,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::TRANSACTION_ID, "ef1e5271-0370-407c-b1e9-669a8df1dc2c")
        ->Set(AirbridgeAttribute::CURRENCY, "USD")
        ->Set(AirbridgeAttribute::PERIOD, "P1M")
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "MusicStreamingMembership")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 15)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```

    ###### Subscribe

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::SUBSCRIBE,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::VALUE, 15)
        ->Set(AirbridgeAttribute::CURRENCY, "USD")
        ->Set(AirbridgeAttribute::TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649")
        ->Set(AirbridgeAttribute::PERIOD, "P1M")
        ->Set(AirbridgeAttribute::IS_RENEWAL, true)
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "MusicStreamingMembership")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 15)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```

    ###### Unsubscribe

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::UNSUBSCRIBE,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::VALUE, 15)
        ->Set(AirbridgeAttribute::CURRENCY, "USD")
        ->Set(AirbridgeAttribute::TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649")
        ->Set(AirbridgeAttribute::IS_RENEWAL, true)
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "MusicStreamingMembership")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 15)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```
  </Accordion>

  <Accordion title="Add impression, Ad click, Complete tutorial, Achieve level, Unlock achievement">
    ###### Add impression

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::AD_IMPRESSION,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::VALUE, 0.01)
        ->Set(AirbridgeAttribute::AD_PARTNERS, 
            UAirbridgeMap::CreateObject()
            ->Set("mopub",
                UAirbridgeMap::CreateObject()
                ->Set("app_version", "5.18.0")
                ->Set("adunit_id", "12345")
                ->Set("adunit_name", "12345")
                ->Set("adunit_format", "Banner")
                ->Set("id", "12345")
                ->Set("currency", "USD")
                ->Set("publisher_revenue", 12345.123)
                ->Set("adgroup_id", "12345")
                ->Set("adgroup_name", "12345")
                ->Set("adgroup_type", "12345")
                ->Set("adgroup_priority", "12345")
                ->Set("country", "kr")
                ->Set("precision", "publisher_defined")
                ->Set("network_name", "12345")
                ->Set("network_placement_id", "12345")
                ->Set("demand_partner_data", "12345")
            )
        )
    );
    ```

    ###### Ad click

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::AD_CLICK,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::VALUE, 0.01)
        ->Set(AirbridgeAttribute::AD_PARTNERS, 
            UAirbridgeMap::CreateObject()
            ->Set("mopub",
                UAirbridgeMap::CreateObject()
                ->Set("app_version", "5.18.0")
                ->Set("adunit_id", "12345")
                ->Set("adunit_name", "12345")
                ->Set("adunit_format", "Banner")
                ->Set("id", "12345")
                ->Set("currency", "USD")
                ->Set("publisher_revenue", 12345.123)
                ->Set("adgroup_id", "12345")
                ->Set("adgroup_name", "12345")
                ->Set("adgroup_type", "12345")
                ->Set("adgroup_priority", "12345")
                ->Set("country", "kr")
                ->Set("precision", "publisher_defined")
                ->Set("network_name", "12345")
                ->Set("network_placement_id", "12345")
                ->Set("demand_partner_data", "12345")
            )
        )
    );
    ```

    ###### Complete tutorial

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::COMPLETE_TUTORIAL,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::DESCRIPTION, "Finish Initial Tutorial")
    );
    ```

    ###### Achieve level

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::ACHIEVE_LEVEL,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::LEVEL, 13)
    );
    ```

    ###### Unlock achievement

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::UNLOCK_ACHIEVEMENT,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::ACHIEVEMENT_ID, "36a0f0bb-b153-4be1-a3e0-3cb5b2b076c1")
        ->Set(AirbridgeAttribute::DESCRIPTION, "Get Score Over 50")
        ->Set(AirbridgeAttribute::SCORE, 80)
    );
    ```
  </Accordion>

  <Accordion title="Rate, Share, Schedule, Spend credits">
    ###### Rate

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::RATE,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::RATE_ID, "531c64b3-4704-4780-a306-89014ec18daf")
        ->Set(AirbridgeAttribute::RATE, 4.5)
        ->Set(AirbridgeAttribute::MAX_RATE, 5)
        ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```

    ###### Share

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::SHARE,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::DESCRIPTION, "Share Promotion")
        ->Set(AirbridgeAttribute::SHARED_CHANNEL, "CopyLink")
    );
    ```

    ###### Schedule

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::SCHEDULE,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::SCHEDULE_ID, "75712915-2cd9-4e42-a85e-8d42f356f4c6")
        ->Set(AirbridgeAttribute::DATE_TIME, "2024-01-01T00:00:00+00:00")
        ->Set(AirbridgeAttribute::PLACE, "ConferenceRoom")
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "abb3e65d-17bc-4b28-89e3-5e356c0ea697")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "ConferenceRoom")
            )
        )
    );
    ```

    ###### Spend credits

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::TrackEvent(
        AirbridgeCategory::SPEND_CREDITS,
        UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::TRANSACTION_ID, "22eb193d-be11-4fe4-95da-c91a196faf1c")
        ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
        ->Set(AirbridgeAttribute::PRODUCTS,
            UAirbridgeList::CreateObject()
            ->Add(
                UAirbridgeMap::CreateObject()
                ->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
                ->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
                ->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
                ->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
                ->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
            )
        )
    );
    ```
  </Accordion>
</AccordionGroup>

Custom Events are events defined by Airbridge users to track user actions that are unique to their services. Refer to the example code below.

```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
FAirbridge::TrackEvent(
    "event",
    UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::VALUE, 10),
    UAirbridgeMap::CreateObject()
        ->Set("string", "string")
        ->Set("number", 1000)
        ->Set("boolean", true)
        ->Set("object", UAirbridgeMap::CreateObject()->Set("key", "value"))
        ->Set("array", UAirbridgeList::CreateObject()->Add("value"))
);
```

<h2 id="user-data">
  User Data
</h2>

Airbridge sends user data along with events. User data allows for a more accurate ad performance measurement.

<h3 id="set-user-id">
  Set User ID
</h3>

User IDs refer to the user identifier used in a service. User IDs should be unique IDs that can identify unique users across websites and apps.

<div style={{ overflowX: 'auto' }}>
  <table style={{ display: 'table' }}>
    <thead>
      <tr>
        <th width="140px">
          Function
        </th>

        <th width="240px">
          Description
        </th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>
          `FAirbridge::SetUserID`
        </td>

        <td>
          Inputs the user ID.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::ClearUserID`
        </td>

        <td>
          Deletes the user ID.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::SetUserAlias`
        </td>

        <td>
          Adds additional user identifiers. Up to 10 items can be added.<br />- key: Up to 128 characters. Must follow the regular expression `^[a-zA-Z_][a-zA-Z0-9_]*$`.<br />- value: Up to 1024 characters.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::RemoveUserAlias`
        </td>

        <td>
          Deletes only specified identifiers.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::ClearUserAlias`
        </td>

        <td>
          Deletes all additional user identifiers.
        </td>
      </tr>
    </tbody>
  </table>
</div>

Refer to the example below.

```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
// ID
FAirbridge::SetUserID("testID");

// Alias
FAirbridge::SetUserAlias("ADD_YOUR_KEY", "ADD_YOUR_VALUE");
FAirbridge::RemoveUserAlias("DELETE_THIS_KEY");
FAirbridge::ClearUserAlias();
```

<h3 id="send-additional-user-information">
  Send additional user information
</h3>

<div id="attention-14" />

<Danger>
  **Attention**

  Sensitive user information may be included. Send after a thorough review with a legal advisor.
</Danger>

Refer to the functions below to send additional user information.

<div style={{ overflowX: 'auto' }}>
  <table style={{ display: 'table' }}>
    <thead>
      <tr>
        <th width="140px">
          Function
        </th>

        <th width="240px">
          Description
        </th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>
          `FAirbridge::SetUserEmail`
        </td>

        <td>
          Inputs user's email. The data is hashed using SHA256.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::ClearUserEmail`
        </td>

        <td>
          Deletes the user email.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::SetUserPhone`
        </td>

        <td>
          Inputs user's phone number.  The data is hashed using SHA256.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::ClearUserPhone`
        </td>

        <td>
          Deletes the user's phone number.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::SetUserAttribute`
        </td>

        <td>
          Adds additional user attributes. Up to 100 items can be added.<br />- key: Up to 128 characters. Must satisfy the regular expression: `^[a-zA-Z_][a-zA-Z0-9_]*$`.<br />- value: Only supports string, number, and Boolean types. Up to 1024 characters.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::RemoveUserAttribute`
        </td>

        <td>
          Deletes only specified attributes from the additional attributes.
        </td>
      </tr>

      <tr>
        <td>
          `FAirbridge::ClearUserAttributes`
        </td>

        <td>
          Deletes all additional user attributes.
        </td>
      </tr>
    </tbody>
  </table>
</div>

Refer to the example below.

```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
FAirbridge::SetUserEmail("testID@ab180.co");
FAirbridge::SetUserPhone("821012341234");

// Attributes
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1L);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1f);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1.0);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", "1");
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", true);
FAirbridge::RemoveUserAttribute("DELETE_THIS_KEY");
FAirbridge::ClearUserAttributes();
```

<h4 id="hash-user-information">
  Hash user information
</h4>

When `User Info Hash Enabled` is set to `false` in the [SDK settings](#configure-sdk-settings), user emails and phone numbers are passed without being hashed. The default setting is `true`.

<h3 id="reset-user-information">
  Reset User Information
</h3>

You can initialize user information with the `FAirbridge::ClearUser` function.

<div id="attention-15" />

<Info>
  **Attention**

  Optional settings. Configure only if necessary.
</Info>

<h3 id="include-user-information-in-install-open-events">
  Include User Information in Install/Open Events
</h3>

The SDK automatically sends install and open events immediately after the app launches. Therefore, if you call user information functions right after the app launches, the user information may not be included in the install/open events depending on the event transmission timing.

To ensure user information is included in install/open events, control the timing of event transmission through [Opt-In setup](#opt-in-setup).

Implement in the following order:

1. Set the `Auto Start Tracking Enabled` option to `false` when [Configure SDK settings](#configure-sdk-settings).
2. Call user information functions to set user information.
3. Call the `startTracking()` function to start event collection.

<h2 id="additional-sdk-settings">
  Additional SDK Settings
</h2>

Follow the instructions below for additional setup.

<div id="attention-16" />

<Info>
  **Attention**

  Optional settings. Configure only if necessary.
</Info>

<h3 id="calculating-skadnetwork-conversion-value-on-the-server">
  Calculating SKAdNetwork Conversion Value on the Server
</h3>

By default, the ConversionValue in SKAdNetwork is calculated using the values from the SDK. If you want to measure events collected server-side through SKAN instead of the SDK, set the `calculateSKAdNetworkByServerEnabled` option to `true`.

<div id="attention-17" />

<Danger>
  **Attention**

  If you are currently using conversion values calculated by the SDK via SKAdNetwork, please exercise caution when making changes. Altering the conversion value calculation method may cause inconsistencies between existing and new data.
</Danger>

<h3 id="restricting-identifier-tracking">
  Restricting Identifier Tracking
</h3>

You can prevent the SDK from collecting certain identifier data.

<AccordionGroup>
  <Accordion title="Restricting Identifiers During SDK Initialization">
    <div id="note-3" />

    <Info>
      **Note**

      Airbridge Unreal SDK v.4.7.0 or later is required.
    </Info>

    In [SDK settings](#configure-sdk-settings), set the `Tracking Blocklist` to specify which identifiers should be blocked. Events collected after this configuration will exclude the specified identifiers.

    Check the restricted data in the identifier restriction list.
  </Accordion>

  <Accordion title="Restricting Identifiers During SDK runtime">
    <div id="attention-18" />

    <Note>
      **Attention**

      Airbridge Unreal SDK v.4.9.0 or later is required.
    </Note>

    While the SDK is running, you can use the `AllowTrackingItem` and `BlockTrackingItem` functions to set the data to be restricted. The specified identifier items will be excluded or included. This does not affect events that have already been stored.

    ```cpp lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    	static void BlockTrackingItem(const EAirbridgeTrackingBlocklist Item);

    	static void AllowTrackingItem(const EAirbridgeTrackingBlocklist Item);
    ```

    Check the restricted data in the identifier [restriction list](#identifier-restriction-list).
  </Accordion>

  <Accordion title="Identifier Restriction List">
    An identifier restriction list is provided through AirbridgeTrackingBlocklist.

    | Identifier  | Platform | **Description**                                                                          |
    | ----------- | -------- | ---------------------------------------------------------------------------------------- |
    | IDFA        | iOS      | Restricts the collection of IDFA.                                                        |
    | IDFV        | iOS      | Restricts the collection of IDFV.                                                        |
    | SKAdNetwork | iOS      | Even if SKAdNetwork calculation is performed, the SKAdNetwork value will not be updated. |
    | GAID        | Android  | Restricts the collection of GAID(Google Advertising ID).                                 |
    | OAID        | Android  | Restricts the collection of OAID(Huawei Advertising ID).                                 |
    | FAID        | Android  | Restricts the collection of FAID(FireOS Advertising ID).                                 |
    | AppSetID    | Android  | Restricts the collection of Google Play App Set ID.                                      |
  </Accordion>
</AccordionGroup>

<h3 id="sdk-settings-by-build-settings">
  SDK settings by build settings
</h3>

<div id="note-4" />

<Info>
  **Note**

  Airbridge Unreal SDK 4.5.0 or later is required.
</Info>

You can apply different SDK settings per build setting.

Activate the `Use Development Airbridge Settings` or `Use Production Airbridge Settings` option, depending on your build setting to configure the SDK accordingly.

If the `Use Development Airbridge Settings` or `Use Production Airbridge Settings` option is inactive, the SDK settings are set to the `Default` settings.

* When the **Use Development Airbridge Settings** is activated and your app is on development Debug, Development, or Test setting, the SDK settings are set to the Development settings.

  <Frame>
    <img src="https://mintcdn.com/airbridge-help-center/1J3gaHyw7IY6gp2d/images/ca4fk0iik512/6I6PcpptwtbPCqWxuqzyHb/2260fc0648238bb960b080dc7e0aec6c/Screenshot_2025-05-30_at_11.59.20_AM.png?fit=max&auto=format&n=1J3gaHyw7IY6gp2d&q=85&s=9d0cc9efff741ef71ce78e2023a9ae37" alt="unreal-sdk-03" width="1320" height="1135" data-path="images/ca4fk0iik512/6I6PcpptwtbPCqWxuqzyHb/2260fc0648238bb960b080dc7e0aec6c/Screenshot_2025-05-30_at_11.59.20_AM.png" />
  </Frame>
* When the **Use Production Airbridge Settings** is activated and your app is on production Shipping setting, the SDK settings are set to the Production settings.

<h3 id="integrate-google-s-icm-attribution-data">
  Integrate Google's ICM attribution data
</h3>

<div id="attention-19" />

<Info>
  **Attention**

  React Native SDK v.4.4.0 or later is required.
</Info>

[Integrated Conversion Measurement (ICM)](https://support.google.com/google-ads/answer/16203286) is Google’s privacy-driven solution for filling in conversion tracking gaps caused by stricter tracking limitations. Google provides the ICM attribution data, which is the non-deterministic attribution data provided by Google's privacy-preserving conversion modeling.

To integrate the ICM attribution data, the Google's On-Device Conversion Measurement (ODM) SDK must be installed. For detailed information, refer to this [article](https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement). or contact Google.

<h3 id="create-tracking-links-within-the-app">
  Create tracking links within the app
</h3>

<Info>
  Airbridge Unreal SDK v.4.3.0 or later is required.
</Info>

Tracking links are links that are embedded to ads for data collection. When users click on the ad, the tracking link is used to pass the touchpoint data to Airbridge, allowing for ad attribution.

Also, users who click on the ad with a tracking link can be redirected to a specific destination.

Use the `CreateTrackingLink` function to create tracking links. Refer to the code examples and the parameter details below.

```c c++ lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
void FAirbridge::CreateTrackingLink(
    const FString& Channel,
    const UAirbridgeMap* Option,
    const AirbridgeTrackingLinkParamFunction& OnSuccess,
    const AirbridgeStringParamFunction& OnFailure
)
```

| Name      | Required or Optional | Type                                            | Description                              |
| --------- | -------------------- | ----------------------------------------------- | ---------------------------------------- |
| Channel   | 필수                   | FString                                         | The ad channel the tracking link is used |
| Option    | 필수                   | UAirbridgeMap\*                                 | Options for creating tracking links      |
| OnSuccess | 필수                   | TFunction\<void(const FAirbridgeTrackingLink&)> | Success callback                         |
| OnFailure | 선택                   | TFunction\<void(const FString&)>                | Fail callback                            |

Use the `Option` parameter in the `CreateTrackingLink` function to configure tracking link options.

<Accordion title="Create trackingLink option">
  <div style={{ overflowX: 'auto' }}>
    <table style={{ display: 'table' }}>
      <thead>
        <tr>
          <th>
            Key
          </th>

          <th>
            Type
          </th>

          <th>
            Description
          </th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td>
            AirbridgeTrackingLinkOption::CAMPAIGN
          </td>

          <td>
            String
          </td>

          <td>
            The campaign credited with the winning touchpoint or conversion.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::AD\_GROUP
          </td>

          <td>
            String
          </td>

          <td>
            The ad group credited with the winning touchpoint or conversion.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::AD\_CREATIVE
          </td>

          <td>
            String
          </td>

          <td>
            The ad creative credited with the winning touchpoint or conversion.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::CONTENT
          </td>

          <td>
            String
          </td>

          <td>
            The content credited with the winning touchpoint or conversion.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::TERM
          </td>

          <td>
            String
          </td>

          <td>
            The search term credited with the winning touchpoint or conversion.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::SUB\_ID
          </td>

          <td>
            String
          </td>

          <td>
            The sub publisher that generated the touchpoint.<br />Sub media values are usually provided by predefined "integrated" channels.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::SUB\_ID\_1
          </td>

          <td>
            String
          </td>

          <td>
            The 1st level sub-sub publisher that generated the touchpoint.<br />Sub media values are usually provided by predefined "integrated" channels.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::SUB\_ID\_2
          </td>

          <td>
            String
          </td>

          <td>
            The 2nd level sub-sub publisher that generated the touchpoint.<br />Sub media values are usually provided by predefined "integrated" channels.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::SUB\_ID\_3
          </td>

          <td>
            String
          </td>

          <td>
            The 3rd level sub-sub publisher that generated the touchpoint.<br />Sub media values are usually provided by predefined "integrated" channels.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::DEEPLINK\_URL
          </td>

          <td>
            (Custom Scheme URL String)
          </td>

          <td>
            Deeplink URL
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::DEEPLINK\_STOPOVER
          </td>

          <td>
            Boolean
          </td>

          <td>
            Deeplink 의 스탑오버 기능 활성화 여부<br />true : 활성화<br />false : 비활성화
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::FALLBACK\_IOS
          </td>

          <td>
            ("store" | Web URL String)
          </td>

          <td>
            ios fallback when app is not installed
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::FALLBACK\_ANDROID
          </td>

          <td>
            ("store" | Web URL String)
          </td>

          <td>
            android fallback when app is not installed
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::FALLBACK\_DESKTOP
          </td>

          <td>
            (Web URL String)
          </td>

          <td>
            desktop fallback when app is not installed
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::FALLBACK\_IOS\_STORE\_PPID
          </td>

          <td>
            String
          </td>

          <td>
            he ppid for the Custom Product Page in the Apple App Store.<br />Enable the custom product page to be shown when landing in the App Store.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::FALLBACK\_ANDROID\_STORE\_LISTING
          </td>

          <td>
            String
          </td>

          <td>
            The Custom Store Listing listing value for the Google Play Store.<br />Enables the display of your custom store listing when landing on the Google Play Store.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::OGTAG\_TITLE
          </td>

          <td>
            String
          </td>

          <td>
            `og:title` for tracking link
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::OGTAG\_DESCRIPTION
          </td>

          <td>
            String
          </td>

          <td>
            `og:description` for tracking link
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::OGTAG\_IMAGE\_URL
          </td>

          <td>
            (Web URL String)
          </td>

          <td>
            `og:image` for tracking link
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::OGTAG\_WEBSITE\_CRAWL
          </td>

          <td>
            ("desktop")
          </td>

          <td>
            When the tracking link is shared, the social media platform directly crawls the Open Graph of the desktop URL specified in fallbackPaths and uses it for the social share preview. Dynamic URLs are also supported, and any change to the Open Graph is reflected automatically from the next time the link is shared. The values set for title, description, and imageUrl will be ignored.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::CUSTOM\_SHORT\_ID
          </td>

          <td>
            String
          </td>

          <td>
            Configure the short ID of tracking links depending on your campaign or contents.<br />If not passed, a random short ID will be generate, and can not be changed once generated.
          </td>
        </tr>

        <tr>
          <td>
            AirbridgeTrackingLinkOption::IS\_REENGAGEMENT
          </td>

          <td>
            ("off" | "on\_true" | "on\_false")
          </td>

          <td>
            Configure the Re-engagement parameter. The Re-engagement parameter has three options.<br />off: OFF is the default setting. The touchpoint can be attributed to both install events and post-install events (in-app events).<br />on\_true: ON-TRUE is used for re-engagement campaigns for installed users. The touchpoint generated by the tracking link is attributed only to the deeplink open and the following in-app events, not to the install event.<br />on\_false: ON-FALSE is used for user acquisition campaigns targeting uninstalled users. The touchpoint generated by the tracking link is attributed only to the install event and the following in-app events, not to the 'deeplink open' event.
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</Accordion>

Use the `OnSuccess` callback in the `CreateTrackingLink` function to pass the `FAirbridgeTrackingLink`.

```c c++ lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
struct FAirbridgeTrackingLink
{
    FString ShortURL;
    FString QrcodeURL;
};
```

| Name      | Type    | Description                          |
| --------- | ------- | ------------------------------------ |
| ShortURL  | FString | The short URL of the tracking link   |
| QrcodeURL | FString | The QR code URL of the tracking link |

Refer to the example codes below.

<AccordionGroup>
  <Accordion title="Create tracking links that launch the app or redirect users to the app store">
    ```c c++ lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::CreateTrackingLink(
        TEXT("test_channel"),
        UAirbridgeMap::CreateObject()
            ->Set(AirbridgeTrackingLinkOption::CAMPAIGN, TEXT("test_campaign"))
            ->Set(AirbridgeTrackingLinkOption::DEEPLINK_URL, TEXT("YOUR_SCHEME://..."))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_IOS, TEXT("store"))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_ANDROID, TEXT("store"))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_DESKTOP, TEXT("https://example.com/")),
        [](const FAirbridgeTrackingLink& TrackingLink)
        {

        },
        [](const FString& Error)
        {
            
        }
    );
    ```
  </Accordion>

  <Accordion title="Create tracking links that launch the app or redirect users to a webpage">
    ```c c++ lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::CreateTrackingLink(
        TEXT("test_channel"),
        UAirbridgeMap::CreateObject()
            ->Set(AirbridgeTrackingLinkOption::CAMPAIGN, TEXT("test_campaign"))
            ->Set(AirbridgeTrackingLinkOption::DEEPLINK_URL, TEXT("sample://home"))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_IOS, TEXT("https://example.com/"))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_ANDROID, TEXT("https://example.com/"))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_DESKTOP, TEXT("https://example.com/")),
        [](const FAirbridgeTrackingLink& TrackingLink)
        {

        },
        [](const FString& Error)
        {
            
        }
    );
    ```
  </Accordion>

  <Accordion title="Create tracking links that redirect users to the app store only">
    ```c c++ lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::CreateTrackingLink(
        TEXT("test_channel"),
        UAirbridgeMap::CreateObject()
            ->Set(AirbridgeTrackingLinkOption::CAMPAIGN, TEXT("test_campaign"))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_IOS, TEXT("store"))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_ANDROID, TEXT("store"))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_DESKTOP, TEXT("https://example.com/")),
        [](const FAirbridgeTrackingLink& TrackingLink)
        {

        },
        [](const FString& Error)
        {
            
        }
    );
    ```
  </Accordion>

  <Accordion title="Create tracking links that redirect users to a webpage only">
    ```c c++ lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::CreateTrackingLink(
        TEXT("test_channel"),
        UAirbridgeMap::CreateObject()
            ->Set(AirbridgeTrackingLinkOption::CAMPAIGN, TEXT("test_campaign"))
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_IOS, TEXT("https://example.com/")),
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_ANDROID, TEXT("https://example.com/")),
            ->Set(AirbridgeTrackingLinkOption::FALLBACK_DESKTOP, TEXT("https://example.com/")),
        [](const FAirbridgeTrackingLink& TrackingLink)
        {

        },
        [](const FString& Error)
        {
            
        }
    );
    ```
  </Accordion>
</AccordionGroup>

<h3 id="receive-airbridge-deep-links-only">
  Receive Airbridge Deep Links only
</h3>

The deep links passed through the `AFAirbridge::SetOnDeeplinkReceived` method of the Airbridge Unreal SDK include not only Airbridge Deep Links but also deep links from other solutions.

```c ExampleGameModeBase.cpp lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
...
#include "AirbridgeUnreal.h"

void AExampleGameModeBase::BeginPlay()
{
    ...
    
    FAirbridge::SetOnDeeplinkReceived([](const FString& Url)
    {
        // show proper content using url
    });

    ...
}
```

By setting `Is Handle Airbridge Deeplink Only` to `true` in the [SDK settings](#configure-sdk-settings), only Airbridge Deep Links will be passed to the `onDeeplinkReceived` callback.  In this way, you can handle the deep links from other solutions separately from the Airbridge Deep Links.

<h3 id="use-tracking-links-within-the-app">
  Use tracking links within the app
</h3>

Depending on how the link is opened, it may be difficult to properly utilize the app's tracking link in-app.

The `FAirbridge::Click` function or `FAirbridge::Impression` function allows you to utilize tracking links normally, bypassing the external browser.

<AccordionGroup>
  <Accordion title="When the user clicks a tracking link within the app">
    When a user clicks on the tracking link in the app, call the `FAirbridge::Click` function. Depending on the tracking link settings, the scheme deep link is passed, or the user is redirected to the app store or website.

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::Click(
        "https://abr.ge/~~~",
        []()
        {
            // when url is tracking link and succeed
        },
        [](const FString& Error)
        {
            // when url is tracking link and failed
            // example: url is another app's tracking link, internet is not connected
        }
    );
    ```
  </Accordion>

  <Accordion title="When the user views a tracking link within the app">
    When a user is impressed to the tracking link, call the `FAirbridge::Impression` function. Calling this function collects Impression event data.

    ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    FAirbridge::Impression(
        "https://abr.ge/~~~",
        []()
        {
            // when url is tracking link and succeed
        },
        [](const FString& Error)
        {
            // when url is tracking link and failed
            // example: url is another app's tracking link, internet is not connected
        }
    );
    ```
  </Accordion>
</AccordionGroup>

<div id="attention-20" />

<Danger>
  **Attention**

  When you set up the Airbridge SDK to use tracking links within apps, every time a tracking link is used within the app, Deeplink Pageviews are aggregated as [Target Events](/en/guides/airbridge-attribution-model#target-events). The deep link performance may be affected when Deeplink Pageviews occur frequently right after Deeplink Opens.

  The attribution window for Deeplink Pageviews is set to 3 days by default. If you want to change the attribution window for Deeplink Pageviews, contact your Airbridge CSM. If you don't have a designated CSM, contact the [Airbridge Help Center](https://app.airbridge.io/supports).
</Danger>

<h3 id="get-attribution-results">
  Get attribution results
</h3>

<div id="attention-21" />

<Danger>
  **Attention**

  It takes some time for the Airbridge SDK to collect attribution results. We do not recommend using attribution results for functionalities requiring real-time processing.
</Danger>

You can receive attribution results for installation events through the `FAirbridge::SetOnAttributionReceived`function.

```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
static void OnReceived(TMap<FString, FString> Attribution) {  }

void SomeFunction() 
{ 
    FAirbridge::SetOnAttributionReceived(OnReceived);
}
```

The value is delivered as follows, depending on the existence of attribution results.

<AccordionGroup>
  <Accordion title="When the attribution result exists">
    If the attribution result exists, a dictionary including the values below will be passed to the callback. All keys provide the attribution data. For example, `attributedChannel` contains information about the ad channel to which the ad performance is attributed.

    The attribution results are passed to the callback within 1 minute after SDK initialization. If the app is closed before the attribution result is passed, the previous attribution results will be passed to the callback within 1 minute the next time the app is launched. Depending on network conditions and other factors, there may be a delay of up to 5 minutes.

    | Key                        | Type   | Description         |
    | -------------------------- | ------ | ------------------- |
    | attributedChannel          | String | Channel             |
    | attributedCampaign         | String | Campaign            |
    | attributedAdGroup          | String | Ad Group            |
    | attributedAdCreative       | String | Ad Creative         |
    | attributedContent          | String | Content             |
    | attributedTerm             | String | Keyword             |
    | attributedSubPublisher     | String | Sub Publisher       |
    | attributedSubSubPublisher1 | String | Sub Sub Publisher 1 |
    | attributedSubSubPublisher2 | String | Sub Sub Publisher 2 |
    | attributedSubSubPublisher3 | String | Sub Sub Publisher 3 |
  </Accordion>

  <Accordion title="When no attribution result exists (Organic)">
    If there is no attribution result, the following dictionary will be sent to the callback.

    ```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    {
        "attributedChannel": "unattributed"
    }
    ```
  </Accordion>
</AccordionGroup>

<h3 id="tracking-deeplink-opens-with-push-notifications">
  Tracking Deeplink Opens with Push Notifications
</h3>

<div id="attention-22" />

<Danger>
  **Attention**

  Apply the code below using a custom iOS AppDelegate.
</Danger>

After the push notification is clicked, you need to pass the deep link information in the payload to the Airbridge SDK to collect the deep link event. Set up the `FAirbridge::trackDeeplink` function.

<h4 id="ios-4">
  iOS
</h4>

Add the code below to your custom AppDelegate.

<CodeGroup>
  ```c SomeAppDelegate.mm lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <Foundation/Foundation.h>
  #import <UIKit/UIKit.h>
  #import <Airbridge/Airbridge.h>
  #import <UserNotifications/UserNotifications.h>

  @interface SomeAppDelegate : NSObject <UIApplicationDelegate, UNUserNotificationCenterDelegate>

  @end

  @implementation SomeAppDelegate

  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
      UIApplicationState state = UIApplication.sharedApplication.applicationState;
      if (state == UIApplicationStateInactive) {
          NSURL *url = // 푸시 알림 페이로드의 딥링크
          
          Airbridge.trackDeeplink(url)
      }
  }

  - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
      UIApplicationState state = UIApplication.sharedApplication.applicationState;
      if ((state == UIApplicationStateInactive || state == UIApplicationStateBackground)
          && [response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier]) {
          NSURL *url = // 푸시 알림 페이로드의 딥링크
          
          Airbridge.trackDeeplink(url)
      }
  }

  ```

  ```c Bridge.cpp lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #if PLATFORM_IOS
  #include "SomeAppDelegate.h"
  #endif 

  void SomeCpp::SomeCpp
  {
  #if PLATFORM_IOS
      [SomeAppDelegate load];
  #endif
  }
  ```
</CodeGroup>

<h3 id="track-only-airbridge-deep-links">
  Track Only Airbridge Deep Links
</h3>

The Airbridge SDK collects deep link events when the app is opened through a deep link, even if the deep link is not an Airbridge Deep Link. Configure `Track Airbridge Link Only` in the [SDK settings](#configure-sdk-settings) to `true` to collect deep link events only if the app is opened through an Airbridge Deep Link and prevent unnecessary event collection.

<h3 id="collect-in-session-lifecycle-events">
  Collect in-session lifecycle events
</h3>

The Airbridge SDK collects Open and Foreground events that initiate a new session. These events are not collected during an ongoing session.

By configuring the `Track In Session Life Cycle Event Enabled` in the [SDK settings](#configure-sdk-settings) to `true`, the Open and Foreground events can be collected during ongoing sessions.

All collected Foreground events are recorded as Open events.

<h3 id="compliance-with-google-dma">
  Compliance with Google DMA
</h3>

To comply with the Digital Markets Act (DMA), the user consent data must be sent to Airbridge. For more information about the DMA and whether it applies to your service, refer to the [Airbridge user guide](/en/guides/supporting-the-updated-google-eu-user-consent-policy).

<div id="attention-23" />

<Danger>
  **Attention**

  Advertisers must collect user consent data from all existing and new users in the EEA at least once starting March 6, 2024.
</Danger>

If you are collecting user consent data using a consent management platform that complies with the Transparency and Consent Framework v2.2 protocol, refer to the following method to pass the user consent data to the Airbridge SDK.

<Accordion title="Collecting user consent data through consent management platforms">
  <div id="note-5" />

  <Info>
    **Note**

    Airbridge Unreal SDK v.4.4.0 or later is required.
  </Info>

  1. In the [SDK settings](#configure-sdk), set `Collect TCF Data Enabled` to `true` and `Auto Start Tracking Enabled` to `false`.

  <Frame>
    <img src="https://mintcdn.com/airbridge-help-center/H8ky6E6GMQvo4HcX/images/ca4fk0iik512/77XG966w5p9FNHoRltYFol/255bebb2fa48440b967a7b76f544706c/unreal-dma.png?fit=max&auto=format&n=H8ky6E6GMQvo4HcX&q=85&s=9796ca76755d0140bc9824c281eda3c3" alt="unreal dma" width="1480" height="984" data-path="images/ca4fk0iik512/77XG966w5p9FNHoRltYFol/255bebb2fa48440b967a7b76f544706c/unreal-dma.png" />
  </Frame>

  2. After the user consent data is stored in the consent management platform, call the `StartTracking` function.

  ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  FAirbridge::StartTracking();
  ```
</Accordion>

For all other cases, refer to the following method.

<Accordion title="Collecting user consent data using the FAirbridge::SetDeviceAlias function">
  <div id="note-6" />

  <Info>
    **Note**

    Airbridge cannot provide guidance on storing the user consent data and implementing the prompts. For assistance, consult legal professionals.
  </Info>

  1. Check the location of the users who launched the app. If their location is within the EEA, check whether the user consent data has been previously collected. If not, user consent data collection is not required.

  2. Configure the `Auto Start Tracking Enabled`in the [SDK settings](#configure-sdk) to `false`.

  <Frame>
    <img src="https://mintcdn.com/airbridge-help-center/h4CgwV3KhOukylHN/images/ca4fk0iik512/7rJ2ahZTZrOpAA25dETRaj/0015e34eb6138ad2b61104359f277113/unreal-dma-manual.png?fit=max&auto=format&n=h4CgwV3KhOukylHN&q=85&s=8d12e828b00df1c5fa7ca3bd4d6b7016" alt="unreal dma manual" width="1500" height="981" data-path="images/ca4fk0iik512/7rJ2ahZTZrOpAA25dETRaj/0015e34eb6138ad2b61104359f277113/unreal-dma-manual.png" />
  </Frame>

  3. If no user consent data has been collected previously, you may collect the data using a prompt or other means. The user consent data fields that need to be collected are `adPersonalization`, `adUserData`.

  After initializing the Airbridge SDK, send the user consent data and the user location data (`eea`) to the Airbridge SDK using the `FAirbridge::SetDeviceAlias` function.

  ```c Unreal - Set Device Alias lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // Based on actual region
  FAirbridge::SetDeviceAlias("eea", "0" /* or "1" */);

  // Based on actual user consent
  FAirbridge::SetDeviceAlias("adPersonalization", "0" /* or "1" */);
  FAirbridge::SetDeviceAlias("adUserData", "0" /* or "1" */);
  ```

  Refer to the table below for the user consent data and the user location data that need to be sent to the Airbridge SDK. Note that the Airbridge field names listed in the table below must be used to successfully send data.

  <div style={{ overflowX: 'auto' }}>
    <table style={{ display: 'table' }}>
      <thead>
        <tr>
          <th width="80px">
            에어브릿지 필드 이름
          </th>

          <th width="80px">
            구글 필드 이름
          </th>

          <th width="160px">
            설명
          </th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td>
            `eea`<br />\<string>
          </td>

          <td>
            `eea`
          </td>

          <td>
            디지털 시장법 준수 지역 여부.<br />- `0`: 디지털 시장법 준수와 관계 없는 지역. EEA 지역에 해당하지 않음.<br />- `1`: 디지털 시장법 준수 지역. EEA 지역에 해당함.
          </td>
        </tr>

        <tr>
          <td>
            `adPersonalization`<br />\<string>
          </td>

          <td>
            `ad_personalization`
          </td>

          <td>
            개인 맞춤형 광고 제공을 위한 정보 수집에 대한 동의 여부.<br />- `0`: 유저가 정보 수집에 동의하지 않음.<br />- `1`: 유저가 정보 수집에 동의함.
          </td>
        </tr>

        <tr>
          <td>
            `adUserData`<br />\<string>
          </td>

          <td>
            `ad_user_data`
          </td>

          <td>
            유저 데이터를 구글에 전송하는 것에 대한 동의 여부.<br />- `0`: 유저가 전송에 동의하지 않음.<br />- `1`: 유저가 전송에 동의함.
          </td>
        </tr>
      </tbody>
    </table>
  </div>

  4. After the user consent data and the user location data are sent to the Airbridge SDK, call the `StartTracking` function.

  ```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  FAirbridge::StartTracking();
  ```
</Accordion>

<h3 id="set-up-meta-deferred-app-links">
  Set Up Meta deferred app links
</h3>

Follow the steps below to use [deferred deep linking](/en/developers/flutter-sdk-v4#set-up-deferred-deep-linking) in Meta ads. The Airbridge SDK collects the Meta deferred app links before the Airbridge deferred deep links. If there are no Meta deferred app links, the Airbridge deferred deep links are collected.

Note that Meta does not support Meta deferred app links for SKAdNetwork campaigns.

1. Install the Facebook SDK. Refer to the [Meta Ads Guide (iOS)](https://developers.facebook.com/docs/ios/).

2. Configure the `Facebook Deferred App Link Enabled` in the [SDK settings](#configure-sdk-settings) to `true`.

<h3 id="initialize-the-airbridge-sdk-with-all-functions-disabled">
  Initialize the Airbridge SDK with all functions disabled
</h3>

<div id="attention-24" />

<Danger>
  **Attention**

  If the SDK is not enabled immediately after the SDK initialization, the Install, Open, and Deeplink Openbvevents may not be collected.
</Danger>

Upon initialization, all functions of the SDK are enabled by default. By configuring `SDK Enabled` in the [SDK settings](#configure-sdk-settings) to `false`, the SDK can be initialized with all functions disabled.

You can also check the activation status of the Airbridge SDK and enable or disable all functions, as in the following example.

```c lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
FAirbridge::IsSDKEnabled();
FAirbridge::EnableSDK();
FAirbridge::DisableSDK();
```

<h3 id="set-up-meta-install-referrer-collection">
  Set up Meta Install Referrer collection
</h3>

To collect the Meta Install Referrer, enter the Meta App ID as the key value for `Meta Install Referrer (Facebook App ID)` in the [SDK settings](#configure-sdk-settings).

Note that the decryption key must be submitted to the Airbridge dashboard to read the decrypted Meta Install Referrer. Refer to this [user guide](/en/guides/meta-business-channel-integration#how-to-provide-the-app-id-and-the-decryption-key) to learn how to enter the decryption key.

<h3 id="set-up-uninstall-tracking">
  Set up uninstall tracking
</h3>

Airbridge sends a silent push every day between 3:00 PM and 4:00 PM (UTC) to users who performed an app event at least once in the last 6 months to check if the app has been deleted. You can check the uninstall event in the Airbridge reports and raw data export files.

Refer to the article below for the detailed setup instructions.

* [Setting up app uninstall tracking - Unreal SDK (v4)](/en/developers/uninstall-tracking-unreal-sdk-v4)

<h3 id="integrate-with-third-party-solutions">
  Integrate with third-party solutions
</h3>

An additional SDK setup is required to integrate with some third-party solutions. It is recommended that you complete this setup before collecting data with the Airbridge SDK.

Refer to the articles listed below for integrating with third-party solutions.

<Accordion title="Third-party platforms integrated with Airbridge">
  * [Amplitude](/en/guides/amplitude)
  * [Google Analytics 4 (GA4)](/en/guides/google-analytics-4)
  * [Mixpanel](/en/guides/mixpanel)
  * [MoEngage](/en/guides/moengage)
  * [Braze](/en/guides/braze)
  * [CleverTap](/en/guides/clevertap)
  * [RevenueCat](/en/guides/revenuecat)
  * [Adapty](/en/guides/adapty)
  * [AppLovin MAX](/en/guides/applovin-max)
  * [GameAnalytics](/en/guides/gameanalytics)
  * [App Store Connect](/en/guides/app-store-connect)
  * [SearchAds.com](/en/guides/search-ads-dot-com)
  * [Segment](/en/guides/segment)
  * [Unity LevelPlay (ironSource)](/en/guides/unity-levelplay)
</Accordion>

<h3 id="sdk-logs">
  **SDK logs**
</h3>

The logs provided by the Airbridge SDK are categorized into `Debug`, `Info`, `Warning`, `Error`, and `Fault` levels. The `Debug` level is the least critical log, while the `Fault` level is the most critical log.

By default, the Airbridge SDK provides logs at `Warning`, `Error`, and `Fault` levels. By entering a specific log level as the `Log Level` value in the [SDK settings](#configure-sdk-settings), the logs from that specified level up to the `Fault` level will be available.

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/unreal-sdk-v4" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/unreal-sdk-v4" />
