> ## Documentation Index
> Fetch the complete documentation index at: https://docs.clix.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrate from Clix to Notifly

> Replace the Clix Android SDK with Notifly and reconnect users, events, and push campaigns.

<Warning>
  **Clix will shut down on November 30, 2026.**

  Complete your migration before this date to continue sending notifications.
  Preserve your campaign settings and reports before the service shuts down.

  If you would like to migrate to **Notifly**, email
  [support@clix.so](mailto:support@clix.so) for migration assistance.
</Warning>

<Warning>
  **Migration impact**

  * **Register devices with Notifly.** Users normally need to open the updated app before Notifly can register them. Existing Clix profiles and tokens do not transfer automatically.
  * **Keep permissions and opt-outs.** The same installed app retains OS permission. Preserve marketing preferences separately and exclude opted-out users from campaigns.
  * **Rebuild campaigns.** Audience rules, templates, schedules, history, and campaign progress need a separate migration plan.
  * **Avoid overlapping sends.** Stop Clix targeting for migrated installations before enabling equivalent Notifly sends.
</Warning>

This guide walks you through replacing the Clix Android SDK with Notifly. Installation and SDK calls follow the official [Notifly Android SDK guide](https://docs.notifly.tech/ko/developer-guide/android-sdk).

<Info>
  The walkthrough below is for native Android. For iOS, React Native, or
  Flutter, use the matching Notifly setup guide in the platform section below
  and apply the same identity, campaign, and rollout checks.
</Info>

## Before Getting Started

* Create or select a Notifly project and get its **Project ID** and **Username** from its settings.
* Configure Firebase using [Notifly's Firebase integration guide](https://docs.notifly.tech/ko/developer-guide/firebase-integration). Reuse the existing Firebase project and Android package name where possible.
* Keep `google-services.json` in the app module and retain the Google Services plugin.
* Record Clix account IDs, user properties, events, campaigns, notification handlers, and messaging preferences.

<Note>
  Notifly's Android guide states that **in-app popup campaigns require Android
  11 (API level 30) or later**. Treat this as a requirement for that feature and
  check the SDK's own build requirements separately.
</Note>

## Migration Steps

<Steps>
  <Step title="Remove the Clix Android integration">
    Remove `so.clix:clix-android-sdk` from your dependencies or version catalog. Remove `Clix.initialize()`, `Clix.Notification.configure()`, permission calls, and Clix listeners. Replace user and event calls in the following steps.

    Review the merged manifest for Clix-specific messaging services and receivers. Remove competing Clix handlers and confirm the Notifly SDK's registration and delivery behavior with your chosen version. If your app has a custom Firebase Messaging service, verify the supported forwarding arrangement before shipping; adding another service without routing can break notification delivery.

    Keep Firebase and other shared dependencies used by your app. Rebuild the app after removing Clix to catch remaining imports and dependency references.
  </Step>

  <Step title="Install and initialize Notifly">
    Add JitPack to your existing Gradle repositories. For a modern Gradle project using Kotlin DSL:

    ```kotlin settings.gradle.kts theme={null} theme={null}
    dependencyResolutionManagement {
        repositories {
            google()
            mavenCentral()
            maven { url = uri("https://jitpack.io") }
        }
    }
    ```

    Add the SDK to the app module:

    ```kotlin app/build.gradle.kts theme={null} theme={null}
    dependencies {
        implementation("com.github.team-michael:notifly-android-sdk:1.12.0")
    }
    ```

    `1.12.0` is the version shown in the referenced Android guide. Check [Notifly's published releases](https://jitpack.io/#team-michael/notifly-android-sdk) and pin a supported version you have reviewed before releasing.

    Initialize in your existing `Application` class:

    ```kotlin MainApplication.kt theme={null} theme={null}
    import android.app.Application
    import tech.notifly.Notifly

    class MainApplication : Application() {
        override fun onCreate() {
            super.onCreate()
            val username = "YOUR_NOTIFLY_USERNAME"
            Notifly.initialize(
                applicationContext,
                "YOUR_NOTIFLY_PROJECT_ID",
                username,
                username
            )
        }
    }
    ```

    Register this class with `android:name=".MainApplication"` on the existing `application` element in `AndroidManifest.xml`. Keep other application settings intact.

    <Warning>
      The fourth initialization argument is a legacy compatibility placeholder. Notifly's current guide says to pass the same non-empty Username value. Do not put an actual password or API Secret Key in this argument or anywhere in the app.
    </Warning>

    Retain your Android 13+ `POST_NOTIFICATIONS` declaration and runtime permission flow. Configure and test notification channels, icons, and click behavior for Notifly; removing Clix also removes any behavior it supplied.
  </Step>

  <Step title="Map users and profile properties">
    | Clix integration | Notifly Android replacement |
    | - | - |
    | `Clix.setUserId()` | `Notifly.setUserId(context, userId)` |
    | User properties | `Notifly.setUserProperties(context, params)` |
    | `Clix.trackEvent()` | `Notifly.trackEvent(context, eventName, eventParams, ...)` |
    | Logout | `Notifly.setUserId(context, null)` |
    | Clix-generated IDs | Separate destination IDs; keep a mapping if required |

    Use your existing stable account ID after SDK initialization and when restoring an authenticated session:

    ```kotlin UserIntegration.kt theme={null} theme={null}
    import tech.notifly.Notifly

    Notifly.setUserId(context, "user_12345")
    Notifly.setUserProperties(
        context,
        mapOf("plan" to "premium", "language" to "en")
    )

    // On logout, unlink this device from the account.
    Notifly.setUserId(context, null)
    ```

    Keep account data in your application or backend so it can be restored after login. The SDK's internal Notifly user ID is different from the account ID supplied to `setUserId()`; do not substitute it for your application's user ID.

    Carry over custom properties and opt-outs from your source of truth. Test anonymous browsing, login, logout, and account switching to confirm that devices and events attach to the intended profile.
  </Step>

  <Step title="Move event tracking and rebuild campaigns">
    Preserve event names and supported property types when replacing Clix tracking:

    ```kotlin EventIntegration.kt theme={null} theme={null}
    import tech.notifly.Notifly

    Notifly.trackEvent(
        context,
        "checkout_started",
        mapOf("cart_id" to "cart_123", "plan" to "premium"),
        listOf("plan")
    )
    ```

    The Android guide allows at most **one** `segmentationEventParamKeys` entry. This list selects an event parameter for segmentation; it is not the complete set of properties sent with the event. Choose the parameter your campaign needs, or omit the optional argument when it is unnecessary.

    Rebuild your Clix campaigns using [Notifly campaigns](https://docs.notifly.tech/ko/user-guide/campaigns/basic) and [user journeys](https://docs.notifly.tech/ko/user-guide/user-journey). Review triggers, delays, cancellation conditions, recurring schedules, user time zones, re-entry, frequency limits, quiet hours, and personalization.

    Replace Clix backend send or trigger calls with the supported Notifly workflow or API for your use case. Check the [Notifly API overview](https://docs.notifly.tech/ko/api-reference/getting-started) for authentication and available operations. Use destination campaign and project identifiers, and keep API secrets on the backend. Do not assume a Clix endpoint has a one-to-one Notifly replacement.

    Keep campaigns paused while importing profiles or validating events. Avoid replaying historical events into active journeys. Reconnect landing URLs, action handling, and [rich push](https://docs.notifly.tech/ko/advanced/rich-push-notification) to the destination payload and app handlers.
  </Step>

  <Step title="Verify the integration and switch traffic">
    Upgrade an existing Clix installation and launch it. Confirm registration and the expected user ID in Notifly, then use Notifly's push testing flow to send a message to that device.

    * Test foreground, background, and cold-start taps, including deep links, icons, images, and actions.
    * Test denied permission, marketing opt-outs, anonymous use, login, logout, account switching, and multiple devices.
    * Confirm user properties and event parameters appear correctly and drive only the intended test campaign.
    * If you use in-app popups, test foreground behavior on Android 11+ separately from push delivery.

    Track destination readiness per installation and account. Exclude migrated installations from Clix before enabling equivalent Notifly sends. Use backend routing or a conservative account-level cutoff when your campaign filters cannot separate devices.

    Release to a small cohort first and monitor registration, delivery, opens, and crashes. Keep compatible old installations on Clix until they update or reach your cutoff, which must be before November 30, 2026. Preserve Clix reports before retiring the old campaigns. Backend rollback can restore Clix sends only where the installed app still supports their payloads.
  </Step>
</Steps>

## Push Token Migration

Use Notifly SDK registration as the default. Keeping the same Firebase project may preserve an FCM token, but Notifly still needs a registered device and the correct user association. Do not assume the SDK's installation alone imports Clix's token database.

If you have an authorized token export, confirm a supported import process with Notifly before relying on it. Verify token type, Firebase project, account mapping, and client payload compatibility with test devices first. Re-registration does not require reinstalling the app or resetting notification permission.

## Other Platforms

<CardGroup cols={2}>
  <Card title="Notifly iOS SDK" icon="apple-whole" href="https://docs.notifly.tech/ko/developer-guide/ios-sdk">
    Replace the Clix delegate and extension using the iOS integration.
  </Card>

  <Card title="Notifly React Native SDK" icon="code" href="https://docs.notifly.tech/ko/developer-guide/react-native-sdk">
    Replace the Clix package and check native or Expo configuration.
  </Card>

  <Card title="Notifly Flutter SDK" icon="code" href="https://docs.notifly.tech/ko/developer-guide/flutter-sdk">
    Replace the Clix package and configure both native platforms.
  </Card>

  <Card title="Clix Deliverability" icon="paper-plane" href="/essentials/deliverability">
    Review permission and registration checks before moving sends.
  </Card>
</CardGroup>
