The New Default. Your hub for building smart, fast, and sustainable AI software

See now
What Is Cross-Platform App Development and How Does It Work?

Native, Hybrid, Cross-Platform, or PWA? The Complete Decision Guide for Cross-Platform App Development

Hubert Białęcki
|   Updated Jul 23, 2026

Cross-platform app development means building one application from a single shared codebase and deploying it to iOS, Android, web, and desktop, instead of writing and maintaining separate code for each platform. For most products that need both iOS and Android, it's the better default: one team ships every feature once, and React Native or Flutter apps perform close enough to native that most users can't tell the difference. A narrow set of products should still go native, and two related options, hybrid apps and progressive web apps (PWAs), solve different problems. PWAs are also a more realistic choice than older guides suggest, since iOS has supported push notifications for Home Screen web apps since iOS 16.4. This guide compares the four approaches, lays out what cross-platform costs you in trade-offs, and shows how to match the approach to your product, budget, and team.

Executive Summary

Cross-platform development is the most cost-effective way to ship one product on iOS and Android, because a single team writes each feature, fix, and experiment once instead of twice. React Native and Flutter render native components or their own widgets and reach near-native performance for business, commerce, and social apps; hybrid apps built with Ionic and Capacitor run web code in a WebView and suit web-first teams; PWAs skip the app stores entirely and fit content, commerce, and task-based products. Native development still wins for graphics-heavy games, augmented reality, real-time hardware-level processing, deep OS integration, and single-platform products. Cross-platform's costs are less room to tailor UX to each platform's conventions, reliance on plugins for OS-level features, and dependence on the framework's release cycle. Choose the framework by your team's existing skills and your product's web and SEO needs; popularity rankings won't tell you much about either.

What Are the Four Mobile App Approaches: Native, Cross-Platform, Hybrid, and PWA?

The four approaches differ in how many codebases you maintain and how the app reaches the device's hardware and screen.

Native app development

A native app is written in each platform's own language and tools: Swift for iOS and Kotlin for Android. You get every API the platform offers and the platform's own UI components, which users already know. The cost is two separate codebases and, in practice, two teams with different skill sets building the same features. Most apps preinstalled on a phone, such as Calculator, Contacts, and Notes, are native.

Cross-platform app development

Cross-platform frameworks compile one codebase into apps for several platforms. React Native uses JavaScript or TypeScript and renders native UI components. Flutter uses Dart and draws its own widgets with its own rendering engine, which is why Flutter apps look identical on every platform. Both can call native code when a feature needs it.

Hybrid app development

Hybrid development is a subset of cross-platform development. A hybrid app is built with HTML, CSS, and JavaScript and runs inside an embedded browser (a WebView) wrapped in a native app shell, with plugins that expose native APIs such as the camera. Ionic with Capacitor is the current mainstream hybrid stack, and it gives web teams native-feeling UI components and animations.

Progressive web apps (PWAs)

A PWA is a website that behaves like an installed app. A service worker handles offline caching and push messages, and a web app manifest sets its icon and launch behavior. Users add it to their home screen from the browser, so there's no app store approval step, and progressive enhancement keeps it working on older browsers with fewer capabilities.

Why the Mobile App Approach Decides Your Budget and Time to Market

The approach you choose fixes how many codebases and teams you pay for over the app's whole life, including every year of maintenance after launch. That makes it a business-plan decision as much as a technical one.

Two native codebases mean every feature, bug fix, and A/B test gets implemented twice, by two teams. Releases drift out of sync: iOS users get a feature weeks before Android users, or the other way round, and product decisions wait while both versions catch up. You launch later, spend more on maintenance, and end up with an experience that differs by platform.

Distribution is the second cost lever. Native, cross-platform, and hybrid apps all ship through the App Store and Google Play, with store review on every update and a 15 to 30 percent platform fee on in-app purchases, as we covered in our guide to PWAs on iOS. A PWA avoids both, at the price of weaker hardware access and no store discovery.

Approach

Codebases and team

Performance

Device access

Distribution and updates

Best fit

Native (Swift, Kotlin)

One per platform, separate specialists

Highest

Full, every platform API

App stores, review on each update

Games, AR, real-time hardware processing, single-platform apps

Cross-platform (React Native, Flutter)

One, one team

Near-native for most apps

Most features via plugins, custom native modules for the rest

App stores, review on each update

Multi-platform business, commerce, and social apps

Hybrid (Ionic + Capacitor)

One, web team

Good for standard UI, slows as UI complexity grows

Common device features via Capacitor plugins

App stores, plus the web

Web-first teams expanding to mobile

PWA

One web codebase

Depends on the browser engine

Limited: no Bluetooth, USB, or NFC on iOS

Installed from the browser, updates go live instantly

Content, commerce, booking, internal tools

How Does a Single Codebase Lower Development and Maintenance Costs?

A shared codebase lowers cost because the work that dominates an app's life, building features and fixing bugs, happens once for every platform. The architecture behind it is a shared application layer (UI, business logic, state, networking) written in one language, plus a thin native layer reached through plugins or custom native modules for platform-specific APIs.

The impact chain has four links:

  1. Technical approach: one codebase in React Native, Flutter, or Ionic, with native modules only where needed.

  2. Workflow change: one team ships each feature, fix, and A/B test to iOS, Android, and web in the same release, so the platforms stay in step.

  3. Measurable metric: fewer engineers per feature and one release cycle instead of two.

  4. Revenue and risk impact: a smaller build and maintenance budget and an earlier launch on both stores, which brings real-user feedback sooner. For products needing both iOS and Android, the saving is often estimated at 30 to 40 percent, depending on app complexity and how much platform-specific native code is required.

The same architecture brings a few secondary benefits. Modern frameworks expose most device features, including the camera, geolocation, and push notifications, through documented plugins. They ship with IDE integrations and debugging tools, and JavaScript-based frameworks can pull from the npm package registry. Hiring is easier too: JavaScript was the most-used programming language in the 2025 Stack Overflow Developer Survey, at 66 percent of more than 49,000 respondents.

None of this holds unless three conditions are met: someone on the team owns the native modules, performance is tested on the lowest-end devices you support, and framework upgrades are scheduled work rather than an afterthought.

React Native vs. Flutter vs. Ionic: Which Cross-Platform Framework Fits Your Team?

The best cross-platform framework is the one your team can already work in and that matches your product's priorities. All three are actively maintained and have large module libraries, so the decision comes down to language, rendering model, and how much the web matters.

React Native for complex, mobile-first apps

React Native suits complex applications that need native performance and native UI components. Teams usually build mobile first and extend to web and desktop later. Because it runs on JavaScript or TypeScript, it draws from the largest talent pool of the three.

Flutter for pixel-perfect UI consistency

Flutter draws every pixel with its own rendering engine and ships an extensive widget library, so the interface looks the same on every device. It uses Dart, a strongly typed language that catches a class of errors at compile time. Pick it when brand-exact design across platforms matters more than following each platform's native look.

Ionic with Capacitor for web-first teams

Ionic is web-first. Most development happens in the browser; it works with Angular, React, or Vue, and Capacitor plugins add native features. For a team that already has a web app and strong web skills, it's the fastest route to the app stores without a rebuild.

A quick rule of thumb: pick React Native if your team writes JavaScript and the app is complex, Flutter if UI consistency is the top priority and the team is willing to learn Dart, and Ionic if you're extending an existing web product to mobile.

Can Cross-Platform Apps Run on Web, Desktop, and TV?

Yes. All three major frameworks can target the web, most can reach desktop, and TV and embedded support vary in maturity.

Web support by framework

Flutter Web renders with WebGL-based engines: a standard build uses CanvasKit, and a build with the --wasm flag uses Skwasm. The older HTML renderer is deprecated and being removed, so guides that recommend it for smaller downloads are out of date. Flutter doesn't support server-side rendering, which makes it a good fit for app-like services where mobile is primary and a poor fit for text-heavy sites that depend on SEO.

React Native reaches the web through the React Native Web library, used by X (formerly Twitter). It translates components into accessible HTML, supports server-side rendering for SEO, and lets you mix in any web library or API. For complex products that need search visibility and full web capabilities, that makes it the stronger choice.

Ionic is web technology at its core, so web and PWA deployment come by default, and native features are added through Capacitor plugins.

Desktop and TV support

Flutter has built-in support for Windows, macOS, and Linux. React Native reaches Windows and macOS through libraries maintained by Microsoft. Ionic deploys to desktop through Electron. For TV, React Native has community libraries for Apple TV and Android TV, while Flutter's support for embedded devices is experimental. Both frameworks reach platform-specific features on these targets through plugins.

For a product that has to live on phones, browsers, and desktops, this is where one codebase pays off most: each extra platform adds packaging and testing work, not a new team.

When Should You Build a Progressive Web App Instead of a Mobile App?

Build a PWA when web reach and fast updates matter more than app store presence and deep hardware access. Content sites, eCommerce stores, booking and ordering flows, dashboards, and internal tools all run well as installed web apps.

What a PWA does: it runs from one web codebase, installs to the home screen from the browser, works offline through a service worker, and ships every update the moment you deploy it. There's no store review and no platform fee on payments.

Why it matters: the time between a fix and the user seeing it shrinks from a store review cycle to a deploy. On iOS, the old objection that PWAs can't send notifications no longer holds. Since iOS 16.4 (March 2023), Home Screen web apps support push notifications and icon badges, and Safari 17 raised offline storage limits, as detailed in our post on PWAs on iOS.

Evidence: Twitter Lite was an early, well-documented PWA that stayed fast and light while supporting notifications and offline use. Starbucks runs a PWA for ordering.

Constraints: performance depends on the browser engine, and on iOS every browser runs on WebKit. iOS PWAs still have no Web Bluetooth, USB, or NFC, weak background processing, no automatic install prompt, and push only after the user installs the app. You also lose App Store search as a discovery channel. If your product depends on any of those, look at cross-platform or native instead.

When Is Native App Development Still the Better Choice?

Native development is the better choice when the app lives on one platform, when performance is the product, or when it depends on deep OS integration. In those cases the savings from a shared codebase shrink or disappear, and going native means you don't spend the project working around the framework.

Go native in these situations:

  • The product only needs iOS or only needs Android, so there's no second codebase to save.

  • The app is graphics-intensive, such as a game or an augmented reality experience, or animation-heavy enough that every frame counts.

  • It does real-time processing at the hardware level, where a framework's extra abstraction layer adds latency you can't afford.

  • It depends on OS-level features that cross-platform frameworks reach only through third-party plugins or custom workarounds, and those integrations would end up as most of the codebase anyway.

Native also gives users the fastest performance on supported devices, UI components that follow each platform's design guidelines exactly, strong offline behavior, and the operating system's security model applied directly to the app.

The most common reason teams pick native, access to the camera or GPS, no longer decides the question on its own. React Native, Flutter, and Capacitor all expose these through plugins, and any remaining native API can be reached with custom native code. Count how much of the app would need that custom code. If the answer is "most of it," two native codebases are cheaper to own than one cross-platform codebase full of platform exceptions.

How Monterail Built Beryl and Sprii With Cross-Platform Frameworks

At Monterail, cross-platform development is the default recommendation for most mobile projects. Two products show the two ends of that choice.

Beryl: React Native for a high-concurrency transport app

The Beryl bike-sharing app was built in React Native and designed to serve hundreds of thousands of simultaneous users across UK cities. Bike sharing runs in real time: riders unlock, ride, and park, and the app has to stay responsive under city-wide load. Choosing React Native over separate iOS and Android builds gave Beryl a single codebase and a single team without giving up the responsiveness a high-concurrency transport service needs.

Sprii: Vue.js and Ionic for a web-first commerce platform

The Sprii live commerce platform was built with Vue.js and Ionic, which let a web-first team ship a cross-platform product without retraining around a new language. The platform has since powered more than 31,000 live shopping events and more than $123M in revenue for its users. Sprii also shows that hybrid apps aren't limited to MVPs: a WebView-based stack can carry a production commerce business when the UI demands fit it.

In both cases, the framework followed the team and the product: React Native for a performance-sensitive mobile service, Ionic for a team whose strength was the web.

What Are the Main Drawbacks of Cross-Platform App Development?

Cross-platform development trades some control for speed and cost, and four constraints decide whether that trade works for your product.

Platform-specific UX is harder to get right

One shared UI makes it harder to tailor the experience to each platform. Cross-platform apps can miss platform-specific design details and drift from Apple's and Google's design guidelines unless the team budgets for per-platform adjustments. Flutter's identical-everywhere rendering helps brand consistency and costs you with users who expect their platform's native patterns.

Performance varies across devices and OS versions

The abstraction layer between your code and the device adds overhead, and an app that has to work everywhere can end up tuned for the lowest common denominator. Modern frameworks, Flutter in particular, have narrowed this gap, but it still shows up on older devices and in WebView-based hybrid apps as UI complexity grows. Test on the slowest devices you intend to support, because the team's own recent phones will hide the problem.

OS-level integrations depend on plugins

Access to device settings, preferences, and OS-level features often runs through third-party plugins or custom workarounds. Each one is a dependency with its own compatibility and maintenance risk, and someone on the team needs enough Swift or Kotlin to fix it when it breaks.

Your app inherits the framework's limits and release cycle

A bug, a missing feature, or a slow update in React Native, Flutter, or Ionic lands directly in your app. Fixing it means extra work: contributing to the framework or writing native support yourself. Put framework upgrades on the roadmap as recurring work.

Key Takeaways

  • A product that needs both iOS and Android usually costs less to build and maintain cross-platform, because each feature and fix ships once from one team.

  • Hybrid apps are a WebView-based subset of cross-platform development, and the Sprii platform shows an Ionic stack can run a production commerce business well past the MVP stage.

  • Since iOS 16.4, installed PWAs on iPhone can send push notifications, so the real PWA limits today are hardware access, background work, manual installation, and no App Store discovery.

  • Camera and GPS access no longer justify native on their own; native earns its cost for single-platform apps, games, AR, real-time hardware processing, and deep OS integration.

  • Pick the framework your team already knows: React Native for complex JavaScript projects, Flutter for exact UI consistency, and Ionic for extending a web product to mobile.

Is Cross-Platform App Development Right for Your Project?

Cross-platform development is right for your project if you need to launch on several platforms at once, keep features in step across them, and iterate on user feedback with a small team. The frameworks are mature enough that the decisions that matter are which framework fits your team and how much native code the product will need. Treat the choice as a decision about the next several years of ownership, because that's where most of the cost sits. Products with deep hardware or OS requirements still belong on native, and content or commerce products that live on the web may not need an app store at all. At Monterail, we start every mobile engagement by examining what the product actually needs, then recommend the approach (native, cross-platform, hybrid, or PWA) and the team to build it, even when that recommendation is the smaller build. Talk to our mobile development team about which approach fits your product.

Cross-Platform App Development FAQ

Hubert Białęcki avatar
Hubert Białęcki
Head of Technology at Monterail
Linkedin
As Monterail’s Head of Technology, Hubert brings a unique blend of technical expertise and strategic leadership to drive innovation and organizational growth. A graduate of Wrocław University of Science and Technology, Hubert has carved an impressive career path from JavaScript developer to technology executive, demonstrating both technical mastery and exceptional leadership capabilities. He excels at understanding complex organizational dynamics and implementing strategic changes that enhance team performance and company development.