GitHub project

Upgrade from 3.x to 4.0.0

Version 4.0.0 of the Customer.io Expo plugin requires version 7.0.0 of customerio-reactnative, which uses version 5.0.0 of our native iOS and Android SDKs. For most apps, the upgrade is a version bump.

What changed?

Version 4.0.0 of the Expo plugin requires version 7.0.0 of customerio-reactnative, which uses version 5.0.0 of the Customer.io iOS and Android SDKs, and Expo SDK 54 or later. For apps already on Expo SDK 54 or later, this upgrade is a version bump. Your plugin configuration, your app code, and the iOS 15.1 and Android API level 24 minimums stay the same.

On Android, the SDK now brings in firebase-messaging 26.0.0, play-services-base 18.11.1, and WorkManager (androidx.work) 2.12.0. Gradle picks up these versions automatically. If your app forces older versions of these libraries, raise those versions.

Android builds also need compileSdk 36 or later and Android Gradle plugin 8.9.1 or later. Expo SDK 54 and later meet these requirements, but Expo SDK 53 doesn’t. See Minimum requirements.

Upgrade process

  1. If your app is on Expo SDK 53 or earlier, upgrade it to Expo SDK 54 or later first. See Expo’s SDK upgrade guide. Apps that stay on SDK 53 or earlier can keep using version 3.x of the plugin.

  2. Install the plugin with version 7.0.0 of customerio-reactnative, which is now the plugin’s peer dependency:

    BASH
    npx expo install customerio-expo-plugin@4.0.0 customerio-reactnative@7.0.0

    Later 4.x versions of the plugin can require a later version of customerio-reactnative. If npm reports a peer dependency conflict, see npm version conflict when installing or updating.

  3. If you keep your ios folder between builds, regenerate it:

    BASH
    npx expo prebuild --clean

    Or, from your ios folder, run pod update CustomerIO once. If you use FCM, add CioFirebaseWrapper to that command. If you use live notifications, also add CustomerIOLiveActivitiesTemplates CustomerIOLiveActivitiesAttributes. The plugin lists those widget pods without a version, so pod update CustomerIO alone leaves them on 4.x. Your Podfile.lock still lists the pods from customerio-reactnative 6.x, so a plain pod install stops with an error.

  4. Rebuild your app.

React Native Firebase 26.1 and later

React Native Firebase 26.1 and later adds Firebase to your iOS app through Swift Package Manager by default. For the fcm push provider, the plugin adds the customerio-reactnative/fcm pod, which adds Firebase through CocoaPods. With both, your app has two copies of Firebase and the build fails. Versions 3.x and 4.0 have this limitation.

Version 4.1.0 adds the ios.pushNotification.useFirebaseFromApp option for these apps. With it, the plugin installs customerio-reactnative/fcm-core, which adds no Firebase of its own and uses the FirebaseMessaging that React Native Firebase brings in. It works with React Native Firebase 26.1 and later, including 27.

  1. Update to customerio-expo-plugin 4.1.0 or later, with the customerio-reactnative version that plugin release requires (7.1.0 for plugin 4.1.0):

    BASH
    npx expo install customerio-expo-plugin@4.1.0 customerio-reactnative@7.1.0
  2. Install @react-native-firebase/messaging as well as @react-native-firebase/app. Without FirebaseMessaging in your app, the app stops at launch.

  3. In your app.json or app.config.js, set ios.pushNotification.useFirebaseFromApp to true, and set ios.useFrameworks to dynamic in both expo-build-properties and the customerio-expo-plugin options. React Native Firebase requires dynamic frameworks, and the two values must match. If you set up the earlier workaround, remove ios.disableSPM from your @react-native-firebase/app plugin options and the React Native Firebase modules, like RNFBApp and RNFBMessaging, from expo-build-properties ios.forceStaticLinking. Merge these keys into your existing config, and keep your React Native Firebase setup otherwise, including expo.ios.googleServicesFile and expo.android.googleServicesFile, and don’t set the Customer.io plugin’s ios.pushNotification.googleServicesFile.

    JSON
    {
      "expo": {
        "ios": { "googleServicesFile": "./GoogleService-Info.plist" },
        "android": { "googleServicesFile": "./google-services.json" },
        "plugins": [
          "@react-native-firebase/app",
          "@react-native-firebase/messaging",
          [
            "expo-build-properties",
            { "ios": { "useFrameworks": "dynamic" } }
          ],
          [
            "customerio-expo-plugin",
            {
              "android": {
                "googleServicesFile": "./google-services.json"
              },
              "ios": {
                "useFrameworks": "dynamic",
                "pushNotification": {
                  "provider": "fcm",
                  "useFirebaseFromApp": true
                }
              }
            }
          ]
        ]
      }
    }
  4. Run npx expo prebuild --clean, then rebuild your app.

If you keep the fcm provider without this option and use React Native Firebase 26.2 or a later 26.x version, you can set ios.disableSPM to true in your @react-native-firebase/app plugin options instead, so React Native Firebase uses CocoaPods too. That setup needs static frameworks, with the React Native Firebase modules you use listed in expo-build-properties ios.forceStaticLinking, as described in React Native Firebase’s 26.x Expo setup. React Native Firebase 27 has no CocoaPods option, so it needs useFirebaseFromApp.

Updated October 27, 2026