Skip to main content

Requirements

  • Android 5.0 (API level 21) or higher
  • Android Studio Flamingo (2022.2.1) or newer
  • Gradle 8.0+

Installation

Step 1: Gradle Setup

Add the Linkrunner SDK to your app’s build.gradle file:
Make sure you have the Maven Central repository in your project’s settings.gradle file:

Step 2: Required Permissions

Add the following permissions to your AndroidManifest.xml file:
Note: The AD_ID permission (<uses-permission android:name="com.google.android.gms.permission.AD_ID" />) is already included in the SDK and is required for collecting device identifiers (GAID). If your app participates in Designed for Families, you should revoke AAID and disable AAID collection. See the Disabling AAID Collection section for more details.

Step 3: Backup Configuration

The SDK provides backup rules to exclude Shared Preferences data from backup. This prevents the retention of the Linkrunner install ID during reinstallation, ensuring accurate detection of new installs and re-installs.
This backup configuration works similarly for all SDKs (React Native, Flutter, and native Android). The same Android backup rules apply regardless of which SDK you’re using.

Adding Backup Rules to Your App

Add to your AndroidManifest.xml:
  • android:fullBackupContent - Used for Android 6-11
  • android:dataExtractionRules - Used for Android 12+

Merging Backup Rules

If you already have your own backup rules specified (e.g., android:fullBackupContent="@xml/my_backup_descriptor" or android:dataExtractionRules="@xml/my_rules"), then manually add the following rules to your existing files: For legacy backup (Android 6-11) in res/xml/my_backup_descriptor:
For modern backup (Android 12+) in res/xml/my_backup_rules.xml:

Step 4: Encrypted SharedPreferences

SDK Version Requirement: Starting from linkrunner-android v3.8.1, the SDK automatically encrypts the credentials it stores in SharedPreferences. No additional configuration is required — upgrade to v3.8.1 or above to get this behavior by default.
Values written by the SDK are encrypted at rest, with a hardware-protected key generated on the device and stored in the Android Keystore. The key never leaves the device and is not bundled with the SDK. If you are upgrading from an earlier version, the SDK will transparently migrate any existing plaintext entries to the encrypted store on the next read after the upgrade — no code changes are needed on your side.

Step 5: Revoking the AD_ID Permission (Optional)

According to Google’s Policy, apps that target children must not transmit the Advertising ID. To revoke the AD_ID permission, use SDK version 3.5.0 and above. Children apps targeting Android 13 (API 33) and above must prevent the permission from getting merged into their app by adding a revoke declaration to their Manifest. Use the setDisableAaidCollection() and isAaidCollectionDisabled() functions to disable AAID collection programmatically: AndroidManifest.xml
Make sure to add xmlns:tools="http://schemas.android.com/tools" to your manifest tag to use the tools:node="remove" attribute. If you disable AAID collection, you should also remove the AD_ID permission from your manifest to fully comply with Google Play’s Family Policy requirements.
For more information, see Google Play Services documentation.

Importing in Kotlin/Java

After installation, you can import the SDK in your Kotlin or Java files:

Initialization (Required)

Initialize the Linkrunner SDK in your application, typically in your Application class or main activity: You can find your project token here. Note: This method returns a void. To get attribution data and deeplink information, use the getAttributionData method.

SDK Signing Parameters (Optional)

For enhanced security, the LinkRunner SDK requires the following signing parameters during initialization:
  • secretKey: A unique secret key used for request signing and authentication
  • keyId: A unique identifier for the key pair used in the signing process
  • debug (optional): Boolean flag to enable debug mode for development (defaults to false)
You can find your project token, secret key, and key ID here.

Setting the Customer User ID

Use setCustomerUserId to attach your own user identifier to the device right after init. Once set, the identifier is stored securely on-device and automatically included in every event you track, so you never have to pass it on each trackEvent call. Call it as early as the user’s ID is available. This guarantees every event carries a user_id from the very first event, and is especially useful for existing users who were already onboarded before this feature shipped.
Available from Android SDK v3.9.1.
Best practice: set the Customer User ID as early as possible. The user_id is only attached to events tracked after it’s set, and is not applied retroactively. Use a stable, unique identifier from your own system (for example your internal user ID or a UUID) rather than an email address or other PII.
The identifier is stored encrypted on-device and persists across app restarts. Calling setCustomerUserId again with a different identifier updates the stored value; passing the same identifier is a no-op. signup() / setUserData() also update it.

User Identification (Required)

Call the signup method as soon as the user is identified — whether through signup or login. This is the moment Linkrunner ties the install (and any future events) to a user identifier. It is strongly recommended to use the integrated platform’s identify function to set a persistent user_id once it becomes available (typically after signup or login). If the platform’s identifier function is not called, you must provide a user identifier for Mixpanel, PostHog, and Amplitude integration.
  • mixpanelDistinctId for Mixpanel
  • posthogDistinctId for PostHog
  • amplitudeDeviceId for Amplitude
To enable remarketing and reattribution, you need to capture deep links and pass them to the Linkrunner SDK. This allows Linkrunner to detect returning users who open the app via a deep link.
Linkrunner sends the updated deeplink back after processing. For Linkrunner campaign links, use the returned deeplink as the resolved destination instead of the original tracking URL.

Getting Attribution Data

To get attribution data and deeplink information for the current installation, use the getAttributionData function:

Setting User Data

Call setUserData each time the app opens and the user is logged in:
setUserData is optional and is not a replacement for signup. Always call signup first as soon as the user is identified (signup or login). Use setUserData afterwards only when additional user details become available later — for example, when the user adds a phone number, email, or completes their profile after identification.

Setting CleverTap ID

Use the setAdditionalData method to set CleverTap ID:

Revenue Tracking

Revenue data is only stored and displayed for attributed users. Make sure you have implemented the .signup function before capturing payments. To attribute a test user, follow the Integration Testing guide. You can verify your events are being captured on the Events Settings page.

Capturing Payments

Track payment information with the following details:

Available Payment Types

Available Payment Statuses

Removing Payments

To remove or refund a payment:

Tracking Custom Events

From Android SDK v3.9.0, custom events automatically include the user_id you set during signup() / setUserData(). The SDK stores this identifier securely on-device and attaches it to every trackEvent call, so you no longer need to pass it manually. Events tracked before signup are sent without a user_id.
Events are only stored and displayed for attributed users. Make sure you have implemented the .signup function before tracking events. To attribute a test user, follow the Integration Testing guide. You can verify your events are being captured on the Events Settings page. For capturing revenue, it is recommended to use the .capturePayment method instead of .trackEvent.
Track custom events in your app:

Revenue Sharing with Ad Networks

To enable revenue sharing with ad networks like Google Ads and Meta, include an amount parameter as a number in your custom event data. This allows the ad networks to optimize campaigns based on the revenue value of conversions:
For revenue sharing with ad networks to work properly, ensure the amount parameter is passed as a number (Double or Int), not as a string.

Ecommerce Events

Minimum SDK Version: Ecommerce Event Manager requires linkrunner-android v3.6.0 or above. Please ensure your SDK is updated before using this feature.
If you are tracking Ecommerce events to sync with Meta Catalog Sales, you must format your eventData to include Meta’s required fields. You also need to map your custom event to the standard commerce event in the Linkrunner Dashboard. For detailed explanations of the required fields like content_ids, contents, and value, refer to our Meta Commerce Manager documentation.

Add To Cart Example

Use the trackEvent method to send an AddToCart event:

View Content Example

Use the trackEvent method to send a ViewContent event:

Payment / Purchase Example

Use the capturePayment method to send a Purchase event containing the ecommerce payload:
Note: For more information on testing and verifying your ecommerce events, please see our Testing Ecommerce Events guide.

Enhanced Privacy Controls

The SDK offers options to enhance user privacy:
When PII hashing is enabled, sensitive user data like name, email, and phone number are hashed using SHA-256 before being sent to Linkrunner servers.

Disabling AAID Collection

SDK Version Requirement: The AAID collection disable functionality requires Android SDK version 3.5.0 or higher.
The SDK provides options to disable AAID (Google Advertising ID) collection. This is useful for apps targeting children or families to comply with Google Play’s Family Policy.
Disabling AAID collection is not recommended unless absolutely necessary. The GAID is a primary signal for Google Ads attribution and install matching, so disabling it reduces attribution accuracy. Only disable it if your app is built for children or families and must comply with Google Play’s Family Policy.

Disable AAID Collection

To disable AAID collection, call setDisableAaidCollection before SDK initialization:
When AAID collection is disabled, the SDK will not collect or send the Google Advertising ID (GAID) to Linkrunner servers.

Removing AD_ID Permission

If you want to completely remove the AD_ID permission from your app’s manifest (for example, for apps targeting children), you can override the SDK’s permission declaration in your AndroidManifest.xml. For detailed instructions on revoking the AD_ID permission, including Google’s policy requirements for apps targeting children and Android 13+ (API 33+), see the Revoking the AD_ID Permission section above.

Uninstall Tracking

Before you begin

Here’s what you need to know before getting started: Requirements:

Android

Connect Firebase Cloud Messaging (FCM) with Linkrunner
To configure FCM HTTP V1 for uninstalls:Enable the FCM API:
  1. Go to the FCM console.
  2. Select a project.
  3. Go to Project Overview > Project settings.
  4. Copy the Project ID. This will be required in a later step. Project ID
  5. Go to the Cloud Messaging tab.
  6. Make sure that Firebase Cloud Messaging API (V1) is set to Enabled.
Create a custom role for Linkrunner Uninstall:
  1. Go to the Service accounts tab.
  2. Click Manage service account permissions.
  3. A new browser tab opens in Google Cloud Platform.
  4. In the side menu, select Roles.
  5. Click + Create role.
  6. Enter the following details:
    • Title: Linkrunner Uninstalls
    • ID: lr_uninstalls
    • Role launch stage: General availability
  7. Click + Add permissions.
  8. In Enter property name or value field, enter cloudmessaging.messages.create and select it from the search results. Google Cloud Permission
  9. Check the cloudmessaging.messages.create option and click Add.
  10. Click Create.
Assign Linkrunner the FCM uninstall role:
  1. In the side menu, select IAM.
  2. Open the View by Principals tab.
  3. Click Grant Access.
  4. In Add Principals -> New principals field, enter lr-uninstalls-tracking@lr-uninstalls-tracking.iam.gserviceaccount.com
  5. In Assign Roles -> Select a role field, enter Linkrunner Uninstalls and select it from the search results.
  6. Click Save.
The Linkrunner service account has been assigned the role of Linkrunner Uninstalls.
  1. In Linkrunner, go to Settings > Uninstall Tracking.
  2. Under the Android tab, enter the Firebase Project ID that you copied initially and click Save. Uninstall Tracking
Follow these instructions to integrate FCM with the Linkrunner SDK:
  1. Set up Firebase Cloud Messaging:
Set up Firebase Cloud Messaging in your Android app. See the Firebase Cloud Messaging documentation for detailed instructions.
  1. Configure your app to provide the device’s push token to the Linkrunner SDK.
Don’t forget to register your service in AndroidManifest.xml:
Custom implementations of FCM’s onMessageReceived method can unintentionally make uninstall push notifications visible to users, disrupting the intended silent experience. To avoid this, ensure your logic checks if the message contains lr-uninstall-tracking and handles it accordingly, as shown in the code example above.

Function Placement Guide

Complete Example

Here’s a simplified example showing how to integrate Linkrunner in a native Android app: You can find your project token here.

Next Steps

Test Your Integration

Validate your setup end-to-end

Set Up Deep Linking

Configure deep links for your app

Support

If you encounter issues during integration, contact us at support@linkrunner.io.