A framework for choosing your app technology
Step one: sort your features into three piles
Write down everything the app must do in its first year. Pile one is standard: accounts, lists, forms, search, payments, chat, maps, media, push notifications. Any option handles these. Pile two is native-leaning: Bluetooth devices, continuous background location, home screen widgets, watch apps, advanced camera or audio processing. Pile three is store-dependent: in-app subscriptions, being found in app store search, dependable push on iPhone. If pile two is empty or small, a shared codebase is safe. If pile two is the product, go native. If pile three is empty and reach matters more than polish, a PWA deserves a serious look.
Step two: ask who will own the code
Frameworks are maintained by people. A company with React developers will keep a React Native app healthy. A company with no mobile staff, relying on us or another agency, is usually better served by Flutter, which brings its own interface layer and leans less on third-party packages for basics. A company with native engineers already on payroll should think hard before retraining them. The cheapest technology is the one your future team can change without fear.
Step three: be realistic about shared code
One codebase does not mean one of everything. Screens, business logic, networking and local storage are written once. Around them sits work that stays per platform: signing and build configuration, push notification setup, permission texts, in-app purchase products, deep link registration, store listings, screenshots and review. Testing is not halved either, since every release still has to be checked on iPhones and on a range of Android devices. The saving against two native apps is real and it grows as each new feature is built once, but it is smaller than the phrase "write once" suggests.
Step four: cost of building against cost of owning
Build cost follows the number of screens, roles and integrations, and differs less between frameworks than people expect. Ownership cost differs more. Two native apps mean two sets of dependencies, two release trains and features that drift apart. A cross-platform app means following one framework's upgrade cycle and occasionally waiting for a plugin to catch up with a new OS feature. A PWA has the lowest upkeep and the fewest capabilities, with no store listing, weaker background behavior and more limited push and hardware access on iPhone than on Android.
How the choice usually falls
- Flutter: both platforms, custom-branded interface, no existing React team.
- React Native: an established React and TypeScript web product and the people who built it.
- Native Kotlin and Swift: the app is built around device or OS features, or one platform is all you need.
- PWA: content, forms and dashboards where store presence and deep device access are not required.
Mixed answers are fine. A cross-platform app with a few native modules covers most "what if" worries, and starting with a PWA on a well-designed API keeps the door open for a store app later.