GitHub project

Migrate to Firebase Installation IDs

Register Firebase Installation IDs (FIDs) with Customer.io instead of FCM registration tokens. FID mode is optional, and your existing token-based integration keeps working until you choose to migrate.

Firebase Cloud Messaging can register devices with Firebase Installation IDs (FIDs) instead of FCM registration tokens. Starting in version 4.24.0, the Customer.io Android SDK registers the FID when your app turns on FID registration. Until you do, the SDK keeps registering FCM tokens.

When someone opens a version of your app with FID registration turned on, the SDK replaces the device’s FCM token with the FID on their profile. You don’t need to change anything in Customer.io. To learn how FIDs differ from FCM tokens and how Customer.io sends to each, see Device IDs.

Turn on FID mode

  1. Update the Customer.io SDK to 4.24.0 or later, and firebase-messaging to 25.1.2 or later.
  2. Turn on FID registration in your AndroidManifest.xml, inside <application>. See Firebase’s Android setup guide for details.
    XML
    <meta-data
        android:name="firebase_messaging_installation_id_enabled"
        android:value="true" />
  3. If your app has its own FirebaseMessagingService, forward onRegistered to Customer.io instead of onNewToken. Firebase calls only onRegistered in FID mode.
    KOTLIN
    override fun onRegistered(installationId: String) {
        CustomerIOFirebaseMessagingService.onRegistered(this, installationId)
    }
  4. If your app calls CustomerIO.instance().registerDeviceToken(), pass the FID from FirebaseInstallations.getInstance().id instead of an FCM token. Firebase doesn’t return an FCM token in FID mode. Reading the FID doesn’t register it with FCM, so FCM can’t deliver to it until Firebase registers the app. Firebase registers the app at startup by default. If you turned off FCM auto-initialization, call FirebaseMessaging.getInstance().register() first, and read the FID after it completes.

To go back to FCM tokens, remove the meta-data element and forward onNewToken again.

Updated October 23, 2026