Skip to content
ExponaBLOG
MODERN ANDROID & KOTLIN · DAY 070 / 100

Staged rollouts on Google Play: best practices explained

Release safely.

Expona Admin7 min read

Staged rollouts on Google Play: best practices explained

Releasing a new version of your Android app to millions of users in one go is like flipping a switch in production—thrilling and terrifying in equal measure. We've all felt that anxiety when a critical bug surfaces hours after a full release, affecting your entire user base. Staged rollouts on Google Play give you the control to release safely, monitor real-world behavior, and pull back if something goes wrong before it reaches everyone.

Why staged rollouts matter

A staged rollout is a phased deployment strategy where you release your app to a small percentage of your user base first, observe how it performs, and gradually increase the percentage if everything looks healthy. Unlike internal testing or beta programs, staged rollouts expose your app to real production conditions with actual user behavior, network conditions, and device configurations you may never encounter in a lab.

The beauty of this approach is that it catches bugs early without catastrophic blast radius. If a crash affects 0.5% of users (maybe 5,000 people on a 1 million user base) rather than 100%, you have time to investigate, fix, and roll forward or roll back with minimal reputational damage.

Roll out to a percentage of users

Google Play lets you configure your release to go live in stages: typically 1%, 5%, 10%, 25%, 50%, and finally 100%. The key is starting small enough that you can observe metrics without affecting your core user base.

When you create a release in the Google Play Console, navigate to the Release section and select your rollout percentage before publishing. For a typical production app, we recommend this progression:

  • 1% rollout (Day 1): Let it run overnight. This catches obvious crashes or crashes in common initialization paths.
  • 5% rollout (Day 1-2): After observing no critical issues, expand slightly. This covers more device types and usage patterns.
  • 10% rollout (Day 2-3): A meaningful sample without massive impact if something breaks.
  • 25%+ (Day 3+): Only if metrics remain healthy.

Timing matters. We've found that releasing on a Tuesday or Wednesday morning in your primary market's timezone gives you the best daylight hours for monitoring. Avoid Friday afternoon releases—if something goes wrong over the weekend, your team is unavailable.

Here's how you'd check your rollout status programmatically via the Google Play Developer API:

kotlin

// Pseudo-code: checking release status
val releaseService = androidpublisher.edits().releases()
val release = releaseService.get(packageName, editId, "inProgress").execute()

println("Current rollout: ${release.userFraction * 100}%")
println("Release status: ${release.status}")
// Possible statuses: draft, inProgress, halted, completed

Google Play Console itself provides the UI for this, but if you're automating deployments in CI/CD, the API lets you programmatically check and advance rollouts once monitoring confirms health.

Watch crash rate and ANRs

The moment your staged rollout goes live, your monitoring dashboard becomes your command center. You need to track two critical metrics obsessively: crash rate and Application Not Responding (ANR) rate.

Crash rate is straightforward—the percentage of sessions ending in an unhandled exception. Most apps aim to keep this below 0.1% in production. A spike from 0.02% to 0.5% after a release is a red flag.

ANRs are trickier because they reflect unresponsiveness on the main thread. An ANR happens when your app blocks the UI thread for more than 5 seconds. Users experience frozen screens, and Google Play counts it as a stability issue. ANR rate should stay below 0.05% for a healthy app.

Set up alerts in your monitoring system (Crashlytics, Firebase, or your own backend) to notify you immediately if either metric spikes. Here's a realistic scenario:

Your team releases version 2.5.0 at 1% on Tuesday morning. Crash rate sits at 0.03%, ANR rate at 0.02%. At 10 AM, Crashlytics sends an alert: crash rate jumped to 0.4%. You examine the stacktrace and see 90% of crashes are in a new image loading library you integrated. You halt the rollout immediately, investigate locally, and find that a missing permission check causes crashes on Android 12+. You roll back to the previous version, fix the bug, and release again after testing.

This scenario—detecting and responding within minutes—is exactly what staged rollouts protect against. Without staging, that 0.4% crash rate would affect your entire user base.

Use Firebase Crashlytics to set up automatic alerting:

kotlin

// Crashlytics integration in your app
import com.google.firebase.crashlytics.FirebaseCrashlytics

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // Log custom metrics
        val crashlytics = FirebaseCrashlytics.getInstance()
        crashlytics.setCustomKey("rollout_percentage", 1)
        crashlytics.setCustomKey("app_version", BuildConfig.VERSION_NAME)
    }
}

Custom keys let you tag crashes by rollout percentage, making it easier to correlate issues with specific release stages.

Halt if problems appear

Knowing when to hit the brakes is critical. If you see either of these patterns, halt immediately:

  • Crash rate increases by more than 2–3x compared to the previous stable version
  • ANR rate doubles or more
  • User-facing feature is completely broken (e.g., login fails for a percentage of users)
  • Battery drain or memory leak appears in device monitoring tools
  • Critical negative reviews flood in mentioning a specific issue

In Google Play Console, halting a rollout is a single click: go to your release, hit "Halt rollout," and the new version stops propagating. Users who already have it won't be affected, but new installs and updates will get the previous stable version.

Once halted, you have two paths:

  1. Roll back: Promote the previous version back to 100%. This is fast and safe if the old version was stable.
  2. Fix and re-release: Fix the issue, increment your build number, and create a new release. This can take an hour or more, so only do this if the issue is understood and the fix is quick and low-risk.

We recommend roll-back as the default. Once users are stable on the previous version, you can diagnose the issue offline and fix it properly without time pressure.

Document every halt in your release notes and post-mortem. Example:

Version 2.5.0 halted after 30 minutes at 1%. Root cause: NPE in GlideImageLoader when cache directory doesn't exist on some devices. Fix: Check cache directory permissions before initializing Glide. Retry: Version 2.5.1 released next morning after local testing confirmed fix.

Increase gradually

The gradual expansion is where patience pays off. Even if your 1% rollout looks perfect after 4 hours, don't jump straight to 100%. Device diversity, network conditions, and user behavior patterns reveal themselves over time.

A practical timeline for a mature app with a large user base:

  • 1% for 6–8 hours: Catch initialization crashes and common code paths.
  • 5% for 12–24 hours: Observe overnight behavior, background processes, and more device types.
  • 10% for 24 hours: Confirm stability across a larger sample.
  • 25% for 24 hours: Real-world stress test without full exposure.
  • 50% for 24 hours: High confidence before final push.
  • 100% (complete rollout): Release when you're certain.

For smaller apps or non-critical updates, you can compress this (1% → 25% → 100% over 48 hours). For major features or risky changes, extend it (1% → 5% → 10% → 25% → 100% over 5 days).

Monitor these metrics continuously during expansion:

Metric Acceptable range Action needed
Crash rate vs. previous version Within 0.02% Halt if increase > 0.05%
ANR rate vs. previous version Within 0.01% Halt if increase > 0.02%
Daily active users (new version) Proportional to rollout % Check for unexpected drops
Session length No significant change Could indicate performance issues
App store rating No sudden negative reviews Manual review if rating drops

Automate this where you can. Set up a dashboard that pulls data from Firebase, Crashlytics, and Play Console APIs, updating every 15 minutes. Color-code it: green for healthy, yellow for watch, red for halt.

Common mistakes

Starting too high: Jumping from 0% to 5% overnight defeats the purpose. Start at 1% and let it breathe. The first few thousand users reveal more than you'd expect.

Not monitoring at night: If you release at 5 PM and don't check until morning, a critical issue could've affected 10x more users. Use automated alerts that wake you up if needed.

Expanding too fast: Seeing green lights after 2 hours and jumping to 25% is tempting but risky. Time reveals issues. Overnight batches, background syncs, and less common code paths need hours to surface problems.

Halting without communication: If you halt a rollout, inform your team and stakeholders immediately. "We halted version 2.5.0 due to a crash on Android 12. Previous version restored. We'll investigate and re-release tomorrow morning." This prevents confusion and panic.

Ignoring minor metrics: A 0.02% ANR increase might seem negligible, but if it's a new pattern, it warrants investigation. Minor issues in staging often become major issues at scale.

Skipping the previous version's baseline: Always have recent metrics from the previous stable version to compare against. If you don't know your old crash rate was 0.02%, a new rate of 0.04% looks like a small issue when it's actually a 2x regression.

Key takeaways

  • Start every release at 1% and expand gradually. This catches problems before they affect millions.
  • Monitor crash rate and ANRs obsessively during the first 24 hours. Set up alerts that notify you immediately.
  • Halt without hesitation if metrics spike. Roll back to the previous version and investigate offline.
  • Be patient with expansion. A 1% → 5% → 25% → 100% timeline over 3 days is better than a fast catastrophe.
  • Automate metric collection and dashboards so you're not manually checking Crashlytics every 15 minutes.
  • Document every rollout decision—halts, expansions, and timings—for post-mortems and team learning.
  • Communicate status to your team and stakeholders. Silence creates anxiety; transparency builds trust.
ShareXLinkedInReddit

Found this useful? Support the writing.

Buy me a coffee
Written by
Expona Admin
Site administrator

Comments

Loading comments…

Leave a comment

Comments are reviewed before they appear. Be kind and stay on topic.

Related articles