# React Native Production Checklist

By Girraj Sharma — https://girrajsharma.dev/react-native-checklist/

Use the checks that apply to your app. Record evidence, owners, and unresolved issues alongside your release notes.

## Startup and performance

- [ ] Measure cold startup in a release build on a representative Android phone and iPhone. Record when the first useful screen becomes usable.
- [ ] Keep nonessential requests and setup work off the path to the first usable screen.
- [ ] Profile a slow screen before changing state libraries or adding memoization. Record what actually takes time.
- [ ] Scroll long lists with realistic data and images. Check for blank rows, delayed taps, and excessive memory use.
- [ ] Repeat the same performance checks after changes, using the same devices, data, and network conditions.

## API requests and recovery

- [ ] Give every data screen a deliberate loading, empty, error, and successful state.
- [ ] Test timeouts, interrupted requests, and server errors. Give users a useful way to recover.
- [ ] Prevent an older response from replacing newer results when users change a search or filter quickly.
- [ ] Handle expired sessions without repeated refresh requests or an endless loading screen.
- [ ] Test repeated taps and retries on write requests. Confirm the backend prevents duplicate orders or other critical actions.

## Offline data and synchronization

- [ ] Decide which features remain available offline and explain which actions need a connection.
- [ ] Label cached information when its age matters, especially for prices, availability, or order status.
- [ ] If offline edits are supported, preserve pending changes when the app closes before synchronization.
- [ ] Test reconnection with queued changes and verify that retrying does not create duplicates.
- [ ] Define how conflicting edits are resolved and test local database migrations with existing user data.

## State and navigation

- [ ] Separate temporary screen state from shared product data so unrelated screens do not update unnecessarily.
- [ ] Clear user-specific state and cached data on logout, then test signing in as a different user.
- [ ] Test back navigation through forms, checkout, and authentication without losing or repeating actions.
- [ ] Open a protected deep link while signed out and verify that authentication returns the user to the intended destination.
- [ ] Test incoming links with the app closed, backgrounded, and already open, including invalid or unavailable destinations.

## Security and privacy

- [ ] Keep private API keys and server credentials out of the app bundle and client-side environment variables.
- [ ] Store session credentials using appropriate platform-backed secure storage, rather than ordinary unencrypted key-value storage.
- [ ] Check that logs, analytics events, and crash reports exclude passwords, tokens, and unnecessary personal data.
- [ ] Confirm the server checks permissions for each protected operation; hiding a button is not access control.
- [ ] Review network transport and data collection, then make sure the privacy information matches what the app and its SDKs actually do.

## Payments and critical actions

- [ ] Verify payment success with authoritative server state before showing an order as paid.
- [ ] Test cancelled, failed, pending, and interrupted payments as well as successful ones.
- [ ] Make submission progress clear and prevent repeated taps from creating duplicate transactions.
- [ ] Reopen the app after a payment interruption and confirm that the final status can be recovered.
- [ ] Check that totals, currency, fees, and the next step are clear before users confirm a purchase.

## Notifications, maps, and permissions

- [ ] Request permissions in context and explain why the feature needs them.
- [ ] Test denied and later-revoked permissions without trapping users in repeated prompts.
- [ ] Check notification destinations in foreground, background, and closed-app states, including signed-out users.
- [ ] Test location features with approximate, unavailable, and stale coordinates. Do not present old positions as live.
- [ ] Stop location listeners and other subscriptions when they are no longer needed, then check battery use during a realistic session.

## Accessibility and everyday use

- [ ] Walk through the main flow with VoiceOver and TalkBack. Check labels, reading order, and announced errors.
- [ ] Increase system text size and verify that key content and actions remain readable and reachable.
- [ ] Check contrast and communicate errors or status with text or icons as well as color.
- [ ] Test forms with the keyboard open, including small screens, safe areas, and validation messages.
- [ ] Test interrupted use: background the app, switch networks, take a call, and return to the current task.

## Monitoring and diagnosis

- [ ] Trigger a controlled test error and confirm that it reaches the intended monitoring project.
- [ ] Verify that crash reports identify the app version and provide readable stack traces for the release build.
- [ ] Track the main user flow so a failed checkout or login can be distinguished from a screen view.
- [ ] Choose who will review crashes and critical failures after release, and how urgent issues will reach them.
- [ ] Record known issues, reproduction steps, and release decisions so the team can investigate regressions.

## Builds and store release

- [ ] Confirm the release uses the intended API environment, app identifiers, signing configuration, and version numbers.
- [ ] Test a fresh install and an upgrade from the current public version with existing accounts and stored data.
- [ ] Run the main flows on physical Android and iOS devices using the build intended for distribution.
- [ ] Review current store requirements, privacy disclosures, screenshots, support links, and reviewer access before submission.
- [ ] Agree on rollout monitoring and a recovery plan, including who can pause distribution or prepare a corrective release.

References: https://reactnative.dev/docs/security and https://docs.expo.dev/build/setup/
