User Tracking

The VIS.X® SDK provides multiple options to use user identifiers for better ad monetization. Besides the regular IDFA (iOS) / GAID (Android), you may also fallback to the usage of IDFV (iOS) / App Set ID (Android), but you can also bring your own, pseudonymized, first-party ID to share within your app ecosystem. Your first-party ID will remain consistent across all your apps and allows precise frequency capping and campaign optimization throughout your app portfolio.

In all cases, you need to implement a CMP, as outlined here and ask your user for explicit consent, under TCF 2.0. VIS.X® will not process personal data if there is no consent for the YOC AG (ID: 154) as a vendor.

Following the instructions on how to allow user tracking on the app level and also how to provide first-party data to the VIS.X® platform.

  1. Guidelines for Android
  2. Guidelines for iOS
  3. CMP Requirements using First Party IDs
Guidelines for Android
Google Play’s Data safety, Google Advertising ID, App Set ID

The Data safety section on Google Play is a simple way for you to help people understand what user data your app collects or shares, as well as showcase your app’s key privacy and security practices. This information helps users make more informed choices when deciding which apps to install.

By July 20, 2022, all developers must declare how they collect and handle user data for the apps they publish on Google Play, and provide details about how they protect this data through security practices like encryption. This includes data collected and handled through any third-party libraries or SDKs used in their apps.

You can read more about Google Play’s Data safety here.

The VIS.X® SDK for Android will use the Google Advertising ID as the primary identifier of a user during ad calls. The SDK will retrieve the ID automatically if the app has asked for and received consent for GDPR (IAB TCF 2.0) and did not opt out in the Google Advertising settings.

In case the user opted out of the usage of the Google Advertising ID, but granted consent under the TCF 2.0 consent framework, the VIS.X® SDK will use the app set ID instead.

Using First-Party IDs in Android

Publishers can provide their identifier to the VIS.X® platform, by using the key visxSharedUserId in your app’s SharedPreferences and passing your ID as String. Additionally, you may provide us a UUID as a namespace to hash your first-party ID, using the key visxSharedNamespace. By using first-party data, you still need to comply with Google Play’s Data safety, before you submit your App to Google Play.

override fun onCreate() {
    super.onCreate()
    instance = this
    PreferenceManager.getDefaultSharedPreferences(applicationContext).edit()
            .putString("visxSharedUserId", "your-first-party-id").apply()
            .putString("visxSharedNamespace", "your-UUID-to-hash-your-first-party-id)
    }

Whether you provide your namespace or not, all first-party IDs will be pseudonymized as a UUID v5 hash, before being transmitted to the VIS.X® Platform. Also, the raw first-party ID of the publisher is neither addressable in the VIS.X® platform nor on any of the subprocessors.

Using ID5 in Android

Publishers can provide their ID5 data to the VIS.X® platform, by using the key visxSharedID5 in your app’s SharedPreferences and passing your ID as String. By using ID5 data, you still need to comply with Google Play’s Data safety, before you submit your App to Google Play.

override fun onCreate() {
    super.onCreate()
    instance = this
    PreferenceManager.getDefaultSharedPreferences(applicationContext).edit()
            .putString("visxSharedID5", "your-id5-identifier").apply()
    }
Guidelines for iOS
App Tracking Transparency, IDFA, IDFV

All apps must ask users for consent for using the IDFA via Apple’s App Tracking Transparency.

The VIS.X® SDK for iOS will use the IDFA as the primary identifier of a user during ad calls. The SDK will retrieve the ID automatically if the app has asked for and received consent for both GDPR (IAB TCF 2.0) and Apple’s App Tracking Transparency.

In case the user denied ATT consent, but granted consent under the TCF 2.0 consent framework, the VIS.X® SDK will use the identifierForVendor (known as IDFV) instead.

Using First-Party IDs in iOS

Publishers can provide their identifier to the VIS.X® platform, by using the key visxSharedUserId in your app’s UserDefaults.standard and passing your ID as String. Additionally, you may provide us a UUID as a namespace to hash your first-party ID, using the key visxSharedNamespace.

By using first-party data, you need to comply with Apple’s App Privacy Details, before you submit your App to AppStore Connect. Therefore you need to declare the Identifier “User ID” with the Data Usage Purpose “Third-Party Advertising”.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // ...
    UserDefaults.standard.set("myUsersId", forKey: "visxSharedUserId")
    UserDefaults.standard.set("myUUIDNamespace", forKey: "visxSharedNamespace")
    UserDefaults.standard.synchronize()
    // ...
    return true
}

Whether you provide your namespace or not, all first-party IDs_ will be pseudonymized as a UUID v5 hash, before being transmitted to the VIS.X® Platform. Also, the raw first-party ID of the publisher is neither addressable in the VIS.X® platform nor on any of the subprocessors.

Using ID5 in iOS

Publishers can provide their ID5 data to the VIS.X® platform, by using the key visxSharedID5 in your app’s UserDefaults.standard and passing your ID as String.

By using ID5 data, you need to comply with Apple’s App Privacy Details, before you submit your App to AppStore Connect. Therefore you need to declare the Identifier “User ID” with the Data Usage Purpose “Third-Party Advertising”.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // ...
    UserDefaults.standard.set("myID5id", forKey: "visxSharedID5")
    UserDefaults.standard.synchronize()
    // ...
    return true
}