Bundle ID & Package Name: What They Are and How to Set Them
Somewhere in every app submission is a small string like com.acme.todo that quietly runs the whole show. It's the one setting you genuinely cannot change after launch, and getting it wrong — or just formatting it with a stray space — is one of the most common reasons a first build fails. Yet most no-code makers set it in ten seconds without knowing what it does.
An app bundle ID is the unique identifier for your iOS app, and its Android counterpart is the package name. Both use reverse-domain format (com.yourcompany.appname), both are permanent once you publish, and both must match exactly across your developer account, your build, and your store listing. This guide explains what they are, the rules for choosing one, and how to set them without breaking your build.
What is a bundle ID (and a package name)?
Think of the bundle ID as your app's fingerprint. The operating system, the app stores, and Apple's and Google's back ends all use it to answer one question: "Is this the same app, or a different one?"
| Term |
Platform |
Example |
Where it lives |
| Bundle ID |
iOS / Apple |
com.acme.todo |
App Store Connect, Apple Developer, your build |
| Package name |
Android / Google |
com.acme.todo |
Google Play Console, your .AAB build |
| Application ID |
Android (build config) |
com.acme.todo |
Set at build time; becomes the package name |
They serve the same purpose on each platform: uniquely identify your app so it can be tied to your certificates, your listing, your users' installs, and your updates. When you ship an update, the store checks the bundle ID / package name to confirm it's the same app and route the update to your existing users. If it doesn't match, the store treats it as a totally different app.
Why it can never change
This is the part worth reading twice. Once your app is live, the bundle ID and package name are permanent. There is no rename button.
If you publish com.acme.todo and later decide you want com.acme.tasks, you can't migrate. You'd have to publish a brand-new app that starts from zero: no downloads, no reviews, no ratings, no search ranking, and no way to bring your existing users along except by asking them to download the new one. For an Android package name, this is enforced at the platform level — Google Play will not accept a changed package name for an existing app.
So the bundle ID is a decision you make once, before your first submission, and live with for the life of the app. Treat it accordingly.
How to choose a bundle ID: the naming rules
Bundle IDs and package names use reverse-domain name notation. You take a domain you control, reverse it, and add your app name:
yourcompany.com → com.yourcompany
+ appname → com.yourcompany.appname
The formatting rules:
- All lowercase.
com.acme.todo, never com.Acme.Todo.
- No spaces. A leading or trailing space is a classic invisible cause of failed builds.
- iOS: letters, numbers, and hyphens allowed in each segment, but stick to letters and numbers — hyphens cause headaches. No underscores.
- Android: each segment must start with a letter, contain only letters, numbers, and underscores, and the name must have at least two segments (a
.). No hyphens on Android.
- Because the rules differ, use the safe intersection: lowercase letters and numbers only, dot-separated, starting each segment with a letter. That format is valid on both platforms — e.g.
com.acme.budgettracker.
Good vs. bad bundle IDs
| Bundle ID |
Verdict |
com.acme.budgettracker |
Good — lowercase, own domain, readable, works on both platforms |
com.janedoe.habits |
Good — no company domain? Use your name |
com.acme.Budget_Tracker |
Bad — capital letter + underscore (fails on iOS) |
com.acme.budget-tracker |
Bad — hyphen fails on Android |
myapp |
Bad — no reverse-domain, no dot; rejected |
com.acme.todo |
Bad — leading space silently breaks the build |
Tips for picking one you won't regret
- Use a domain you actually own if you have one. If not, your own name (
com.janedoe.appname) is fine and common for indie makers.
- Don't put the version or platform in it.
com.acme.todo — not com.acme.todo.v2 or com.acme.todo.ios. The bundle ID identifies the app, not the release or platform.
- Keep it short and human-readable. You'll type it into multiple systems.
- Match it across iOS and Android when you can. Using the same string on both stores keeps your setup consistent and easier to reason about.
How to set it (and match it everywhere)
The single rule that prevents most build failures: the bundle ID must be identical in every place it appears — your developer account, your build tool, and your store listing. One mismatched character means Apple can't sign the build or Google can't match the upload.
iOS
- In your Apple Developer account, register an App ID / bundle ID in reverse-domain format.
- Create the app in App Store Connect using that exact bundle ID.
- Enter the same bundle ID in your build tool. If you build with Adalo, it goes in the Publish settings — copy-paste it rather than retyping to avoid typos and stray spaces.
Android
- Set your application ID / package name in your build config (in Adalo, in the Android publish settings).
- When you create the app in Google Play Console and upload your
.AAB, the console reads the package name from the bundle. It must be unique across all of Google Play — if someone else already used it, you'll have to pick another.
For the full walkthrough of generating and uploading builds around these settings, see how to publish an Adalo app, and for the platform-agnostic overview start with the pillar on publishing an app without code.
Common bundle ID errors and fixes
| Symptom |
Cause |
Fix |
| Build fails immediately |
Leading/trailing space, or bundle ID mismatch between account and build |
Retype in com.company.app format in both places; strip whitespace |
| "Bundle ID is not available" |
Someone already registered that ID |
Choose a different, unique reverse-domain string |
| Update won't attach to existing app |
Bundle ID / package name differs from the original release |
Match the original exactly — a different ID is treated as a new app |
| Play upload rejected |
Package name already used on Google Play |
Package names are globally unique; pick another |
| Invalid package name (Android) |
Hyphen, or a segment starting with a number |
Use only letters/numbers, each segment starting with a letter |
Bundle ID checklist
- [ ] Reverse-domain format, e.g.
com.yourcompany.appname
- [ ] All lowercase, no spaces, no hyphens or underscores
- [ ] Based on a domain you control (or your own name)
- [ ] No version or platform baked in
- [ ] Registered in Apple Developer + created in App Store Connect
- [ ] Set identically in your build tool
- [ ] Matches exactly in every location
- [ ] Chosen deliberately — you can't change it after launch
Once your bundle ID is locked in, the rest of the launch is asset and metadata work — screenshots, descriptions, and a privacy policy. When you're ready to weigh what the Adalo Studio pricing covers for those, everything except the developer accounts can be prepared for free or a one-time unlock.
Frequently asked questions
What is an app bundle ID?
A bundle ID is a unique identifier for your iOS app, written in reverse-domain format like com.yourcompany.appname. Apple uses it to distinguish your app from every other app and to tie it to your provisioning, certificates, and App Store listing. Android's equivalent is the package name.
Can I change my bundle ID or package name after publishing?
No. Once your app is live on the App Store or Google Play, the bundle ID and package name are permanent. Changing one creates what the stores treat as a brand-new app with no reviews, ranking, or existing users, so choose carefully before your first submission.
What format should a bundle ID use?
Use reverse-domain notation: com.yourcompany.appname, all lowercase, no spaces, no hyphens or underscores. Base it on a domain you control and keep it short and readable. The same convention works for an Android package name.
Tools mentioned in this guide:
App Store Screenshot Generator,
App Privacy Policy Generator.