Choose a PWA when reach and iteration speed matter more than deep device integration: it installs from a link, updates on deploy and reuses your web stack. Choose React Native with Expo when store presence, reliable iOS push or device APIs are non-negotiable. In 2026, a sensible default for many products is PWA first, React Native once the store matters. Both can, and should, share the same backend API.
What are you actually choosing between?
A PWA is a web app with a manifest and a service worker: installable, offline-capable, delivered by URL and updated on every load. A React Native app is a real native app whose UI is driven by JavaScript: it ships through the App Store and Google Play and can use any native capability through modules.
That definition settles part of the debate on its own. A PWA (web.dev keeps a solid collection on the subject) is your website, upgraded: nothing new for users to install unless they want to. React Native renders real native views from JavaScript, and since its New Architecture became the default in late 2024, the old bridge bottlenecks are mostly gone. Fully native Swift or Kotlin development is a third category: legitimate for heavy 3D or deep OS integration, outside what we build (our practice covers React Native and Expo apps, PWAs and the backends behind them), and unnecessary for most product apps.
How much do store presence and install friction matter?
Store presence decides more projects than any purely technical criterion. If your users expect to find you by searching the App Store, want an icon installed by default and read store reviews, React Native earns its cost. If they arrive from a link, an email or a QR code, a PWA removes the whole install funnel.
The friction is asymmetric. Opening a URL takes one tap. A store install takes a search, a download, sometimes a sign-in, and every added step loses users. On Android, a PWA can even be published to Google Play as a Trusted Web Activity. Apple offers no equivalent: its review guidelines on minimum functionality filter out thin web wrappers, so an App Store presence means a genuinely native build, which is exactly where React Native fits.
Still weighing a PWA against React Native? Describe your app: a one-page diagnosis within 48 hours.
Get my diagnosis →Can a PWA send push notifications in 2026?
Yes on Android and desktop; yes with conditions on iOS. Since iOS 16.4 (March 2023), Safari supports Web Push, but only for web apps added to the Home Screen, and only after a permission prompt triggered by a user gesture. If iOS push drives your retention, React Native remains the dependable route.
The practical limits matter more than the headline. iOS never prompts anyone to install a PWA: users have to find Share, then Add to Home Screen, a step few take unprompted. Delivery has improved since the 2023 debut, but support still varies by browser and version, so test on the devices your audience actually owns before betting retention on it. MDN's Push API reference tracks current support. On Android, Chrome has handled Web Push and install prompts for years.
What about offline, background work and device APIs?
Both handle basic offline use well. A service worker caches assets and API responses; a React Native app persists data in SQLite or key-value storage. The gap opens on background execution and hardware access: background sync, continuous geolocation and Bluetooth are limited or absent in browsers, and weakest in Safari on iOS.
As of early 2026, Safari still ships neither Background Sync nor Web Bluetooth, so treat any hard background or hardware requirement as a React Native signal. On the React Native side, the Expo module ecosystem covers camera, biometrics, secure storage and most sensors without writing native code. For plain offline reading and request queueing, a small service worker goes a long way:
// sw.js: cache-first for static assets, network-first for the API
self.addEventListener('fetch', (event) => {
const url = new URL(event.request.url);
if (url.pathname.startsWith('/api/')) return; // the API stays on the network
event.respondWith(
caches.match(event.request).then((hit) => hit || fetch(event.request))
);
});
How do updates reach your users?
A PWA updates on the next page load: deploy, done. A React Native app built with Expo can ship JavaScript changes over the air with EAS Update, within store policy limits, and only needs a store review for native changes. That difference compounds over a year of weekly iteration.
Expo's EAS Update pushes new JavaScript bundles straight to installed apps, keeping reviews for the rare native change. Reviews usually clear within a day or two in 2026, but they are never guaranteed and rejections happen, so never park a time-critical fix behind one. A PWA has no gatekeeper at all: fix, deploy, and the next load is current.
PWA vs React Native: the criteria side by side
No criterion wins alone; the pattern does. Read the table by circling what is non-negotiable for your product. One hard requirement in the right column (store presence, iOS push, hardware access) is enough to justify React Native. None of them means the PWA wins on cost and speed.
| Criterion | PWA | React Native (Expo) |
|---|---|---|
| Store presence | Google Play via Trusted Web Activity; no App Store | App Store and Google Play |
| Install friction | None: open a URL; installing is optional | Store search, download, permissions |
| Push notifications | Full on Android and desktop; iOS since 16.4, installed PWAs only | Full on both platforms (APNs, FCM) |
| Offline | Good, via service worker caching | Good, via local storage or SQLite |
| Background work | Limited; weakest in Safari | Broad, via native modules |
| Device APIs | A browser-dependent subset | Near-complete through the module ecosystem |
| Update model | Instant on deploy | OTA for JavaScript (EAS Update); review for native changes |
| Codebase | Your existing web stack | One JS/TS codebase for both platforms |
When is the right answer both?
Often, and it is not a compromise. Ship the PWA first: it validates the product with real users at web speed and zero install friction. Add a React Native app once the store matters: iOS push for retention, device features, or customers asking where to download it. The PWA keeps serving everyone else.
The sequencing also protects the budget: the web version is rarely wasted work, because the marketing site, the dashboard and the app can share one design system and one API. When the store step comes, our mobile development work starts from that existing contract rather than from a blank page.
What does this mean for your backend?
One API serves both clients, if you design it client-agnostic from day one. That means token-based authentication rather than cookie-only sessions, a push service that stores Web Push subscriptions next to device tokens, and versioned contracts so an installed app from last quarter never breaks. The move from PWA to store app then becomes an addition, not a rewrite.
// One subscription endpoint for both clients
const reg = await navigator.serviceWorker.ready;
if ('pushManager' in reg) {
const sub = await reg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: VAPID_PUBLIC_KEY,
});
// The same endpoint also stores native device tokens
await fetch('/api/push/subscriptions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(sub),
});
}
Getting that contract right is API work more than mobile work, and it is where the PWA-first path pays off twice: the same API development effort serves the web app today and the store app later.
Decision checklist
Run your product through this before writing any code:
- Users arrive by link, email or QR code: start with the PWA.
- Retention depends on push notifications on iOS: React Native.
- Bluetooth, background geolocation or heavy hardware use: React Native.
- You ship fixes weekly or faster: PWA, or React Native with EAS Update.
- Store credibility matters to your buyers: React Native (or a Trusted Web Activity, Android only).
- Still undecided: build the PWA, keep the API client-agnostic, revisit in two quarters.