Uninstall Tracking
Uninstall tracking helps you understand user behavior and optimize campaigns:
- Purpose: Tracks app uninstalls to assess user engagement and campaign performance.
- Mechanism: Uses Firebase Analytics to set a user property (
ct_objectId
) linked to Trackier's unique identifier, and captures theapp_remove
event. - Workflow:
- Set
ct_objectId
withTrackierSDK.getTrackierId()
in your app. - Configure
app_remove
as a conversion event in Firebase. - Use a Firebase Cloud Function to send uninstall data to Trackier MMP.
- Set
- Use Case: Measure uninstall rates for a campaign to refine targeting.
Implementation
1. Add Dependencies
Install the Firebase Analytics plugin by running the following command in your project root directory:
npx expo install @react-native-firebase/analytics
Follow the Firebase Analytics setup instructions to add Firebase to your app, including adding the google-services.json
file to your Android project.
2. Set User Property
- JavaScript
- TypeScript
import React from 'react';
import { TrackierConfig, TrackierSDK } from 'expo-trackier';
import analytics from '@react-native-firebase/analytics';
import { StyleSheet, Text, View } from 'react-native';
export default function App() {
// Initialize Trackier SDK
const trackierConfig = new TrackierConfig("xxxx-xx-4505-bc8b-xx", TrackierConfig.EnvironmentDevelopment);
TrackierSDK.initialize(trackierConfig);
// Set up Firebase Analytics for uninstall tracking
const setupUninstallTracking = async () => {
const trackierId = await TrackierSDK.getTrackierId();
await analytics().setUserProperty('ct_objectId', trackierId);
};
return (
<View style={styles.container}>
<Text>Trackier Expo SDK with Uninstall Tracking</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});
import React from 'react';
import { TrackierConfig, TrackierSDK } from 'expo-trackier';
import analytics from '@react-native-firebase/analytics';
import { StyleSheet, Text, View } from 'react-native';
export default function App(): JSX.Element {
// Initialize Trackier SDK
const trackierConfig = new TrackierConfig("xxxx-xx-4505-bc8b-xx", TrackierConfig.EnvironmentDevelopment);
TrackierSDK.initialize(trackierConfig);
// Set up Firebase Analytics for uninstall tracking
const setupUninstallTracking = async (): Promise<void> => {
const trackierId = await TrackierSDK.getTrackierId();
await analytics().setUserProperty('ct_objectId', trackierId);
};
return (
<View style={styles.container}>
<Text>Trackier Expo SDK with Uninstall Tracking</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});
3. Setup Cloud Functions
Prerequisites
- Node.js 20.x or 22.x (use nvm for easy version management)
- Firebase CLI (
npm install -g firebase-tools
) - Firebase project on Blaze plan (required for analytics triggers)
- Google account with access to Firebase Console
- App with Firebase Analytics SDK integrated
- Trackier account (for uninstall event tracking)
Set Up Node.js and Firebase CLI
# Install Node Version Manager (nvm) if not already installed
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# Install and use Node.js 22 (recommended)
nvm install 22
nvm use 22
# Install Firebase CLI globally
npm install -g firebase-tools
# Login to Firebase
firebase login
Create or Select Your Firebase Project
If you already have a Firebase project for your app:
- Go to Firebase Console
- Select your project
If you need to create a new Firebase project:
- In the Firebase Console, click Add project and follow the steps
- Link Google Analytics when prompted
- Register your Android app and download
google-services.json
for your app
Initialize Firebase Functions in Your Project Directory
# Create a new directory for your project (if needed)
mkdir YourProjectName
cd YourProjectName
# Initialize Firebase in this directory
firebase init functions
Choose:
- Use an existing project (if you already have one) or create a new one
- Language: JavaScript
- ESLint: Yes (recommended)
- Install dependencies: Yes
Prepare Your Functions Directory
- Your folder structure should look like this:
YourProjectName/
functions/
index.js
package.json
.eslintrc.js
... - If you already have a
functions
directory, use it.
Add the Uninstall Tracking Function Code
Replace the contents of functions/index.js
with:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const axios = require("axios");
// Set your SDK key here (or use environment variables for security)
const SDK_KEY = "YOUR_SDK_KEY_HERE";
admin.initializeApp();
// Defensive: Only export analytics trigger if available
if (!functions.analytics) {
// This will prevent deployment errors in unsupported environments
console.warn("Analytics triggers are not available in this environment.");
exports.sendAndroidUninstallToTrackierApptrove = () => {};
} else {
exports.sendAndroidUninstallToTrackierApptrove = functions.analytics
.event("app_remove")
.onLog(async (event) => {
// Defensive extraction of user properties
const userProps =
event.user && event.user.userProperties ?
event.user.userProperties :
{};
const installId =
userProps.ct_objectId && userProps.ct_objectId.value ?
userProps.ct_objectId.value :
"";
const mode =
userProps.ct_mode && userProps.ct_mode.value ?
userProps.ct_mode.value :
"production";
const cuid =
userProps.ct_uid && userProps.ct_uid.value ?
userProps.ct_uid.value :
"";
const cmail =
userProps.ct_mail && userProps.ct_mail.value ?
userProps.ct_mail.value :
"";
if (!installId) {
functions.logger.warn(
"No ct_objectId found in event",
{userProps},
);
return null;
}
const url = "https://events.trackier.io/v1/uninstall";
const data = {
installId,
sdkKey: SDK_KEY,
mode,
cuid,
cmail,
meta: event,
};
try {
const response = await axios.post(
url,
data,
{
headers: {"Content-Type": "application/json"},
timeout: 10000,
},
);
functions.logger.log(
"Tracked uninstall",
{
installId,
status: response.status,
data: response.data,
},
);
} catch (error) {
functions.logger.error(
"Uninstall tracking failed",
{
installId,
status: error.response ? error.response.status : "N/A",
data: error.response ? error.response.data : error.message,
},
);
}
return null;
});
}
Set Up Dependencies In package.json
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"lint:fix": "eslint . --fix",
"lint": "eslint .",
"serve": "firebase emulators:start --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "20"
},
"main": "index.js",
"dependencies": {
"axios": "^1.10.0",
"firebase-admin": "^11.0.0",
"firebase-functions": "^3.23.0"
},
"devDependencies": {
"eslint": "^8.15.0",
"eslint-config-google": "^0.14.0"
},
"private": true
}
ESLint Configuration
Create a .eslintrc.js
file in your functions directory:
// .eslintrc.js
module.exports = {
parserOptions: {
ecmaVersion: 2020, // or at least 2015
sourceType: 'module', // if you're using ES modules (import/export)
},
env: {
es6: true,
node: true, // if you're in a Node.js environment
},
};
Deploy Your Function And Fix link Error
# In the functions directory
cd functions
# Install dependencies
npm install
# (Optional) Run linter and auto-fix issues
npm run lint:fix
firebase deploy --only functions
- If you see errors about CPU/Gen 2 or function already existing as 2nd Gen:
firebase functions:delete sendAndroidUninstallToTrackierApptrove --force
// After delete your function redeploy the function
firebase deploy --only functions - Ignore warnings about outdated
firebase-functions
if you need analytics triggers.
Verify and Debug
A. See Data in Firebase Console
- Go to Firebase Console
- Select your project
- Navigate to Analytics > Dashboard and look for the
app_remove
event
B. Use Analytics DebugView
- In the Firebase Console, go to Analytics > DebugView
- Enable DebugView on your device:
adb shell setprop debug.firebase.analytics.app <your.app.package>
# Example:
adb shell setprop debug.firebase.analytics.app com.example.myapp
# To turn off:
adb shell setprop debug.firebase.analytics.app .none. - Open your app and trigger uninstall or other events
- Watch for real-time events in DebugView
C. Check Cloud Function Logs
- In Firebase Console: Build > Functions > View logs
- monitor the status of your cloud function here:
https://console.cloud.google.com/functions/list
- Look for logs like
Tracked uninstall
orUninstall tracking failed
D. Check Trackier Uninstall Log
- Log in to your [Trackier dashboard]
- Navigate to uninstall/event logs
- Filter by
installId
or other user properties - Confirm the uninstall event was received
Troubleshooting & Tips
- Analytics triggers not working?
- Make sure you are on Blaze plan and Analytics is linked
- Only deploy to production (not emulator)
- Use
firebase-functions@3.x
andfirebase-admin@11.x
- CPU/Gen 2 errors?
- Remove any
"cpu"
option fromfirebase.json
or CLI flags - Delete the function if it was previously deployed as Gen 2, then redeploy
- Remove any
- Dependency conflicts?
- Downgrade
firebase-admin
to^11.0.0
if needed
- Downgrade
- Linting errors?
- Use
npm run lint:fix
and break up long lines/fix indentation
- Use
- Function not triggering?
- Ensure your app is setting the user property:
await analytics().setUserProperty('ct_objectId', trackierId);
- Use Analytics DebugView to verify the event is sent
- Ensure your app is setting the user property:
- Still stuck?
Best Practices
- Test Firebase Integration: Verify Firebase Analytics is correctly set up by logging custom events and checking the Firebase Console.
- Secure Firebase Configuration: Store
google-services.json
securely and avoid committing it to public repositories. - Call Setup Early: Execute the uninstall tracking setup code as early as possible in the app lifecycle to ensure the Trackier ID is set.
- Monitor Uninstall Data: Regularly check the Trackier Panel to analyze uninstall trends and optimize retention strategies.
- Comply with Privacy Regulations: Ensure uninstall tracking complies with GDPR, CCPA, and other privacy laws, obtaining user consent where required.
- Use Development Environment: Test uninstall tracking in
TrackierConfig.EnvironmentDevelopment
to avoid affecting production data.
Troubleshooting
- Trackier ID Not Set:
- Verify that
TrackierSDK.getTrackierId()
is called afterTrackierSDK.initialize
. - Check console logs for errors related to
getTrackierId
.
- Verify that
- Firebase Analytics Not Tracking:
- Ensure the
firebase_analytics
package is installed and configured correctly. - Confirm the
google-services.json
file is added to your Expo project. - Check the Firebase Console for event logs to verify
app_remove
events.
- Ensure the
- Uninstall Data Not Appearing in Trackier Panel:
- Verify the
app_remove
event is set as a conversion event in Firebase. - Ensure the Firebase Cloud Function is correctly implemented and deployed.
- Verify the
For further assistance, refer to the Trackier Documentation Portal or contact Trackier support at support@trackier.com.