Agencies tend to pick one and defend it for ever, because it is cheaper to have one team that is good at one thing. We run both, which means we get asked to justify the choice on every project. Here is the actual reasoning.
What does not decide it
Performance, for almost everyone. Both produce apps that feel native for the kind of software most businesses need. If you are building a game or a video editor this is a different article, but a booking app, a shop or a scanner will not be limited by either.
Nor does the language. A team that can write Dart can write TypeScript.
What does
- Does it share code with a web app? If there is a React front end already, React Native reuses types, validators and API clients. That is a genuine saving, and it is why WasteLinks is Expo alongside a Next.js web app.
- How hard is the interface working? Flutter draws every pixel itself, so a dense, heavily branded interface behaves identically on both platforms. That is why Enjoy Events is Flutter.
- What hardware does it touch? Sustained camera work such as door scanning, background location, Bluetooth. We look at what exists today rather than what could be written.
- Who maintains it after us? If the client has a web team, handing them React Native is kinder than handing them Dart.
The one that surprises people
Over-the-air updates. React Native with Expo can ship most changes straight to the phone without an App Store review. For a product that changes weekly, that is worth more than any technical comparison.
It is how the Devin ce beau delivery app works: new screens and copy fixes arrive in seconds, and only genuinely native changes need a fresh build and Apple's review.
How it usually lands
Roughly: dense branded interface, heavy hardware use, no web app to share with, we reach for Flutter. Existing React codebase, frequent releases, a team who will maintain it, we reach for Expo.
And when it is genuinely close, we pick the one your future maintainers can hire for. That outlasts any argument about rendering.