This decision generates more heat than almost any other in mobile work, and most of the argument is about the wrong thing. "Which is better" has no answer. All three approaches ship good products in 2026, and all three ship bad ones.
What follows is the framework we use, which mostly ignores the technology and asks about the situation.
The honest state of each
Native, separate codebases in each platform's own tools. Best access to platform capabilities, best performance ceiling, best support for anything new the platform ships, because you are not waiting for an abstraction layer to catch up. Costs roughly two builds, and needs people with both skill sets.
Cross-platform, one codebase, both platforms, rendering to real native components. The gap in quality against native has narrowed to the point where users cannot reliably identify which is which. It remains a leaky abstraction: some things need native code anyway, and when something breaks below the abstraction it is harder to debug, because you now have three layers to reason about.
Web / progressive web app, one codebase, every platform, no store. Instant updates, no review process, linkable. Constrained on device capability, weaker on background behaviour and notifications depending on platform, and it forfeits store presence as a discovery channel.
That last point is worth pausing on. Choosing web is not only a technical decision — it removes app store search as a route to being found, which for consumer products is often a primary channel.
The four questions that decide it
What does your team already know?
The most under-weighted factor, and frequently decisive. A team fluent in web technology will ship a better cross-platform app than a native one, because they will spend their time on the product rather than on learning a platform.
The corollary matters for founders hiring later: picking a stack your future team cannot hire for is a cost that arrives in a year, not this quarter.
What is on your feature list, specifically?
Vague requirements do not decide anything. Specific ones decide immediately. Go through your list and mark anything involving: background processing, complex gestures, camera or sensor work beyond capture, offline-first sync, platform widgets, deep OS integration, or heavy real-time graphics.
If that mark-up covers a handful of features, native earns its cost. If it covers none, the constraint is not real and you are paying for a ceiling you will not reach.
How long does this product have to live?
A validation build that may be discarded in six months and a system a business will depend on for a decade deserve different answers. Cross-platform and web get you to a decision faster; native's advantages compound over a long life, particularly around adopting new platform capabilities early.
Six-month horizon, one codebase. Ten-year horizon with deep platform integration, the calculus shifts.
Who are your users, and on what?
If your users are overwhelmingly on one platform, "cross-platform" is solving a problem you do not have: build well for the platform they are on. If your users are inside businesses on managed devices, distribution rules may decide this before any technical consideration does.
The trap: choosing for a scale you do not have
The most common bad reasoning we see is a pre-launch product choosing native because of performance concerns that only appear at a scale it has not reached, with a feature set it has not built, for users it does not yet have.
Meanwhile the actual risk is running out of runway before finding out whether anyone wants the product. Optimising for the wrong risk is how good teams lose. If you are still testing whether the idea works, that is an MVP question, and it usually points toward whichever option gets you to real users fastest.
Choose for the risk you face. Pre-launch, that risk is almost never performance.
The case for shipping web first
One option gets dismissed too quickly, and it is often the strongest for a product that has not yet proven demand: ship the web version first and add an app once you know people want it.
The advantages compound. No review process, so you can deploy several times a day while the product is changing fastest. No install friction, so a link in a message is the whole funnel. And you learn what the product needs to do before committing to a codebase whose cost is dominated by that specification.
The honest counterweight is discovery and retention. You give up store search as a channel, and you give up the home-screen icon, which is a genuine retention mechanism rather than a cosmetic one. For a product people use daily, that matters. For a product people use occasionally, or one sold to businesses through a sales conversation rather than found in a store, it frequently does not.
The trap in the other direction
The mirror-image mistake: choosing cross-platform for an app whose entire value is deep platform integration, then spending the year fighting the abstraction and writing native modules for half the features.
This is diagnosable in advance from the feature-list question above. If your marked-up feature list is long, cross-platform will not save you time. It will cost you time, and leave you maintaining native code in two places plus the shared layer.
A pragmatic default, and when to leave it
For most products we are asked about, a founder, a defined budget, a product that needs to reach real users and then evolve — the default is one cross-platform codebase, and we leave it when one of these is true:
- The marked-up feature list is long, and central to the product's value.
- Users are concentrated on a single platform, making the second one theoretical.
- The team's existing depth clearly points elsewhere.
- The product is a tool rather than an experience, no store presence is needed, and web wins on distribution.
The defaults are not the interesting part. The reasons for leaving them are, and they are specific to your situation rather than to the technology.
Changing your mind later
The decision feels permanent, which is part of why it generates so much anxiety. It is less permanent than it looks, and knowing the actual cost of each move makes the choice easier to live with.
Web to native or cross-platform is the cheapest change, and the most common. The backend and business logic survive; you are rebuilding the client. If you have kept logic on the server rather than in the browser, a surprising amount transfers.
Cross-platform to native is a real rebuild of the client, but rarely a crisis, because by the time you need it you know exactly what the app does. The specification problem: the expensive part of any build, is already solved. Teams that make this move usually do it for one platform first, where the users are.
Native to cross-platform is the awkward one. You are consolidating two mature codebases with divergent behaviour into one, and every difference between them has to be resolved into a single decision. Budget for the archaeology, not just the code.
The practical lesson is a structural one: keep business logic out of the client. Logic on the server survives every one of these transitions. Logic embedded in screens has to be rewritten each time. That single habit is worth more than getting the initial choice right.
The maintenance question nobody asks
Almost all of this discussion is about building. Most of an app's life is maintenance, and the approaches differ there in ways that rarely reach the decision.
Native means two codebases to update when a platform ships a new version, but the updates are well-documented and the tooling is first-party. Cross-platform means one codebase, and a dependency on the framework supporting the new platform version before you can. That lag is usually short and occasionally awkward, and it is worth knowing you are accepting it.
The hiring dimension matters more for a small team than the technical one. A single cross-platform codebase means any engineer can work on both platforms. For a team of three, that flexibility can outweigh every technical argument above. Native means specialists, and specialists who are only busy half the time on a small product.
Ask any team quoting for this what happens when the next major OS version lands: who does the work, how quickly, and whether it is included. The answer tells you more about the next three years than the framework name does.
What matters more than any of this
Having built across all three approaches, the things that determine whether a mobile product succeeds are consistently not the framework:
- Whether the states nobody demos are handled, offline, slow, expired, empty, denied.
- Whether the backend is sound, since most app problems are backend problems wearing a costume.
- Whether it starts fast, because launch time is what users perceive as quality.
- Whether anyone can find it, which is store optimisation and not engineering at all.
We have seen native apps that felt sluggish and cross-platform apps that felt immaculate. The difference was care and experience, not the framework, and it is the reason our mobile development work starts from the situation rather than from a house technology.
Keep reading
Multi-Tenant SaaS Decisions You Cannot Undo Later
Most SaaS architecture can be changed later. A handful of choices harden the moment you have paying customers. These are the ones to get right first.
Why Staffing Juniors on Your MVP Costs More
A cheaper day rate is not a cheaper project. What actually drives cost on a small build, and why it is decisions rather than hours.