---
title: "Release to a share of users first · Agent Wranglers"
url: https://agentwranglers.se/playbook/mobile-apps/signing-and-release/phased-release
updated: 2026-10-21
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Release to a share of users first

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Signing and release](https://agentwranglers.se/playbook/mobile-apps/signing-and-release.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers). Updated 2026-10-21.

- ID: MOB-11
- Level: Recommended
- Chapter: [Signing and release](https://agentwranglers.se/playbook/mobile-apps/signing-and-release)
- Rule: Release every update with Apple's phased release and a Google Play staged rollout. Stop the rollout when crash or error rates rise.
- How: Apple's phased release reaches all users over 7 days, from 1% on day one to 100% on day seven. You can pause it for up to 30 days in total. Anyone can still download the update by hand, so phased release lowers risk but does not hide the update. On Google Play, set the release to `inProgress` with a `userFraction`, such as 0.05, and raise it in steps. Setting the status to `halted` stops new installs. The general method is in [release to a small share first](https://agentwranglers.se/playbook/engineering/build-test-and-deploy/staged-rollouts). The rates that stop a rollout come from [stay under the store's crash and freeze limits](https://agentwranglers.se/playbook/mobile-apps/crashes-and-quality/vitals-thresholds).
- Check: Every production release in the last 90 days started below 100% of users on both stores. A script can halt the Play rollout and is tried once a quarter on an internal app.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### Python example

```python
edit = service.edits().insert(packageName=PACKAGE, body={}).execute()
service.edits().tracks().update(
    packageName=PACKAGE, editId=edit["id"], track="production",
    body={"releases": [{"versionCodes": [VERSION_CODE], "status": "halted", "userFraction": 0.05}]},
).execute()
service.edits().commit(packageName=PACKAGE, editId=edit["id"]).execute()
```

### TypeScript example

```ts
const edit = await play.edits.insert({ packageName: PACKAGE });
await play.edits.tracks.update({
  packageName: PACKAGE, editId: edit.data.id, track: 'production',
  requestBody: { releases: [{ versionCodes: [VERSION_CODE], status: 'halted', userFraction: 0.05 }] },
});
await play.edits.commit({ packageName: PACKAGE, editId: edit.data.id });
```

## Sources

- [Apple, Release a version update in phases](https://developer.apple.com/help/app-store-connect/update-your-app/release-a-version-update-in-phases/)
- [Google Play Developer API, tracks](https://developers.google.com/android-publisher/tracks)

## Related rules

- [Release to a small share first](https://agentwranglers.se/playbook/engineering/build-test-and-deploy/staged-rollouts) in Engineering
- [Stay under the store's crash and freeze limits](https://agentwranglers.se/playbook/mobile-apps/crashes-and-quality/vitals-thresholds) in Mobile apps

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/mobile-apps/signing-and-release/phased-release">Agent Wranglers mobile apps playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Test every build with internal testers first](https://agentwranglers.se/playbook/mobile-apps/signing-and-release/internal-testing)
- Next: [Plan to fix forward](https://agentwranglers.se/playbook/mobile-apps/signing-and-release/fix-forward)
- [Signing and release](https://agentwranglers.se/playbook/mobile-apps/signing-and-release)
