Two version numbers, two entirely different jobs
Every Android app carries both a versionName and a versionCode, and mixing them up is one of the most common reasons a Play Console upload gets rejected.
versionNameis a string for humans —1.4.2,2.0-beta,Spring Release. It appears on your store listing and in the app's settings. Android never compares it to anything.versionCodeis a plain integer for the system. Android uses it, and only it, to decide whether an APK is newer than the one installed. Users never see it.
The rule that follows: every upload must have a higher versionCode than the last one you uploaded. Not different — higher. Play remembers every code you have ever used, and refuses anything less than or equal to your highest, even if you deleted that release.
Which scheme should you use?
| Scheme | Example | Good for | Watch out for |
|---|---|---|---|
| Semantic | 1.4.2 → 10402 | Reading the version name straight off the code | Minor and patch cap at 99 |
| Date | 260902 | Apps that ship on a schedule | Only one release per day |
| Date + build | 26090201 | CI pipelines with several builds a day | Overflows the ceiling in 2042 |
| Increment | 13 | Almost everyone, honestly | Carries no information at all |
If you are unsure, use the simple increment. The version code is not documentation — it is a counter, and its only job is to go up. The semantic scheme is worth it when you want to look at a crash report and know instantly which release it came from.
The ceiling, and why it matters
Google Play refuses any versionCode above 2,100,000,000. That sounds impossibly far away until you invent a scheme like yyyyMMddHH, which produced 2026090214 on the day this page was written — already over the limit. Any scheme that packs a four-digit year plus more than four more digits will break. The tool above flags it when your inputs cross the line.
The mistake that costs a release
Uploading with a version code you have already used gives you "Version code N has already been used. Try another version code." — and since Play never forgets a code, the only way out is upwards. Two habits prevent it:
- Bump the code in the same commit as the change, not at upload time. A code you set from memory at 11pm is a code you will collide with.
- If you publish to multiple tracks or use APK splits, leave gaps. A common pattern is to multiply your logical code by 10 so per-ABI splits can occupy the units digit.
What happens to users when the code goes up
Android compares the installed code with the incoming one. Higher means update — app data, databases and preferences are preserved, and the signing key must match. Lower or equal means the install is refused outright, which is why sideloading an older APK over a newer one fails with a confusing parse or downgrade error. Uninstalling first works but wipes the app's data.
If you build through our online converter, the version name and code are fields on the package step — the same two values, doing the same two jobs.