When a prospect says they need an app, our first job is to figure out whether they actually do. Most don't. A fast, installable PWA outperforms a native app for the majority of marketing-led use cases — and ships in a fraction of the time. The cost of getting this question wrong is six months and several hundred thousand dollars.
The instinct to build native is usually emotional. Apps feel like real products. App Store presence feels like legitimacy. The home-screen icon feels like permanence. None of those are bad reasons — but they're not the same as the business reasons that justify the cost.
When native is right.
Background processing, hardware access, deep offline, push notifications that actually deliver, and ecosystem trust signals (App Store reviews) — these still make native worth it. Everything else: think twice.
The clearest native-justified case: a tool the user opens multiple times a day, depends on for something time-sensitive, and would feel handicapped using through a browser. Think fitness tracking, banking, ride-sharing, sleep monitoring. If a prospect can't describe their app that way, the answer is probably web.
What we build instead.
When the native case isn't there, we build a PWA — a Progressive Web App that installs from the browser, lives on the home screen, works offline for the read path, and ships in a third the time of native. The tooling has improved dramatically; Next.js plus Workbox covers 90% of what most teams need.
The other 10% — push notifications on iOS, deep linking, store discoverability — has workarounds, and we walk clients through the trade-offs honestly. Sometimes those gaps are dealbreakers and we pivot to native. Often they're not, and a PWA ships in eight weeks instead of six months.
When we do go native.
We default to React Native with Expo. It covers 95% of use cases at a fraction of the maintenance cost of two separate Swift/Kotlin codebases. Performance-critical or hardware-heavy edges get native modules. We've seen 'we'll definitely need Swift' arguments evaporate once we walk through the actual constraints.
Either way, the question to ask before writing any code: what would have to be true for this to fail? If 'we couldn't get push notifications working' isn't on that list, you probably don't need native. If 'users won't install a web app from a browser' is on that list, you probably do.