From b34f72c3120474fc4929c64e2e56e296e5f26ff3 Mon Sep 17 00:00:00 2001 From: Erik MacInnis Date: Thu, 29 Jan 2026 16:13:17 -0700 Subject: [PATCH 1/4] fix: clarified customer attributes for appsflyer integration --- docs/integrations/attribution/appsflyer.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/integrations/attribution/appsflyer.mdx b/docs/integrations/attribution/appsflyer.mdx index 319f588d0..ad31344da 100644 --- a/docs/integrations/attribution/appsflyer.mdx +++ b/docs/integrations/attribution/appsflyer.mdx @@ -25,13 +25,13 @@ Before RevenueCat can integrate with Appsflyer, your app should be running the l The Appsflyer integration requires some device-specific data. RevenueCat will only send events into Appsflyer if the below [Customer Attributes](/customers/customer-attributes) keys have been set for the device. -| Key | Description | Required | -| :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- | -| `$appsflyerId` | Appsflyer Id. The unique Appsflyer identifier for the user | ✅ (required) | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (recommended) | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (recommended) | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ✅ (recommended) | -| `$ip` | The IP address of the device | ❌ (optional) | +| Key | Description | Required | +| :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :------------------- | +| `$appsflyerId` | Appsflyer Id. The unique Appsflyer identifier for the user | ✅ | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (iOS only) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (Play Store only) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ✅ | +| `$ip` | The IP address of the device | ❌ | :::warning Android ID deprecation Due to policy changes from the Play Store, Android ID is no longer collected by RevenueCat's Android SDKs starting on versions 6.9.8+, 7.11.1+, and later major versions. From 2d766a24fd9348e08a72ede874b88a76902a2acb Mon Sep 17 00:00:00 2001 From: Erik MacInnis Date: Mon, 2 Feb 2026 10:16:22 -0700 Subject: [PATCH 2/4] fix: proper customer attributes for appsflyer integration --- docs/integrations/attribution/appsflyer.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/integrations/attribution/appsflyer.mdx b/docs/integrations/attribution/appsflyer.mdx index ad31344da..f2c337fce 100644 --- a/docs/integrations/attribution/appsflyer.mdx +++ b/docs/integrations/attribution/appsflyer.mdx @@ -25,13 +25,13 @@ Before RevenueCat can integrate with Appsflyer, your app should be running the l The Appsflyer integration requires some device-specific data. RevenueCat will only send events into Appsflyer if the below [Customer Attributes](/customers/customer-attributes) keys have been set for the device. -| Key | Description | Required | -| :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :------------------- | -| `$appsflyerId` | Appsflyer Id. The unique Appsflyer identifier for the user | ✅ | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (iOS only) | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (Play Store only) | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ✅ | -| `$ip` | The IP address of the device | ❌ | +| Key | Description | Required | +| :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :------------ | +| `$appsflyerId` | Appsflyer Id. The unique Appsflyer identifier for the user | ✅ (required) | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ❌ (optional) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ❌ (optional) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (optional) | +| `$ip` | The IP address of the device | ❌ (optional) | :::warning Android ID deprecation Due to policy changes from the Play Store, Android ID is no longer collected by RevenueCat's Android SDKs starting on versions 6.9.8+, 7.11.1+, and later major versions. From 1800b9255723b61d286906da139a32ad5bddc9b8 Mon Sep 17 00:00:00 2001 From: Erik MacInnis Date: Mon, 2 Feb 2026 10:39:40 -0700 Subject: [PATCH 3/4] ref: updated appsflyer and mparticle customer attributes --- docs/integrations/attribution/appsflyer.mdx | 14 +++++++------- .../third-party-integrations/mparticle.mdx | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/integrations/attribution/appsflyer.mdx b/docs/integrations/attribution/appsflyer.mdx index f2c337fce..b87d3595b 100644 --- a/docs/integrations/attribution/appsflyer.mdx +++ b/docs/integrations/attribution/appsflyer.mdx @@ -25,13 +25,13 @@ Before RevenueCat can integrate with Appsflyer, your app should be running the l The Appsflyer integration requires some device-specific data. RevenueCat will only send events into Appsflyer if the below [Customer Attributes](/customers/customer-attributes) keys have been set for the device. -| Key | Description | Required | -| :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :------------ | -| `$appsflyerId` | Appsflyer Id. The unique Appsflyer identifier for the user | ✅ (required) | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ❌ (optional) | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ❌ (optional) | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (optional) | -| `$ip` | The IP address of the device | ❌ (optional) | +| Key | Description | Required | +| :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- | +| `$appsflyerId` | Appsflyer Id. The unique Appsflyer identifier for the user | ✅ | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ❌ (recommended) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ❌ (recommended) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (recommended) | +| `$ip` | The IP address of the device | ❌ (recommended) | :::warning Android ID deprecation Due to policy changes from the Play Store, Android ID is no longer collected by RevenueCat's Android SDKs starting on versions 6.9.8+, 7.11.1+, and later major versions. diff --git a/docs/integrations/third-party-integrations/mparticle.mdx b/docs/integrations/third-party-integrations/mparticle.mdx index b7d8e8145..9844f001c 100644 --- a/docs/integrations/third-party-integrations/mparticle.mdx +++ b/docs/integrations/third-party-integrations/mparticle.mdx @@ -53,11 +53,11 @@ The mParticle integration also requires some device-specific data. RevenueCat wi | Key | Description | Required | | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- | -| `$mparticleId` | The unique mParticle user identifier (mpid). | ✅ (recommended) | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ❌ (optional) | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (optional) | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ❌ (optional) | -| `$ip` | The IP address of the device | ❌ (optional) | +| `$mparticleId` | The unique mParticle user identifier (mpid). | ✅ | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ❌ (recommended) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (recommended) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ❌ (recommended) | +| `$ip` | The IP address of the device | ❌ (recommended) | :::warning Android ID deprecation Due to policy changes from the Play Store, Android ID is no longer collected by RevenueCat's Android SDKs starting on versions 6.9.8+, 7.11.1+, and later major versions. From 5616fb4f70ec7a2fb017a7c427f04582651a87cc Mon Sep 17 00:00:00 2001 From: Erik MacInnis Date: Mon, 9 Feb 2026 15:38:05 -0700 Subject: [PATCH 4/4] ref: updated integration required keys --- .../attribution/airbridge_1.swift | 6 ++- .../integrations/attribution/airbridge_2.kt | 5 ++- .../integrations/attribution/kochava_1.swift | 10 +++++ .../integrations/attribution/kochava_2.kt | 3 ++ .../attribution/solarengine_1.swift | 5 ++- docs/integrations/attribution/adjust.mdx | 10 ++--- docs/integrations/attribution/airbridge.mdx | 29 +++++++++---- docs/integrations/attribution/appsflyer.mdx | 1 + docs/integrations/attribution/kochava.mdx | 35 +++++++++------- docs/integrations/attribution/singular.mdx | 13 +++--- docs/integrations/attribution/solarengine.mdx | 41 ++++++++++++------- docs/integrations/attribution/tenjin.mdx | 15 +++---- 12 files changed, 113 insertions(+), 60 deletions(-) create mode 100644 code_blocks/integrations/attribution/kochava_1.swift diff --git a/code_blocks/integrations/attribution/airbridge_1.swift b/code_blocks/integrations/attribution/airbridge_1.swift index 695bee7ca..f1dcab8e1 100644 --- a/code_blocks/integrations/attribution/airbridge_1.swift +++ b/code_blocks/integrations/attribution/airbridge_1.swift @@ -1,11 +1,15 @@ +import AdSupport import Purchases // ... Purchases.configure(withAPIKey: "public_sdk_key") // ... +// Automatically collect the $idfa, $idfv, and $ip values +Purchases.shared.attribution.collectDeviceIdentifiers() + // Retrieve the DeviceUUID from the Airbridge SDK let deviceUUID = /* Airbridge SDK DeviceUUID */ -// Forward it to RevenueCat +// Set the Airbridge Device ID Purchases.shared.attribution.setAirbridgeDeviceID(deviceUUID) diff --git a/code_blocks/integrations/attribution/airbridge_2.kt b/code_blocks/integrations/attribution/airbridge_2.kt index 4d36d15a2..65f1ae7ba 100644 --- a/code_blocks/integrations/attribution/airbridge_2.kt +++ b/code_blocks/integrations/attribution/airbridge_2.kt @@ -2,8 +2,11 @@ Purchases.configure(this, "public_sdk_key") // ... +// Automatically collect the $gpsAdId and $ip values +Purchases.sharedInstance.collectDeviceIdentifiers() + // Retrieve the DeviceUUID from the Airbridge SDK val deviceUUID = /* Airbridge SDK DeviceUUID */ -// Forward it to RevenueCat +// Set the Airbridge Device ID Purchases.sharedInstance.setAirbridgeDeviceID(deviceUUID) diff --git a/code_blocks/integrations/attribution/kochava_1.swift b/code_blocks/integrations/attribution/kochava_1.swift new file mode 100644 index 000000000..fbb61eff4 --- /dev/null +++ b/code_blocks/integrations/attribution/kochava_1.swift @@ -0,0 +1,10 @@ +import AdSupport +// ... +Purchases.configure(withAPIKey: "public_sdk_key") +// ... + +// Automatically collect the $idfa, $idfv, and $ip values +Purchases.shared.attribution.collectDeviceIdentifiers() + +// Set the Kochava Device ID +Purchases.shared.attribution.setKochavaDeviceID(kochavaDeviceId) diff --git a/code_blocks/integrations/attribution/kochava_2.kt b/code_blocks/integrations/attribution/kochava_2.kt index 80531f0d6..d16dff7f5 100644 --- a/code_blocks/integrations/attribution/kochava_2.kt +++ b/code_blocks/integrations/attribution/kochava_2.kt @@ -2,6 +2,9 @@ Purchases.configure(this, "public_sdk_key") //.. +// Automatically collect the $gpsAdId and $ip values +Purchases.sharedInstance.collectDeviceIdentifiers() + // Set the KochavaDeviceID Tracker.getInstance().retrieveDeviceId { deviceId -> Purchases.sharedInstance.setKochavaDeviceID(deviceId); diff --git a/code_blocks/integrations/attribution/solarengine_1.swift b/code_blocks/integrations/attribution/solarengine_1.swift index f5d07bee7..85bb22e76 100644 --- a/code_blocks/integrations/attribution/solarengine_1.swift +++ b/code_blocks/integrations/attribution/solarengine_1.swift @@ -1,11 +1,12 @@ +import AdSupport import Purchases // ... Purchases.configure(withAPIKey: "public_sdk_key") // ... -// Collect device identifiers (important for attribution matching) -Purchases.shared.collectDeviceIdentifiers() +// Automatically collect the $idfa, $idfv, and $ip values +Purchases.shared.attribution.collectDeviceIdentifiers() // Retrieve the identifiers from the Solar Engine SDK let distinctId = /* Solar Engine SDK Distinct ID (optional) */ diff --git a/docs/integrations/attribution/adjust.mdx b/docs/integrations/attribution/adjust.mdx index 2e3db1adb..18007c0ba 100644 --- a/docs/integrations/attribution/adjust.mdx +++ b/docs/integrations/attribution/adjust.mdx @@ -27,11 +27,11 @@ The Adjust integration requires some device-specific data. RevenueCat will only | Key | Description | Required | | :---------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- | -| `$adjustId` | Adjust Id. The unique Adjust identifier for the user | ✅ (required) | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (recommended) | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (recommended) | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ✅ (recommended) | -| `$ip` | The IP address of the device | ✅ (recommended) | +| `$adjustId` | Adjust Id. The unique Adjust identifier for the user | ✅ | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ❌ (recommended) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ❌ (recommended) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (recommended) | +| `$ip` | The IP address of the device | ❌ (recommended) | :::warning Android ID deprecation Due to policy changes from the Play Store, Android ID is no longer collected by RevenueCat's Android SDKs starting on versions 6.9.8+, 7.11.1+, and later major versions. diff --git a/docs/integrations/attribution/airbridge.mdx b/docs/integrations/attribution/airbridge.mdx index bf6c495cf..31ba8aec8 100644 --- a/docs/integrations/attribution/airbridge.mdx +++ b/docs/integrations/attribution/airbridge.mdx @@ -23,16 +23,17 @@ Set up the latest Airbridge SDK in every platform where you collect purchases be ## 2. Send device data to RevenueCat -Airbridge matches RevenueCat events to campaign cohorts using device and advertising identifiers. Make sure your app collects and sends the following [Customer Attributes](/customers/customer-attributes) to RevenueCat before the first purchase occurs: +Airbridge matches RevenueCat events to campaign cohorts using device and advertising identifiers. No subscriber attributes are strictly required for events to be sent, but collecting the following [Customer Attributes](/customers/customer-attributes) is recommended for accurate attribution: -| Key | Description | Recommended Platforms | -| :--------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------- | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | iOS | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | iOS | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | Android | -| `$ip` | Device IP address, gathered server-side when enabled | iOS & Android | +| Key | Description | Required | +| :----------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- | +| `$airbridgeDevice` | Airbridge DeviceUUID. The unique Airbridge identifier for the device | ✅ | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ❌ (recommended) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ❌ (recommended) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (recommended) | +| `$ip` | The IP address of the device | ❌ (recommended) | -Airbridge also requires its DeviceUUID to associate lifecycle events with campaign cohorts. Use the Purchases SDK helper `setAirbridgeDeviceID()` to forward this identifier to RevenueCat — the helper will automatically populate the required customer attributes and is available in both the iOS (Swift) and Android (Kotlin) SDKs. +These properties can be set manually, like any other [Customer Attributes](/customers/customer-attributes), or through the helper methods `collectDeviceIdentifiers()` and `setAirbridgeDeviceID()`. import swiftContent from "@site/code_blocks/integrations/attribution/airbridge_1.swift?raw"; import kotlinContent from "@site/code_blocks/integrations/attribution/airbridge_2.kt?raw"; @@ -44,7 +45,17 @@ import kotlinContent from "@site/code_blocks/integrations/attribution/airbridge_ ]} /> -These identifiers can be set manually like any other attribute, or by calling `collectDeviceIdentifiers()` after configuring the _Purchases SDK_. Call it again if a user later grants Ads Tracking permission so the `$idfa` value is updated. +You should make sure to call `collectDeviceIdentifiers()` after the _Purchases SDK_ is configured, and before the first purchase occurs. It's safe to call this multiple times, as only the new/updated values will be sent to RevenueCat. + +:::danger Device identifiers with iOS App Tracking Transparency (iOS 14.5+) +If you are requesting the App Tracking permission through ATT to access the IDFA, you can call `.collectDeviceIdentifiers()` _again_ if the customer accepts the permission to update the `$idfa` attribute in RevenueCat. +::: + +:::info Import AdSupport Framework (iOS) +The AdSupport framework is required to access the IDFA parameter on iOS. Don't forget to import this into your project. +::: + +![Import AdSupport Framework](/docs_images/integrations/attribution/import-adsupport-framework.png) ## 3. Configure Airbridge in the RevenueCat dashboard diff --git a/docs/integrations/attribution/appsflyer.mdx b/docs/integrations/attribution/appsflyer.mdx index b87d3595b..decd05989 100644 --- a/docs/integrations/attribution/appsflyer.mdx +++ b/docs/integrations/attribution/appsflyer.mdx @@ -31,6 +31,7 @@ The Appsflyer integration requires some device-specific data. RevenueCat will on | `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ❌ (recommended) | | `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ❌ (recommended) | | `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (recommended) | +| `$amazonAdId` | Amazon [advertising identifier](https://developer.amazon.com/docs/fire-tv/advertising-id.html) | ❌ (recommended) | | `$ip` | The IP address of the device | ❌ (recommended) | :::warning Android ID deprecation diff --git a/docs/integrations/attribution/kochava.mdx b/docs/integrations/attribution/kochava.mdx index 85633bcb1..61d1a3e5b 100644 --- a/docs/integrations/attribution/kochava.mdx +++ b/docs/integrations/attribution/kochava.mdx @@ -29,27 +29,32 @@ The Kochava integration requires some device-specific data. RevenueCat will only $kochavaDeviceId and $deviceVersion are supported on versions 5.4.0+ of the iOS SDK, and 8.8.0+ of the Android SDK. Support in other SDKs is coming soon. ::: -| Key | Description | Required | -| :----------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- | -| `$kochavaDeviceId` | The unique Kochava Device ID. | ✅ (required) | -| `$ip` | The IP address of the device. This is gathered server-side when `$ip` is set to `true`. | ✅ (required) | -| `$deviceVersion` | Device, platform and version information. This is gathered server-side when `$deviceVersion` is set to `true`. | ✅ (required) | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (recommended) | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (recommended) | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ✅ (recommended) | - -When calling the `setKochavaDeviceId()` helper, all of the required customer attributes will be automatically set. Alternatively, these properties can be set manually, like any other [Attributes](/customers/customer-attributes). - +| Key | Description | Required | +| :----------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------- | +| `$kochavaDeviceId` | The unique Kochava Device ID | ✅ | +| `$ip` | The IP address of the device. This is gathered server-side when `$ip` is set to `true`. | ✅ | +| `$deviceVersion` | Device, platform and version information. This is gathered server-side when `$deviceVersion` is set to `true`. | ✅ | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (iOS, one of `$idfa` or `$idfv`) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ✅ (iOS, one of `$idfa` or `$idfv`) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (Android, one of `$gpsAdId` or `$androidId`) | +| `$androidId` | Android [device identifier](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID) | ✅ (Android, one of `$gpsAdId` or `$androidId`) | + +These properties can be set manually, like any other [Customer Attributes](/customers/customer-attributes), or through the helper methods `collectDeviceIdentifiers()` and `setKochavaDeviceID()`. + +import swiftContent from "@site/code_blocks/integrations/attribution/kochava_1.swift?raw"; import kotlinContent from "@site/code_blocks/integrations/attribution/kochava_2.kt?raw"; -{/* Use the RCCodeBlock component to render the code blocks with tabs */} - - + You should make sure to set attributes after the _Purchases SDK_ is configured, and before the first purchase occurs. It's safe to set attributes multiple times, as only the new/updated values will be sent to RevenueCat. :::danger Device identifiers with iOS App Tracking Transparency (iOS 14.5+) -If you are requesting the App Tracking permission through ATT to access the IDFA, you can call `.collectDeviceIdentifiers()` if the customer accepts the permission to update the `$idfa` attribute in RevenueCat. +If you are requesting the App Tracking permission through ATT to access the IDFA, you can call `.collectDeviceIdentifiers()` _again_ if the customer accepts the permission to update the `$idfa` attribute in RevenueCat. ::: :::info Import AdSupport Framework (iOS) diff --git a/docs/integrations/attribution/singular.mdx b/docs/integrations/attribution/singular.mdx index ad79316f4..b0ac145a8 100644 --- a/docs/integrations/attribution/singular.mdx +++ b/docs/integrations/attribution/singular.mdx @@ -21,12 +21,13 @@ With our Singular integration you can: The Singular integration requires some device-specific data. RevenueCat will only send events into Singular if the below [Customer Attribute](/customers/customer-attributes) keys have been set for the device. -| Key | Description | Required | -| :--------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :---------------- | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (iOS only) | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ✅ (iOS only) | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (Android only) | -| `$ip` | The IP address of the device | ❌ (optional) | +| Key | Description | Required | +| :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------- | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (iOS, both required) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ✅ (iOS, both required) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (Android, one of `$gpsAdId` or `$androidId`) | +| `$androidId` | Android [device identifier](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID) | ✅ (Android, one of `$gpsAdId` or `$androidId`) | +| `$ip` | The IP address of the device | ❌ (optional) | :::warning Android ID deprecation Due to policy changes from the Play Store, Android ID is no longer collected by RevenueCat's Android SDKs starting on versions 6.9.8+, 7.11.1+, and later major versions. diff --git a/docs/integrations/attribution/solarengine.mdx b/docs/integrations/attribution/solarengine.mdx index 6dc13ebfd..3dad84811 100644 --- a/docs/integrations/attribution/solarengine.mdx +++ b/docs/integrations/attribution/solarengine.mdx @@ -23,22 +23,19 @@ Set up the latest Solar Engine SDK in every platform where you collect purchases ## 2. Send device data to RevenueCat -Solar Engine matches RevenueCat events to campaign cohorts using device and advertising identifiers. Make sure your app collects and sends the following [Customer Attributes](/customers/customer-attributes) to RevenueCat before the first purchase occurs: +Solar Engine matches RevenueCat events to campaign cohorts using device and advertising identifiers. No subscriber attributes are strictly required for events to be sent. The following [Customer Attributes](/customers/customer-attributes) are recommended for accurate attribution: -| Key | Description | Recommended Platforms | -| :--------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------- | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | iOS | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | iOS | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | Android | -| `$ip` | Device IP address, gathered server-side when enabled | iOS & Android | +| Key | Description | Required | +| :----------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- | +| `$solarEngineDistinctId` | Solar Engine Distinct Id. The primary Solar Engine identifier for the device | ✅ | +| `$solarEngineAccountId` | Solar Engine Account Id | ❌ (recommended) | +| `$solarEngineVisitorId` | Solar Engine Visitor Id | ❌ (optional) | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ❌ (recommended) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ❌ (recommended) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (recommended) | +| `$ip` | The IP address of the device | ❌ (recommended) | -These identifiers can be set manually like any other attribute, or by calling `collectDeviceIdentifiers()` after configuring the _Purchases SDK_. Call it again if a user later grants Ads Tracking permission so the `$idfa` value is updated. - -Solar Engine also uses specific identifiers to associate lifecycle events with campaign cohorts. Use the Purchases SDK helpers to forward these identifiers to RevenueCat: - -- `setSolarEngineDistinctId()` - The Solar Engine Distinct ID (primary identifier) -- `setSolarEngineAccountId()` - The Solar Engine Account ID (optional) -- `setSolarEngineVisitorId()` - The Solar Engine Visitor ID (optional) +These properties can be set manually, like any other [Customer Attributes](/customers/customer-attributes), or through the helper methods `collectDeviceIdentifiers()` and the Solar Engine setter methods. import swiftContent from "@site/code_blocks/integrations/attribution/solarengine_1.swift?raw"; import kotlinContent from "@site/code_blocks/integrations/attribution/solarengine_2.kt?raw"; @@ -50,6 +47,22 @@ import kotlinContent from "@site/code_blocks/integrations/attribution/solarengin ]} /> +You should make sure to call `collectDeviceIdentifiers()` after the _Purchases SDK_ is configured, and before the first purchase occurs. It's safe to call this multiple times, as only the new/updated values will be sent to RevenueCat. + +:::danger Device identifiers with iOS App Tracking Transparency (iOS 14.5+) +If you are requesting the App Tracking permission through ATT to access the IDFA, you can call `.collectDeviceIdentifiers()` _again_ if the customer accepts the permission to update the `$idfa` attribute in RevenueCat. +::: + +:::info Import AdSupport Framework (iOS) +The AdSupport framework is required to access the IDFA parameter on iOS. Don't forget to import this into your project. +::: + +![Import AdSupport Framework](/docs_images/integrations/attribution/import-adsupport-framework.png) + +:::danger Remove any client-side purchase tracking +Make sure to remove all client-side tracking of revenue. Since RevenueCat will be sending events for all revenue actions, tracking purchases with the Solar Engine SDK directly can lead to double counting of revenue in Solar Engine. +::: + ## 3. Configure Solar Engine in the RevenueCat dashboard After your SDK is ready and device data is flowing, finish the setup in RevenueCat: diff --git a/docs/integrations/attribution/tenjin.mdx b/docs/integrations/attribution/tenjin.mdx index 701959610..f53ca118e 100644 --- a/docs/integrations/attribution/tenjin.mdx +++ b/docs/integrations/attribution/tenjin.mdx @@ -21,13 +21,14 @@ With our Tenjin integration you can: The Tenjin integration requires some device-specific data. RevenueCat will only send events into Tenjin if the below [Attribute](/customers/customer-attributes) keys which are required have been set for the device. -| Key | Description | Required | -| :---------- | :---------------------------------------------------------------------------------------------------------------------------------------------- | :---------------- | -| `$tenjinId` | The Tenjin Analytics Installation ID, the unique identifier from Tenjin for the device | ✅ (recommended) | -| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (iOS only) | -| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (Android only) | -| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (optional) | -| `$ip` | The IP address of the device | ❌ (optional) | +| Key | Description | Required | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- | +| `$tenjinId` | Tenjin Id. The Tenjin Analytics Installation ID for the device | ❌ (recommended) | +| `$idfa` | iOS [advertising identifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier) UUID | ✅ (iOS) | +| `$gpsAdId` | Google [advertising identifier](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info) | ✅ (Android) | +| `$amazonAdId` | Amazon [advertising identifier](https://developer.amazon.com/docs/fire-tv/advertising-id.html) | ✅ (Amazon) | +| `$idfv` | iOS [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor) UUID | ❌ (recommended) | +| `$ip` | The IP address of the device | ❌ (recommended) | :::info IDFA attribute Even if a user has not granted permission to track, the IDFA attribute must be set to the iOS default provided value of `00000000-0000-0000-0000-000000000000` in order for events to be sent to Tenjin.