---
description: Switch between Live Update channels at runtime to deliver different app experiences to your users, from beta testing to version-specific updates.
title: Channel Surfing with Capacitor Live Updates - Capawesome
image: https://capawesome.io/docs/assets/images/social/blog/capawesome-cloud-channel-surfing.png
---

[ Skip to content](#channel-surfing-with-capacitor-live-updates) 

[ 🔐 Introducing the **Capacitor Vault** plugin — store secrets behind biometrics or a device passcode.](/blog/announcing-the-capacitor-vault-plugin/) 

* [  SDKs ](/docs/sdks/)
* [  Formbricks ](/docs/sdks/capacitor/formbricks/)
* [  Geocoder ](/docs/sdks/capacitor/geocoder/)
* [  Google Sign-In ](/docs/sdks/capacitor/google-sign-in/)
* [  Grafana Faro ](/docs/sdks/capacitor/grafana-faro/)
* [  libSQL ](/docs/sdks/capacitor/libsql/)
* [  Live Update ](/docs/sdks/capacitor/live-update/)
* [  Managed Configurations ](/docs/sdks/capacitor/managed-configurations/)
* [  Media Session ](/docs/sdks/capacitor/media-session/)
* [  ML Kit ](/docs/sdks/capacitor/mlkit/)
* [  Navigation Bar ](/docs/sdks/capacitor/navigation-bar/)
* [  NFC ](/docs/sdks/capacitor/nfc/)
* [  OAuth ](/docs/sdks/capacitor/oauth/)
* [  Pedometer ](/docs/sdks/capacitor/pedometer/)
* [  Photo Editor ](/docs/sdks/capacitor/photo-editor/)
* [  PostHog ](/docs/sdks/capacitor/posthog/)
* [  Printer ](/docs/sdks/capacitor/printer/)
* [  Purchases ](/docs/sdks/capacitor/purchases/)
* [  RealtimeKit ](/docs/sdks/capacitor/realtimekit/)
* [  Screen Orientation ](/docs/sdks/capacitor/screen-orientation/)
* [  Screenshot ](/docs/sdks/capacitor/screenshot/)
* [  Secure Preferences ](/docs/sdks/capacitor/secure-preferences/)
* [  Speech Recognition ](/docs/sdks/capacitor/speech-recognition/)
* [  Speech Synthesis ](/docs/sdks/capacitor/speech-synthesis/)
* [  Share Target ](/docs/sdks/capacitor/share-target/)
* [  Square Mobile Payments ](/docs/sdks/capacitor/square-mobile-payments/)
* [  SQLite ](/docs/sdks/capacitor/sqlite/)
* [  Superwall ](/docs/sdks/capacitor/superwall/)
* [  Torch ](/docs/sdks/capacitor/torch/)
* [  Vault ](/docs/sdks/capacitor/vault/)
* [  Wifi ](/docs/sdks/capacitor/wifi/)
* [  Zip ](/docs/sdks/capacitor/zip/)
* [  Cordova ](/docs/sdks/cordova/)
* [  Cloud ](/docs/cloud/)
* [  Integrations ](/docs/cloud/live-updates/integrations/)
* Concepts
* Reference
* [  Troubleshooting ](/docs/cloud/live-updates/troubleshooting/)
* [  FAQ ](/docs/cloud/live-updates/faq/)
* [  Native Builds ](/docs/cloud/native-builds/)
* [  Set Up Environments ](/docs/cloud/native-builds/environments/)
* [  Overwrite Native Configurations ](/docs/cloud/native-builds/native-configurations/)
* [  Auto-Increment Build Numbers ](/docs/cloud/native-builds/auto-incrementing-build-numbers/)
* [  Configure the Web Build Script ](/docs/cloud/native-builds/web-build-script/)
* [  Build from a Monorepo ](/docs/cloud/native-builds/monorepo/)
* [  Use pnpm or Yarn ](/docs/cloud/native-builds/package-managers/)
* [  Install Private npm Packages ](/docs/cloud/native-builds/npm-private-registry/)
* [  Override the Java Version ](/docs/cloud/native-builds/override-java-version/)
* [  Custom iOS Provisioning Profiles ](/docs/cloud/native-builds/custom-ios-provisioning-profiles/)
* [  Build without Git ](/docs/cloud/native-builds/build-without-git/)
* [  Access Git Behind a Firewall ](/docs/cloud/native-builds/firewall-access/)
* [  Integrations ](/docs/cloud/native-builds/integrations/)
* Reference
* [  Troubleshooting ](/docs/cloud/native-builds/troubleshooting/)
* [  FAQ ](/docs/cloud/native-builds/faq/)
* [  App Store Publishing ](/docs/cloud/app-store-publishing/)
* [  Submit a Build ](/docs/cloud/app-store-publishing/submit-a-build/)
* [  Submit Automatically After a Build ](/docs/cloud/app-store-publishing/submit-automatically/)
* [  Troubleshooting ](/docs/cloud/app-store-publishing/troubleshooting/)
* [  FAQ ](/docs/cloud/app-store-publishing/faq/)
* [  Automations ](/docs/cloud/automations/)
* [  Reference ](/docs/cloud/automations/reference/)
* [  Troubleshooting ](/docs/cloud/automations/troubleshooting/)
* [  FAQ ](/docs/cloud/automations/faq/)
* [  Assist ](/docs/cloud/assist/)
* [  CLI ](/docs/cloud/cli/)
* APIs and SDKs
* [  Webhooks ](/docs/cloud/webhooks/)
* [  Integrations ](/docs/cloud/integrations/)
* Account
* [  Organization ](/docs/cloud/organizations/)
* [  Two-Factor Enforcement ](/docs/cloud/organizations/two-factor-authentication/)
* [  Audit Logs ](/docs/cloud/organizations/audit-logs/)
* [  Billing ](/docs/cloud/organizations/billing/)
* [  License Keys ](/docs/cloud/license-keys/)
* [  AI ](/docs/ai/)
* [  Insiders ](/docs/insiders/)
* [  Billing & Plans ](/docs/insiders/billing-and-plans/)
* [  FAQ ](/docs/insiders/faq/)
* [  License ](https://capawesome.io/legal/eula/)
* [  Support ](/docs/support/)
* [  Contributing ](/docs/contributing/)
* Contributing code
* [  Code of Conduct ](/docs/contributing/code-of-conduct/)
* [  Questions ](https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion#creating-a-discussion)
* [  Blog ](/blog/)
* Categories

* [  Version-Specific Channel Surfing ](#version-specific-channel-surfing)
* [  Fetching Available Channels ](#fetching-available-channels)
* [  Try Channel Surfing Today ](#try-channel-surfing-today)
* [  Conclusion ](#conclusion)

* Related links

# Channel Surfing with Capacitor Live Updates[¶](#channel-surfing-with-capacitor-live-updates "Permanent link")

Need to deliver beta builds to testers, target updates by app version, or A/B test features — all without a new app store release? Channel surfing with the [Capacitor Live Update plugin](/docs/sdks/capacitor/live-update/) lets you switch between update channels on the fly and deliver different app experiences to different user segments.

[ ![Build and deploy your Capacitor app with Capawesome Cloud](../../assets/external/cloud.capawesome.io/assets/banners/cloud-build-and-deploy-capacitor-apps.69628c3f.png) ](/) 

## What is Channel Surfing?[¶](#what-is-channel-surfing "Permanent link")

Channel surfing is the ability to dynamically switch between Live Update channels at runtime. Instead of hardcoding a single channel name in your app, you can programmatically change which channel your app receives updates from based on user preferences, app version, or other criteria.

This feature unlocks powerful use cases:

* **Beta Testing**: Let users opt-in to beta features by switching to a `beta` channel
* **Version-Specific Updates**: Automatically target the right channel based on your app's native version code
* **A/B Testing**: Deliver different experiences to different user segments
* **Rollback Strategy**: Quickly switch users back to a stable channel if issues arise

## Enabling Channel Surfing[¶](#enabling-channel-surfing "Permanent link")

Channel surfing works out of the box with the Capacitor Live Update plugin. Simply use the [setChannel(...)](/docs/sdks/capacitor/live-update/#setchannel) method to switch channels, or pass the channel name directly to the [sync(...)](/docs/sdks/capacitor/live-update/#sync) or [fetchLatestBundle(...)](/docs/sdks/capacitor/live-update/#fetchlatestbundle) methods.

### Set a Persistent Channel[¶](#set-a-persistent-channel "Permanent link")

Use `setChannel(...)` to persistently change the channel for all future update checks:

`[](#%5F%5Fcodelineno-0-1)import { LiveUpdate } from '@capawesome/capacitor-live-update';
[](#%5F%5Fcodelineno-0-2)
[](#%5F%5Fcodelineno-0-3)const switchToBeta = async () => {
[](#%5F%5Fcodelineno-0-4)  await LiveUpdate.setChannel({ channel: 'beta' });
[](#%5F%5Fcodelineno-0-5)  // All future sync() calls will use the 'beta' channel
[](#%5F%5Fcodelineno-0-6)  await LiveUpdate.sync();
[](#%5F%5Fcodelineno-0-7)};
`

### Use a Channel for a Single Update[¶](#use-a-channel-for-a-single-update "Permanent link")

Alternatively, specify the channel directly when checking for updates:

`[](#%5F%5Fcodelineno-1-1)import { LiveUpdate } from '@capawesome/capacitor-live-update';
[](#%5F%5Fcodelineno-1-2)
[](#%5F%5Fcodelineno-1-3)const checkBetaUpdates = async () => {
[](#%5F%5Fcodelineno-1-4)  const result = await LiveUpdate.sync({ channel: 'beta' });
[](#%5F%5Fcodelineno-1-5)  if (result.nextBundleId) {
[](#%5F%5Fcodelineno-1-6)    console.log('Beta update available');
[](#%5F%5Fcodelineno-1-7)  }
[](#%5F%5Fcodelineno-1-8)};
`

## Version-Specific Channel Surfing[¶](#version-specific-channel-surfing "Permanent link")

A common pattern is to create channels for each native version code, then automatically switch to the correct channel at runtime. This ensures users only receive updates compatible with their installed app version:

`` [](#%5F%5Fcodelineno-2-1)import { LiveUpdate } from '@capawesome/capacitor-live-update';
[](#%5F%5Fcodelineno-2-2)
[](#%5F%5Fcodelineno-2-3)const syncWithVersionChannel = async () => {
[](#%5F%5Fcodelineno-2-4)  const { versionCode } = await LiveUpdate.getVersionCode();
[](#%5F%5Fcodelineno-2-5)  await LiveUpdate.sync({ channel: `production-${versionCode}` });
[](#%5F%5Fcodelineno-2-6)};
 ``

This approach is **recommended** for managing binary-compatible updates, as detailed in the [Best Practices](/docs/cloud/live-updates/#versioned-channels) guide.

## Fetching Available Channels[¶](#fetching-available-channels "Permanent link")

Want to let users choose from available channels? You can fetch a list of all channels for your app using the [fetchChannels()](/docs/sdks/capacitor/live-update/#fetchchannels) method:

`[](#%5F%5Fcodelineno-3-1)import { LiveUpdate } from '@capawesome/capacitor-live-update';
[](#%5F%5Fcodelineno-3-2)
[](#%5F%5Fcodelineno-3-3)const fetchChannels = async () => {
[](#%5F%5Fcodelineno-3-4)  const { channels } = await LiveUpdate.fetchChannels();
[](#%5F%5Fcodelineno-3-5)
[](#%5F%5Fcodelineno-3-6)  return channels.map(channel => channel.name);
[](#%5F%5Fcodelineno-3-7)};
`

This returns all channels configured in your Capawesome Cloud app, which you can display to users or use for dynamic channel selection. Please note that the `fetchChannels()` method requires the [Live Update SDK](/docs/sdks/capacitor/live-update/) version **6.9.0+** (Capacitor 6), **7.5.0+** (Capacitor 7), or **8.2.0+** (Capacitor 8). Alternatively, you fetch the list of channels from the [Capawesome Cloud API](/docs/cloud/api/) or hardcode known channel names in your app.

## Try Channel Surfing Today[¶](#try-channel-surfing-today "Permanent link")

Ready to deliver the right updates to the right users? Get started with [Capawesome Cloud](/) and the Live Update SDK today.

[Book a Capawesome Cloud Demo](https://cal.com/team/capawesome/cloud-demo)

## Conclusion[¶](#conclusion "Permanent link")

Channel surfing gives you fine-grained control over how you deliver updates to your users. Whether you're managing version-specific updates, running beta programs, or implementing A/B tests, it makes it simple to deliver the right experience to the right users.

To learn more, check out the [Capacitor Live Update plugin](/docs/sdks/capacitor/live-update/) documentation and the [Best Practices](/docs/cloud/live-updates/) guide. If you're also interested in temporarily pausing updates for specific channels, take a look at the [Channel Pausing](/blog/capawesome-cloud-channel-pausing/) blog post. If you need per-device control over channel assignments, check out the [Forced Channel Assignments](/blog/capawesome-cloud-forced-channel-assignments/) blog post. If you have any questions, feel free to reach out on the [Capawesome Discord server](https://discord.gg/VCXxSVjefW). For the latest updates, subscribe to the [Capawesome newsletter](/newsletter/).

June 8, 2026 

 Back to top 