Installation
Requirements
- Flutter 3.19.0 or higher
- Dart 3.3.0 or higher
- iOS 15.0+ / Android 5.0 (API level 21) and above
Step 1: Add the Package
Run the following command to add the latest version of the Linkrunner package to your project:- Add the latest version of
linkrunnerto yourpubspec.yaml - Download and install the package and its dependencies
Step 2: Platform Specific Setup
Android Configuration
- Ensure your project’s
minSdkVersionis at least 21 in yourandroid/app/build.gradlefile:
- Add the following permissions to your
AndroidManifest.xmlfile:
Note: TheAD_IDpermission (<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.
Revoking the AD_ID Permission
According to Google’s Policy, apps that target children must not transmit the Advertising ID. To revoke the AD_ID permission, use Flutter 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 thesetDisableAaidCollection() and isAaidCollectionDisabled() functions to disable AAID collection programmatically:
android/app/src/main/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.Backup Configuration
For Android apps, 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. For detailed backup configuration instructions, please refer to the Android SDK Backup Configuration.iOS Configuration
- Update your iOS deployment target to iOS 15.0 or higher in your
ios/Podfile:
- Add the following to your
Info.plistfile for App Tracking Transparency:
Initialization
You’ll need your project token to get started!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 authenticationkeyId: A unique identifier for the key pair used in the signing process
getAttributionData method.
Platform-Specific SDK Signing
For applications requiring different signing keys per platform:User Registration
Call thesignup method once after the user has completed your app’s onboarding process:
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).
- Mixpanel - ID Management & User Identification
- PostHog - How User Identification Works
- Amplitude - Identify Users Documentation
- mixpanelDistinctId for Mixpanel
- amplitudeDeviceId for Amplitude
- posthogDistinctId for PostHog
Getting Attribution Data
To get attribution data and deeplink information for the current installation, use thegetAttributionData function:
getAttributionData function returns an AttributionData object with the following structure:
Setting User Data
CallsetUserData each time the app opens and the user is logged in:
Setting CleverTap ID
Use thesetAdditionalData method to set CleverTap ID:
Parameters for LinkRunner.setAdditionalData
clevertap_id: String (optional) - CleverTap user identifier
Tracking Custom Events
Track custom events in your app:Revenue Sharing with Ad Networks
To enable revenue sharing with ad networks like Google Ads and Meta, include anamount 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.Revenue Tracking
Capturing Payments
Track payment information:Parameters for LRCapturePayment
amount: double (required) - The payment amountuserId: String (required) - Identifier for the user making the paymentpaymentId: String (optional) - Unique identifier for the paymenttype: PaymentType (optional) - Type of payment. Available options:PaymentType.FIRST_PAYMENT- First payment made by the userPaymentType.SECOND_PAYMENT- Second payment made by the userPaymentType.WALLET_TOPUP- Adding funds to a walletPaymentType.FUNDS_WITHDRAWAL- Withdrawing fundsPaymentType.SUBSCRIPTION_CREATED- New subscription createdPaymentType.SUBSCRIPTION_RENEWED- Subscription renewalPaymentType.ONE_TIME- One-time paymentPaymentType.RECURRING- Recurring paymentPaymentType.DEFAULT_PAYMENT- Default type (used if not specified)
status: PaymentStatus (optional) - Status of the payment. Available options:PaymentStatus.PAYMENT_INITIATED- Payment has been initiatedPaymentStatus.PAYMENT_COMPLETED- Payment completed successfully (default if not specified)PaymentStatus.PAYMENT_FAILED- Payment attempt failedPaymentStatus.PAYMENT_CANCELLED- Payment was cancelled
Removing Payments
Remove payment records (for refunds or cancellations):Parameters for LRRemovePayment
userId: String (required) - Identifier for the user whose payment is being removedpaymentId: String (optional) - Unique identifier for the payment to be removed
paymentId or userId must be provided when calling removePayment. If only userId is provided, all payments for that user will be removed.
Enhanced Privacy Controls
The SDK offers options to enhance user privacy:Disabling AAID Collection
SDK Version Requirement: The AAID collection disable functionality requires Flutter SDK version 3.5.0 or higher.
Disable AAID Collection
To disable AAID collection, callsetDisableAaidCollection before SDK initialization:
Removing AD_ID Permission
If you want to completely remove theAD_ID permission from your app’s manifest (for example, for apps targeting children), you can override the SDK’s permission declaration in your android/app/src/main/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:- Flutter SDK 3.2.2 and later
- Firebase in your Flutter project (Android)
- Registering your app with APNs (iOS)
Android
Connect Firebase Cloud Messaging (FCM) with LinkrunnerFCM HTTP v1 API
FCM HTTP v1 API
To configure FCM HTTP V1 for uninstalls:Enable the FCM API:
- Go to the FCM console.
- Select a project.
- Go to Project Overview > Project settings.
- Copy the Project ID. This will be required in a later step.

- Go to the Cloud Messaging tab.
- Make sure that Firebase Cloud Messaging API (V1) is set to Enabled.
- Go to the Service accounts tab.
- Click Manage service account permissions.
- A new browser tab opens in Google Cloud Platform.
- In the side menu, select Roles.
- Click + Create role.
- Enter the following details:
- Title: Linkrunner Uninstalls
- ID: lr_uninstalls
- Role launch stage: General availability
- Click + Add permissions.
- In Enter property name or value field, enter
cloudmessaging.messages.createand select it from the search results.
- Check the cloudmessaging.messages.create option and click Add.
- Click Create.
- In the side menu, select IAM.
- Open the View by Principals tab.
- Click Grant Access.
- In Add Principals -> New principals field, enter
lr-uninstalls-tracking@lr-uninstalls-tracking.iam.gserviceaccount.com - In Assign Roles -> Select a role field, enter
Linkrunner Uninstallsand select it from the search results. - Click Save.
Linkrunner Dashboard
Linkrunner Dashboard
- In Linkrunner, go to Settings > Uninstall Tracking.
-
Under the Android tab, enter the Firebase Project ID that you copied initially and click Save.

Integrate with Linkrunner SDK
Integrate with Linkrunner SDK
Follow these instructions to integrate FCM with the Linkrunner SDK:Custom implementations of FCM’s
- Set up Firebase Cloud Messaging:
- Configure your app to provide the device’s push token to the Linkrunner SDK.
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.iOS
Connect APNs with LinkrunnerApple Developer Portal
Apple Developer Portal
Get the required credentials from the Apple Developer Portal:APNs Authentication Key (p8) and Key ID:
- Go to the Apple Developer Portal.
- Select Identifiers under Certificates, IDs & Profiles.
- Click on the app you want to track uninstalls for. Then, under Capabilities, search for Push Notifications and enable it.
- Under Certificates, IDs & Profiles, select Keys and click on plus (+) icon to create a key. Enable APNs when creating the key and download the key file (p8).
- The Key ID can be found in the Keys tab.
- Under Identifiers, click on your app and you will see the Bundle ID and Team ID (App ID Prefix).
Linkrunner Dashboard
Linkrunner Dashboard
- In Linkrunner, go to Settings > Uninstall Tracking.
-
Under the iOS tab, upload the APNs Authentication Key (p8) file and enter the Key ID, Bundle ID and Team ID (App ID Prefix) that you copied from the Apple Developer Portal.

Integrate with Linkrunner SDK
Integrate with Linkrunner SDK
Follow these instructions to integrate FCM with the Linkrunner SDK:
- Set up Firebase Cloud Messaging:
- Configure your app to provide the device’s APNs token to the Linkrunner SDK.
Function Placement Guide
| Function | Where to Place | When to Call |
|---|---|---|
LinkRunner().init | App initialization | Once when app starts |
LinkRunner().getAttributionData | Attribution data handling flow | Whenever the attribution data is needed |
LinkRunner().setAdditionalData | Integration code | When third-party integration IDs are available |
LinkRunner().signup | Onboarding flow | Once after user completes onboarding |
LinkRunner().setUserData | Authentication logic | Every time app opens with logged-in user |
LinkRunner().trackEvent | Throughout app | When specific user actions occur |
LinkRunner().capturePayment | Payment processing | When user makes a payment |
LinkRunner().removePayment | Refund flow | When payment needs to be removed |
LinkRunner().setDisableAaidCollection | App initialization or privacy settings | When you need to disable AAID collection |
LinkRunner().isAaidCollectionDisabled | Privacy settings or compliance checks | When you need to check AAID collection status |
Complete Example
Here’s a simplified example showing how to integrate Linkrunner in a Flutter 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