React Native lets you build iOS and Android apps from a single JavaScript/TypeScript codebase. The pitch — one team, two platforms, lower cost — is real, but it comes with boundaries that matter: performance ceilings, native-module edge cases, and app-store realities that no cross-platform framework eliminates. This guide lays out the genuine decision: React Native vs Flutter vs fully native, where each fits, what React Native cannot do well, and what actually drives the cost of a cross-platform build.

The cross-platform decision, honestly framed

You have three serious options, and each is the right answer for a different product:

ApproachBest forTrade-off
React NativeContent, commerce, booking, and forms-driven apps; teams with JavaScript expertise; products that also need a React web appBridge/native-module complexity at the edges; performance ceiling for heavy graphics
FlutterCustom UI and animations; teams starting fresh without JS investment; consistent rendering across devicesDart is a smaller hiring pool; larger app binaries; separate ecosystem from web
Fully native (Swift + Kotlin)Performance-critical apps, heavy media, Bluetooth/NFC hardware integration, platform-first UXTwo codebases, two teams, roughly double the maintenance

React Native's distinctive advantage is the shared ecosystem with React web: business logic, API clients, and even some UI patterns transfer between your web app and mobile app. If you already have a React frontend, React Native is usually the natural mobile choice. If you are starting from zero with a highly custom animated UI, Flutter deserves a serious look.

Where React Native genuinely fits

React Native excels at the apps most businesses actually need: catalogues and listings, booking flows, e-commerce, dashboards, content readers, forms-heavy workflows (onboarding, KYC, surveys), and social or messaging features. These are UI-driven apps where the heavy lifting happens on the server and the phone mostly renders lists, forms, and media — exactly what React Native does well.

It also fits products that will iterate fast. Over-the-air update systems let you push JavaScript-bundle fixes and minor changes without waiting for app-store review — a genuine operational advantage for businesses that need to move quickly, though native code changes still go through the stores.

Where React Native struggles — the honest limits

  • Performance-intensive graphics: games, complex animations at 60fps, heavy video editing, or real-time audio processing will hit the bridge between JavaScript and native code. These need native modules or a native build.
  • Deep hardware integration: Bluetooth LE peripherals, NFC edge cases, background processing with strict OS limits — possible in React Native, but each requires custom native modules, which erodes the "single codebase" savings.
  • Platform-specific UX expectations: iOS and Android users expect different navigation patterns and gestures. A single shared UI that ignores both platforms' conventions feels wrong on both. Good React Native apps still design per platform where it matters.
  • Framework churn: React Native's architecture has evolved significantly (the new architecture, Fabric, TurboModules). Apps built on old patterns need migration work. This is manageable with maintenance, but "build once, never touch it" is not realistic.

What actually drives cost and timeline

Cost depends on scope, integrations, and design complexity — not on the framework badge. For React Native specifically, the drivers are: the number of screens and their complexity, backend and third-party integrations (payments, maps, SMS, push notifications), native-module work (each custom native bridge is specialist work billed accordingly), offline behaviour (offline-first apps cost more to design but work far better on unreliable networks), and the app-store process itself (review cycles, certificates, compliance requirements).

A common budgeting mistake: pricing the app build but forgetting the backend. Most apps are thin clients over an API — the API, admin panel, and infrastructure are often half the project. Ask for an itemised quote that separates the mobile app, the backend/API, integrations, and ongoing maintenance, so you can see where the money goes.

What can go wrong

  • Bridge bottlenecks discovered late: performance problems that only appear on low-end Android devices with real data. Testing on flagship phones in the office is not testing. Budget for device-lab testing on the hardware your users actually own.
  • Dependency on abandoned libraries: the React Native ecosystem has many community libraries; some get abandoned. Vet library maintenance activity before building on them, and prefer libraries with active maintainers or commercial backing.
  • OTA updates masking process gaps: the ability to push updates over the air is not a substitute for testing. Rushed OTA pushes have broken production apps. The update pipeline needs the same discipline as store releases.
  • Store rejection surprises: Apple and Google reject apps for policy reasons — payments, data collection, minimum functionality. Review the store guidelines for your category before building, not after submission.

Expo vs bare workflow: a practical choice

React Native apps are built in one of two ways, and the choice affects cost and flexibility. Expo's managed workflow provides build tooling, over-the-air updates, and push notifications out of the box — it accelerates standard business apps (catalogues, bookings, forms) and removes a layer of native build complexity. The bare workflow (plain React Native CLI) gives full access to native code and any third-party native library, at the cost of managing the native build process yourself.

The rule of thumb: if your app's features exist within Expo's supported modules, the managed workflow ships faster and costs less to maintain. If you need custom native modules — Bluetooth peripherals, specialised SDKs, deep hardware integration — start bare, because ejecting mid-project to add native code is disruptive. This is a decision for the first week, not the third month; ask your vendor which workflow they recommend and why, before the build starts.

How a React Native build typically runs

  1. Platform decision and validation: confirm React Native fits your feature list — flag any feature needing custom native modules early and price it as specialist work.
  2. API and backend design: define the API contract the app will consume; most apps need a backend built or extended in parallel.
  3. Per-platform UX design: shared design system, but navigation and gestures adapted to iOS and Android conventions where users will notice.
  4. Core build in sprints: screens and flows built against the API contract, with native modules developed and tested on real devices as they are needed.
  5. Device and network testing: low-end Android devices, poor-network simulation, offline behaviour, and OS-version coverage — the testing most teams skip and most users punish.
  6. Store preparation and launch: certificates, store listings, privacy disclosures, review submission, staged rollout with crash monitoring from day one.
  7. Maintenance rhythm: OS updates, React Native upgrades, dependency audits, and a defined OTA-update policy so the app stays healthy after launch.

FAQs

React Native vs Flutter — which should we choose?

Choose React Native if your team knows JavaScript, you have (or plan) a React web app to share logic with, and your app is UI-and-forms driven. Choose Flutter if you are starting fresh, want highly custom animations, and value identical rendering across devices. Both are legitimate; the deciding factors are your team's skills, your web strategy, and how custom your UI needs to be — not which framework is "winning" this year.

Can React Native handle a complex app, or is it only for simple ones?

It handles complex apps well — large production apps run on React Native. Complexity that lives in business logic, navigation depth, and integrations is fine. Complexity that lives in heavy graphics, real-time media processing, or deep hardware integration is where you hit limits and need native modules. The right question is not "how complex" but "what kind of complex."

Do we still need separate iOS and Android developers?

For most of the build, no — one React Native team covers both platforms. But you still need native awareness: custom native modules, platform-specific bugs, and store processes require someone comfortable in Swift/Kotlin and the platform toolchains. Budget for that expertise even if it is a fraction of one person's time rather than two full teams.

How do over-the-air updates work, and are they safe?

OTA systems push updated JavaScript bundles to installed apps without app-store review, which is excellent for bug fixes and minor changes. They cannot update native code, so anything touching native modules still goes through the stores. They are safe when treated with release discipline — staged rollouts, monitoring, rollback capability — and dangerous when used to skip testing.

Expo or bare React Native — which workflow should we use?

Use Expo's managed workflow when your features fit its supported modules — it ships standard business apps faster with less native build overhead. Use the bare workflow when you need custom native modules (Bluetooth, specialised SDKs, deep hardware access), because ejecting mid-project is disruptive. Decide in the first week based on your feature list, not mid-build.

What does long-term maintenance look like?

Plan for ongoing work: annual OS updates from Apple and Google, React Native version upgrades, dependency security audits, and store policy changes. An app that is never updated rots — libraries go stale, OS changes break things, stores delist non-compliant apps. A maintenance agreement covering these rhythms costs far less than emergency rescues.

Deciding between React Native, Flutter, and native for your product? Talk to us about what your app needs to do — we will recommend the approach that fits, even if it is not ours to build. Also see mobile app development, Flutter app development, and API development services for the backend your app will need.