Skip to main content

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 the app_remove event.
  • Workflow:
    1. Set ct_objectId with TrackierSDK.getTrackierId() in your app.
    2. Configure app_remove as a conversion event in Firebase.
    3. Use a Firebase Cloud Function to send uninstall data to Trackier MMP.
  • Use Case: Measure uninstall rates for a campaign to refine targeting.

Implementation

1. Add Dependencies

dependencies {
implementation platform('com.google.firebase:firebase-bom:33.1.0')
implementation 'com.google.firebase:firebase-analytics'
}

2. Set User Property

private FirebaseAnalytics mFirebaseAnalytics;

// Initialize Firebase Analytics
FirebaseAnalytics mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);

// Set the user property with Trackier ID
mFirebaseAnalytics.setUserProperty("ct_objectId", Objects.requireNonNull(TrackierSDK.getTrackierId()));

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:

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
},
};

# 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

  • Look for logs like Tracked uninstall or Uninstall 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 and firebase-admin@11.x
  • CPU/Gen 2 errors?
    • Remove any "cpu" option from firebase.json or CLI flags
    • Delete the function if it was previously deployed as Gen 2, then redeploy
  • Dependency conflicts?
    • Downgrade firebase-admin to ^11.0.0 if needed
  • Linting errors?
    • Use npm run lint:fix and break up long lines/fix indentation
  • Function not triggering?
    • Ensure your app is setting the user property:
      mFirebaseAnalytics.setUserProperty("ct_objectId", trackierId)
    • Use Analytics DebugView to verify the event is sent
  • Still stuck?