Documentation

Troubleshooting

Start with the symptom, check likely causes in order, and find the next action.

Updated 2026-09-14

On this page

Find the last successful stage

Record the native version, hash, channel, device ID and time. Do not start by reinstalling: it clears local update state and can hide the problem.

No update received

Check in order, retrying after each fix:

OrderCheckIf it fails
1Release build starts without MetroReconnect native loading and rebuild
2SDK appKey matches CLI application and platformRun pakta me and compare configuration
3The exact installed native build is registeredUpload that artifact, not a rebuild
4Channel and native version match an active targetCheck native metadata; update name is not native version
5Application, channel, native package and deployment are activeInspect pause and expiration states
6The device is eligible for the percentageVerify at 100% in a separate test app; production non-selection can be expected
7Update endpoints and artifact URLs are reachableCheck SDK /api and CLI host separately

bundleStatus: unknownBundle indicates baseline mismatch; republishing does not fix registration. rebuiltSameJs means identical JS with a different build identity and permits full fallback. See CheckResult.

Downloaded, but the old screen remains

download_success means download completion only. With silentAndLater, fully end the process after download and launch again. Backgrounding and resuming normally triggers another check.

If currentHash changed but the label did not, verify the .ppk entry point, branch and contents. A new release name does not prove new content.

Rollback or blank screen after launch

Stop expanding the rollout and retain the failing package and sourcemap. Read isRolledBack, rolledBackVersion and currentVersion from getUpdateMetadata() and restore the stack.

An unconfirmed update can be rolled back on a later launch. Errors after health confirmation do not necessarily trigger rollback. Redeploy a stable historical package and review critical initialization and confirmation timing.

CLI waits, cannot authenticate or cannot find the app

  • Check identity with me; set RNU_SERVICE_URL before self-hosted login because credentials are isolated by service.

  • Run from the app root containing update.json; locally use selectApp --platform android.

  • CI needs PAKTA_API_TOKEN, explicit targets and --no-interactive, not selection prompts.

  • For unknown options see CLI reference. Commit the lockfile for consistent local and CI versions.

Common questions

Is Expo Go supported?

No. Use a build containing native modules; follow Expo integration.

Which changes need a new native package?

Native dependencies, permissions, native code and runtime changes. OTA only delivers compatible JS/assets. See boundaries.

Does update.json ship in the app?

The CLI stores appId/appKey there. If business code imports it, contents enter the bundle; otherwise it is publishing configuration only. Never store publishing tokens in it.

Does pausing or deleting a deployment undo installed updates?

No. It changes future delivery. Installed content needs a recovery deployment and device activation. Reducing the percentage does not actively roll devices back either.

How do I self-host?

See self-hosting setup. Quotas depend on server configuration; do not assume unlimited usage.

Does OTA guarantee store approval?

No. Technical capability is not review permission. Apple restricts downloaded executable code that changes functionality; check the official review guidelines. Channel isolation is not a guarantee of avoiding review requirements.

If you still need help

Include platform, RN/Expo/SDK/CLI versions, native version, channel, current hash, deployment ID, failing stage, time and a sanitized stack. Exclude tokens, passwords and session configuration.