A client's team spent four months building a field service app in Flutter because a blog post told them it was the future of cross-platform development. The mobile app was solid. Then they tried to deploy the web version — Flutter Web — and hit a wall. Performance issues, limited library ecosystem compared to JavaScript, and rendering behavior that didn't match web user expectations.
They ended up rebuilding the web frontend in React while maintaining the Flutter mobile app. Two codebases instead of one — the exact outcome cross-platform was supposed to prevent.
I've seen this pattern enough times to have a strong opinion: your mobile framework decision should be driven by your team's existing skills and your product's primary platform, not by which framework has the most enthusiastic community.
The Decision Matrix
Your team writes React/JavaScript and web is your primary platform. Use React Native with Expo. The code sharing between web and mobile is real and practical. Shared business logic, shared types, shared API clients. The Expo framework handles the build toolchain complexity that makes React Native painful without it. Your team ships faster because they're working in familiar territory.
Mobile is your primary product with complex UI requirements. Go native. Swift for iOS, Kotlin for Android. Native development gives you full access to platform-specific features, the best performance for complex animations and transitions, and the fastest adoption of new OS features. The tradeoff is maintaining two codebases, but if mobile is your core product, that investment is justified.
You're building a simple mobile companion to a web product. React Native with Expo if your team knows JavaScript. Flutter if your team knows Dart (rare, but some teams do). The key insight is that "simple companion" apps don't need the full power of native development, and the reduced maintenance cost of a single codebase matters more than marginal performance differences.
You need to move fast and might pivot. Web first, period. Build a responsive web application, ship it, validate the product, and add native mobile later if user behavior justifies it. I recommend web-only for the first 3 months for most of my clients. The fastest path to customer feedback is a URL they can open on any device, not an app store submission with a 2-week review cycle.
Flutter's Strengths and Limitations
Flutter produces genuinely excellent mobile apps. The widget system is well-designed, hot reload is fast, and the resulting iOS and Android apps are performant and visually consistent. If your team knows Dart and your product is mobile-first, Flutter is a strong choice.
Where Flutter falls short is web deployment. Flutter Web compiles Dart to JavaScript (or WebAssembly) and renders to a canvas element, which means: the resulting "web page" isn't really a web page — it's a canvas application that happens to run in a browser. SEO is poor because there's no real DOM for search engines to crawl. Accessibility is limited compared to native HTML. The library ecosystem for web-specific features (rich text editing, complex forms, deep linking) is a fraction of what's available in JavaScript. And performance, while improving, doesn't match a purpose-built web framework.
My advice: use Flutter for mobile-only applications. Don't count on Flutter Web as a production-ready web deployment target.
The Monorepo Advantage for Multi-Platform
If you're building for both web and mobile, a monorepo is almost always the right choice. Shared types ensure your web and mobile apps agree on data structures. Shared API clients mean a backend API change is reflected in both platforms with one PR. Shared business logic means validation rules, calculation logic, and state management are written once.
React Native with Expo in a monorepo with a Next.js or React web app is the pattern I implement most often. The shared code ratio is typically 40-60% — not the "write once, run everywhere" dream, but enough to meaningfully reduce development and maintenance costs.
When to Add Mobile
Not every product needs a mobile app. Adding mobile because competitors have it or because the CEO wants one isn't a strategy — it's a distraction.
Add mobile when your users' workflows genuinely happen away from a desk (field service, inspections, logistics, healthcare), when push notifications drive meaningful engagement that email can't replicate, when camera, GPS, or other device hardware is core to the feature, or when offline capability is required and a PWA isn't sufficient.
If none of these apply, invest in making your web application responsive and performant on mobile browsers. A great responsive web experience beats a mediocre native app, and it's dramatically cheaper to build and maintain.
Related: Build, Buy, or Partner | The Prototype-to-Production Gap | Vertical Slice Development