← Back to mobile delivery notes
Native modules

How to plan native modules before a React Native build

A practical guide to identifying native module risk before building a React Native app with device APIs, platform SDKs, permissions, or background behavior.

react-nativenative-modulesexpomobile-architecture

Native module risk should be visible before the sprint starts

React Native is often the fastest way to build a focused mobile V1 across iOS and Android. But the moment the app depends on device APIs, platform SDKs, permissions, or background behavior, native module planning becomes part of the product plan.

The mistake is not using native modules. The mistake is discovering their cost after scope, timeline, and budget are already fixed.

Create a native feature inventory

Before implementation, list every feature that touches the device or operating system.

Common examples:

For each feature, write why it is needed in V1. If the answer is weak, cut or simplify it.

Check library maturity

A React Native package can look popular and still be a bad fit for your release. Check whether it is maintained, supports your React Native/Expo version, has recent releases, works on both platforms, and has known issues around release builds.

If the feature is business-critical, avoid depending on a fragile package without a fallback plan.

Decide Expo, prebuild, or bare early

Some native capabilities work cleanly in Expo managed workflows. Some require config plugins and prebuild. Some need bare React Native or custom Swift/Kotlin.

This choice affects developer experience, release process, and handover. It should not be left as an implementation detail that only one developer understands.

Map permissions and store risk

Native modules often introduce permissions. Permissions introduce product copy, privacy answers, QA paths, and possible store review concerns.

For every permission, define:

This is especially important for location, camera, photos, tracking, notifications, and sensitive data flows.

Plan platform differences

A feature may be simple on iOS and awkward on Android, or the reverse. Background behavior, permissions, notification handling, file access, and deep links often differ.

Document platform differences explicitly. QA should test the actual platform behavior, not the assumption that React Native makes everything identical.

Isolate native assumptions

Good architecture isolates native behavior behind clear modules or services. The rest of the app should not be scattered with platform-specific assumptions. This makes future upgrades, replacements, and handover easier.

For example, location access should have a clear wrapper that handles permission status, request timing, failure states, and platform differences. The product UI can then react to those states cleanly.

Budget for native QA

Native features require real-device testing. Simulator results are useful but not enough. Test denied permissions, background/foreground transitions, app reinstall, OS differences, and release builds.

If the V1 timeline is tight, reduce native scope rather than pretending QA can be skipped.

Handover native decisions

When the app moves to an internal developer or future hire, native module notes are critical. Document why each module exists, how it is configured, what permissions it uses, and what could break during upgrades.

A React Native + native delivery engagement should make these decisions explicit, not bury them in package files.

A practical rule

Use native modules when they directly support the core loop or launch trust. Cut or delay them when they only make the V1 feel bigger. Plan them before build, test them before submission week, and document them before handover.

Get a 24h risk reply if your React Native build includes native features and you need to know which ones are safe, risky, or unnecessary for V1.

Working through something similar?

Working through a similar mobile issue?

Send the app, repo issue, job post, or V1 notes and get a concise risk read before you commit scope.

Get a 24h risk reply