Singular

Singular est une plateforme MMP (Mobile Measurement Partner) qui collecte et présente des données issues des campagnes marketing.

Adapty envoie les événements d’abonnement que vous sélectionnez à Singular. Dans le tableau de bord Singular, vous pouvez ensuite voir le chiffre d’affaires généré par chaque campagne et évaluer l’efficacité de votre publicité.

Configurer l’intégration

Connecter Adapty à Singular

Pour configurer l’intégration avec Singular, rendez-vous dans Integrations > Singular dans votre Adapty Dashboard, activez le bouton et renseignez les champs.

singular-creds.webp

Les identifiants suivants sont disponibles :

  • Singular SDK Key : Obligatoire. La clé SDK de production pour votre application Singular.
  • Singular SDK Key (Sandbox) : Facultatif. La clé SDK pour votre application Singular en sandbox. Si elle n’est pas renseignée, les événements sandbox ne seront pas envoyés à Singular.

Les deux clés se trouvent dans le tableau de bord Singular sous Developer tools -> SDK Keys -> SDK Key (not SDK Secret) :

4bc50d1-singular_sdk_key.webp

Configurer les événements et les tags

Sous les identifiants, vous trouverez trois groupes d’événements que vous pouvez envoyer à Singular depuis Adapty. Pour la liste complète des événements Adapty, consultez Événements.

e67de0c-singular_events.webp

Nous recommandons d’utiliser les noms d’événements fournis par défaut par Adapty. Vous pouvez toutefois les modifier selon vos besoins.

Adapty envoie les événements d’abonnement à Singular en server-to-server, ce qui vous permet de consulter tous les événements d’abonnement dans votre tableau de bord Singular et de les associer à vos campagnes d’acquisition.

Warning

Les profils créés avant la mise en place de l’intégration ne peuvent pas transmettre leurs événements à Singular.

Connecter votre application à Singular

Singular active par défaut le Singular Device ID (SDID) pour les comptes créés à partir du 15 juillet 2026. Ces comptes n’acceptent les événements que via la v2 de l’Event API, et Adapty n’envoie un événement en v2 que si le profil de l’utilisateur contient un SDID. Pour transmettre des événements à ce type de compte, passez le SDID à Adapty depuis votre application.

Si votre compte Singular a été créé avant le 15 juillet 2026 et que le SDID n’y est pas activé, ignorez cette étape. Adapty envoie vos événements à la v1 de l’Event API et aucune modification du code de l’application n’est nécessaire.

  1. Activez Adapty, puis démarrez le SDK Singular avec un callback SDID : sdidReceivedHandler sur iOS, SDIDAccessorHandler sur Android, sdidReceivedCallback sur React Native et Flutter, et SingularSdidAccessorHandler sur Unity.
  2. Attendez que Singular appelle le callback. Le SDID arrive dans votre application de manière asynchrone, après le démarrage du SDK Singular. Singular appelle le callback à chaque lancement, y compris lorsque le SDID est déjà stocké sur l’appareil.
  3. Dans le callback, transmettez le SDID à Adapty avec setIntegrationIdentifier() et la clé singular_sdid. Aucun SDK Adapty ne possède de constante prédéfinie pour cette clé, écrivez-la donc sous forme de chaîne littérale.
  4. N’appelez Adapty.identify() qu’après la fin de setIntegrationIdentifier(). Adapty crée un profil anonyme à l’activation, puis bascule vers le profil identifié une fois que identify() est résolu. Un SDID défini pendant cette transition peut être perdu.

Structure d’un événement

Adapty choisit la version de l’API Singular Event pour chaque événement selon que le profil de l’utilisateur possède un SDID :

  • Avec un SDID : Adapty envoie une requête POST vers https://s2s.singular.net/api/v2/evt avec un corps encodé en form-urlencoded. Le paramètre sdid remplace les identifiants d’appareil idfa, idfv, aifa, andi et asid. Les booléens sont envoyés sous la forme true ou false.
  • Sans SDID : Adapty envoie une requête GET vers https://s2s.singular.net/api/v1/evt avec des paramètres de requête.

Les deux versions transmettent les mêmes paramètres pour le reste. Un événement v1 est structuré ainsi :

{
  "n": "subscription_renewed",
  "a": "singular_sdk_key_123",
  "p": "iOS",
  "i": "com.example.app",
  "ip": "192.168.100.1",
  "idfa": "00000000-0000-0000-0000-000000000000",
  "idfv": "00000000-0000-0000-0000-000000000000",
  "ve": "17.0.1",
  "att_authorization_status": 3,
  "custom_user_id": "user_12345",
  "utime": 1709294400,
  "partner": "adapty",
  "use_ip": false,
  "is_revenue_event": true,
  "amt": 9.99,
  "cur": "USD",
  "purchase_product_id": "yearly.premium.6999",
  "purchase_transaction_id": "GPA.3383...",
  "e": "{\"is_revenue_event\":true,\"amt\":9.99,\"cur\":\"USD\",\"purchase_product_id\":\"yearly.premium.6999\",\"purchase_transaction_id\":\"GPA.3383...\"}"
}

Where:

ParamètreTypeDescription
nStringLe nom de l’événement (mappé depuis l’événement Adapty).
aStringVotre clé SDK Singular.
pStringPlateforme (“iOS” ou “Android”).
iStringApp ID du store (Bundle ID).
ipStringAdresse IP de l’utilisateur.
sdidStringv2 uniquement. Singular Device ID, issu de l’identifiant d’intégration singular_sdid.
idfaStringiOS, v1 uniquement. ID for Advertisers (majuscules).
idfvStringiOS, v1 uniquement. ID for Vendors (majuscules).
aifaStringAndroid, v1 uniquement. Google Advertising ID (minuscules).
andiStringAndroid, v1 uniquement. Android ID (minuscules).
asidStringAndroid, v1 uniquement. App Set ID (minuscules).
veStringVersion de l’OS.
att_authorization_statusIntegeriOS uniquement. Statut ATT (ex. : 3 pour autorisé).
custom_user_idStringL’identifiant Customer User ID de l’utilisateur.
utimeLongHorodatage UNIX de l’événement en secondes.
partnerStringToujours adapty. Identifie l’événement comme envoyé par Adapty.
use_ipBooleantrue quand Adapty ne dispose pas d’adresse IP pour l’utilisateur.
is_revenue_eventBooleantrue si l’événement contient un revenu. Envoyé uniquement avec les événements de revenu.
amtFloatMontant du revenu.
curStringCode de devise (ex. : “USD”).
purchase_product_idStringL’identifiant produit du store.
purchase_transaction_idStringIdentifiant de transaction original.
eStringChaîne JSON contenant les détails de l’événement (voir ci-dessous).

Le paramètre e (données d’événement personnalisées) est une chaîne encodée en JSON contenant :

ParamètreTypeDescription
is_revenue_eventBooleantrue si l’événement contient un revenu.
amtFloatMontant du revenu.
curStringCode de devise.
purchase_product_idStringL’identifiant du produit dans le store.
purchase_transaction_idStringIdentifiant de transaction d’origine.

Dépannage

Les événements échouent avec invalid api version: v1

Votre compte Singular a été créé le 15 juillet 2026 ou après cette date, et n’accepte les événements que via l’API Event v2. Adapty a envoyé l’événement à v1 car le profil de l’utilisateur ne contient pas de SDID. Pour corriger cela, transmettez le SDID à Adapty depuis votre application, comme décrit dans Connecter votre application à Singular. Les événements des utilisateurs sur une version de l’application sans l’appel setIntegrationIdentifier() continuent d’échouer jusqu’à ce que ces utilisateurs mettent à jour l’application.

access_level_updated s’affiche comme échoué dans le flux d’événements

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.