Skip to main content

White-label and multi-tenant apps

Ship every tenant's app from one codebase

Give each tenant, brand, or location its own Capgo channel. Update one tenant's web layer without touching the others, and build branded native shells with Capgo Build.

1 codebase
Shared Capacitor app for every tenant
1 channel per tenant
Own bundle, history, and rollback
Cloud builds
Android flavors and iOS schemes

Shell

Capacitor app

Tenants

Channels

Native

Capgo Build

The Problem

White-label apps get hard when every customer becomes a fork

Brand variants multiply fast

Each customer wants its own logo, theme, feature set, content, and launch date. Separate forks turn those requests into maintenance you pay for on every release.

Store reviews slow tenant fixes

A menu typo or onboarding fix for one tenant should not wait for a new binary and store review, often 24–48 hours, sometimes much longer.

Global releases are too blunt

One global update can break every brand at once. One fork per brand slows the whole team down. You need a release lane per tenant.

Common setups

What white-label looks like in a Capgo app

Customer-branded SaaS app

Each business customer gets its own logo, theme, onboarding copy, and feature set, and receives updates on its own channel.

Franchise or location app

Each restaurant, clinic, gym, or branch gets local menus, assets, and campaign screens as live updates, without a new binary.

Mini-app marketplace

A host app lists workspaces or mini-apps and moves the device to the matching Capgo channel at runtime with setChannel().

The Solution

One app shell, a release lane per tenant

The native shell stays shared. Each tenant's web layer moves through its own channel.

Channel per tenant

Each tenant, franchise, or workspace gets a channel. Ship to one tenant or to all of them, and roll back one channel without touching the others.

Channels docs

Self-assign at runtime

With self-assignment on, the app calls setChannel() to put a device on its tenant's channel. Capgo still validates the channel on every update check.

setChannel() reference

Version targeting across shells

Tenants often run different native versions. Block major updates per channel, or set a minimum native version, so a bundle only reaches shells that can run it.

Version targeting docs

Capgo Build for branded shells

Build each Android flavor or iOS scheme in the cloud and upload it to the stores. Use live updates for the web layer that changes every week.

Build options

How it works

How white-label teams ship with Capgo

One Capacitor codebase, one channel per tenant. The commands and code are from the Capgo CLI and updater docs.

  1. Create a channel for each tenant

    Each tenant gets a channel with its own bundle and history. Allow self-assignment so the app can move a device onto it.

    npx @capgo/cli@latest channel add acme com.example.app --self-assign
    npx @capgo/cli@latest channel add globex com.example.app --self-assign
    Channels docs
  2. Upload each tenant's bundle

    Build the web layer with the tenant's theme and config, then upload it to that tenant's channel only. Other tenants keep their current bundle.

    npx @capgo/cli@latest bundle upload --channel acme
    npx @capgo/cli@latest bundle upload --channel globex
    Rollback docs
  3. Move the device to its tenant at sign-in

    After sign-in, call setChannel() with the tenant's channel. The choice is stored on the device and takes effect on the next update check.

    import { CapacitorUpdater } from '@capgo/capacitor-updater'
    
    await CapacitorUpdater.setChannel({
      channel: tenant.channel,
      triggerAutoUpdate: true,
    })
    setChannel() reference
  4. Build branded shells in the cloud

    When a tenant needs its own store listing, icon, or permissions, build that flavor or scheme with Capgo Build. No Mac of your own needed.

    npx @capgo/cli@latest build request com.acme.app --platform android --android-flavor acme
    npx @capgo/cli@latest build request com.acme.app --platform ios --ios-scheme Acme
    Build options

Apps built with Capacitor

Regional media and carrier apps share a core but need local control

Regional sports, entertainment, and telecom brands can reuse one app foundation while changing schedules, campaigns, support, and market-specific content for each brand or country.

Tigo Sports Guatemala app icon SPORTS

Tigo Sports Guatemala

Regional sports media app where schedules and local content need market control.

Google Play installs
1.6M
Store rating
3.3
TV SPIELFILM - TV-Programm app icon ENTERTAINMENT

TV SPIELFILM - TV-Programm

Entertainment guide where content surfaces vary by market and programming window.

Google Play installs
12.1M
Store rating
4.4
Mi Orange app icon TOOLS

Mi Orange

Carrier app where shared account patterns still need local product and support content.

Google Play installs
9.3M
Store rating
4.2

Customer proof

What teams shipping with Capgo say

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

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.”

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.”

Portrait of Sergiu S

Sergiu S

Lead Developer, drivolino GmbH

“The Capgo Capacitor Updater plugin completely transformed how we ship updates. What used to take days now takes just minutes.”

FAQ

White-label questions

What teams ask before running many brands on one Capgo setup.

Do we need a separate Capgo app for every brand?

Only when each brand has its own app ID in the stores. One store app that serves many tenants is one Capgo app with a channel per tenant. Separate branded store apps are separate Capgo apps, each with its own channels.

Channels docs

Can a user switch tenants inside the app?

Yes. If the tenant's channel allows self-assignment, call setChannel() from the app. On current plugin versions the choice is stored on the device and used on the next update check.

setChannel() reference

What if some tenants are on an older native version?

Use version targeting. Block major updates on a channel, or set a minimum native version on a bundle, so older shells keep a bundle they can run.

Version targeting docs

Can we roll back one tenant without affecting the others?

Yes. Each channel keeps its own bundle history. Roll the tenant's channel back to an earlier bundle, and the other channels keep what they have.

Rollback docs

What still needs a store release?

App names, icons, permissions, native plugins, and native code live in the binary. Capgo Build can build each flavor or scheme and upload it to App Store Connect and Google Play.

Capgo Build docs

Try tenant channels on your own app

During the 14-day trial, create two tenant channels, upload a bundle to each, and switch a test device between them with setChannel().