Adjust
With our Adjust integration you can:
- Accurately track subscriptions generated from Adjust campaigns, allowing you to know precisely how much revenue your campaigns generate.
- Send trial conversions and renewals directly from RevenueCat to Adjust, allowing for tracking without an app open.
- Continue to follow your cohorts for months to know the long tail revenue generated by your campaigns.
Integration at a Glance
Includes Revenue | Supports Negative Revenue | Sends Sandbox Events | Includes Customer Attributes | Sends Transfer Events | Optional Event Types |
---|---|---|---|---|---|
✅ | ❌ | ✅ | ❌ | ❌ | non_subscription_purchase_event_token expiration_event_token |
1. Install Adjust SDK
Before RevenueCat can integrate with Adjust, your app should be running the latest Adjust SDK. Refer to the Adjust developer documentation for the latest installation instructions.
2. Send device data to RevenueCat
The Adjust integration requires some device-specific data. RevenueCat will only send events into Adjust if the below Customer Attribute keys have been set for the device.
Key | Description | Required |
---|---|---|
$adjustId | Adjust Id. The unique Adjust identifier for the user | ✅ (required) |
$idfa | iOS advertising identifier UUID | ✅ (recommended) |
$gpsAdId | Google advertising identifier | ✅ (recommended) |
$idfv | iOS vender identifier UUID | ✅ (recommended) |
$ip | The IP address of the device | ✅ (recommended) |
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.
Therefore, Google's Advertising ID acts as the primary device identifier for Android devices in RevenueCat and when connecting with third-party integrations.
These properties can be set manually, like any other Customer Attributes, or through the helper methods to collectDeviceIdentifiers()
and setAdjustId()
.
- Swift
- Java
import AdSupport
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Purchases.configure(withAPIKey: "public_sdk_key")
// ... Configure Adjust SDK and set delegate
// Automatically collect the $idfa, $idfv, and $ip values
Purchases.shared.attribution.collectDeviceIdentifiers()
// Set the Adjust Id on app launch if it exists
if let adjustId = Adjust.adid() {
Purchases.shared.attribution.setAdjustID(adjustId)
}
// ..
}
// IMPORTANT: - Set the Adjust Id when it becomes available, if it
// didn't exist on app launch
extension AppDelegate: AdjustDelegate {
func adjustAttributionChanged(_ attribution: ADJAttribution?) {
if let adjustId = attribution?.adid {
Purchases.shared.attribution.collectDeviceIdentifiers()
Purchases.shared.attribution.setAdjustID(adjustId)
}
}
}
Purchases.configure(this, "my_api_key");
// Automatically collect the $gpsAdId and $ip values
Purchases.getSharedInstance().collectDeviceIdentifiers();
// Set the Adjust Id on app launch if it exists
if (Adjust.getAdid() != Null) {
Purchases.getSharedInstance().setAdjustID(Adjust.getAdid());
}
// IMPORTANT: - Set the Adjust Id when it becomes available, if it
// didn't exist on app launch
config.setOnAttributionChangedListener(new OnAttributionChangedListener() {
@Override
public void onAttributionChanged(AdjustAttribution attribution) {
Map<String, String> data = new HashMap<String, String>();
Purchases.getSharedInstance().collectDeviceIdentifiers();
Purchases.getSharedInstance().setAdjustID(attribution.adid);
}
});
You should make sure to set attributes after the Purchases SDK is configured, and before the first purchase occurs. It's safe to set this multiple times, as only the new/updated values will be sent to 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.
The AdSupport framework is required to access the IDFA parameter on iOS. Don't forget to import this into your project.
Make sure to remove all client-side tracking of revenue. Since RevenueCat will be sending events for all revenue actions, tracking purchases with the Adjust SDK directly can lead to double counting of revenue in Adjust.
(Optional) Send campaign data to RevenueCat
RevenueCat itself is not an attribution network, and can't determine which specific ad drove an install/conversion. However, if you're able to collect this information from another source, such as Adjust, it's possible to attach it to a user in RevenueCat using Customer Attributes as well.
The below reserved key names can be used to optionally attach campaign data to a user. This data will then be sent through to other downstream analytics integrations and accessible via APIs and webhooks.
Key |
---|
$mediaSource |
$campaign |
$adGroup |
$ad |
$keyword |
$creative |
3. Send RevenueCat events into Adjust
After you've set up the Purchase SDK to send attribution data from Adjust to RevenueCat, you can "turn on" the integration and configure the event tokens from the RevenueCat dashboard.
- Navigate to your project in the RevenueCat dashboard and find the Integrations card in the left menu. Select + New
- Choose Adjust from the integrations menu
- Add your app tokens and event tokens for your iOS app and/or Android app
- Select whether you want sales reported as gross revenue (before app store commission), or after store commission and/or estimated taxes.
(Optional) S2S Adjust Authentication
If you've enabled S2S authentication on Adjust, fill out the OAuth token field in the RevenueCat Adjust settings page.
If you have a specific token per platform, you can override it on each platform section.
iOS
Android
If you're getting an error that looks like this:
{"error":"Event request failed (missing authentication token)"}
Then you have Adjust S2S Authentication enabled and you need to follow this step to provide your authentication token to RevenueCat.
4. Testing the Adjust integration
You can test the Adjust integration end-to-end before going live. It's recommended that you test the integration is working properly for new users, and any existing users that may update their app to a new version.
Make a sandbox purchase with a new user
Simulate a new user installing your app, and go through your app flow to complete a sandbox purchase.
Check that the required device data is collected
Navigate the the Customer View for the test user that just made a purchase. Make sure that all of the required data from step 1 above is listed as attributes for the user.
Adjust testing console
Adjust provides a testing console to verify attribution data for sandbox users before moving to production. We recommend you follow their testing guide if you're submitting an app for the first time with Adjust attribution.
Verifying sandbox events
RevenueCat will send Sandbox subscription events to Adjust's in sandbox mode. You can see Adjust sandbox events using the following filter in Adjust:
If you notice failed in events in your Adjust settings in the RevenueCat dashboard, take a look at Adjust's docs on what the error codes might mean.
Sending Revenue Data to Adjust
Adjust does not accept events with revenue less than 0.001, so free trial and refund events are sent to Adjust without a revenue property.
You should start seeing events from RevenueCat appear in Adjust!
Sample Event
Below is a sample event sent to Adjust. The type of the event (e.g. initial purchase) is defined by the event_token
. Note that product identifiers, customer attributes, app user IDs, etc. don't get sent to Adjust.
- Code
{
"app_token": "abcdefg",
"event_token": "abcdefg",
"s2s": 1,
"created_at_unix": 1640995185,
"adid": "00000000000000000000000000000000",
"environment": "production",
"currency": "USD",
"revenue": 34.511,
"idfa": "00000000-0000-0000-0000-000000000000",
"idfv": "00000000-0000-0000-0000-000000000000",
"ip_address": "00.0.000.000"
}