In this guide 6 sections
Start with Expo. Its development builds now accept custom native modules, so scanners and Bluetooth printers rarely force you to leave it. Choose bare React Native only when your team already owns native build pipelines or a vendor SDK refuses to fit Expo’s configuration system.
Three setups, not two
People argue Expo against bare as if there were a wall between them. There are three setups. The managed workflow uses only libraries bundled with Expo. Expo with custom native code adds your own modules through development builds and config plugins. Bare React Native gives you the Xcode and Android Studio projects directly.
The middle option covers most business apps. You keep Expo’s build tooling and still add a native library when a device demands it.
When the hardware decides for you
Business apps lean on devices. A Zebra or Honeywell handheld sends scans through a vendor SDK or a keyboard wedge. A Bluetooth thermal printer needs a library that speaks ESC/POS. An MDM may inject managed app configuration that the app must read at launch.
Pure managed Expo cannot load most of these. A development build with a config plugin often can. Bare is needed when the SDK ships as a binary framework with manual linking steps that no plugin handles.
- Camera barcode scanning: usually fine in managed Expo
- Hardware scanner SDKs: development build with a plugin
- Bluetooth label printers: development build, test on real printers
- MDM managed configuration: development build or bare
- Vendor frameworks with manual linking: bare
Builds, updates and the store rules
EAS Build compiles iOS and Android binaries in the cloud, so nobody needs a Mac under a desk to ship an iPhone build. Bare projects can use it as well, or a pipeline of your own on GitHub Actions with fastlane.
Over-the-air updates let you fix JavaScript without a store review, but only for JavaScript and assets. Any change to a native module needs a new binary. Store policies also expect the update to keep the app’s purpose unchanged.
Count the skills in your own team
A team of web developers who know React will move faster in Expo. A bare project demands someone who can read a Gradle error, resolve CocoaPods conflicts and debug a crash in Kotlin or Swift. Without that person every upgrade stalls.
Ask who fixes the build when React Native releases a new version. A lone contractor carrying that job is a warning sign, so favour Expo, because its upgrade guides absorb much of that work.
- Who handles signing certificates and provisioning?
- Who upgrades React Native each year?
- Who can debug native crash logs?
- Who owns the CI pipeline?
A safe way to decide this week
Build a one-screen spike on the hardest device in your plan. Scan a code, print a label, read the managed configuration. Do it in an Expo development build on a real handset.
If it works, stay. If a vendor SDK blocks you, record the exact blocker and request a native module from the vendor. Eject to bare only with that note in hand.
React Native stack scorecard
A scorecard with three columns for managed Expo, Expo with custom native code and bare. Rows cover each required device, SDK or MDM feature, build service, update path, team skill and upgrade owner. Each cell takes a pass, workaround or blocked mark, and the closing line holds the choice made.
Open a blank worksheet to printQuestions owners ask
Can I move from Expo to bare later?
Yes. Running prebuild generates the native iOS and Android folders from your project. Moving is easier when you have kept native changes inside config plugins from the start.
Does Expo support Bluetooth printers?
Through community libraries inside a development build, yes. Test the exact printer model, since firmware and paper width settings differ between makes.
Will over-the-air updates replace store releases?
Only for JavaScript and asset changes. New native code, permissions or SDK versions still need a fresh binary and, on iPhone, a store or private distribution update.
Is bare React Native faster at runtime?
Not by itself. Both run the same engine. Speed depends on how you write lists, images and state updates, not on the project template.
