Begin with operating constraints

For a grocery retailer, the app spans product discovery, availability, shopping lists, baskets, coupons, payments, loyalty and order tracking. None of these operates independently: the mobile experience is only as reliable as the commerce services and data contracts behind it.

Before comparing frameworks, map the failure-sensitive journeys. What happens when a coupon cannot be redeemed? When inventory changes while a basket is open? When push notifications are delayed? The architecture decision should be assessed against these outcomes, rather than development speed in isolation.

Where React Native can be a strong choice

React Native can provide a shared presentation and business-logic layer across iOS and Android. For teams that maintain similar user experiences on both platforms, this may simplify coordination and lower the duplicated effort of building features twice.

Its suitability still depends on library health, accessibility, animation and navigation requirements, performance on the lowest supported devices, and the availability of skills to maintain native modules. Modern React Native uses a New Architecture; libraries and framework versions should be validated together instead of relying on assumptions about past bridge limitations.

Where native deserves serious consideration

Dedicated Swift and Kotlin applications offer direct access to platform capabilities and the fullest control of platform-specific behaviour. This matters for complex camera experiences, deeply integrated payments, background services, specialised peripherals or unusually demanding interaction latency.

Native development can also make sense when the product roadmap deliberately diverges by platform. The trade-off is maintaining two implementation paths, two release pipelines and an explicit policy for feature parity.

A decision matrix worth scoring

Score the following dimensions against your own critical user journeys, using evidence from a prototype rather than vendor promises:

  • Customer journeys: checkout, loyalty, scanning, deep links, notifications, accessibility and offline handling.
  • Integration surface: payment SDKs, loyalty vendors, analytics consent, identity, camera and retail hardware.
  • Engineering capability: existing iOS, Android and React Native expertise, hiring availability and support ownership.
  • Non-functional demands: launch time, app responsiveness, crash rates, memory budgets and battery behaviour.
  • Change economics: shared code in practice, upgrade effort, dependency lifetime and operating cost.
  • Release governance: store approvals, automated tests, feature flags and incident rollback.

Make the decision with a bounded proof of value

Create one representative vertical slice: login, product detail, basket, coupon application and a mocked checkout, connected to realistic service contracts. Run it on the slowest supported Android device and a representative iPhone. Measure startup, navigation smoothness, crashes and failure recovery.

Write an Architecture Decision Record documenting the chosen option, alternatives, evidence, assumptions and conditions that would trigger a revisit. This prevents a temporary technology preference from becoming an irreversible policy.

Architecture should outlive the framework

Regardless of the framework, keep catalogue, pricing, promotions, loyalty and fulfilment rules behind documented APIs. Design explicit states for stale prices, partial orders and unavailable inventory. A maintainable contract between the app and commerce platform is more valuable than optimising only the language used to render screens.

A good retail architecture decision is one that the organisation can support across multiple releases, teams and business cycles.

Further reading

Facing a similar architecture decision?

An introductory conversation can help clarify options and risks. No obligation and no requirement to share assessment results.

Request an introductory discussion ↗

← All articles