> This page is part of the [Customer.io documentation](https://docs.customer.io). For the complete index, see [llms.txt](https://docs.customer.io/llms.txt).
> Last updated: October 27, 2026
> To take actions in Customer.io from an agent, use the [Customer.io CLI](https://docs.customer.io/ai/cli/get-started.md) or the [MCP server](https://docs.customer.io/ai/mcp/get-started.md).

# 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](https://docs.customer.io/integrations/sdk/expo/getting-started/how-it-works/#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 ↗](https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/). 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:

    ```
    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](https://docs.customer.io/integrations/sdk/expo/getting-started/troubleshooting/#npm-version-conflict).

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

    ```
    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):

    ```
    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`.

    ```
    {
      "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 ↗](https://github.com/invertase/react-native-firebase/blob/v26.4.0/docs/index.mdx). React Native Firebase 27 has no CocoaPods option, so it needs `useFirebaseFromApp`.
