Skip to main content

Beta Testing

Send web changes to beta testers without a new TestFlight build

Testers install your app once. After that, each JavaScript, HTML, or CSS change goes to a beta channel they joined from the app, and they get it on the next update check. Changes to native code still go through TestFlight or a Play testing track.

Testers opt in from the app

Allow self-assignment on a channel with --self-assign. Your app lists channels with listChannels() and moves the device with setChannel(), so a tester can join beta from a settings screen.

setChannel() reference

Pin one device from the console

Set a device override in the Capgo console to put a single tester's phone on a channel without changing the app. Overrides are removed 90 days after they were last set.

Device overrides

Share a build with a QR code

Enable previews for the app once. Then get-qr, or --qr-preview on upload, prints a QR code and preview links for a bundle or channel that you can post in your QA thread.

get-qr reference

TestFlight stays for native changes

Live updates change JavaScript, HTML, CSS, and assets. When you add a plugin or touch native code, send a new TestFlight or Play testing build, then keep iterating on it with channels.

What needs a native build

TestFlight and Capgo channels do different jobs

  • Getting a new build to testers

    TestFlight / Play testing
    Build, sign, upload, and wait for store processing
    Capgo beta channel
    Upload a bundle with the CLI. Testers get it on the next update check
  • Adding a tester

    TestFlight / Play testing
    Invite them in App Store Connect or the Play Console
    Capgo beta channel
    They join the channel from your app, or you set a device override
  • Moving a tester to another build

    TestFlight / Play testing
    Install a different build
    Capgo beta channel
    Switch channel in the app with setChannel()
  • Native code and plugin changes

    TestFlight / Play testing
    Yes
    Capgo beta channel
    No, ship a new binary

Testers still install the app once, from TestFlight, a Play testing track, or the store. Channels take over from there for web-layer changes. What needs a native build

How it works

How QA teams run a beta with Capgo

One installed build, a channel testers can join, and one CLI upload per change. Every command below is from the Capgo docs.

  1. Create a beta channel testers can join

    Self-assignment lets the app move a device onto this channel. Leave it off on your production channel.

    npx @capgo/cli@latest channel add beta com.example.app --self-assign
    Channels docs
  2. Add a Join beta switch in your app

    setChannel() asks Capgo whether the channel allows self-assignment, then stores it on the device. triggerAutoUpdate starts an update check right away.

    import { CapacitorUpdater } from '@capgo/capacitor-updater'
    
    // Join beta and check for its bundle now
    await CapacitorUpdater.setChannel({ channel: 'beta', triggerAutoUpdate: true })
    
    // Leave beta and go back to the default channel
    await CapacitorUpdater.unsetChannel({ triggerAutoUpdate: true })
    setChannel() reference
  3. Upload each change to beta

    Enable previews once. After that, print a QR code with every upload so testers and reviewers can open the new bundle.

    # once
    npx @capgo/cli@latest app set com.example.app --preview
    # every change
    npx @capgo/cli@latest bundle upload --channel beta --qr-preview
    get-qr reference
  4. Promote what passed QA

    Link the tested bundle to production, or roll it out to a share of production devices first. Testers stay on beta until they leave it.

    npx @capgo/cli@latest channel set production com.example.app \
      --bundle 1.4.2
    # or roll it out to 10% of production first
    npx @capgo/cli@latest channel set production com.example.app \
      --rollout-bundle 1.4.2 --rollout-percentage 10 --rollout-enable
    Progressive rollouts docs

Who uses beta channels

Internal QA

QA keeps one installed build and moves between qa, beta, and feature channels instead of reinstalling for each JavaScript change.

Opt-in beta users

Add a Join beta switch that calls setChannel(). Users who leave call unsetChannel() and go back to the default channel.

Stakeholder reviews

Send a QR code from get-qr so product owners can open the preview of a specific bundle or channel.

Apps built with Capacitor

Community apps need careful feature exposure

High-usage consumer apps can validate game, learning, or forecast flows with a closed tester group before every user receives the new experience.

lichess • Free Online Chess app icon GAME BOARD

lichess • Free Online Chess

Large community app where tournaments, analysis, and social features need careful validation.

Google Play installs
11.3M
Store rating
4.3
StudySmarter - School & uni app icon EDUCATION

StudySmarter - School & uni

Education workflows where onboarding and practice changes should be reviewed before release.

Google Play installs
6.5M
Store rating
4.8
Windy.com - Weather Forecast app icon WEATHER

Windy.com - Weather Forecast

Forecast and map interactions where product changes need confidence before expanding.

Google Play installs
32.9M
Store rating
4.7

Customer proof

What teams shipping with Capgo say

5.0/5 rated by developer teams 9,400+ teams Read reviews

Nate van Jole

CTO, Private

“Getting set up took less than a day. Channel-based rollouts let me test on my own device before anything hits production users.”

no-tone @ Webincode

Developer, Webincode

“Being able to add Device ID's to certain groups and push the changes to only certain groups is a life saver.”

Portrait of Michael Haberler

Michael Haberler

nethead emeritors

“Great job on the updater plugin. It works flawlessly for me, and live updates are a super accelerator for quick testing turnaround.”

FAQ

Questions QA and product teams ask

Short answers about testers, builds, and what still needs TestFlight.

Can Capgo replace TestFlight or Play internal testing?

Only for web-layer changes. Testers install your app once from TestFlight, a Play testing track, or the store. After that, JavaScript, HTML, CSS, and asset changes can reach them through a channel. Adding a plugin, upgrading Capacitor, or changing native code or Capacitor config needs a new binary.

What needs a native build

How does a tester join or leave the beta?

Turn on self-assignment for the beta channel, then call setChannel({ channel: 'beta' }) from a screen in your app. Capgo checks that the channel allows it and the device stores the choice. unsetChannel() sends the device back to the default channel. The default channel itself cannot be joined with setChannel().

setChannel() reference

Can we move one tester's phone without changing the app?

Yes. Open the device in the Capgo console and set a channel override. It can take up to 2 minutes to reach every edge server, and it is removed 90 days after it was last set. Channels chosen in the app with setChannel() do not appear in that list.

Device overrides

How do we test a new native build without an old live update on top?

Increase CapacitorUpdater.version for every native build. With the default settings, bundles downloaded for the older build are removed when the newer one is installed. You can also turn off updates for development builds and emulators on the channel.

Test native builds without live updates

What if a beta bundle crashes on start?

Call notifyAppReady() once your app has loaded. If a new bundle does not call it within 10 seconds, the device marks it as failed and goes back to the previous working bundle.

notifyAppReady() and automatic rollback

Set up a beta channel on your own app

Create a channel testers can join, add the switch, and send your first bundle during the 14-day free trial. No credit card needed.