The native vs web vs cross-platform decision gets made too early, too casually, and based on the wrong factors. Teams choose native because "mobile apps need to be native." They choose React Native because engineers already know React. They choose web because it's easier to deploy. None of these are wrong, but none are complete decision frameworks either.
What Native Does Well
Native apps (Swift/Kotlin or SwiftUI/Jetpack Compose) have the best access to platform APIs, the best performance for computation-heavy tasks (camera, AR, GPU-bound animations), and the most native-feeling interactions. They're harder to build and maintain (two codebases) but produce the best experience on each platform when done well.
What Web Does Well
Web apps are easier to update (no app store approval), easier to share (a URL rather than an install step), and reach users with one codebase. For content-heavy products, tools (productivity, dashboards), or anything where the install barrier matters (one-time use cases), web is often the right choice.
Cross-Platform
React Native and Flutter occupy the middle: one codebase, native rendering (in most cases), access to most native APIs. The performance gap vs native has narrowed significantly. The development experience gap vs web has also narrowed. For teams with React expertise building mobile apps, React Native is now a genuinely good choice for most product types.
The Decision Framework
Ask: Does the experience require deep platform integration (camera, Bluetooth, background processing)? Do you need peak performance for graphics-intensive features? Can you support two codebases? If yes to all three, consider native. If not, evaluate cross-platform first, then web.