Bundle ID (iOS) and package name (Android) are the permanent, immutable identifiers that link every version of your app, every review, every user install, and every in-app purchase receipt to a single entity in the store databases. A malformed identifier — one that uses uppercase characters, hyphens, or has fewer than three segments — causes binary submission rejection before review begins. Using a generic placeholder like com.example.app in production is grounds for immediate rejection. Critically, once an app is published, changing the bundle ID or package name creates a brand-new app listing, breaking updates for all existing users. The Apple Bundle ID spec (apple-bundle-id) and Android Application ID spec (android-application-id) both mandate strict reverse domain notation.
Critical because an invalid or generic bundle ID/package name causes immediate binary rejection, and any post-publication change severs the update chain for all existing users permanently.
Set both identifiers in app.json before first submission. Use strict reverse domain notation: all lowercase, alphanumeric segments only, each segment starting with a letter, minimum three segments.
// app.json
{
"expo": {
"ios": {
"bundleIdentifier": "com.yourcompany.appname"
},
"android": {
"package": "com.yourcompany.appname"
}
}
}
Choose this identifier before first TestFlight or Play Console submission — it cannot be changed without losing all existing installs and reviews. Avoid hyphens in any segment (they are illegal in both specs). Segments must not start with a digit.
mobile-store-readiness.build-config.bundle-id-formatcriticalapp.json for ios.bundleIdentifier (iOS) and android.package (Android). Count the dot-separated segments in each identifier. Format should be reverse domain notation: com.company.appname (e.g., com.example.myapp). Package names should not contain numbers at the start of any segment, should be lowercase, and use only alphanumeric characters and dots.app.json or build config.com.2company.app), has fewer than 3 segments, or uses a generic name like com.example.app in production."Android package 'com.MyCompany.myapp' uses uppercase — must be lowercase: 'com.mycompany.myapp'" or "iOS bundleIdentifier missing from app.json""ios": { "bundleIdentifier": "com.yourcompany.appname" },
"android": { "package": "com.yourcompany.appname" }