---
description: Step-by-step guide to migrating live updates, native builds, and app store publishing from Ionic Appflow to Capawesome Cloud before the 2027 shutdown.
title: Migrate from Ionic Appflow to Capawesome Cloud - Capawesome
image: https://capawesome.io/docs/assets/images/social/blog/migrating-from-ionic-appflow-to-capawesome-cloud.png
---

<!doctype html> 

[Skip to content ](#migrate-from-ionic-appflow-to-capawesome-cloud) 

[🖥️ Introducing the **Capacitor Electron Platform** — build desktop apps for macOS, Windows, and Linux. Free & open source. ](/blog/announcing-the-capacitor-electron-platform/) 

* [ 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/)
* [ Gyroscope ](/docs/sdks/capacitor/gyroscope/)
* [ Haptics ](/docs/sdks/capacitor/haptics/)
* [ Home Indicator ](/docs/sdks/capacitor/home-indicator/)
* [ In-App Browser ](/docs/sdks/capacitor/in-app-browser/)
* [ Install Referrer ](/docs/sdks/capacitor/install-referrer/)
* [ Intercom ](/docs/sdks/capacitor/intercom/)
* [ Intune ](/docs/sdks/capacitor/intune/)
* [ Keep Awake ](/docs/sdks/capacitor/keep-awake/)
* [ libSQL ](/docs/sdks/capacitor/libsql/)
* [ Light Sensor ](/docs/sdks/capacitor/light-sensor/)
* [ Live Update ](/docs/sdks/capacitor/live-update/)
* [ Localization ](/docs/sdks/capacitor/localization/)
* [ Mail Composer ](/docs/sdks/capacitor/mail-composer/)
* [ Managed Configurations ](/docs/sdks/capacitor/managed-configurations/)
* [ Maps Launcher ](/docs/sdks/capacitor/maps-launcher/)
* [ Media Session ](/docs/sdks/capacitor/media-session/)
* [ ML Kit ](/docs/sdks/capacitor/mlkit/)
* [ Navigation Bar ](/docs/sdks/capacitor/navigation-bar/)
* [ Network ](/docs/sdks/capacitor/network/)
* [ NFC ](/docs/sdks/capacitor/nfc/)
* [ Node.js ](/docs/sdks/capacitor/nodejs/)
* [ OAuth ](/docs/sdks/capacitor/oauth/)
* [ Passkeys ](/docs/sdks/capacitor/passkeys/)
* [ Password Autofill ](/docs/sdks/capacitor/password-autofill/)
* [ PDF Generator ](/docs/sdks/capacitor/pdf-generator/)
* [ PDF Viewer ](/docs/sdks/capacitor/pdf-viewer/)
* [ Pedometer ](/docs/sdks/capacitor/pedometer/)
* [ Permissions ](/docs/sdks/capacitor/permissions/)
* [ Phone Dialer ](/docs/sdks/capacitor/phone-dialer/)
* [ Photo Editor ](/docs/sdks/capacitor/photo-editor/)
* [ Photo Manipulator ](/docs/sdks/capacitor/photo-manipulator/)
* [ PixLive ](/docs/sdks/capacitor/pixlive/)
* [ PostHog ](/docs/sdks/capacitor/posthog/)
* [ Printer ](/docs/sdks/capacitor/printer/)
* [ Privacy Screen ](/docs/sdks/capacitor/privacy-screen/)
* [ Proximity Sensor ](/docs/sdks/capacitor/proximity-sensor/)
* [ Purchases ](/docs/sdks/capacitor/purchases/)
* [ RealtimeKit ](/docs/sdks/capacitor/realtimekit/)
* [ Root Detection ](/docs/sdks/capacitor/root-detection/)
* [ Screen Brightness ](/docs/sdks/capacitor/screen-brightness/)
* [ Screen Orientation ](/docs/sdks/capacitor/screen-orientation/)
* [ Screen Reader ](/docs/sdks/capacitor/screen-reader/)
* [ Screenshot ](/docs/sdks/capacitor/screenshot/)
* [ Secure Preferences ](/docs/sdks/capacitor/secure-preferences/)
* [ Settings Launcher ](/docs/sdks/capacitor/settings-launcher/)
* [ Shake ](/docs/sdks/capacitor/shake/)
* [ Silent Mode ](/docs/sdks/capacitor/silent-mode/)
* [ SIM ](/docs/sdks/capacitor/sim/)
* [ SMS Composer ](/docs/sdks/capacitor/sms-composer/)
* [ 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/)
* [ System WebView ](/docs/sdks/capacitor/system-webview/)
* [ Tauri ](/docs/sdks/capacitor/tauri/)
* [ Text Interaction ](/docs/sdks/capacitor/text-interaction/)
* [ Text Zoom ](/docs/sdks/capacitor/text-zoom/)
* [ Thermal State ](/docs/sdks/capacitor/thermal-state/)
* [ Toast ](/docs/sdks/capacitor/toast/)
* [ Torch ](/docs/sdks/capacitor/torch/)
* [ Vault ](/docs/sdks/capacitor/vault/)
* [ Volume ](/docs/sdks/capacitor/volume/)
* [ Wallet ](/docs/sdks/capacitor/wallet/)
* [ Wifi ](/docs/sdks/capacitor/wifi/)
* [ YouTube Player ](/docs/sdks/capacitor/youtube-player/)
* [ 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, Yarn, or bun ](/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

* [ Part 2: Migrate Native Builds ](#part-2-migrate-native-builds)
* [ Part 3: Migrate App Store Publishing ](#part-3-migrate-app-store-publishing)
* [ Migration Timeline ](#migration-timeline)
* [ FAQ ](#faq)
* [ Get Help With Your Migration ](#get-help-with-your-migration)
* [ Conclusion ](#conclusion)

# Migrate from Ionic Appflow to Capawesome Cloud[¶](#migrate-from-ionic-appflow-to-capawesome-cloud "Permanent link")

Ionic Appflow reaches end of life on December 31, 2027, and Ionic already stopped selling it to new customers in February 2025\. If you rely on Appflow, the shutdown means finding a new home for your live updates, native builds, and app store publishing before the deadline — and many teams are already looking for an [alternative](https://capawesome.io/alternatives/ionic-appflow/). Capawesome Cloud is a **drop-in replacement** for Ionic Appflow, covering the same three areas. And like Appflow, it works with **Capacitor, Cordova, and native iOS and Android** apps. This guide walks through migrating each area step by step.

## Key Takeaways[¶](#key-takeaways "Permanent link")

* **Ionic Appflow reaches end of life on December 31, 2027.** New customer sales already stopped in February 2025, so every Appflow team needs a migration plan.
* **Capawesome Cloud covers all three Appflow pillars** — live updates, native builds, and app store publishing — for Capacitor, Cordova, and native iOS and Android apps.
* **The Live Update SDK keeps Appflow's `sync()` and `reload()` API**, so most teams complete the live update migration in under an hour.
* **Every Appflow concept has a direct equivalent**: channels map to channels, environments to environments, and signing certificates and destinations carry over one-to-one.
* **You can run Appflow and Capawesome Cloud in parallel** during the transition, so there's no risky big-bang cutover.

Migrate the three areas in any order, or only the ones you use. If your app also relies on Ionic's enterprise plugins like Auth Connect, Identity Vault, or Secure Storage, see [Alternatives to the Ionic Enterprise plugins](/blog/alternatives-to-ionic-enterprise-plugins/) for drop-in replacements.

AI-Assisted Migration

For a guided experience, add the [Capawesome skills](https://github.com/capawesome-team/skills) to your project with `npx skills add capawesome-team/skills --skill ionic-appflow-migration` and use the following prompt with your preferred AI coding assistant:

`` [](#%5F%5Fcodelineno-0-1)Use the `ionic-appflow-migration` skill from `capawesome-team/skills` to help me migrate from Ionic Appflow to Capawesome Cloud.
 ``

## Why Migrate from Ionic Appflow?[¶](#why-migrate-from-ionic-appflow "Permanent link")

Ionic [announced the discontinuation of their commercial products](https://ionic.io/blog/important-announcement-the-future-of-ionics-commercial-products), including Appflow, as part of their transition after being acquired by OutSystems. New sales stopped in February 2025, and existing users keep access until the end-of-life date on December 31, 2027 — but it's worth planning your migration well before the shutdown.

Capawesome Cloud offers transparent, scalable pricing, delta updates that reduce data transfer, native builds that run 3-5x faster on M4 hardware, and a secure zero-trust architecture. It is also [SOC 2 Type 2 compliant](/blog/capawesome-cloud-soc-2-type-2-compliance/), verified through continuous third-party auditing — which matters if your vendor risk assessment is the first hurdle a new platform has to clear. The platform is actively maintained, and most teams complete the live update migration in under an hour.

Not sure yet whether Capawesome Cloud is the right fit? Read [Capawesome Cloud: Alternative to Ionic Appflow](/blog/alternative-to-appflow/) for a broader look at what to evaluate in an Appflow replacement.

## How Appflow Concepts Map to Capawesome Cloud[¶](#how-appflow-concepts-map-to-capawesome-cloud "Permanent link")

Almost everything you configured in Appflow has a direct counterpart in Capawesome Cloud, which is what makes the migration mostly a matter of moving configuration rather than rethinking your release process:

| Ionic Appflow                     | Capawesome Cloud    | Notes                                            |
| --------------------------------- | ------------------- | ------------------------------------------------ |
| App                               | App                 | The container everything else belongs to         |
| Live update channel               | Channel             | Same concept, same naming freedom                |
| Cloud-built live update           | Web build           | Builds the web bundle in the cloud               |
| Native build                      | Native build        | Android, iOS, and web as a third platform        |
| Environment (variables & secrets) | Environment         | Variables plus encrypted secrets                 |
| Signing certificate               | Signing certificate | Reuse your existing keystore, .p12, and profiles |
| Destination                       | Destination         | Store credentials for TestFlight and Google Play |
| Personal access token             | API token           | For CI/CD authentication with the CLI            |

## Prerequisites[¶](#prerequisites "Permanent link")

Before you begin, make sure you have:

* A Capacitor, Cordova, or native app in a Git repository.
* A [Capawesome Cloud](https://console.cloud.capawesome.io) account and organization.
* The latest version of the [Capawesome CLI](/docs/cloud/cli/) installed and authenticated.
* Access to your Ionic Appflow configuration and signing credentials.

## Create Your App[¶](#create-your-app "Permanent link")

Everything in Capawesome Cloud is organized around an **app**, which is the equivalent of an Appflow app. Create one first, then use its app ID throughout the migration.

CLIConsole

Use the [apps:create](/docs/cloud/cli/commands/#appscreate) command:

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

You'll be prompted to select an organization and provide a name. The CLI then creates the app and prints the app ID.

Open the [Capawesome Cloud Console](https://console.cloud.capawesome.io/organizations/%5F/apps), select your organization, and click **Create App**. The console generates a unique app ID you'll use in the steps below.

Note the app ID. You'll also want to create your channels (for example `development`, `staging`, and `production`) the same way you did in Appflow.

## Part 1: Migrate Live Updates[¶](#part-1-migrate-live-updates "Permanent link")

Appflow live updates map directly to [Capawesome Cloud Live Updates](/docs/cloud/live-updates/). The Live Update SDK is available for both Capacitor and Cordova with full API parity, so the migration is mostly a SDK swap plus a configuration change.

### Install the Live Update SDK[¶](#install-the-live-update-sdk "Permanent link")

Remove the Appflow live update SDK and install the Capawesome equivalent for your framework:

CapacitorCordova

`[](#%5F%5Fcodelineno-2-1)npm uninstall @capacitor/live-updates
[](#%5F%5Fcodelineno-2-2)npm install @capawesome/capacitor-live-update
[](#%5F%5Fcodelineno-2-3)npx cap sync
`

`[](#%5F%5Fcodelineno-3-1)cordova plugin remove cordova-plugin-ionic
[](#%5F%5Fcodelineno-3-2)cordova plugin add @capawesome/cordova-live-update --variable APP_ID=<your-app-id>
`

Both plugins are open source and actively maintained, and provide everything you need for over-the-air updates.

### Configure Your App[¶](#configure-your-app "Permanent link")

Next, replace your Appflow configuration with the Capawesome configuration. The examples below show the recommended production setup: `autoUpdateStrategy` set to `background` checks for updates on app start and resume, downloads them in the background, and applies them on the next launch, while `readyTimeout` and `autoBlockRolledBackBundles` enable [automatic rollback](/docs/cloud/live-updates/rollbacks/) of broken updates — a safety net Appflow doesn't give you out of the box.

CapacitorCordova

Update your [Capacitor configuration](https://capacitorjs.com/docs/config) file:

capacitor.config.ts

`[](#%5F%5Fcodelineno-4-1)import { CapacitorConfig } from "@capacitor/cli";
[](#%5F%5Fcodelineno-4-2)
[](#%5F%5Fcodelineno-4-3)const config: CapacitorConfig = {
[](#%5F%5Fcodelineno-4-4)  plugins: {
[](#%5F%5Fcodelineno-4-5)    LiveUpdate: {
[](#%5F%5Fcodelineno-4-6)      appId: "00000000-0000-0000-0000-000000000000", // Replace with your Capawesome app ID
[](#%5F%5Fcodelineno-4-7)      defaultChannel: "production",
[](#%5F%5Fcodelineno-4-8)      autoUpdateStrategy: "background",
[](#%5F%5Fcodelineno-4-9)      autoBlockRolledBackBundles: true,
[](#%5F%5Fcodelineno-4-10)      readyTimeout: 10000
[](#%5F%5Fcodelineno-4-11)    }
[](#%5F%5Fcodelineno-4-12)  }
[](#%5F%5Fcodelineno-4-13)};
[](#%5F%5Fcodelineno-4-14)
[](#%5F%5Fcodelineno-4-15)export default config;
`

Set the plugin variables as `<preference>` entries in your `config.xml`:

`[](#%5F%5Fcodelineno-5-1)<preference name="APP_ID" value="00000000-0000-0000-0000-000000000000" />
[](#%5F%5Fcodelineno-5-2)<preference name="DEFAULT_CHANNEL" value="production" />
[](#%5F%5Fcodelineno-5-3)<preference name="AUTO_UPDATE_STRATEGY" value="background" />
[](#%5F%5Fcodelineno-5-4)<preference name="AUTO_BLOCK_ROLLED_BACK_BUNDLES" value="true" />
[](#%5F%5Fcodelineno-5-5)<preference name="READY_TIMEOUT" value="10000" />
`

The options mirror what you used in Appflow. The `appId` is the identifier from your Capawesome app, and the default channel determines which channel the app checks for updates. For automatic rollback to work, call `ready()` as early as possible at app start to signal that the new bundle launched successfully — if the call doesn't arrive within the `readyTimeout`, the SDK rolls back to the built-in bundle that shipped with the installed native app version.

Here's how the most common configuration options map between the two platforms:

| Ionic Appflow    | Capawesome Cloud   | Notes                                        |
| ---------------- | ------------------ | -------------------------------------------- |
| appId            | appId              | Same purpose, different value                |
| channel          | defaultChannel     | Same purpose, renamed                        |
| autoUpdateMethod | autoUpdateStrategy | Set to background, or handle updates in code |
| maxVersions      | autoDeleteBundles  | A boolean instead of a number                |
| enabled          | Not needed         | Handled in code                              |

### Replace the SDK Calls[¶](#replace-the-sdk-calls "Permanent link")

The Capawesome Live Update SDK exposes the same `sync()` and `reload()` methods as the Appflow SDK, so most call sites change only their import.

CapacitorCordova

`[](#%5F%5Fcodelineno-6-1)import { LiveUpdate } from "@capawesome/capacitor-live-update";
[](#%5F%5Fcodelineno-6-2)
[](#%5F%5Fcodelineno-6-3)const applyUpdate = async () => {
[](#%5F%5Fcodelineno-6-4)  const { nextBundleId } = await LiveUpdate.sync();
[](#%5F%5Fcodelineno-6-5)  if (nextBundleId) {
[](#%5F%5Fcodelineno-6-6)    await LiveUpdate.reload();
[](#%5F%5Fcodelineno-6-7)  }
[](#%5F%5Fcodelineno-6-8)};
`

`[](#%5F%5Fcodelineno-7-1)const { LiveUpdate } = cordova.plugins;
[](#%5F%5Fcodelineno-7-2)
[](#%5F%5Fcodelineno-7-3)const applyUpdate = async () => {
[](#%5F%5Fcodelineno-7-4)  const { nextBundleId } = await LiveUpdate.sync();
[](#%5F%5Fcodelineno-7-5)  if (nextBundleId) {
[](#%5F%5Fcodelineno-7-6)    await LiveUpdate.reload();
[](#%5F%5Fcodelineno-7-7)  }
[](#%5F%5Fcodelineno-7-8)};
`

For more ways to apply updates, see the [Update Strategies](/docs/cloud/live-updates/update-strategies/) guide.

### Publish Your First Update[¶](#publish-your-first-update "Permanent link")

With the SDK in place, build your web assets and upload them with the CLI. This is the same command for Capacitor and Cordova:

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

You'll be prompted for the path to your web assets (typically `www` or `dist`) and the target app. Once the upload completes, the bundle is delivered to your users according to your update strategy. You can drop the same command into your CI/CD pipeline exactly as you did with Appflow.

Prefer to skip the local build entirely? Capawesome Cloud can also build the web bundle for you and deploy it straight to a channel — the equivalent of Appflow's cloud-built live updates. See [Build the Web Bundle in the Cloud](#build-the-web-bundle-in-the-cloud) below.

## Part 2: Migrate Native Builds[¶](#part-2-migrate-native-builds "Permanent link")

Appflow's native builds map to [Capawesome Cloud Native Builds](/docs/cloud/native-builds/), which builds your Capacitor, Cordova, or native app in the cloud — for Android, iOS, and even the web bundle used by Live Updates. There are no YAML pipelines to maintain and no runners to manage, and every build runs in an isolated environment on M4 hardware with the latest stable versions of Node.js, Java, and Xcode preinstalled.

### Connect Your Git Repository[¶](#connect-your-git-repository "Permanent link")

The repository connection you configured in Appflow is replaced by connecting your Git provider to Capawesome Cloud:

1. Navigate to the [Git](https://console.cloud.capawesome.io/apps/%5F/git) page of your app in the Capawesome Cloud Console.
2. In the **Git Providers** section, select your provider — GitHub, GitLab, Bitbucket, or Azure DevOps, including self-hosted instances — and click **Connect**.
3. In the **Git Repositories** section, choose the repository owner and select the repository to build.
4. Click **Save** to finalize the connection.

Connecting Git is optional: you can also upload local source files directly with the CLI's `--path` option (see [Build without Git Connection](/docs/cloud/native-builds/build-without-git/)), and if your Git server sits behind a firewall, see [Access Git Behind a Firewall](/docs/cloud/native-builds/firewall-access/).

### Upload Your Signing Credentials[¶](#upload-your-signing-credentials "Permanent link")

Your Appflow signing certificates carry over as-is — you upload the same files to Capawesome Cloud. For Android, that's your keystore (`.jks` or `.keystore`) with its keystore password, key alias, and key password. For iOS, it's your signing certificate as a `.p12` file with its password, plus the provisioning profiles (`.mobileprovision`) for your app.

CLIConsole

Use the [apps:certificates:create](/docs/cloud/cli/commands/#appscertificatescreate) command:

`[](#%5F%5Fcodelineno-9-1)npx @capawesome/cli apps:certificates:create --platform ios --type production --file certificate.p12 --provisioning-profile profile.mobileprovision
`

For Android, pass the keystore via `--file` along with `--password`, `--key-alias`, and `--key-password`.

Open the [Signing Certificates](https://console.cloud.capawesome.io/apps/%5F/certificates) page of your app and create a certificate for each platform.

Credentials are encrypted at rest and never exposed in build logs. See [Signing certificates](/docs/cloud/native-builds/certificates/) for the per-platform details, including how to export or generate the files if you don't have them at hand.

### Migrate Your Environments and Secrets[¶](#migrate-your-environments-and-secrets "Permanent link")

If you used Appflow environments to inject variables and secrets into your builds, Capawesome Cloud has the same concept under the same name. An [environment](/docs/cloud/native-builds/environments/) is a reusable, named set of **variables** (non-sensitive configuration like API endpoints or feature flags) and **secrets** (encrypted values that never appear in build logs). Recreate each Appflow environment once, then select it per build.

CLIConsole

Create the environment with [apps:environments:create](/docs/cloud/cli/commands/#appsenvironmentscreate) and add values with [apps:environments:set](/docs/cloud/cli/commands/#appsenvironmentsset):

`[](#%5F%5Fcodelineno-10-1)npx @capawesome/cli apps:environments:create --name production
[](#%5F%5Fcodelineno-10-2)npx @capawesome/cli apps:environments:set --name production --variable API_URL=https://api.example.com --secret API_KEY=sk_live_...
`

Both `--variable` and `--secret` are repeatable, and you can import many values at once from a `.env` file with `--variable-file` or `--secret-file` — handy for moving a long list of Appflow secrets in one go.

Open the [Environments](https://console.cloud.capawesome.io/apps/%5F/environments) page, click **Create Environment**, then use **Manage Variables** and **Manage Secrets** to add your values. The **Import** feature lets you paste multiple `KEY=VALUE` pairs at once.

When triggering a build, pass `--environment production` (or pick the environment in the Console's build dialog) to make the values available during the build. You can also set a default environment in your app's settings so it's preselected for every build.

### Configure Your Build[¶](#configure-your-build "Permanent link")

Where Appflow used build settings in the dashboard, Capawesome Cloud uses an optional [capawesome.config.json](/docs/cloud/native-builds/configuration/) file in your repository. It covers monorepo and subdirectory setups (`baseDir`), custom dependency installation (`dependencyInstallCommand`), and custom web build commands (`webBuildCommand`). The defaults work for standard project setups, so most apps don't need the file at all.

### Trigger a Build[¶](#trigger-a-build "Permanent link")

With the repository connected and credentials in place, trigger your first build.

CLIConsole

Use the [apps:builds:create](/docs/cloud/cli/commands/#appsbuildscreate) command from any machine, including Windows and Linux:

`[](#%5F%5Fcodelineno-11-1)npx @capawesome/cli apps:builds:create --platform ios --git-ref main --environment production
`

Pick the build type with `--type`: Android supports `debug` and `release`; iOS supports `simulator`, `development`, `ad-hoc`, `app-store`, and `enterprise`. Add `--apk`, `--aab`, or `--ipa` to download the artifact automatically once the build finishes, or fetch it later with [apps:builds:download](/docs/cloud/cli/commands/#appsbuildsdownload).

Navigate to the [Builds](https://console.cloud.capawesome.io/apps/%5F/builds) page of your app, click **Build from Git**, select the Git reference, platform, build type, and environment, then click **Build**. Once the build completes, download the artifact from the build's detail page.

For the full walkthrough, see [Getting Started with Native Builds](/docs/cloud/native-builds/setup/).

### Debug Failed Builds with Cloud Assist[¶](#debug-failed-builds-with-cloud-assist "Permanent link")

If a build fails during the migration, you don't have to dig through raw logs alone. [Cloud Assist](/docs/cloud/assist/) provides AI-powered failure summaries with the cause, an explanation, and a suggested fix. Pass `--failure-summary` to `apps:builds:create` to get a summary automatically if the build fails, or run [apps:builds:failure-summary](/docs/cloud/cli/commands/#appsbuildsfailure-summary) for a past build. Cloud Assist is included free in all plans with build minutes.

### Build the Web Bundle in the Cloud[¶](#build-the-web-bundle-in-the-cloud "Permanent link")

Native builds aren't limited to Android and iOS — `web` is a third platform. A web build compiles your web assets in the cloud and deploys them straight to a Live Update channel, which is the direct equivalent of Appflow building your live updates for you:

`[](#%5F%5Fcodelineno-12-1)npx @capawesome/cli apps:builds:create --platform web --git-ref main --channel production
`

Web builds use the same Git integration and environments as native builds, and any team member can trigger one from the Console — no local toolchain required. Read [Announcing Capawesome Cloud Web Builds](/blog/announcing-capawesome-cloud-web-builds/) for the full story.

## Part 3: Migrate App Store Publishing[¶](#part-3-migrate-app-store-publishing "Permanent link")

Appflow's "Deploy to App Store" feature maps to [Capawesome Cloud App Store Publishing](/docs/cloud/app-store-publishing/), which submits builds to TestFlight, the Apple App Store, and Google Play. The Appflow **destinations** concept carries over one-to-one, so you can reuse the store credentials you already have.

### Create a Store Destination[¶](#create-a-store-destination "Permanent link")

A **destination** holds the store credentials and target track, just like an Appflow destination. Create one for each store you publish to:

CLIConsole

Use the [apps:destinations:create](/docs/cloud/cli/commands/#appsdestinationscreate) command:

`[](#%5F%5Fcodelineno-13-1)npx @capawesome/cli apps:destinations:create --name "Google Play" --platform android
`

All credentials can be passed as flags (for example `--google-service-account-key-file` for Google Play or `--apple-api-key-file` for the Apple App Store) — see the command reference for the full list.

Open the [Destinations](https://console.cloud.capawesome.io/apps/%5F/destinations) page of your app and create a destination per store.

Here's what each store requires:

* **Apple App Store (TestFlight)**: Your Apple Developer **Team ID**, plus either an **App Store Connect API key** (the `.p8` key file, Key ID, and Issuer ID) or an Apple ID with an app-specific password. The API key is the more robust choice for automation. See the [Apple App Store destination](/docs/cloud/app-store-publishing/destinations/apple-app-store/) guide for obtaining the credentials.
* **Google Play**: Your **package name**, the release **track** (Internal, Alpha, Beta, or Production), the publishing format (**AAB** or **APK**), and a **Google Cloud service account JSON key** invited to your Google Play Console with release permissions. See the [Google Play Store destination](/docs/cloud/app-store-publishing/destinations/google-play-store/) guide for the step-by-step setup.

First Google Play upload is manual

The very first version of your app must be uploaded manually to Google Play Console — a Google Play requirement, not a Capawesome Cloud limitation. All subsequent builds can then be submitted automatically.

### Deploy a Build[¶](#deploy-a-build "Permanent link")

With a destination configured, submit any successful build to it.

CLIConsole

Use the [apps:deployments:create](/docs/cloud/cli/commands/#appsdeploymentscreate) command, identifying the build by its number:

`[](#%5F%5Fcodelineno-14-1)npx @capawesome/cli apps:deployments:create --build-number 42 --destination "Google Play"
`

The `--failure-summary` flag works here too, giving you a Cloud Assist diagnosis if a submission fails.

Open the [Deployments](https://console.cloud.capawesome.io/apps/%5F/deployments) page, click **Create Deployment**, select the build and the destination, then confirm.

iOS builds upload to TestFlight automatically, and Android builds publish to the destination's configured track. Keep in mind that the stores run their own processing and review after the handoff, so a successful deployment means the build was submitted — not yet live. You can also trigger deployments automatically after every build with [Automations](/docs/cloud/automations/).

## Migration Timeline[¶](#migration-timeline "Permanent link")

You have until December 31, 2027, so you can take a measured approach. A practical plan:

1. Set up Capawesome Cloud and test live updates in a development environment (1-2 days).
2. Implement the SDK swap in a feature branch and test all update strategies (3-5 days, including QA).
3. Connect native builds and app store publishing, and verify a full build-and-submit run.
4. Roll out to a subset of users and monitor for 1-2 weeks. You can run Appflow and Capawesome Cloud in parallel during this phase.
5. Update all users to the Capawesome Cloud version, monitor for another week, then retire Appflow.

## FAQ[¶](#faq "Permanent link")

### When does Ionic Appflow shut down?[¶](#when-does-ionic-appflow-shut-down "Permanent link")

Ionic Appflow reaches end of life on December 31, 2027\. Ionic already discontinued new customer sales in February 2025 as part of winding down its commercial products after the OutSystems acquisition. Existing customers keep access until the shutdown date, but migrating early leaves room for a gradual, low-risk rollout.

### Can I run Ionic Appflow and Capawesome Cloud in parallel?[¶](#can-i-run-ionic-appflow-and-capawesome-cloud-in-parallel "Permanent link")

Yes. A common approach is to ship a new app release with the Live Update SDK from Capawesome Cloud while older binaries keep receiving updates from Appflow. This lets you roll out to a subset of users, monitor for a week or two, and only then retire Appflow — no big-bang cutover required.

### Does Capawesome Cloud support Cordova apps?[¶](#does-capawesome-cloud-support-cordova-apps "Permanent link")

Yes. The Live Update SDK is available for Cordova with full API parity to the Capacitor version, and native builds and app store publishing support Cordova projects too. Read [Announcing Cordova Support in Capawesome Cloud](/blog/announcing-cordova-support-in-capawesome-cloud/) for the details.

### How long does the migration take?[¶](#how-long-does-the-migration-take "Permanent link")

Most teams complete the live update migration — the SDK swap and configuration change — in under an hour. A full migration including native builds, app store publishing, QA, and a gradual rollout typically takes two to four weeks, most of which is monitoring rather than active work.

## Get Help With Your Migration[¶](#get-help-with-your-migration "Permanent link")

Want a hand moving off Appflow? Our team can walk you through the migration and answer questions specific to your Capacitor, Cordova, or native setup.

[Book an Ionic Appflow Migration Demo](https://cal.com/team/capawesome/ionic-appflow-migration)

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

Migrating from Ionic Appflow to Capawesome Cloud keeps your live update, native build, and app store publishing infrastructure on a platform that's actively maintained and built for the long term — with plenty of time to spare before Appflow's end of life on December 31, 2027\. The similar APIs and configuration mean minimal code changes, while delta updates, automatic rollbacks, faster builds, and transparent pricing add value on top.

If you also use Ionic's enterprise plugins, read [Alternatives to the Ionic Enterprise plugins](/blog/alternatives-to-ionic-enterprise-plugins/) for drop-in replacements for Auth Connect, Identity Vault, and Secure Storage. If you're on Cordova, read [Announcing Cordova Support in Capawesome Cloud](/blog/announcing-cordova-support-in-capawesome-cloud/) for a closer look at what's now available. Have questions or want to share how your migration went? Join us on the [Capawesome Discord server](https://discord.gg/VCXxSVjefW), and [subscribe to the Capawesome newsletter](https://capawesome.io/newsletter/) to stay up to date.

July 14, 2026 

Back to top

```json
{
      "@context": "https://schema.org",
      "@type": "BlogPosting",
      "headline": "Migrate from Ionic Appflow to Capawesome Cloud",
      "description": "Step-by-step guide to migrating live updates, native builds, and app store publishing from Ionic Appflow to Capawesome Cloud before the 2027 shutdown.",
      "image": "https://capawesome.io/assets/banners/cloud-build-and-deploy-capacitor-apps.png",
      "datePublished": "2025-08-28T00:00:00+00:00",
      "dateModified": "2026-07-08T00:00:00+00:00",
      "author": [
        {
          "@type": "Person",
          "name": "Robin Genz",
          "url": "https://github.com/robingenz"
        }
      ],
      "publisher": {
        "@type": "Organization",
        "name": "Capawesome",
        "url": "https://capawesome.io",
        "logo": {
          "@type": "ImageObject",
          "url": "https://capawesome.io/assets/images/logo.svg"
        }
      },
      "articleSection": "Capacitor",
      "keywords": ["Capacitor", "Cloud", "Cordova", "Guides"],
      "isPartOf": {
        "@type": "Blog",
        "@id": "https://capawesome.io/blog/#blog"
      },
      "mainEntityOfPage": "https://capawesome.io/blog/migrating-from-ionic-appflow-to-capawesome-cloud/",
      "url": "https://capawesome.io/blog/migrating-from-ionic-appflow-to-capawesome-cloud/"
    }
{
      "@context": "https://schema.org",
      "@type": "BreadcrumbList",
      "itemListElement": [
        {
          "@type": "ListItem",
          "position": 1,
          "name": "Home",
          "item": "https://capawesome.io/"
        },
        {
          "@type": "ListItem",
          "position": 2,
          "name": "Blog",
          "item": "https://capawesome.io/blog/"
        },
        {
          "@type": "ListItem",
          "position": 3,
          "name": "Migrate from Ionic Appflow to Capawesome Cloud",
          "item": "https://capawesome.io/blog/migrating-from-ionic-appflow-to-capawesome-cloud/"
        }
      ]
    }
```
