> ## 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 OneSignal

> Replace the Clix SDK with OneSignal and move your mobile 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 OneSignal.** Users normally need to open the updated app before their push subscription is available. Clix's iOS FCM tokens cannot be used as raw APNs tokens.
  * **Keep existing permissions.** An SDK change does not reset notification permission for the same installed app. Preserve marketing opt-outs separately.
  * **Rebuild campaigns.** Audiences, templates, schedules, and message history do not transfer automatically.
  * **Prevent duplicate sends.** Exclude migrated devices from Clix before enabling OneSignal campaigns for them.
</Warning>

This guide walks you through moving an existing Clix integration to OneSignal. Replace the SDK in a new app release, then move notification traffic as devices register with OneSignal.

## Before Getting Started

* Create a OneSignal app and get its **App ID**.
* Keep your Android package name and iOS bundle identifier unchanged.
* Record your Firebase project, push credentials, user IDs, campaign rules, and notification click handlers.
* Use the same stable account ID you pass to `Clix.setUserId()`. Keep an explicit mapping for anonymous installations; do not treat Clix-generated IDs as account IDs.

<Info>
  Keep a copy of your campaign settings and reports before changing the
  integration. A user import does not recreate campaign execution history or
  users already waiting in a campaign.
</Info>

## Migration Steps

<Steps>
  <Step title="Configure push credentials">
    <Tabs>
      <Tab title="Android">
        Configure Google Android (FCM) in OneSignal and upload credentials for the Firebase project used by your app. Reuse that project when possible to avoid changing the sender.

        Follow [OneSignal Android setup](https://documentation.onesignal.com/docs/en/android-sdk-setup) to check SDK and build requirements.
      </Tab>

      <Tab title="iOS">
        Configure Apple iOS (APNs) in OneSignal with credentials for your existing bundle identifier. Keep the Push Notifications capability enabled.

        Clix delivers iOS push through FCM; OneSignal uses APNs directly. Collect the APNs registration through OneSignal instead of converting an FCM token. Replace the Clix notification service extension with the OneSignal extension and configure its App Group if you use rich push or receipt tracking.

        Follow [OneSignal iOS setup](https://documentation.onesignal.com/docs/en/ios-sdk-setup).
      </Tab>
    </Tabs>

    Keep REST API keys and push service credentials on the server or in the provider console. The OneSignal App ID is the value used in the app.
  </Step>

  <Step title="Replace the Clix SDK">
    Remove `Clix.initialize()`, Clix notification configuration, permission calls, and notification listeners. Replace user and event calls in the next step.

    <AccordionGroup>
      <Accordion title="Remove platform-specific Clix integration">
        * **Android:** Remove `so.clix:clix-android-sdk` or its version catalog alias. Remove Clix-specific manifest entries and receivers.
        * **iOS:** Remove the Clix package or `pod 'Clix'`. Replace `ClixAppDelegate` with your app's normal delegate and replace `ClixNotificationServiceExtension` before removing the dependency.
        * **React Native:** Remove `@clix-so/react-native-sdk` and its imports. Review native configuration and Expo plugins.
        * **Flutter:** Remove `clix_flutter` and its imports. Review native configuration as well as Dart code.

        Keep shared dependencies used elsewhere. OneSignal should own push registration and message handling in the new release; remove competing Firebase Messaging handlers or use OneSignal's documented conflict resolution.
      </Accordion>
    </AccordionGroup>

    <Tabs>
      <Tab title="Android">
        Add a pinned, supported OneSignal 5.x version to your app module. Replace `ONESIGNAL_VERSION` before syncing Gradle.

        ```kotlin app/build.gradle.kts theme={null} theme={null}
        dependencies {
            implementation("com.onesignal:OneSignal:ONESIGNAL_VERSION")
        }
        ```

        Initialize in your existing `Application` class and ensure that class is registered in `AndroidManifest.xml`:

        ```kotlin MainApplication.kt theme={null} theme={null}
        import android.app.Application
        import com.onesignal.OneSignal

        class MainApplication : Application() {
            override fun onCreate() {
                super.onCreate()
                OneSignal.initWithContext(this, "YOUR_ONESIGNAL_APP_ID")
            }
        }
        ```

        Keep your permission flow at its existing point in the UI. For users who have not granted permission, call `OneSignal.Notifications.requestPermission(false)` from a coroutine. Configure the Android notification icon and channels.
      </Tab>

      <Tab title="iOS">
        Install the SDK using the package or CocoaPods instructions in the iOS setup guide. Add this to your app delegate's launch method:

        ```swift AppDelegate.swift theme={null} theme={null}
        import OneSignalFramework

        // In application(_:didFinishLaunchingWithOptions:)
        OneSignal.initialize(
            "YOUR_ONESIGNAL_APP_ID",
            withLaunchOptions: launchOptions
        )
        ```

        Restore any app delegate behavior previously supplied by `ClixAppDelegate`. If you disable OneSignal swizzling, forward registration, receipt, and tap callbacks as described in the iOS setup guide.
      </Tab>
    </Tabs>

    For a shared codebase, use the official [React Native](https://documentation.onesignal.com/docs/en/react-native-sdk-setup) or [Flutter](https://documentation.onesignal.com/docs/en/flutter-sdk-setup) integration instead of initializing an additional native SDK instance.
  </Step>

  <Step title="Move user identification and events">
    Use this mapping when replacing your Clix calls:

    | Clix integration | OneSignal replacement |
    | - | - |
    | `Clix.setUserId()` | `OneSignal.login()` using your account ID as the External ID |
    | User properties | User tags; convert values to supported string representations |
    | `Clix.trackEvent()` | Custom Events for behavior; keep event names and property types consistent |
    | Logout or account switch | `OneSignal.logout()`, then `login()` for the next account |
    | Device record | OneSignal push subscription; store its Subscription ID separately |

    ```kotlin UserIntegration.kt theme={null} theme={null}
    import com.onesignal.OneSignal

    // After login, and when restoring an authenticated session
    OneSignal.login("user_12345")
    OneSignal.User.addTag("plan", "premium")
    OneSignal.User.trackEvent(
        "checkout_started",
        mapOf("cart_id" to "cart_123", "item_count" to 2)
    )

    // On logout
    OneSignal.logout()
    ```

    Confirm that your SDK version and OneSignal plan support the [Custom Events](https://documentation.onesignal.com/docs/en/custom-events) features you need. A tag update is a profile change and does not replace an event stream.

    Reapply your app's messaging preferences to the new subscription and audience rules. Login alone does not carry over consent stored in Clix.
  </Step>

  <Step title="Rebuild campaigns and backend sends">
    Recreate scheduled campaigns and event-based journeys in OneSignal. Check time zones, re-entry rules, delays, frequency limits, quiet hours, and personalization defaults against each Clix campaign.

    Replace calls to Clix's send and campaign-trigger APIs with the [OneSignal Create message API](https://documentation.onesignal.com/reference/create-message). Target External IDs or Subscription IDs instead of Clix user or device IDs. Move backend credentials into server configuration and update webhook consumers.

    Translate landing URLs and custom data into OneSignal's supported payload fields. Connect the notification click listener to your existing navigation code; Clix's automatic landing URL handling is removed with the SDK.

    Do not replay historical events into active journeys. Import profile attributes first, then enable triggers after you have checked eligibility and suppression rules.
  </Step>

  <Step title="Test and move traffic">
    First, upgrade an existing installation with permission already granted. Verify that the device appears in OneSignal under the expected External ID and receives one test message.

    * Test foreground, background, and cold-start taps, including deep links, images, and actions.
    * Test denied permission, marketing opt-out, logout, account switching, and multiple devices.
    * Check subscription updates, custom events, and notification reporting. Provider acceptance does not prove the device displayed the message.

    Keep a backend record of successful destination registration by installation, account, platform, and app version. Route each message to one provider. When Clix audience filters cannot exclude individual migrated installations, use backend routing or a conservative account-level cutoff and account for other devices on that account.

    Release to a small cohort, then expand after registration and delivery checks pass. Keep Clix sends limited to compatible old installations until your chosen cutoff, which must be before November 30, 2026. A backend rollback can return traffic only to installations that still handle Clix payloads; the replacement release needs a compatible send path or a corrective app update.
  </Step>
</Steps>

## Push Token Migration

SDK registration is the default migration path. You do not need to force token rotation, reinstall the app, or reset permission.

If you can obtain an authorized export, OneSignal supports importing users and subscriptions through its documented APIs. Verify token type and Firebase sender compatibility first. An Android token import does not make an old Clix-only app understand OneSignal payloads. An iOS import requires an APNs token, which is different from the FCM token stored by a Clix integration. See [OneSignal migration guidance](https://documentation.onesignal.com/docs/en/migrating-to-onesignal).

## Related Guides

<CardGroup cols={2}>
  <Card title="Clix User Management" icon="circle-user" href="/user-management/user-management">
    Review existing account and anonymous user behavior.
  </Card>

  <Card title="Clix Deliverability" icon="paper-plane" href="/essentials/deliverability">
    Review permissions and device registration before switching sends.
  </Card>
</CardGroup>
