---
title: "OneSignal"
description: "Intégrez OneSignal avec Adapty pour améliorer l'engagement par notifications push."
---

[OneSignal](https://onesignal.com/) est une plateforme d'engagement client de premier plan qui propose des notifications push, des e-mails, des SMS et des messages in-app. L'intégration d'Adapty avec OneSignal vous permet d'accéder à tous vos événements d'abonnement en un seul endroit, ce qui vous permet de déclencher des communications automatisées basées sur ces événements.

Avec Adapty, vous pouvez suivre les [événements d'abonnement](events) sur plusieurs stores, analyser le comportement des utilisateurs et utiliser ces données pour une communication plus ciblée. Cette intégration vous permet de surveiller les événements d'abonnement dans votre tableau de bord OneSignal et de les associer à vos [campagnes d'acquisition](https://documentation.onesignal.com/docs/en/automated-messages).

Adapty met à jour les tags OneSignal en fonction des événements d'abonnement, ce qui vous permet d'envoyer des notifications push personnalisées avec une configuration minimale.

**Caractéristiques de l'intégration**

| Caractéristique de l'intégration | Description                                                  |
| :-------------------------------- | :----------------------------------------------------------- |
| Fréquence                         | Mises à jour en temps réel                                   |
| Sens des données                  | Unidirectionnel : d'Adapty vers le serveur OneSignal         |
| Point d'intégration Adapty        | <ul><li>SDK OneSignal et Adapty dans le code de l'application mobile</li><li>Serveur Adapty</li></ul>|

## Configuration de l'intégration One Signal \{#setting-up-one-signal-integration\}

Pour configurer l'intégration :

1. Ouvrez [Integrations → OneSignal](https://app.adapty.io/integrations/onesignal) dans votre Adapty Dashboard.

   
     <img src="/assets/shared/img/onesignal-on.webp"
     style={{
       border: '1px solid #727272', /* border width and color */
       width: '700px', /* image width */
       display: 'block', /* for alignment */
       margin: '0 auto' /* center alignment */
     }}
   />
   

2. Activez le bouton d'intégration.
3. Saisissez votre **OneSignal App ID**.

Pour configurer l'intégration avec OneSignal, rendez-vous dans [Integrations -> OneSignal](https://app.adapty.io/integrations/onesignal) dans votre Adapty Dashboard, activez le bouton bascule et configurez les identifiants de l'intégration.

## Récupérer votre OneSignal App ID \{#retrieving-your-onesignal-app-id\}

Trouvez votre **OneSignal App ID** dans votre [OneSignal Dashboard](https://dashboard.onesignal.com/login) :

1. Accédez à **Settings** → **Keys & IDs**.

   
     <img src="/assets/shared/img/onesignal-dashboard.webp"
     style={{
       border: '1px solid #727272', /* border width and color */
       width: '700px', /* image width */
       display: 'block', /* for alignment */
       margin: '0 auto' /* center alignment */
     }}
   />
   

2. Copiez votre **OneSignal App ID** et collez-le dans le champ **App ID** de l'Adapty Dashboard.

     <img src="/assets/shared/img/onesignal-id.webp"
     style={{
       border: '1px solid #727272', /* border width and color */
       width: '700px', /* image width */
       display: 'block', /* for alignment */
       margin: '0 auto' /* center alignment */
     }}
   />
   

Vous trouverez plus d'informations sur l'identifiant OneSignal dans la [documentation suivante.](https://documentation.onesignal.com/docs/en/keys-and-ids)

### Configuration des événements \{#configuring-events\}

Adapty vous permet d'envoyer trois groupes d'événements à OneSignal. Activez ceux dont vous avez besoin dans l'Adapty Dashboard. Vous pouvez consulter la liste complète des événements disponibles avec leur description détaillée [ici](events).

  <img src="/assets/shared/img/onesignal.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

Adapty envoie les événements d'abonnement à OneSignal via une intégration serveur à serveur, ce qui vous permet de suivre toute l'activité liée aux abonnements dans OneSignal.

:::warning

Depuis le 17 avril 2023, le plan gratuit de OneSignal ne prend plus en charge cette intégration. Elle est disponible uniquement sur les plans **Growth**, **Professional** et **supérieurs**. Pour plus de détails, consultez [OneSignal Pricing](https://onesignal.com/pricing).

:::

## Tags personnalisés \{#custom-tags\}

Cette intégration met à jour et attribue diverses propriétés à vos utilisateurs Adapty sous forme de tags, qui sont ensuite envoyés à OneSignal. Consultez la liste des tags ci-dessous pour trouver ceux qui correspondent le mieux à vos besoins.

:::warning
OneSignal impose une limite de tags. Cela inclut à la fois les tags générés par Adapty et les tags déjà présents dans OneSignal. Dépasser cette limite peut entraîner des erreurs lors de l'envoi d'événements.
:::

| Tag | Type | Description |
|---|----|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `adapty_customer_user_id` | String | L'identifiant unique de l'utilisateur dans votre application. Il doit être cohérent entre votre système, Adapty et OneSignal. |
| `adapty_profile_id` | String | L'identifiant du profil utilisateur Adapty, disponible dans votre [Adapty Dashboard](profiles-crm). |
| `environment` | String | `Sandbox` ou `Production`, indiquant l'environnement actuel de l'utilisateur. |
| `store` | String | Store où le produit a été acheté. Options : **app_store**, **play_store**, **stripe**, ou le nom de votre [store personnalisé](custom-store). |
| `vendor_product_id` | String | L'identifiant du produit dans le store (ex. : `org.locals.12345`). |
| `subscription_expires_at` | String | Date d'expiration du dernier abonnement (`YYYY-MM-DDTHH:MM:SS+0000`, ex. : `2023-02-10T17:22:03.000000+0000`). |
| `last_event_type` | String | Le dernier type d'événement de la [liste des événements Adapty](events).<br/> Remarques :<br/>- Pour l'événement **Subscription expired**, Adapty envoie la propriété `last_event_type` avec la valeur `subscription_cancelled`.<br/>- Pour **Trial renew canceled** – `auto_renew_off`<br/>- Pour **Subscription renew canceled** – `auto_renew_off_subscription` |
| `purchase_date` | String | Date de la dernière transaction (`YYYY-MM-DDTHH:MM:SS+0000`, ex. : `2023-02-10T17:22:03.000000+0000`). |
| `active_subscription` | String | `true` si l'utilisateur a un abonnement actif, `false` si l'abonnement a expiré. |
| `period_type` | String | Indique le type de période le plus récent pour l'achat ou le renouvellement. Valeurs possibles : `trial` pour une période d'essai ou `normal` pour tous les autres cas. |

Toutes les valeurs décimales sont arrondies à des entiers. Les chaînes de caractères restent inchangées.

En plus des tags prédéfinis, vous pouvez envoyer des [attributs personnalisés](segments#custom-attributes) en tant que tags, ce qui offre une plus grande flexibilité dans les données que vous incluez. C'est utile pour suivre des détails spécifiques liés à votre produit ou service.

Les attributs utilisateur personnalisés sont automatiquement envoyés à OneSignal si la case **Send user attributes** est cochée sur la [page d'intégration](https://app.adapty.io/integrations/onesignal). Lorsqu'elle est décochée, Adapty envoie exactement 10 tags. Lorsqu'elle est cochée, plus de 10 tags peuvent être envoyés, permettant une capture de données enrichie.

## Configuration du SDK \{#sdk-configuration\}

Il existe deux façons d'intégrer OneSignal avec Adapty :

1. **Legacy (avant v5) :** Utilise `playerId` (déprécié dans le [SDK OneSignal v5](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/5.0.0)).
2. **Actuel (v5+) :** Utilise `subscriptionId`.

:::warning
Assurez-vous d'envoyer `playerId` (pour le SDK OneSignal avant v5) ou `subscriptionId` (pour le SDK OneSignal v5+) à Adapty. Sans cela, les tags OneSignal ne seront pas mis à jour et l'intégration ne fonctionnera pas correctement.
:::

<Tabs groupId="current-version" queryString> 
<TabItem value="v5+" label="OneSignal SDK v5+ (current)" default> 

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="iOS (Swift)" default>

```swift showLineNumbers
// SubscriptionID
OneSignal.Notifications.requestPermission({ accepted in
    Task {
        // Adapty SDK 4.x
        try await Adapty.setIntegrationIdentifier(.oneSignalSubscriptionId(OneSignal.User.pushSubscription.id))
        // Adapty SDK 3.x
        try await Adapty.setIntegrationIdentifier(
            key: "one_signal_subscription_id", 
            value: OneSignal.User.pushSubscription.id
        )
    }
}, fallbackToSettings: true)
```

</TabItem>
<TabItem value="kotlin" label="Android (Kotlin)" default>

```kotlin showLineNumbers
// SubscriptionID
val oneSignalSubscriptionObserver = object: IPushSubscriptionObserver {
    override fun onPushSubscriptionChange(state: PushSubscriptionChangedState) {
        Adapty.setIntegrationIdentifier("one_signal_subscription_id", state.current.id) { error ->
            if (error != null) {
                // handle the error
            }
        }
    }
}
```

</TabItem>
<TabItem value="java" label="(Android) Java" default>

```java showLineNumbers
// SubscriptionID
IPushSubscriptionObserver oneSignalSubscriptionObserver = state -> {
    Adapty.setIntegrationIdentifier("one_signal_subscription_id", state.getCurrent().getId(), error -> {
        if (error != null) {
            // handle the error
        }
    });
};
```

</TabItem>  

<TabItem value="flutter" label="Flutter (Dart)" default>

```javascript showLineNumbers
// 1. Since OneSignal.User.pushSubscription.id may return null if called too early, 
// OneSignal suggests to listen for the updates:

OneSignal.User.pushSubscription.addObserver((state) {
   if (state.current.optedIn) {
      // now you can try to retrieve subscriptionId
   }
});

// 2. Then you can push subscriptionId to Adapty:
final subscriptionId = OneSignal.User.pushSubscription.id;
if (subscriptionId != null) {
   await Adapty().setIntegrationIdentifier(key: "one_signal_subscription_id", value: subscriptionId);
}
```

</TabItem>
<TabItem value="unity" label="Unity (C#)" default>

```csharp showLineNumbers
using AdaptySDK;
using OneSignalSDK;

var pushUserId = OneSignal.Default.PushSubscriptionState.userId;

Adapty.SetIntegrationIdentifier(
  "one_signal_player_id", 
  pushUserId, 
  (error) => {
  // handle the error
});
```

</TabItem>
<TabItem value="rn" label="React Native (TS)" default>

```typescript showLineNumbers

OneSignal.User.pushSubscription.addEventListener('change', (subscription) => {
  const subscriptionId = subscription.current.id;

  if (subscriptionId) {
    adapty.setIntegrationIdentifier("one_signal_subscription_id", subscriptionId);
  }
});
```

</TabItem>
</Tabs>

 </TabItem> 

<TabItem value="pre-v5" label="OneSignal SDK v. up to 4.x (legacy)" default> 

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="iOS (Swift)" default>

```swift showLineNumbers
// PlayerID
// in your OSSubscriptionObserver implementation
func onOSSubscriptionChanged(_ stateChanges: OSSubscriptionStateChanges) {
    if let playerId = stateChanges.to.userId {
        Task {
            // Adapty SDK 4.x
            try await Adapty.setIntegrationIdentifier(.oneSignalPlayerId(playerId))
            // Adapty SDK 3.x
            try await Adapty.setIntegrationIdentifier(
                key: "one_signal_player_id", 
                value: playerId
            )
        }
    }
}
```

</TabItem>
<TabItem value="kotlin" label="Android (Kotlin)" default>

```kotlin showLineNumbers
// PlayerID
val osSubscriptionObserver = OSSubscriptionObserver { stateChanges ->
    stateChanges?.to?.userId?.let { playerId ->
        Adapty.setIntegrationIdentifier("one_signal_player_id", playerId) { error ->
            if (error != null) {
                // handle the error
            }
        }
    }
}
```

</TabItem>
<TabItem value="java" label="Java" default>

```java showLineNumbers
// PlayerID
OSSubscriptionObserver osSubscriptionObserver = stateChanges -> {
    OSSubscriptionState to = stateChanges != null ? stateChanges.getTo() : null;
    String playerId = to != null ? to.getUserId() : null;
    
    if (playerId != null) {
        Adapty.setIntegrationIdentifier("one_signal_player_id", playerId, error -> {
            if (error != null) {
                // handle the error
            }
        });
    }
};
```

</TabItem>  

<TabItem value="flutter" label="Flutter (Dart)" default>

```javascript showLineNumbers
// PlayerID (pre-v5 OneSignal SDK)
// in your OSSubscriptionObserver implementation
func onOSSubscriptionChanged(_ stateChanges: OSSubscriptionStateChanges) {
    if let playerId = stateChanges.to.userId {
        Task {
            try await Adapty.setIntegrationIdentifier(
                key: "one_signal_player_id", 
                value: playerId
            )
        }
    }
}
```

</TabItem>
<TabItem value="rn" label="React Native (TS)" default>
```typescript showLineNumbers

OneSignal.addSubscriptionObserver(event => {
  const playerId = event.to.userId;
  
  adapty.setIntegrationIdentifier("one_signal_player_id", playerId);
});
```

</TabItem>
</Tabs>

 </TabItem> 

</Tabs>

En savoir plus dans la documentation OneSignal :

- [ID d'abonnement push](https://documentation.onesignal.com/docs/en/mobile-sdk-reference#user-pushsubscription-id)
- [Modifications d'abonnement push](https://documentation.onesignal.com/docs/en/mobile-sdk-reference#addobserver-push-subscription-changes)

## Gérer plusieurs appareils \{#dealing-with-multiple-devices\}

Si un utilisateur possède plusieurs appareils, le suivi des événements d'achat et des abonnements peut s'avérer complexe. OneSignal propose une solution via les [identifiants utilisateur externes](https://documentation.onesignal.com/docs/en/users).

Pour maintenir la cohérence des données utilisateur sur tous les appareils :

1. Faites correspondre les différents appareils côté **serveur** et envoyez ces données à OneSignal.
2. Utilisez le [customer_user_id](identifying-users) d'Adapty comme [externalUserId](https://documentation.onesignal.com/docs/en/users#external-id) dans OneSignal. Si votre application n'a pas de système d'inscription, envisagez d'utiliser un autre identifiant unique qui reste cohérent sur tous les appareils de l'utilisateur.

Il est important de maintenir la cohérence de l'identifiant utilisateur sur tous les appareils et de mettre à jour OneSignal chaque fois que l'ID d'un utilisateur change. Cela simplifie le suivi de l'activité et des abonnements des utilisateurs tout en garantissant une messagerie cohérente, et permet une analyse plus précise ainsi qu'une meilleure expérience utilisateur. Pour plus de détails, consultez la [documentation OneSignal sur les identifiants utilisateurs externes](https://documentation.onesignal.com/docs/en/users).

## Résolution des problèmes \{#troubleshooting\}

### `access_level_updated` apparaît comme échoué dans le fil d'événements \{#access_level_updated-shows-as-failed-in-the-event-feed\}

`access_level_updated` est un **événement réservé aux webhooks**. Adapty ne l'envoie jamais à cette intégration. Mais Adapty enregistre un résultat pour chaque intégration activée, et un événement non pris en charge est affiché comme un échec.