
Sean Weldon
September 28, 2026
10
min. read
and updated on:
October 5, 2026
Cross-platform development means writing one codebase that produces applications for multiple platforms, and it has become the default approach for most commercial mobile products. The economics ar...

Cross-platform development means writing one codebase that produces applications for multiple platforms, and it has become the default approach for most commercial mobile products. The economics are straightforward: one team, one codebase, one release process, at roughly 30 to 40 percent below the cost of building natively twice, with maintenance costs that stay singular rather than doubling for the life of the product.
What is less widely understood is that cross-platform is a category rather than a technology, and the options inside it differ in ways that matter for hiring, maintenance, and how much native code you will end up writing anyway.
Flutter, maintained by Google, using the Dart language. Flutter draws its own interface widgets directly to a canvas rather than using platform components, which gives complete visual control and highly consistent rendering across platforms. Strong for bespoke interfaces and animation-heavy products. Dart is statically typed with sound null safety, which helps on large codebases. The package ecosystem is smaller than JavaScript’s and higher in average quality.
React Native, maintained by Meta and a large open-source community, using JavaScript or TypeScript. It renders using the platform’s own components, so an app inherits native appearance and behaviour including accessibility affordances. Its largest advantage is ecosystem: any React developer is a short ramp from productivity, the hiring pool is very large, and logic can often be shared with a React web application.
For most products either will produce a good result, and the deciding factors are what your team already knows and whether a React web application exists to share with.
Kotlin Multiplatform. Shares business logic across platforms in Kotlin while leaving the interface native on each. A different philosophy from Flutter and React Native: instead of one codebase for everything, you share the logic and build two native interfaces. Appropriate when you want genuinely native interfaces and are prepared to build them twice, and increasingly attractive for teams with existing Android expertise in Kotlin.
.NET MAUI. The natural choice for organisations already invested in .NET, particularly enterprises with existing C# codebases and Microsoft-centric infrastructure. Outside that context it has a smaller mobile community than the two leaders.
Web-based approaches. Progressive web apps and wrapped web applications reach the widest audience with the least platform-specific work, and give up reliable background operation, deep hardware access, and app store presence. Reasonable for content and light transactional products, weak for anything device-dependent.
| Option | Shares | Interface | Best fit |
|---|---|---|---|
| Flutter | Logic and interface | Custom-drawn, consistent | Bespoke design, animation, FlutterFlow acceleration |
| React Native | Logic and interface | Platform components | React teams, web code sharing, large hiring pool |
| Kotlin Multiplatform | Logic only | Fully native, built twice | Native feel with shared business rules |
| .NET MAUI | Logic and interface | Platform components | Existing .NET and C# organisations |
| Progressive web app | Everything | Browser | Reach over device capability |
The headline saving is 30 to 40 percent against two native builds, and it is worth understanding where that comes from because it is not uniform across the project.
Interface engineering: the largest saving, close to 50 percent, since screens are built once rather than twice.
Business logic and state management: similar saving, again built once.
Backend and API: no saving at all. This work is identical regardless of client technology, and on many products it is 40 percent or more of the total, which is the main reason the overall saving is 30 to 40 percent rather than 50.
Design: modest saving. One design system serves both platforms, and you still need to account for platform navigation conventions on each.
Quality assurance: smaller saving than expected. One codebase is not one target, and you still test across an iOS device range and a much wider Android one.
Store submission and compliance: no saving. Two submissions, two sets of privacy declarations, two review processes.
The larger saving arrives afterwards. Maintenance on one codebase rather than two is close to half the ongoing cost, and it eliminates feature parity drift, which is the most commonly reported regret among teams running two native products.

Cross-platform changes what a competent team looks like, and it is worth knowing what to expect on a proposal.
A typical cross-platform mobile team is two to four engineers on the client, one to two on the backend, a designer, and quality assurance capacity, rather than separate iOS and Android sub-teams. That consolidation is where the coordination saving comes from: one standup, one release process, one set of decisions.
What the team still needs, and what you should confirm exists, is native capability. Somebody has to write the platform channel code when the product needs Bluetooth, background location, or a platform SDK without a maintained plugin. Bolder Apps builds cross-platform in Flutter and FlutterFlow and native in Swift and Kotlin, and the reason to look for that combination in any partner is that the native boundary is not optional on most real products. A team with no native depth will either avoid the requirement or quote a full native rebuild for it.
No cross-platform framework eliminates platform-specific work, and pretending otherwise is the most common source of surprise in these projects.
Expect native modules or platform-specific handling for advanced camera control, Bluetooth peripherals, background execution and location, platform-specific SDKs without maintained plugins, widgets and watch companions, and any deep integration with system services.
Expect platform-specific configuration regardless: signing and provisioning on iOS, permission declarations and manifests on both, push notification setup, privacy declarations covering every embedded SDK, and store submission requirements.
Bolder Apps builds cross-platform in Flutter and FlutterFlow and native in Swift and Kotlin, and the reason to want both capabilities in one team is exactly this boundary. A team fluent only in the cross-platform layer will either work around a native requirement badly or tell you the product needs to be built twice.
One consideration specific to Flutter deserves separate mention. FlutterFlow is a visual builder that generates real, editable Flutter code, which means a team can assemble interface layers and standard flows visually and then continue in code without a migration cliff.
That matters commercially because it compresses the distance from decision to testable product, which is the phase where most early-stage budget is spent learning things. The ceiling is real, complex state management, deep business logic, native integration, and automated testing all belong in hand-written code, and the export is a starting point requiring restructuring rather than a finished architecture.
The requirement for it to work rather than become a mess is a team fluent in Flutter itself, not only in the builder, and an export decision made deliberately at a known trigger rather than reached through frustration.
Contrary to how framework selection is usually debated, the strongest predictor of outcome is not which cross-platform technology you pick. It is how many production apps the specific team building yours has shipped in the technology they are proposing. A Flutter app built by a React Native team is where the real cost difference appears.
Cross-platform decisions outlive the build, and two consequences deserve weight.
Replaceability. React Native has the largest hiring pool because any React developer is close. Flutter’s pool is smaller and growing steadily. Kotlin Multiplatform draws on Android expertise. .NET MAUI draws on enterprise C#. If your product will outlive its original team, and most do, the size of the pool matters more than any benchmark.
Framework upgrade cadence. All of these release frequently, and staying current is ongoing work rather than an event. Flutter upgrades tend to be predictable because the toolchain comes from one maintainer. React Native has a larger surface across native project files and third-party packages, though the experience has improved considerably.
Budget 15 to 20 percent of build cost annually for maintenance on any of them, because Apple and Google ship OS releases yearly regardless of what your app is written in, and Google Play raises its target API requirement on an annual schedule.
Five situations where building natively is correct rather than merely preferred.

Products whose core value is device capability: real-time video processing, computer vision on a live camera feed, augmented reality, or performance-critical graphics.
Products requiring sustained background operation as their central function, where platform-specific behaviour dominates the engineering.
Products depending on immediate adoption of brand-new platform features on release day.
Products built around one platform’s ecosystem: heavy Apple Watch, CarPlay, or widget integration.
Situations where an existing team is deeply expert in one native platform and the second platform is not actually needed. Team fluency beats theoretical efficiency.
Four questions that test whether the recommendation is about your product.
Which framework, and which specific requirement in my product drove that choice? A named requirement rather than a general statement.
Which parts of my app do you expect to need native code, and who writes it? Almost every non-trivial cross-platform app has some, and claiming otherwise is the tell.
How many production apps have you shipped in this framework in the last two years, and can I open them in the store?
How will you handle platform conventions, meaning iOS navigation behaviour and Android back handling, so the app does not feel like a port on one platform? Bolder Apps builds in Flutter, FlutterFlow, Swift, and Kotlin, and this question matters regardless of who builds it, because a framework that draws its own widgets makes platform conventions your responsibility rather than something inherited.
For typical business and consumer applications the difference is not perceptible to users. Gaps appear in animation-heavy, computation-heavy, or graphics-intensive scenarios. Jank in a normal app is far more often caused by poor list handling or unnecessary re-rendering than by the framework, and both are achievable natively too.
Meaningfully with React Native and a React web application, where logic, types, and validation often transfer. Flutter supports web output, which is less commonly used for production consumer web. The more reliable sharing strategy in any stack is keeping business logic on the server, where every client benefits.
Roughly 30 to 40 percent on the initial build against two native applications, and close to half on ongoing maintenance because there is one codebase to update rather than two. The saving shrinks in proportion to how much native module work your product requires.
Flutter and React Native both have substantial corporate backing, large ecosystems, and heavy production usage, and abandonment is not a realistic near-term risk for either. Choosing on speculation about a maintainer’s future priorities is weaker than choosing on team fluency and product requirements.
It is effectively a client rewrite, typically 50 to 65 percent of the mobile build, since almost no code transfers between Dart and JavaScript. Your backend and API survive intact, which is another reason to keep business logic server-side.




