How to Change the Package Name in React Native & Expo (Safely)
Renaming applicationId and bundleIdentifier is easy before launch and impossible after. The safe order of operations for Expo (CNG) and bare React Native projects.
Renaming your app's package name is trivial before you publish and effectively impossible after — Google Play and the App Store treat applicationId / bundleIdentifier as the permanent identity of a published app. Here is the safe order of operations for both Expo (managed workflow) and bare React Native.
The rule that matters most
You cannot change the package name after publishing. Renaming means publishing a new app — losing your reviews, download history, and store ranking. Get it right before your first release.
Choose a package name you control forever: the reverse-domain of a domain you own (com.yourcompany.yourapp), lowercase, no hyphens.
Expo (managed workflow / CNG)
If you use Continuous Native Generation (no committed ios/ and android/ folders), there is exactly one place to change:
{
"expo": {
"android": { "package": "com.yourcompany.yourapp" },
"ios": { "bundleIdentifier": "com.yourcompany.yourapp" },
"scheme": "yourapp"
}
}Then regenerate the native projects:
npx expo prebuild --clean--clean matters — it wipes and regenerates ios/ and android/ so no stale identifiers linger in build.gradle, the manifest, or the Xcode project.
Also update while you're at it:
expo.scheme— your deep-link scheme (see the deep links guide).- Firebase config (
google-services.json/GoogleService-Info.plist) — bound to the package name. - Push notification credentials, if they reference the old bundle ID.
Bare React Native
Without CNG, you own the native projects directly. Android first:
android/app/build.gradle— changeapplicationId "com.oldname.app"(and optionally thenamespace).- Package structure — rename the Java/Kotlin folders under
android/app/src/main/java/com/oldname/...and updateMainActivity/MainApplicationdeclarations. AndroidManifest.xml— update the.MainActivitypath if the package changed.
Then iOS:
- Open the Xcode project and change Bundle Identifier on every target (app, tests, widgets).
- Or edit
PRODUCT_BUNDLE_IDENTIFIERdirectly inproject.pbxproj.
Finally, rebuild clean — stale derived data caches old identifiers:
cd ios && pod deintegrate && pod install && cd ..
npx react-native clean && npx react-native run-androidThe checks people forget
- Play Console draft — if you already created a draft listing with the old package, delete it before uploading a new AAB.
- Deep links and universal links — the package name is part of Android App Links; your
assetlinks.jsonand iOS AASA files must match the new identifier. - Sentry / analytics / AdMob — SDK configs often embed the package name; regenerate them after renaming.
- Keystore — your signing key is not tied to the package name, but the Play listing is. Keep the keystore, change the identifier.
One command instead of ten
BowlerKit automates all of this: the rename-package guide covers the CLI command that updates the package name, bundle identifier, deep-link scheme, and Firebase config across the whole project consistently. See the quick start to generate a project with the right identifiers from minute one.