App Store Connect Listing: Create and Maintain It for React Native Apps
AI generated
RN
native
React Native · Expo · App Store Connect · iOS Release
Create and Maintain an App Store Connect Listing
for React Native and Expo Apps

A clean App Store Connect listing decides discoverability, review success and user trust long before the first build gets uploaded. From Bundle ID registration through screenshots and the privacy label to automated maintenance with eas submit, this guide walks through the full process for React Native and Expo apps.

18 min read Bundle ID · Screenshots · Privacy Label · TestFlight · eas submit Expo SDK 51+ · iOS 17+ · App Store Connect API

1. Registering the Bundle ID and App ID in the Apple Developer Portal

Before any App Store Connect listing can be created at all, the app needs a unique Bundle ID in the Apple Developer Portal. Under developer.apple.com, in "Certificates, Identifiers & Profiles" > "Identifiers", a new App ID gets registered in reverse-DNS format, for example de.mironsoft.appname. This Bundle ID must match exactly the value under expo.ios.bundleIdentifier in app.json or app.config.js, otherwise the build or the submit step fails at the latest.

Registering the App ID also fixes its capabilities, meaning which system features the app is allowed to use: push notifications for expo-notifications, associated domains for universal links and deep linking, in-app purchase for subscription models built on RevenueCat or StoreKit. This selection is not a mere formality, since it must later match exactly the capabilities enabled in the Xcode project or the Expo build profile. A missing capability leads to a rejection before the actual review even starts, and an unnecessary capability in sensitive areas such as push notifications can trigger extra questions on the App Store Connect listing itself.

Teams using eas build can handle most of the Bundle ID registration through eas credentials right from the terminal, without ever opening the Developer Portal manually. Still, understanding the underlying structure pays off, because later changes, such as adding Sign in with Apple, require updating the App ID in the portal and a matching update to the App Store Connect listing itself.


// app.config.js — metadata that must match the App ID in Apple Developer Portal
export default {
  expo: {
    name: "Mironsoft Demo",
    slug: "mironsoft-demo",
    version: "2.4.0",
    ios: {
      // Must exactly match the App ID registered in the Apple Developer Portal
      bundleIdentifier: "de.mironsoft.appname",
      buildNumber: "17",
      supportsTablet: true,
    },
    android: {
      package: "de.mironsoft.appname",
      versionCode: 17,
    },
  },
};

2. Creating the App Store Connect Listing: Filling in App Information

Once the Bundle ID exists, a new app gets created in App Store Connect under "My Apps" via the plus icon. It asks for platform (iOS), a name of up to 30 characters, the primary language, the previously registered Bundle ID from a dropdown, and an internal SKU that is never shown publicly. This step creates the actual App Store Connect listing as the central record that later ties together metadata, builds, pricing rules and every TestFlight group.

The "App Information" tab holds the most important structural fields next: a 30 character subtitle that appears directly under the name in search results, the primary and optionally secondary category, a statement on content rights for third party content, and the age rating questionnaire. The questionnaire specifically asks about depictions of violence, gambling simulations, user generated content and chat features. Wrong answers either result in a rating that is too low and has to be corrected later, or in an unnecessarily high rating that limits downloads within certain target audiences.

Category and subtitle should stand clearly apart from the keyword field, which only becomes relevant later in the ASO context. The category choice additionally influences which charts the app appears in and which similar apps get shown to users as recommendations, an effect that is regularly underestimated when setting up the App Store Connect listing.

3. Preparing Screenshots for Every Device Size Class

Apple requires screenshots in several fixed device size classes, without which no version can be submitted for review at all: the 6.9 inch class for iPhone 16 Pro Max at 1320 by 2868 pixels, the 6.5 or 6.7 inch class for older and current standard sizes, and for universal apps the 13 inch iPad class at 2064 by 2752 pixels. At least one screenshot per required class is a blocker field on the App Store Connect listing, without which the submit button stays greyed out.

In practice it is not worth populating every device category manually. xcrun simctl can generate screenshots on the largest supported simulators, from which Apple automatically accepts downscaled variants for some older size classes. For React Native projects, fastlane snapshot combined with Detox or Maestro is a good fit for producing screenshots reproducibly from real app states instead of pure marketing mockups, on every release.

One detail that is frequently overlooked: every language registered on the App Store Connect listing needs its own localized screenshots. If they are missing, Apple automatically falls back to the primary language screenshots, which measurably hurts conversion on the product page in non-English speaking storefronts.


# Capture screenshots on the largest simulator per required size class
xcrun simctl boot "iPhone 16 Pro Max"
xcrun simctl io "iPhone 16 Pro Max" screenshot ./screenshots/6.9-inch/01-home.png

# fastlane snapshot: automate screenshots across devices and locales
fastlane snapshot

# Upload existing screenshots and metadata without touching the binary
fastlane deliver --skip_binary_upload --skip_screenshots false \
  --screenshots_path ./screenshots

4. Writing the Description and Keyword Field for ASO

The app description allows up to 4000 characters, but Apple's search only weighs it in a limited way. Structure still matters: the first two or three lines appear before the "more" button and must convey the core value proposition immediately, followed by concrete feature bullet points and a clear call to action at the end. A generic marketing text without this structure wastes conversion potential on the App Store Connect listing, regardless of how good the app itself is.

The keyword field, 100 characters, comma separated, no space after the comma to save room, is the single most important ASO lever on the entire App Store Connect listing. Terms already in the name and subtitle should not be repeated here, since Apple indexes those automatically anyway. Synonyms, common misspelling variants and, as far as trademark law allows, related search terms from the same category tend to work better.

The promotional text, 170 characters, can be changed at any time without a new version submission, useful for seasonal notes or limited time offers. Name, subtitle and keywords, by contrast, are tied to a new version and only become visible once review has completed, which must be planned for carefully around short notice campaigns.

5. Filling Out the App Privacy Nutrition Label Correctly

Since iOS 14, Apple requires the full App Privacy questionnaire, colloquially called the nutrition label, on every App Store Connect listing. For every data category collected, such as contact info, location, usage data, diagnostics or identifiers, three questions must be answered: is the category collected at all, is it linked to the user's identity, and is it used for tracking across apps and websites owned by other companies. Wrong or incomplete answers here are among the most common reasons for a rejection after review has already completed.

For React Native apps using libraries such as Firebase Analytics, Sentry or RevenueCat, the privacy disclosures of every integrated SDK must be checked individually. Many vendors by now publish ready made privacy manifest disclosures that can be transferred directly into the questionnaire. The key distinction: tracking in Apple's sense means linking data with data from other companies for advertising purposes, purely internal analytics generally does not count as tracking but still needs to be categorized correctly.

Independent of the nutrition label, iOS additionally requires purpose strings for individual system permissions, such as camera or location access. In Expo projects these are maintained under expo.ios.infoPlist in app.json and end up in Info.plist automatically at build time. Without a matching purpose string, Apple rejects the build before the actual review even starts, regardless of what is filled in on the App Store Connect listing for privacy.


{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSCameraUsageDescription": "This app uses the camera to scan receipts for expense tracking.",
        "NSLocationWhenInUseUsageDescription": "Your location is used to show nearby stores in the map view.",
        "NSUserTrackingUsageDescription": "This identifier helps us measure ad performance across apps.",
        "ITSAppUsesNonExemptEncryption": false
      }
    }
  }
}

6. Pricing, Availability and TestFlight Testing Groups

The "Pricing and Availability" tab sets the price tier, either tier 0 for free apps or one of Apple's paid tiers, which gets converted automatically into every local currency, plus the list of countries and regions where the App Store Connect listing should be visible at all. By default every available territory is enabled; for regulatory or localization reasons this list can be restricted at any time.

TestFlight distinguishes two fundamentally different testing group types. Internal testers, up to 100 people, must be members of the App Store Connect team with the right role and see new builds instantly, without a separate beta review. External testers, up to 10,000 people via public or private invite links, each go through a shortened beta app review once per build. For React Native teams, a good setup uses one internal group for developers and QA plus several external groups split by customer segment or sprint phase.

eas submit can assign builds directly to an existing TestFlight group when the matching group ID is stored in the submit profile of eas.json. That saves the manual click in the App Store Connect interface and turns TestFlight distribution into a fixed part of the CI pipeline instead of a separate manual step after every release.

7. Submitting a Build: Version and Build Number Conventions

Before a version can even be submitted for review, at least one build has to be uploaded and fully processed. Depending on load, Apple needs anywhere from a few minutes to several hours for this processing step after upload. Version, say 2.4.0, is the user visible, semantic number, while the build number is purely internal and must be strictly increasing on every upload, even across version boundaries, two separate fields that regularly get confused in React Native projects.

In app.json, expo.version controls the visible version number, while expo.ios.buildNumber and expo.android.versionCode set the platform specific build number. With "cli.appVersionSource": "remote" and "autoIncrement": true in eas.json, EAS takes over incrementing automatically on every production build, which reliably prevents duplicate build numbers and the resulting rejected uploads.

After submission, the build goes through the actual review process, usually 24 to 48 hours, sometimes noticeably longer for new sensitive permissions or first time submissions. On rejection, Apple gives concrete reasons in the Resolution Center. For first time submissions, missing demo credentials for login protected apps and incomplete metadata on the App Store Connect listing are by far the most common causes.


// eas.json — automatic build number increments for production submissions
{
  "cli": {
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true,
      "ios": {
        "resourceClass": "m-medium"
      }
    }
  }
}

8. Automating with the App Store Connect API and eas submit

For teams with regular releases, the App Store Connect API pays off. Under "Users and Access" > "Integrations", an API key with issuer ID, key ID and an accompanying .p8 file gets generated. This key replaces the interactive Apple ID sign in including two factor authentication on every submit and is a basic requirement for a fully automated CI/CD pipeline around the App Store Connect listing.

eas submit, part of the Expo Application Services CLI, uses exactly this key to hand builds from the pipeline directly to App Store Connect, without anyone having to manually open Xcode or the Transporter tool. Configuration happens in the submit block of eas.json, split by profile such as production or testflight-only, including the path to the API key, the issuer ID and the matching Apple Team ID.

Fastlane deliver solves the same task with more upfront configuration effort, but in exchange offers deeper access to metadata synchronization, screenshots and multi language description texts can be pushed directly from local files into the App Store Connect listing. For pure React Native or Expo projects without a grown multi app Fastlane history, eas submit is usually the more pragmatic entry point into automation.


{
  "submit": {
    "production": {
      "ios": {
        "ascApiKeyPath": "./secrets/AuthKey_ASC_KEY_ID.p8",
        "ascApiKeyIssuerId": "YOUR_ISSUER_ID",
        "ascApiKeyId": "YOUR_ASC_KEY_ID",
        "appleTeamId": "YOUR_APPLE_TEAM_ID",
        "ascAppId": "YOUR_APP_STORE_CONNECT_APP_ID"
      }
    }
  }
}

9. Manual Maintenance, eas submit and Fastlane deliver Compared

Depending on team size, release frequency and existing tooling, different paths make sense for maintaining the App Store Connect listing and submitting builds. The following overview compares the three most common approaches, from purely operating the web interface to a fully automated pipeline.

Task Manual (App Store Connect UI) eas submit Fastlane deliver
Build upload Xcode Organizer or Transporter, manual login Automatic via API key from CI Automatic via API key from CI
Metadata maintenance Directly in the browser, no version history Limited, primarily build focused Full, from local text files
TestFlight assignment Manual per build and group Automatable via group ID in profile Automatable via pilot/deliver config
CI integration Not intended Native Expo integration Via any CI runner
Setup effort Minimal, no configuration needed Low with an existing Expo setup Higher, own Fastfile configuration

For single releases or very small teams, manual maintenance through the web interface is often enough. As soon as several platforms, languages or release channels need to be maintained at once, investing in eas submit or Fastlane deliver pays off quickly, because the App Store Connect listing then gets updated consistently from a single source instead of being reconciled manually with every release.

Mironsoft

React Native, Expo and iOS release automation

An App Store Connect listing that ships without stress?

We handle the setup and maintenance of your App Store Connect listing, from Bundle ID and privacy label through TestFlight testing groups to a fully automated submit pipeline with eas submit or Fastlane.

Store Setup

Set up Bundle ID, app information and the privacy label cleanly and completely

TestFlight Process

Build internal and external testing groups and integrate them into your release workflow

CI/CD Automation

Integrate eas submit or Fastlane deliver into your pipeline

10. Summary

A complete App Store Connect listing for React Native and Expo apps comes together in a clear order: first the Bundle ID and App ID in the Apple Developer Portal, then app information with name, subtitle, category and the age rating questionnaire, followed by localized screenshots for every required device size class. Description and keyword field decide visibility and conversion, while the App Privacy nutrition label has to be filled out carefully and honestly to avoid rejections after review.

TestFlight with internal and external testing groups is just as much a part of the process as correctly separating version and build number before the actual submission. Teams releasing regularly should invest early in automation: an App Store Connect API key together with eas submit or Fastlane deliver reduces manual clicking on the App Store Connect listing to a minimum and makes the entire release process reproducible.

App Store Connect Listing: Create and Maintain It — The Essentials at a Glance

Keep the Order

Register Bundle ID and App ID in the Apple Developer Portal first, then create the App Store Connect listing with the matching Bundle ID.

Take the Privacy Label Seriously

Fill out the App Privacy nutrition label carefully per data category, one of the most common reasons for rejections after review.

Use TestFlight Early

Internal group for developers and QA, external groups per customer segment, reduces surprises at the final review.

Automate Instead of Clicking

App Store Connect API key plus eas submit or Fastlane deliver saves time and prevents duplicate build numbers.

11. FAQ: App Store Connect Listing for React Native Apps

1Bundle ID vs. App Store Connect listing?
The Bundle ID identifies the app technically in the Apple Developer Portal. The App Store Connect listing bundles metadata, builds, pricing and testing groups for exactly that Bundle ID.
2Screenshots needed per language?
Yes, otherwise Apple falls back to the primary language. That noticeably lowers conversion in other language markets.
3What counts as tracking?
Linking with data from other companies for advertising purposes. Internal analytics usually does not count as tracking, but still needs correct categorization.
4How many internal TestFlight testers?
Up to 100 people, must be members of the App Store Connect team. Builds appear instantly without a separate beta review.
5How long does review take?
Usually 24 to 48 hours. For first time submissions or new sensitive permissions it can take noticeably longer.
6Change name and keywords without a new version?
No, both are tied to a new version submission. Only the promotional text can be changed at any time.
7Version vs. build number?
Version is the visible semantic number, build number is internal and must be strictly increasing. Maintained separately in app.json via expo.version and expo.ios.buildNumber.
8Is a Mac strictly required?
Not for managing the listing itself. Yes for local Xcode builds, though eas build bypasses that with cloud builds.
9What does eas submit do differently?
Uses an App Store Connect API key instead of interactive login with 2FA and hands builds over directly from the CI pipeline.
10What happens on rejection?
Apple provides a concrete reason in the Resolution Center. Most common causes: missing demo credentials and incomplete privacy disclosures.