---
title: "Commerce backend for a React Native shopping app"
description: "Which commerce backend to use for a React Native or Expo shopping app: Medusa's JS SDK and Store API, Shopify Storefront API, Firebase, and mobile payments."
url: https://medusajs.com/kb/headless-checkout/react-native-commerce-backend
last_updated: 2026-10-29T11:36:34Z
topic: "headless-checkout"
type: "concept"
applies_to: "Medusa v2.x"
related:
  - "https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md"
  - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md"
  - "https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md"
  - "https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md"
  - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md"
sources:
  - "https://docs.medusajs.com/resources/storefront-development/guides/react-native-expo"
  - "https://docs.medusajs.com/resources/js-sdk"
  - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe"
  - "https://docs.medusajs.com/api/store"
  - "https://github.com/stripe/stripe-react-native"
  - "https://shopify.dev/docs/api/storefront"
  - "https://developer.apple.com/app-store/review/guidelines/"
---

# Commerce backend for a React Native shopping app

> A React Native or Expo shopping app needs a headless commerce backend with an HTTP API for products, carts, checkout, customers and orders. Medusa is an open-source TypeScript option: its JS SDK runs in React Native, stores auth tokens in AsyncStorage, and its Store API covers the full checkout. Shopify's Storefront API is the hosted alternative.

## What a mobile shopping app needs from a commerce backend

A React Native shopping app is a client like any web storefront. It needs a backend that exposes commerce logic over HTTP, because product data, prices, stock and orders must live on a server, not in the app bundle.

The backend should provide:

- Catalog: products, variants, categories, prices per region and currency.
- Carts: server-side carts that survive app restarts and can be recovered by ID.
- Checkout: shipping options, tax calculation, promotions and payment sessions.
- Customers: registration, login and token-based auth suited to mobile.
- Orders: order history, status and returns.
- An admin: a dashboard so non-developers manage products and orders without an app release.

## How Medusa works with React Native and Expo

Medusa is a headless commerce platform: its [Store API](https://docs.medusajs.com/api/store) serves products, carts, checkout, customers and orders to any client. Medusa maintains a [React Native and Expo guide](https://docs.medusajs.com/resources/storefront-development/guides/react-native-expo) that builds a full app with product listing, region selection, cart and checkout, with the [full code on GitHub](https://github.com/medusajs/examples/tree/main/react-native-expo).

The app talks to Medusa through the [JS SDK](https://docs.medusajs.com/resources/js-sdk) (@medusajs/js-sdk). For mobile, the guide sets auth.type to jwt, auth.jwtTokenStorageMethod to custom, and passes AsyncStorage as auth.storage. The auth.storage option is available after Medusa v2.5.1.

npm install @medusajs/js-sdk @medusajs/types @react-native-async-storage/async-storage

Every request includes a [publishable API key](https://docs.medusajs.com/resources/storefront-development/publishable-api-keys), which scopes the app to one or more sales channels. The app stores the cart ID locally and reloads the cart from the server on launch.

## Taking payments in a React Native app

Medusa's Payment Module delegates to payment providers. The React Native guide uses Medusa's built-in manual provider (pp_system_default) for testing; production apps add a real provider such as [Stripe](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe).

On the device, Stripe's [React Native SDK](https://github.com/stripe/stripe-react-native) provides PaymentSheet, which accepts cards, Apple Pay and Google Pay and supports Expo. Medusa's Stripe provider has an automatic_payment_methods option, which the docs describe as useful when you integrate wallets like Apple Pay or Google Pay.

Apple's [App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/) require apps that sell physical goods to use payment methods other than in-app purchase. So a commerce app uses a payment provider, not StoreKit.

## Alternatives for a React Native commerce backend

| Option | What you get | Trade-offs |
| --- | --- | --- |
| Medusa | Open-source TypeScript backend, REST Store API, JS SDK, admin dashboard, custom modules | You host it, or use Medusa Cloud from $29/month with a 0% GMV fee |
| Shopify Storefront API | Hosted catalog, cart and checkout through a GraphQL API | Checkout and data model are Shopify's; custom logic lives in apps; Shopify plan fees apply |
| Firebase or Supabase custom build | Auth, database and functions you assemble yourself | No commerce logic: you build carts, pricing, tax, inventory and order states |
| Payment-only (Stripe alone) | Payments and basic product objects | No inventory, fulfillment, promotions or order management |

Medusa fits when your team writes TypeScript and wants the backend logic in code it controls. Shopify fits when you want hosted commerce and are comfortable with Shopify's checkout and limits. A custom Firebase build only makes sense for very small catalogs with simple orders.

## Sharing one backend between app and web

Medusa serves mobile and web clients from the same Store API. You can run a React Native app and a Next.js storefront against one backend, with sales channels and publishable API keys separating catalogs if needed. Customer accounts, carts and orders are shared, so a customer sees the same order history in both.

## Common questions

### Does the Medusa JS SDK work in React Native?

Yes. Medusa's React Native and Expo guide installs @medusajs/js-sdk in an Expo app and configures JWT authentication with a custom storage, using @react-native-async-storage/async-storage to persist the token.

### Do I need a web storefront to use Medusa with a mobile app?

No. Medusa is headless, so a React Native app can be the only client of the Store API. You can install Medusa without the Next.js Starter Storefront and add a web storefront later against the same backend.

### Can I use Apple's in-app purchase for physical products in my shopping app?

No. Apple's App Store Review Guidelines require apps selling physical goods or services used outside the app to use purchase methods other than in-app purchase, such as Apple Pay or card entry. A payment provider like Stripe handles this.

### Can I use Firebase as the backend for a shopping app?

Firebase can store products and orders, but it has no cart, pricing, tax, inventory, promotion or order lifecycle logic. You would build all of that yourself, which a commerce backend like Medusa already provides.

## Documentation

- [Implement a mobile app with React Native, Expo, and Medusa](https://docs.medusajs.com/resources/storefront-development/guides/react-native-expo)
- [Medusa JS SDK](https://docs.medusajs.com/resources/js-sdk)
- [Publishable API keys](https://docs.medusajs.com/resources/storefront-development/publishable-api-keys)
- [Stripe Payment Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe)

## Related

- [How to add a cart and checkout to an existing Next.js site](https://medusajs.com/kb/headless-checkout/add-ecommerce-to-nextjs.md)
- [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md)
- [Stripe vs a commerce backend: what Stripe doesn't handle](https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md)
- [What does headless commerce actually mean?](https://medusajs.com/kb/build-vs-buy/what-is-headless-commerce.md)
- [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md)
