---
title: 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.
date:
  created: 2025-08-28
  updated: 2026-07-08
authors:
  - robingenz
categories:
  - Capacitor
  - Cloud
  - Cordova
  - Guides
---

# Migrate from Ionic Appflow to Capawesome Cloud

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/){:target="_blank"}. 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.

<!-- more -->

## Key Takeaways

- **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](./alternatives-to-ionic-enterprise-plugins.md) for drop-in replacements.

!!! tip "AI-Assisted Migration"

    For a guided experience, add the [Capawesome skills](https://github.com/capawesome-team/skills){:target="_blank"} 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:

    ```
    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?

Ionic [announced the discontinuation of their commercial products](https://ionic.io/blog/important-announcement-the-future-of-ionics-commercial-products){:target="_blank"}, 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](./capawesome-cloud-soc-2-type-2-compliance.md), 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](./alternative-to-appflow.md) for a broader look at what to evaluate in an Appflow replacement.

## How Appflow Concepts Map to Capawesome Cloud

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

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){:target="_blank"} account and organization.
- The latest version of the [Capawesome CLI](../../cloud/cli/index.md) installed and authenticated.
- Access to your Ionic Appflow configuration and signing credentials.

## Create Your App

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.

=== "CLI"

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

    ```bash
    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.

=== "Console"

    Open the [Capawesome Cloud Console](https://console.cloud.capawesome.io/organizations/_/apps){:target="_blank"}, 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

Appflow live updates map directly to [Capawesome Cloud Live Updates](../../cloud/live-updates/index.md). 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

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

=== "Capacitor"

    ```bash
    npm uninstall @capacitor/live-updates
    npm install @capawesome/capacitor-live-update
    npx cap sync
    ```

=== "Cordova"

    ```bash
    cordova plugin remove cordova-plugin-ionic
    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

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](../../cloud/live-updates/rollbacks.md) of broken updates — a safety net Appflow doesn't give you out of the box.

=== "Capacitor"

    Update your [Capacitor configuration](https://capacitorjs.com/docs/config){:target="_blank"} file:

    ```typescript title="capacitor.config.ts"
    import { CapacitorConfig } from "@capacitor/cli";

    const config: CapacitorConfig = {
      plugins: {
        LiveUpdate: {
          appId: "00000000-0000-0000-0000-000000000000", // Replace with your Capawesome app ID
          defaultChannel: "production",
          autoUpdateStrategy: "background",
          autoBlockRolledBackBundles: true,
          readyTimeout: 10000
        }
      }
    };

    export default config;
    ```

=== "Cordova"

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

    ```xml
    <preference name="APP_ID" value="00000000-0000-0000-0000-000000000000" />
    <preference name="DEFAULT_CHANNEL" value="production" />
    <preference name="AUTO_UPDATE_STRATEGY" value="background" />
    <preference name="AUTO_BLOCK_ROLLED_BACK_BUNDLES" value="true" />
    <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

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

=== "Capacitor"

    ```typescript
    import { LiveUpdate } from "@capawesome/capacitor-live-update";

    const applyUpdate = async () => {
      const { nextBundleId } = await LiveUpdate.sync();
      if (nextBundleId) {
        await LiveUpdate.reload();
      }
    };
    ```

=== "Cordova"

    ```javascript
    const { LiveUpdate } = cordova.plugins;

    const applyUpdate = async () => {
      const { nextBundleId } = await LiveUpdate.sync();
      if (nextBundleId) {
        await LiveUpdate.reload();
      }
    };
    ```

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

### Publish Your First Update

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

```bash
npm run build
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

Appflow's native builds map to [Capawesome Cloud Native Builds](../../cloud/native-builds/index.md), 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

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/_/git){:target="_blank"} 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](../../cloud/native-builds/build-without-git.md)), and if your Git server sits behind a firewall, see [Access Git Behind a Firewall](../../cloud/native-builds/firewall-access.md).

### Upload Your Signing Credentials

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.

=== "CLI"

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

    ```bash
    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`.

=== "Console"

    Open the [Signing Certificates](https://console.cloud.capawesome.io/apps/_/certificates){:target="_blank"} 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](../../cloud/native-builds/certificates/index.md) 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

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](../../cloud/native-builds/environments.md) 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.

=== "CLI"

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

    ```bash
    npx @capawesome/cli apps:environments:create --name production
    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.

=== "Console"

    Open the [Environments](https://console.cloud.capawesome.io/apps/_/environments){:target="_blank"} 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

Where Appflow used build settings in the dashboard, Capawesome Cloud uses an optional [`capawesome.config.json`](../../cloud/native-builds/configuration.md) 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

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

=== "CLI"

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

    ```bash
    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`](../../cloud/cli/commands.md#appsbuildsdownload).

=== "Console"

    Navigate to the [Builds](https://console.cloud.capawesome.io/apps/_/builds){:target="_blank"} 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](../../cloud/native-builds/setup.md).

### Debug Failed Builds with Cloud Assist

If a build fails during the migration, you don't have to dig through raw logs alone. [Cloud Assist](../../cloud/assist/index.md) 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`](../../cloud/cli/commands.md#appsbuildsfailure-summary) for a past build. Cloud Assist is included free in all plans with build minutes.

### Build the Web Bundle in the Cloud

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:

```bash
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](./announcing-capawesome-cloud-web-builds.md) for the full story.

## Part 3: Migrate App Store Publishing

Appflow's "Deploy to App Store" feature maps to [Capawesome Cloud App Store Publishing](../../cloud/app-store-publishing/index.md), 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

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

=== "CLI"

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

    ```bash
    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.

=== "Console"

    Open the [Destinations](https://console.cloud.capawesome.io/apps/_/destinations){:target="_blank"} 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](../../cloud/app-store-publishing/destinations/apple-app-store.md) 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](../../cloud/app-store-publishing/destinations/google-play-store.md) guide for the step-by-step setup.

!!! note "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

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

=== "CLI"

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

    ```bash
    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.

=== "Console"

    Open the [Deployments](https://console.cloud.capawesome.io/apps/_/deployments){:target="_blank"} 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](../../cloud/automations/index.md).

## Migration Timeline

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

### When does Ionic Appflow shut down?

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?

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?

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](./announcing-cordova-support-in-capawesome-cloud.md) for the details.

### How long does the migration take?

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

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){ .md-button .md-button--primary }

## Conclusion

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](./alternatives-to-ionic-enterprise-plugins.md) for drop-in replacements for Auth Connect, Identity Vault, and Secure Storage. If you're on Cordova, read [Announcing Cordova Support in Capawesome Cloud](./announcing-cordova-support-in-capawesome-cloud.md) 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){:target="_blank"}, and [subscribe to the Capawesome newsletter](https://capawesome.io/newsletter/){:target="_blank"} to stay up to date.
