Skip to content
Validator + generator

Get a valid bundle ID before Xcode tells you it isn't.

Type a company and app name. The tool returns a clean iOS bundle identifier, a matching Android package name, and flags every rule that would have blocked your build.

iOS bundle identifierValid
com.acme-studio.notes

Lowercase, three segments, letters and digits only. Apple will accept this.

Android package nameValid
com.acme_studio.notes

Hyphens swapped for underscores so the name is a valid Java identifier.

Drop into app.json (Expo)

{
  "expo": {
    "ios": {
      "bundleIdentifier": "com.acme-studio.notes"
    },
    "android": {
      "package": "com.acme_studio.notes"
    }
  }
}

Pick something durable — both stores treat a change as a brand-new app.

See Shipnative

Common questions

Should iOS bundle IDs and Android package names be the same?+

Most teams keep them identical (com.acme.notes works for both). It's not enforced, but matching them makes deep links, RevenueCat product IDs, Firebase configs, and analytics dashboards much easier to reason about later.

Can I change my bundle ID after launch?+

Practically no. Apple ties the bundle ID to your App Store listing, and Android ties the package name to the Play Store listing — both treat a change as a brand-new app. Pick something durable from day one.

Why does my Android build fail with 'package name already exists'?+

Android package names must be globally unique on a single device. If you're testing two builds of the same app side by side, give the dev variant a suffix like com.acme.notes.dev so both can install at once.

Are uppercase letters allowed?+

iOS technically allows uppercase but case is significant, and most tooling assumes lowercase. Android only allows lowercase letters, digits, and underscores per segment. Stick with lowercase everywhere — the convention exists for a reason.

Why are hyphens fine on iOS but not on Android?+

iOS bundle IDs treat each segment as a string, so hyphens are legal characters. Android package names must be valid Java/Kotlin identifiers — and identifiers can't contain hyphens. That's why the tool replaces them with underscores for the Android variant.

The boilerplate that has the IDs already wired up

Shipnative reads your bundle ID once and uses it across iOS, Android, RevenueCat, deep links, and Sentry — no copy-paste sprawl.