WhollySoftware
Back to blogMobile

Handling App Updates and Forced Upgrades Gracefully

Wholly Software TeamJune 3, 20255 min read
Handling App Updates and Forced Upgrades Gracefully

On a banking app, we needed a reliable way to force clients below a minimum supported version to upgrade before a breaking API change went live — the old app version would otherwise send malformed requests against the new backend schema. We built a lightweight version-check endpoint hit on app launch, returning a minimum required version and a 'recommended' version separately, rather than hardcoding version gates into the client itself, since that would require its own app update to change.

The forced-upgrade screen is a dead end by design, blocking access to the rest of the app, so we treat it as a rare, deliberate decision rather than a default. Our rule of thumb: only force-upgrade for breaking backend changes or critical security fixes, and give at least a two-week soft-nudge period, a dismissible banner, before flipping to a hard block, so users have real warning rather than hitting a wall unexpectedly.

Staged rollouts on both stores complicate the force-upgrade story. Apple and Google roll new versions out to a percentage of users over days, which means the server can't assume 'the new version is out' means everyone can get it yet. We coordinate the backend's breaking-change cutover date against the rollout completing to 100%, tracked via the store console, plus an extra few days of buffer for people who haven't opened the app to trigger the update in that window.

For non-critical updates, we lean on the platform's native prompts instead of custom UI — Android's App Update API's flexible flow, which lets users keep using the app while the update downloads in the background, versus the immediate flow that blocks. We reserve the immediate flow for the same rare critical-fix scenarios as force-upgrade.

The failure mode we specifically design against is a user stuck on an old version with no path forward because they're on an OS version too old to install the new build. For those genuinely orphaned users, we keep a minimal, clearly-labeled legacy API surface alive for a defined sunset window rather than cutting them off entirely, since 'the app just stopped working' support tickets are far costlier to a client's reputation than maintaining one old endpoint for a few extra months.

App UpdatesMobile ReleaseBackend CompatibilityUX
Handling App Updates and Forced Upgrades Gracefully — Wholly Software