---
description: Best practices for the Capacitor Live Update SDK. Channel strategy, version pinning, rollback safety, and rollout patterns for production apps.
title: Best Practices for Capacitor Live Updates - Capawesome
image: https://capawesome.io/docs/assets/images/social/cloud/live-updates/guides/best-practices.png
---

[ Skip to content](#best-practices) 

[ 🎉 Introducing **Capawesome Platform** — one platform for Live Updates, Native Builds, App Store Publishing, and Insider SDKs.](https://capawesome.io) 

* [  Formbricks ](/docs/plugins/formbricks/)
* [  Geocoder ](/docs/plugins/geocoder/)
* [  Google Sign-In ](/docs/plugins/google-sign-in/)
* [  libSQL ](/docs/plugins/libsql/)
* [  Live Update ](/docs/plugins/live-update/)
* [  Managed Configurations ](/docs/plugins/managed-configurations/)
* [  Media Session ](/docs/plugins/media-session/)
* [  ML Kit ](/docs/plugins/mlkit/)
* [  NFC ](/docs/plugins/nfc/)
* [  OAuth ](/docs/plugins/oauth/)
* [  Pedometer ](/docs/plugins/pedometer/)
* [  Photo Editor ](/docs/plugins/photo-editor/)
* [  PostHog ](/docs/plugins/posthog/)
* [  Printer ](/docs/plugins/printer/)
* [  Purchases ](/docs/plugins/purchases/)
* [  RealtimeKit ](/docs/plugins/realtimekit/)
* [  Screen Orientation ](/docs/plugins/screen-orientation/)
* [  Screenshot ](/docs/plugins/screenshot/)
* [  Secure Preferences ](/docs/plugins/secure-preferences/)
* [  Speech Recognition ](/docs/plugins/speech-recognition/)
* [  Speech Synthesis ](/docs/plugins/speech-synthesis/)
* [  Share Target ](/docs/plugins/share-target/)
* [  Square Mobile Payments ](/docs/plugins/square-mobile-payments/)
* [  SQLite ](/docs/plugins/sqlite/)
* [  Superwall ](/docs/plugins/superwall/)
* [  Torch ](/docs/plugins/torch/)
* [  Wifi ](/docs/plugins/wifi/)
* [  Zip ](/docs/plugins/zip/)
* [  Cloud ](/docs/cloud/)
* [  Live Updates ](/docs/cloud/live-updates/)
* [  Bundle Size Optimization ](#bundle-size-optimization)
* [  Code Signing ](#code-signing)
* [  Reasonable Update Checks ](#reasonable-update-checks)
* [  Update Strategies ](/docs/cloud/live-updates/guides/update-strategies/)
* Advanced
* Integrations
* [  Native Builds ](/docs/cloud/native-builds/)
* [  Configuration ](/docs/cloud/native-builds/configuration/)
* [  Environments ](/docs/cloud/native-builds/environments/)
* Guides
* [  Sample Projects ](/docs/cloud/native-builds/sample-projects/)
* [  Troubleshooting ](/docs/cloud/native-builds/troubleshooting/)
* [  Automations ](/docs/cloud/automations/)
* [  Assist ](/docs/cloud/assist/)
* Account
* Organizations
* [  Organization and User Management ](/docs/cloud/organizations/memberships/)
* [  Single Sign-On (SSO) ](/docs/cloud/organizations/sso/)
* [  Teams ](/docs/cloud/organizations/teams/)
* [  Two-Factor Authentication ](/docs/cloud/organizations/two-factor-authentication/)
* [  Integrations ](/docs/cloud/integrations/)
* [  License Keys ](/docs/cloud/license-keys/)
* [  Webhooks ](/docs/cloud/webhooks/)
* [  Pricing ](https://capawesome.io/pricing/)
* [  FAQ ](/docs/cloud/faq/)
* [  Support ](/docs/cloud/support/)
* [  Contributing ](/docs/contributing/)
* [  LLMs ](/docs/llms/)
* [  Insiders ](/docs/insiders/)
* [  License ](https://capawesome.io/legal/eula/)
* [  Support ](/docs/insiders/support/)
* [  FAQ ](/docs/insiders/faq/)
* [  Blog ](/blog/)
* Categories

* [  Bundle Size Optimization ](#bundle-size-optimization)
* [  Code Signing ](#code-signing)
* [  Reasonable Update Checks ](#reasonable-update-checks)

# Best Practices[¶](#best-practices "Permanent link")

Here are some best practices to follow when using the Live Update SDK to ensure a smooth user experience:

* [Automatic Rollbacks](#automatic-rollbacks): Automatically revert to the previous version if an update fails.
* [Binary Compatible Changes](#binary-compatible-changes): Ensure that your updates are binary compatible to avoid breaking changes.
* [Bundle Size Optimization](#bundle-size-optimization): Reduce your bundle size to speed up updates and save data transfer.
* [Code Signing](#code-signing): Sign your app bundles to ensure their integrity and authenticity.
* [Reasonable Update Checks](#reasonable-update-checks): Implement a strategy for checking for updates without using too many device resources.

## Automatic Rollbacks[¶](#automatic-rollbacks "Permanent link")

We strongly recommend enabling automatic rollbacks to ensure that your users can always revert to a previous version of your app if an update fails or does not work as expected. For more information, check out the [Rollbacks](/docs/cloud/live-updates/advanced/rollbacks/) guide.

## Binary Compatible Changes[¶](#binary-compatible-changes "Permanent link")

It is important to make sure that only [Binary Compatible Changes](/docs/cloud/live-updates/faq/#what-are-binary-compatible-changes) are delivered to your users to prevent incompatible updates.

Capawesome Cloud offers two different ways to restrict live updates to specific native versions:

* [Versioned Bundles](#versioned-bundles)
* [Versioned Channels](#versioned-channels) (recommended)

### Versioned Bundles[¶](#versioned-bundles "Permanent link")

Versioned bundles allow you to restrict live updates to specific native versions by defining a range of version codes for each platform.

Version Code 

The version code (named [versionCode](https://developer.android.com/studio/publish/versioning) on Android and [CFBundleVersion](https://developer.apple.com/documentation/bundleresources/information%5Fproperty%5Flist/cfbundleversion) on iOS) is the internal version number of your app. It is used to determine whether one version is more recent than another and must be incremented each time you release a new version of your app.

To create a versioned bundle, you only need to specify the minimum and maximum version codes for each platform:

* **Minimum Version**: The native binary must have at least this version code to be compatible with the bundle.
* **Maximum Version**: The native binary must have at most this version code to be compatible with the bundle.
* **Equivalent**: If the native binary has this exact version code, do **NOT** download the bundle, because they are equal.

CLIConsole

To set the version code restrictions when uploading a live update using the [Capawesome CLI](/docs/cloud/cli/), use the `--android-min`, `--android-max`, `--android-eq`, `--ios-min`, `--ios-max`, and `--ios-eq` options:

`[](#%5F%5Fcodelineno-0-1)npx @capawesome/cli apps:liveupdates:upload --android-min 10 --android-max 12 --android-eq 11 --ios-min 10 --ios-max 12 --ios-eq 11
`

In this example, we restrict the bundle to Android version codes `10` to `12` (excluding `11`) and iOS version codes `10` to `12` (excluding `11`).

To set the version code restrictions using the [Capawesome Cloud Console](https://console.cloud.capawesome.io/), navigate to the app you want to restrict the bundle for, and click on the [Builds](https://console.cloud.capawesome.io/apps/%5F/builds) menu item in the sidebar. Next, create a new build or select an existing build. On the build details page, click on the "Settings" tab and set the version code restrictions in the "Versioning" section.

![Versioned Bundle](/docs/assets/images/screenshots/cloud-app-builds-versioning.png)

### Versioned Channels[¶](#versioned-channels "Permanent link")

Versioned channels allow you to restrict live updates to specific native versions by creating a channel for each version code. This is the **recommended approach**, as it leaves less room for mistakes and makes bundles easier to manage. Channels also offer advanced features such as bundle limits.

To create a versioned channel, you can use the following [Capawesome CLI](/docs/cloud/cli/#appschannelscreate) command:

`[](#%5F%5Fcodelineno-1-1)npx @capawesome/cli apps:channels:create --name production-10
`

In this example, we created a channel named `production-10` for the version code `10`.

To upload a bundle to a specific channel, you can use the following [Capawesome CLI](/docs/cloud/cli/#appsliveupdatesupload) command:

`[](#%5F%5Fcodelineno-2-1)npx @capawesome/cli apps:liveupdates:upload --channel production-10
`

Finally, we just need to set the correct channel in the app to ensure that only compatible bundles are downloaded.

The recommended approach is to configure the channel natively at build time, so no TypeScript boilerplate is needed.

Minimum Version 

The native channel configuration (`capawesome_live_update_default_channel` on Android and `CapawesomeLiveUpdateDefaultChannel` on iOS) requires `@capawesome/capacitor-live-update` version **8.2.0** or later.

**Android**:

android/app/build.gradle

`[](#%5F%5Fcodelineno-3-1)android {
[](#%5F%5Fcodelineno-3-2)    defaultConfig {
[](#%5F%5Fcodelineno-3-3)        resValue "string", "capawesome_live_update_default_channel", "production-" + defaultConfig.versionCode
[](#%5F%5Fcodelineno-3-4)    }
[](#%5F%5Fcodelineno-3-5)}
`

**iOS**:

ios/App/App/Info.plist

`[](#%5F%5Fcodelineno-4-1)<key>CapawesomeLiveUpdateDefaultChannel</key>
[](#%5F%5Fcodelineno-4-2)<string>production-$(CURRENT_PROJECT_VERSION)</string>
`

Alternatively, you can set the channel dynamically in TypeScript:

`` [](#%5F%5Fcodelineno-5-1)import { LiveUpdate } from '@capawesome/capacitor-live-update';
[](#%5F%5Fcodelineno-5-2)
[](#%5F%5Fcodelineno-5-3)const sync = async () => {
[](#%5F%5Fcodelineno-5-4)  // Get the version code of the native app
[](#%5F%5Fcodelineno-5-5)  const { versionCode } = await LiveUpdate.getVersionCode();
[](#%5F%5Fcodelineno-5-6)  // Automatically download and set the latest compatible bundle
[](#%5F%5Fcodelineno-5-7)  await LiveUpdate.sync({ channel: `production-${versionCode}` });
[](#%5F%5Fcodelineno-5-8)};
 ``

## Bundle Size Optimization[¶](#bundle-size-optimization "Permanent link")

Smaller bundles mean faster downloads, lower data transfer costs, and a better experience for your users. Common optimizations include removing source maps from your build output, choosing the right artifact type (`zip` vs `manifest`), and removing unnecessary static assets. For a detailed walkthrough, check out our guide on [how to reduce the bundle size of Capacitor live updates](/blog/how-to-reduce-the-bundle-size-of-capacitor-live-updates/).

## Code Signing[¶](#code-signing "Permanent link")

We strongly recommend signing your app bundles to ensure their integrity and authenticity. This way, you can be sure that the bundles have not been tampered with and are coming from a trusted source. For more information, check out the [Code Signing](/docs/cloud/live-updates/advanced/code-signing/) guide.

## Reasonable Update Checks[¶](#reasonable-update-checks "Permanent link")

While it's important to keep your app up-to-date, checking for updates too frequently can lead to a poor user experience. Not only does the device get **rate-limited** after a certain number of requests, but these requests also use up a lot of the device's resources like battery and data.

The **simplest and most effective way** to handle update checks is to use the [autoUpdateStrategy](/docs/plugins/live-update/#configuration) configuration option. This automatically checks for updates at app startup and when the app resumes (with a minimum 15-minute interval between checks), which provides a perfect balance between keeping your app up-to-date and preserving device resources.

If you choose to implement manual update checks, you should definitely **NOT (!!!)** check for updates in fixed intervals:

`[](#%5F%5Fcodelineno-6-1)import { LiveUpdate } from "@capawesome/capacitor-live-update";
[](#%5F%5Fcodelineno-6-2)
[](#%5F%5Fcodelineno-6-3)// Do NOT do this!!!
[](#%5F%5Fcodelineno-6-4)setTimeout(() => {
[](#%5F%5Fcodelineno-6-5)  LiveUpdate.checkForUpdate();
[](#%5F%5Fcodelineno-6-6)}, 60000);
`

This approach can quickly lead to organizational rate-limiting and drains the device's battery and data.

For manual implementation examples, check out the [Update Strategies](/docs/cloud/live-updates/guides/update-strategies/) guide.

May 7, 2026 

 Back to top 