The Decision That Shapes Your Entire Project
This is probably the most impactful decision you'll make on a React Native project, and the official docs don't explain the tradeoffs clearly enough. We've started projects with all three approaches — Expo Managed Workflow (7 projects), Expo Bare/Prebuild (5 projects), and vanilla React Native CLI (3 projects). Here's the honest comparison.
Expo Managed: Incredible DX, Real Limitations
Expo Managed is pure joy for the first few months. No Xcode, no Android Studio, no native build configuration. You write JavaScript/TypeScript, push to Expo's build service (EAS Build), and get installable apps back. OTA updates via EAS Update mean you can ship bug fixes without going through App Store review. For our team, the development velocity on Expo Managed projects is about 30% higher than bare React Native in the first three months.
The limitation: anything that requires custom native code is off-limits unless there's an Expo module for it. We hit this wall on our fourth Expo Managed project when the client needed to integrate a specific Indian payment SDK (not Razorpay — a bank-specific SDK that only provided native iOS/Android libraries). There was no Expo module, no JavaScript wrapper, and writing a custom native module requires ejecting to the bare workflow. We ejected, and it took a week to untangle the Expo-specific configurations.
Our rule: if the project requirements are clear and can be met with Expo's module ecosystem, Managed workflow is the best choice. If there's any chance of needing custom native code, don't start with Managed — the ejection process is disruptive.
Expo Bare/Prebuild: The Best of Both Worlds?
Expo's Prebuild (formerly "bare workflow") is increasingly our default. You get access to native project files (ios/ and android/ directories), so you can add any native module you want. But you still get Expo's ecosystem — EAS Build, EAS Update, Expo modules, and the Expo CLI. The native files are generated from your app.json configuration, so you can regenerate them if they get messed up.
This approach gives you the safety net of Expo's tooling while keeping the escape hatch of native code access. The tradeoff: you need to know enough about Xcode and Android Studio to troubleshoot native build issues. And when you install a library that requires native linking (pod install, Gradle configuration), you need to understand what's happening. The Expo Prebuild abstraction handles most of this, but edge cases still require native knowledge.
We've shipped five apps with this approach and all five are still on it with no plans to change. It's the sweet spot for most projects.
React Native CLI: Maximum Control, Maximum Pain
Vanilla React Native without Expo is for teams that need complete control over every aspect of the native build. We use this for projects with heavy native integration (apps with custom camera processing, Bluetooth LE communication, or AR features) where we need to modify native build settings that Expo's abstraction layer doesn't support.
The downside: everything that Expo automates, you do manually. Build configuration, code signing, CI/CD setup, native module linking, OTA updates (you need CodePush or a custom solution). For our React Native CLI projects, we spend about 15-20% of engineering time on build tooling and native configuration — time that's near zero with Expo.
We also find that onboarding new developers is significantly slower. Setting up a vanilla React Native development environment on a new machine takes 2-4 hours (installing Xcode, Android Studio, SDKs, configuring emulators). Expo takes about 15 minutes.
The Decision Matrix
Standard app with well-known native integrations (camera, maps, payments via Stripe/Razorpay, push notifications): Expo Managed. App that might need custom native modules or has specific native requirements: Expo Prebuild. App with extensive custom native code, AR/VR, Bluetooth, or bleeding-edge native APIs: React Native CLI.
If you're a startup building your first app and you're not sure what you'll need: start with Expo Prebuild. You get 95% of the DX benefits of Managed with the flexibility to go native when you need to. You can always drop down to CLI-level control later, but going from CLI to Expo is much harder.