MMP SDK HubAttribution SDK datasheets
Home / Guides / Expo and MMP SDKs

Expo and MMP SDKs: Managed vs Bare Workflow

How attribution SDKs work in Expo: why Expo Go can't run them, config plugins in the managed workflow, what changes in a bare project, and which MMPs support Expo.

Short answer

An MMP SDK contains native iOS and Android code, so it never runs in Expo Go. In a managed project you add the vendor's config plugin to app config and use a development build; in a bare project you install the React Native package and edit the native files yourself. Six of the nine MMPs here publish an Expo-ready package.

Why can't Expo Go run an MMP SDK?

Expo Go is a prebuilt app that contains only the native modules Expo ships with it. An attribution SDK brings its own native iOS and Android libraries, so it can't be loaded into Expo Go.

Development build: your own build of the app that includes expo-dev-client and any native libraries you add. It replaces Expo Go for testing once a native SDK is in the project.

This is the first thing to tell a team that has been testing in Expo Go: the attribution SDK will not appear to work there, and that is expected. Install it in a development build or an EAS build instead.

Managed workflow: config plugins do the native work

In the managed workflow you don't commit ios/ and android/ folders. Expo generates them during npx expo prebuild, and config plugins make the native changes an SDK needs during that step.

A typical managed setup has four parts:

  1. Install the package with npx expo install so the version matches your Expo SDK.
  2. Add the config plugin to the plugins array in app.json or app.config.js, with any options the vendor documents (for example an ATT wait time or a link domain).
  3. Set platform keys in app config: ios.infoPlist.NSUserTrackingUsageDescription for the ATT prompt, ios.associatedDomains for universal links and android.intentFilters with autoVerify for App Links.
  4. Build a development build to test, then an EAS or local release build.

Because prebuild regenerates the native folders, never edit them by hand in a managed project. Anything the SDK needs must come from the config plugin or app config, or it will be lost on the next prebuild.

Bare workflow: you own the native folders

A bare project commits ios/ and android/ and treats them like any React Native app. You can still use a vendor's config plugin once through prebuild, but after that you maintain the native changes yourself:

  • Add the React Native package and run pod install.
  • Add Info.plist keys, Associated Domains and the Android intent filters by hand, following the vendor's React Native docs.
  • Add any Gradle dependencies the vendor lists, such as the Play Install Referrer library.

Teams usually go bare when they need native code that no config plugin covers. For an MMP SDK alone, a managed project with a config plugin is less work to keep up to date.

Which MMPs support Expo?

From the Expo datasheet, checked 2 Nov 2026:

RouteVendors
Vendor package or config pluginAirbridge, AppMetrica, AppsFlyer, Kochava, Linkrunner, Singular
Vendor-documented community pluginAdjust, Branch
No Expo route foundTenjin

A few details behind that table:

  • AppsFlyer documents Expo SDK 52 or later with the New Architecture for its 7.x plugin, built with expo-dev-client.
  • Adjust and Branch both document Expo through config plugins in the expo/config-plugins repository, which the Expo community maintains. Branch's docs list Expo SDK 54 as the minimum.
  • Kochava's React Native docs list Expo 54 as a minimum, but a config plugin is documented only for an older major version of its package.
  • Linkrunner publishes expo-linkrunner as a config plugin alongside its React Native package, for Expo SDK 52 and later.
  • AppMetrica gives Expo steps that use expo-dev-client, without a config plugin.
  • Singular ships an Expo config plugin inside its React Native package.

Use the SDK picker to see the package names, licences and versions side by side.

ATT, Install Referrer and deep links in Expo

The setup an MMP needs doesn't change because you use Expo; only where you declare it does.

  • ATT: set the usage description through app config or the plugin's option, then show the prompt with expo-tracking-transparency or the SDK's own method before the SDK sends the install, if you want the IDFA on it.
  • Play Install Referrer: comes with the vendor's Android SDK in most cases. Check the vendor's datasheet if it asks for a Gradle dependency; in a managed project that has to come from the plugin.
  • Deep links: Expo Router and React Navigation's linking config both handle incoming URLs. Make sure the link reaches the MMP SDK too, or deferred deep links will open the home screen. The deferred deep link symptom page on Attribution Debugger walks through that failure.

A working order for Expo teams

  1. Confirm the MMP has an Expo route on the Expo datasheet.
  2. Check its minimum Expo SDK against yours. A plugin that needs Expo 54 means upgrading first.
  3. Move testing from Expo Go to a development build.
  4. Add the plugin and platform keys in app config, run prebuild and inspect the generated Info.plist and AndroidManifest.xml once.
  5. Test an install from a real tracking link on a device, then a deferred deep link from a fresh install.

Linkrunner is one of the vendors whose Expo route is a config plugin it publishes itself; its Expo SDK docs show the plugin options and the development build steps.

Questions

Do I need to eject from Expo to add an MMP SDK?

No. Ejecting is no longer how Expo works. Add the vendor's config plugin, run prebuild and use a development build; you only move to a bare project if you want to maintain the native folders yourself.

Why does my MMP dashboard show no installs from Expo Go?

Expo Go can't load the SDK's native code, so the SDK never starts there. Test attribution in a development build or a release build on a real device.

Can I use a community config plugin in production?

Many teams do, and Adjust and Branch both point to one. Check that the plugin version supports your Expo SDK and the vendor's current React Native package before each upgrade.

Does EAS Build run config plugins?

Yes. EAS runs prebuild for managed projects, so the plugin's native changes are applied on every cloud build.

What is an MMP SDK?

An MMP SDK is the library a mobile measurement partner asks you to add to your app. It records the first open, in-app events and deep link opens, and sends them to the MMP so installs can be matched to the ad or link that drove them.

Is every MMP SDK open source?

No. Many wrappers and SDKs are MIT licensed, but some native SDKs are proprietary: AppsFlyer's native iOS and Android SDKs, Kochava's SDKs and AppMetrica's Flutter plugin are published under proprietary terms. The licence column in each table shows what the registry or repository states.