One codebase shipping to iOS and Android sounds like half the work. For a small team it often is, right up until you hit the part of the app users actually judge you on. The savings are real. So is the bill that comes due at the native edge. Here's where each one lands.
The win is velocity, not just headcount
The obvious pitch is "write once." The real pitch is iterate once. A bug fix, a copy change, a new screen: you do it in one place and both platforms get it in the same release. For a team of three, that compounds faster than the headcount math suggests: fewer branches, one review, one QA pass, one set of analytics to reason about.
React Native, Flutter, and friends are past the "toy" phase. Shopify, Discord, and Coinbase run real traffic on React Native. The framework is rarely the thing that breaks you.
The trap is the last 10%
Cross-platform gets you to a working app fast and stalls exactly where quality lives: the native surface. Gestures, haptics, the keyboard toolbar, system materials, the transitions between screens. These are the moments users feel, and they're the moments the abstraction leaks.
The failure mode is predictable: you build 90% in a week, then spend a month on native modules, platform if branches, and one screen that renders blank on Android for reasons the docs don't cover. The time you saved up front, you pay back at the edge, usually right before launch, when you have the least slack.
Choose by where your hard problems are
The decision isn't ideological. It's about where your app's difficulty sits.
- Go cross-platform when the app is mostly screens, forms, lists, and API calls, like most B2B tools, dashboards, and content apps. The native edge is small, so the tax is small.
- Go native (or accept two teams) when the product is the native experience: a camera, a game, heavy real-time audio, deep OS integration. There, you'd fight the abstraction on every feature.
Most startups are in the first bucket and talk themselves into the second out of fear. Ship cross-platform, and treat the native polish as a known line item, not a surprise.
You can buy back the last 10%
The native edge is expensive because every team rediscovers it from scratch: why glass renders blank, how to morph a control instead of swapping it, where the keyboard toolbar belongs. That knowledge is the same across apps. It doesn't have to be yours to earn.
That gap is closeable: a growing catalog of curated, glass-safe React Native components, real iOS 26 Liquid Glass, with an automatic blur fallback on Android and older iOS, installed by your coding agent in one pass. Keep the velocity of one codebase and skip the month at the edge.
Cross-platform is the right default for most teams. Just budget for the last 10% before it budgets you.