# Update Policies — Bundle Drop Docs

> Configure Bundle Drop update policies to control when OTA updates download and apply — immediately, on next launch, or manually.

Canonical: https://bundledrop.app/docs/update-policies

## What Update Policies Are

Update policies control when an available OTA bundle should be downloaded and applied after your app checks for updates.

They are most commonly used with [BundleDrop.init](/docs/init-update-manager), which owns the startup flow for you.

Watch the same compatible v42 release reach three sample devices. The manual device illustrates calls made by the app; the policy does not trigger those actions itself.

## Available Policies

Bundle Drop supports three policies:

- `manual`
- `on-next-launch`
- `immediate`

## `manual`

`manual` means Bundle Drop does not automatically download or apply updates. It is also the **default** — if you call `BundleDrop.init` without a `policy`, the runtime starts in `manual` and waits for your app to trigger update actions.

This is the best fit when you want a user-driven update flow, such as a settings screen or an update prompt with explicit buttons.

Teams usually pair this with [useBundleDrop](/docs/use-bundle-drop).

`checkLatest()` only checks availability. `downloadUpdate()` downloads and stages a bundle without reloading the current session; `applyUpdate()` activates the staged bundle by restarting the React Native runtime. A staged bundle can also activate on a later cold launch, so decide when your app calls `downloadUpdate()` if activation timing matters.

## `on-next-launch`

`on-next-launch` means Bundle Drop downloads the update when it is available, stages it, and waits until the next cold app launch to apply it. Returning to an app that is still running is not a cold launch.

This is a good default when you want an automated flow without reloading the app immediately in the middle of a session.

## `immediate`

`immediate` means Bundle Drop downloads the update and applies it as soon as possible.

This is useful when you want updates to take effect right away, but it is also the most aggressive option because it can interrupt the current session.

## How This Fits with `BundleDrop.init`

`BundleDrop.init` is the main place where update policies matter.

It runs the automated startup flow and uses the selected policy to decide what should happen when a new update is available:

- `manual`: initialize runtime state, but do not automatically download or apply
- `on-next-launch`: download now, apply on the next cold app launch
- `immediate`: download now, apply right away

## Choosing the Right Policy

A practical way to choose:

- use `manual` for user-controlled update UX
- use `on-next-launch` for most production apps
- use `immediate` when you want the fastest possible update adoption

## Dashboard Rollback and Safety Recovery

[Dashboard rollback](/docs/rollback) stops a release from being offered on a channel. On the next update check, an eligible compatible replacement follows the selected policy: your app controls manual activation, `on-next-launch` stages it for the next launch, and `immediate` applies it after download.

Safety recovery is separate. If a revoked current bundle has no safe compatible OTA replacement, Bundle Drop can recover to the embedded bundle even with `manual` or a check-only startup flow. Native integrity and compatibility checks also remain active.

[Automatic Recovery](/docs/automatic-recovery) handles repeatedly unhealthy OTA startups on a later cold launch. Its `rollback.healthCheckMode` setting controls when startup becomes healthy; it does not change your update policy.

## Related Docs

- For the startup controller, see [BundleDrop.init](/docs/init-update-manager).
- For manual update flows, see [useBundleDrop](/docs/use-bundle-drop).
- For reverting a bad release, see [Rollback](/docs/rollback).
- For on-device startup protection, see [Automatic Recovery](/docs/automatic-recovery).
