### Lors de la connexion/inscription \{#during-loginsignup\}
Si vous identifiez les utilisateurs après le lancement de l'application (par exemple, après leur connexion ou inscription), utilisez la méthode `identify` pour définir leur customer user ID.
- Si vous **n'avez jamais utilisé ce customer user ID auparavant**, Adapty le liera automatiquement au profil actuel.
- Si vous **avez déjà utilisé ce customer user ID pour identifier l'utilisateur**, Adapty basculera vers le profil associé à ce customer user ID.
:::important
Les customer user ID doivent être uniques pour chaque utilisateur. Si vous codez la valeur du paramètre en dur, tous les utilisateurs seront considérés comme un seul.
:::
Attendez que le callback de complétion d'`identify` se déclenche avant d'appeler d'autres méthodes du SDK. Des appels simultanés pourraient atterrir sur le profil anonyme plutôt que sur le profil identifié. Voir [Ordre des appels dans le SDK Android](android-sdk-call-order).
Par défaut, le SDK essaie de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'obtiendront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la désinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les flows et les paywalls localement sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour les récupérer plus rapidement, ainsi qu'un serveur de secours autonome en cas d'indisponibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut être composée de différentes requêtes en interne.
Pour Android : vous pouvez créer un `TimeInterval` avec des fonctions d'extension (comme `5.seconds`, où `.seconds` provient de `import com.adapty.utils.seconds`), ou `TimeInterval.seconds(5)`. Pour ne définir aucune limite, utilisez `TimeInterval.INFINITE`.
| Paramètres de réponse : | Paramètre | Description | | :-------- | :---------- | | Flow | Un objet `AdaptyFlow` contenant le placement, les identifiants (`id`, `variationId`), le nom, les Remote Configs, ainsi qu'un indicateur `hasViewConfiguration` précisant si le flow inclut une configuration de vue. Pour récupérer les produits réels en vue d'un préchargement, d'une interface personnalisée ou de vérifications programmatiques, appelez `getPaywallProducts(flow)`. | ## Récupérer la configuration de vue \{#fetch-the-view-configuration\} Après avoir récupéré le flow ou le paywall, vérifiez s'il inclut une configuration de vue via `flow.hasViewConfiguration`. Ce flag permet de distinguer la façon dont le placement a été conçu dans l'Adapty Dashboard : - **`true`** — le placement a été conçu dans le **Flow Builder** (un flow) ou le **Paywall Builder** (un paywall). Adapty génère l'interface à votre place. Suivez les étapes ci-dessous pour récupérer la configuration de vue et [afficher le flow ou le paywall](android-present-paywalls). - **`false`** — le placement est un paywall personnalisé sans interface Builder. [Traitez-le comme un paywall Remote Config](present-remote-config-paywalls-android). :::important Veillez à activer le bouton **Show on device** dans le Flow Builder. Si cette option n'est pas activée, la configuration de vue ne sera pas disponible pour la récupération. :::Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs font face à une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront pas forcément les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, ce qui le rend fiable pour éviter des requêtes réseau en cours de session.
Notez que le cache est conservé au redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
| ## Personnaliser les ressources \{#customize-assets\} Pour personnaliser les images et vidéos dans votre flow ou paywall, implémentez des ressources personnalisées. Les images et vidéos hero ont des identifiants prédéfinis : `hero_image` et `hero_video`. Dans un bundle de ressources personnalisées, vous ciblez ces éléments par leurs identifiants et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un identifiant personnalisé](custom-media) dans le tableau de bord Adapty. Par exemple, vous pouvez : - Afficher une image ou vidéo différente à certains utilisateurs. - Afficher une image d'aperçu locale pendant le chargement d'une image principale distante. - Afficher une image d'aperçu avant de lancer une vidéo. Here's an example of how you can provide custom assets via a simple dictionary: ```kotlin showLineNumbers val customAssets = AdaptyCustomAssets.of( "hero_image" to AdaptyCustomImageAsset.remote( url = "https://example.com/image.jpg", preview = AdaptyCustomImageAsset.file( FileLocation.fromAsset("images/hero_image_preview.png"), ) ), "hero_video" to AdaptyCustomVideoAsset.file( FileLocation.fromResId(requireContext(), R.raw.custom_video), preview = AdaptyCustomImageAsset.file( FileLocation.fromResId(requireContext(), R.drawable.video_preview), ), ), ) val flowView = AdaptyUI.getFlowView( activity, flowConfiguration, products, eventListener, insets, customAssets, ) ``` :::note Si un asset n'est pas trouvé, le flow utilisera son apparence par défaut. ::: Pour les vidéos, vous pouvez éventuellement passer une `resolution` pour réserver l'espace de mise en page et définir le ratio d'aspect (`width / height`) avant le chargement de la vidéo : ```kotlin showLineNumbers AdaptyCustomVideoAsset.file( FileLocation.fromResId(requireContext(), R.raw.custom_video), preview = AdaptyCustomImageAsset.file( FileLocation.fromResId(requireContext(), R.drawable.video_preview), ), resolution = AdaptyCustomVideoAsset.Resolution(width = 1080, height = 1920), ) ```optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-paywall-locale-in-adapty-paywall-builder). Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé lors du redémarrage de l'application et n'est effacé que lors de la désinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement sur deux couches : le cache régulièrement mis à jour décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos paywalls tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comporter différentes requêtes en coulisses.
Pour Android : vous pouvez créer un `TimeInterval` avec des fonctions d'extension (comme `5.seconds`, où `.seconds` provient de `import com.adapty.utils.seconds`), ou `TimeInterval.seconds(5)`. Pour ne pas définir de limite, utilisez `TimeInterval.INFINITE`.
| Paramètres de réponse : | Paramètre | Description | | :-------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | Un objet [`AdaptyPaywall`](https://android.adapty.io/adapty/com.adapty.models/-adapty-paywall/) contenant une liste d'identifiants de produits, l'identifiant du paywall, le Remote Config et plusieurs autres propriétés. | ## Récupérer la configuration d'affichage d'un paywall créé avec Paywall Builder \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Assurez-vous d'activer le bouton **Show on device** dans le Paywall Builder. Si cette option n'est pas activée, la configuration d'affichage ne pourra pas être récupérée. ::: Après avoir récupéré le paywall, vérifiez s'il contient un `ViewConfiguration`, ce qui indique qu'il a été créé avec Paywall Builder. Cela vous guidera sur la façon d'afficher le paywall. Si le `ViewConfiguration` est présent, traitez-le comme un paywall Paywall Builder ; sinon, [gérez-le comme un paywall Remote Config](present-remote-config-paywalls).optionnel
défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et la façon dont nous recommandons de les utiliser.
| | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas avoir les toutes dernières données, mais le chargement sera plus rapide, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, donc il est sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
| ## Personnaliser les ressources \{#customize-assets\} Pour personnaliser les images et vidéos de votre paywall, implémentez des ressources personnalisées. Les images et vidéos hero ont des identifiants prédéfinis : `hero_image` et `hero_video`. Dans un bundle de ressources personnalisées, vous ciblez ces éléments par leurs identifiants et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un identifiant personnalisé](custom-media) dans le tableau de bord Adapty. Par exemple, vous pouvez : - Afficher une image ou une vidéo différente à certains utilisateurs. - Afficher une image d'aperçu locale pendant le chargement d'une image principale distante. - Afficher une image d'aperçu avant de lancer une vidéo. :::important Pour utiliser cette fonctionnalité, mettez à jour le SDK Android Adapty vers la version 3.7.0 ou supérieure. ::: Voici un exemple montrant comment fournir des ressources personnalisées via un simple dictionnaire : ```kotlin showLineNumbers val customAssets = AdaptyCustomAssets.of( "hero_image" to AdaptyCustomImageAsset.remote( url = "https://example.com/image.jpg", preview = AdaptyCustomImageAsset.file( FileLocation.fromAsset("images/hero_image_preview.png"), ) ), "hero_video" to AdaptyCustomVideoAsset.file( FileLocation.fromResId(requireContext(), R.raw.custom_video), preview = AdaptyCustomImageAsset.file( FileLocation.fromResId(requireContext(), R.drawable.video_preview), ), ), ) val paywallView = AdaptyUI.getPaywallView( activity, viewConfiguration, products, eventListener, insets, customAssets, ) ``` :::note Si un asset est introuvable, le paywall reviendra à son apparence par défaut. :::Les insets sont les espaces autour du flow qui empêchent les éléments cliquables d'être masqués par les barres système.
Par défaut : `Unspecified`, ce qui signifie qu'Adapty ajustera automatiquement les insets, ce qui fonctionne parfaitement pour les flows plein écran.
Si votre flow n'est pas plein écran, vous pouvez définir des insets personnalisés. Pour savoir comment faire, lisez la section [Modifier les insets du flow](android-present-paywalls#change-flow-insets) ci-dessous.
| | **customAssets** | optionnel | Passez un objet `AdaptyCustomAssets` pour remplacer les images et vidéos de votre flow ou paywall au moment de l'exécution. Consultez [Personnaliser les assets](android-get-pb-paywalls#customize-assets) pour plus de détails. | | **tagResolver** | optionnel | Utilisez `AdaptyUiTagResolver` pour résoudre les balises personnalisées dans le texte du flow. Ce résolveur prend un paramètre de balise et le résout en une chaîne correspondante. Consultez la rubrique sur les balises personnalisées dans le Paywall Builder pour plus de détails. | | **timerResolver** | optionnel | Passez le résolveur ici si vous souhaitez utiliser la fonctionnalité de minuterie personnalisée. | :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: ## Modifier les insets du flow \{#change-flow-insets\} Les insets sont les espaces autour du flow qui empêchent les éléments cliquables d'être masqués par les barres système. Par défaut, Adapty ajuste automatiquement les insets, ce qui fonctionne parfaitement pour les flows plein écran. Si votre flow n'est pas plein écran, vous pouvez définir des insets personnalisés : - Si ni la barre de statut ni la barre de navigation ne se superposent à `AdaptyFlowView`, utilisez `AdaptyFlowInsets.None`. - Pour des configurations plus personnalisées, par exemple si votre flow se superpose à la barre de statut en haut mais pas en bas, vous pouvez définir uniquement `bottomInset` à `0`, comme indiqué dans l'exemple ci-dessous :Les insets sont les espaces autour du paywall qui empêchent les éléments cliquables d'être masqués par les barres système.
Par défaut : `UNSPECIFIED`, ce qui signifie qu'Adapty ajustera automatiquement les insets, ce qui fonctionne parfaitement pour les paywalls plein écran.
Si votre paywall n'est pas plein écran, vous pouvez définir des insets personnalisés. Pour savoir comment faire, lisez la section [Modifier les insets du paywall](android-present-paywalls#change-paywall-insets) ci-dessous.
| | **personalizedOfferResolver** | optionnel | Pour indiquer un prix personnalisé ([en savoir plus](https://developer.android.com/google/play/billing/integrate#personalized-price)), implémentez `AdaptyUiPersonalizedOfferResolver` et passez votre propre logique qui mappe `AdaptyPaywallProduct` à `true` si le prix du produit est personnalisé, sinon `false`. | | **tagResolver** | optionnel | Utilisez `AdaptyUiTagResolver` pour résoudre les balises personnalisées dans le texte du paywall. Ce résolveur prend un paramètre de balise et le résout en une chaîne correspondante. Consultez la rubrique sur les balises personnalisées dans le Paywall Builder pour plus de détails. | | **timerResolver** | optionnel | Passez le résolveur ici si vous souhaitez utiliser la fonctionnalité de minuterie personnalisée. | :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: ## Modifier les insets du paywall \{#change-paywall-insets\} Les insets sont les espaces autour du paywall qui empêchent les éléments cliquables d'être masqués par les barres système. Par défaut, Adapty ajuste automatiquement les insets, ce qui fonctionne parfaitement pour les paywalls plein écran. Si votre paywall n'est pas plein écran, vous pouvez définir des insets personnalisés : - Si ni la barre de statut ni la barre de navigation ne se superposent à `AdaptyPaywallView`, utilisez `AdaptyPaywallInsets.NONE`. - Pour des configurations plus personnalisées, par exemple si votre paywall se superpose à la barre de statut en haut mais pas en bas, vous pouvez définir uniquement `bottomInset` à `0`, comme indiqué dans l'exemple ci-dessous :
## Le nombre de vues du paywall est trop élevé \{#the-paywall-view-number-is-too-big\}
**Problème** : Le compteur de vues du paywall affiche le double du nombre attendu.
**Cause** : Vous appelez peut-être `logShowFlow` (SDK Android v4+) / `logShowPaywall` dans votre code, ce qui double le compteur de vues si vous utilisez le Paywall Builder ou le Flow Builder. Pour les flows et les paywalls construits avec ces outils, l'analytique est suivie automatiquement, il n'est donc pas nécessaire d'utiliser cette méthode.
**Solution** : Assurez-vous de ne pas appeler `logShowFlow` (SDK Android v4+) / `logShowPaywall` dans votre code si vous utilisez le Paywall Builder ou le Flow Builder.
## Autres problèmes \{#other-issues\}
**Problème** : Vous rencontrez d'autres problèmes liés au Paywall Builder non couverts ci-dessus.
**Solution** : Migrez le SDK vers la dernière version en utilisant les [guides de migration](android-sdk-migration-guides) si nécessaire. De nombreux problèmes sont résolus dans les versions plus récentes du SDK.
---
# File: android-implement-paywalls-manually
---
---
title: "Implémenter les paywalls manuellement dans le SDK Android"
description: "Découvrez comment implémenter des paywalls manuellement dans votre application Android avec le SDK Adapty."
---
## Accepter les achats \{#accept-purchases\}
Si vous travaillez avec des paywalls que vous avez implémentés vous-même, vous pouvez déléguer la gestion des achats à Adapty en utilisant la méthode `makePurchase`. De cette façon, nous gérons tous les scénarios utilisateur, et vous n'avez qu'à traiter les résultats de l'achat.
:::important
`makePurchase` fonctionne avec les produits créés dans l'Adapty Dashboard. Assurez-vous de configurer les produits et les moyens de les récupérer dans le tableau de bord en suivant le [guide de démarrage rapide](quickstart).
:::
Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données mises en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données mises en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas accès aux toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, ce qui le rend fiable pendant la session pour éviter des requêtes réseau inutiles.
Notez que le cache est conservé après le redémarrage de l'application et n'est effacé que lors de la réinstallation de l'application ou d'un nettoyage manuel.
Le SDK Adapty stocke les flows et les paywalls en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](android-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les flows et les paywalls plus rapidement, ainsi qu'un serveur de secours autonome au cas où le CDN serait inaccessible.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente pour cette méthode. Si le délai est atteint, les données mises en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut regrouper différentes requêtes en arrière-plan.
| N'encodez pas les IDs de produit en dur ! Comme les flows sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent changer à tout moment. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, votre application doit tous les afficher sans nécessiter de modification du code. La seule chose à encoder en dur est l'ID de placement. Paramètres de la réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Un objet `AdaptyFlow` contenant le placement, les identifiants (`id`, `variationId`), le nom, un tableau `remoteConfigs` (une entrée par locale configurée) et un indicateur `hasViewConfiguration`. Pour récupérer les produits du flow, appelez `getPaywallProducts(flow)`. | :::note Dans la v4, le paramètre `locale` a été déplacé hors de `getFlow` et dans `getFlowConfiguration` (utilisé uniquement lors du rendu avec AdaptyUI). Pour les paywalls personnalisés, toutes les locales disponibles sont renvoyées ensemble dans `flow.remoteConfigs` — choisissez la locale qui correspond à la langue de l'appareil de l'utilisateur ou au paramètre de votre application. ::: ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le flow, vous pouvez récupérer le tableau de produits qui lui correspond :Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
|optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](android-localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache lorsqu'elles existent. Dans ce cas, les utilisateurs n'auront pas forcément les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, ce qui permet de l'utiliser en toute sécurité pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé après un redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](android-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système garantit que vous obtenez toujours la dernière version de vos paywalls, tout en assurant la fiabilité même lorsque la connexion est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre plusieurs requêtes en arrière-plan.
| N'encodez pas les identifiants de produits en dur ! Puisque les paywalls sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent évoluer au fil du temps. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, votre application doit tous les afficher sans nécessiter de modification du code. La seule chose à encoder en dur est l'identifiant du placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Un objet [`AdaptyPaywall`](https://android.adapty.io/adapty/com.adapty.models/-adapty-paywall/) contenant : une liste d'identifiants de produits, l'identifiant du paywall, le Remote Config et plusieurs autres propriétés. | ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le paywall, vous pouvez récupérer le tableau de produits qui lui correspond :optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](android-localizations-and-locale-codes) pour plus d'informations sur les codes de langue et la façon dont nous recommandons de les utiliser.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la réinstallation de l'application ou via un nettoyage manuel.
|Si la requête a réussi, la réponse contient cet objet. Un objet [AdaptyProfile](https://android.adapty.io/adapty/com.adapty.models/-adapty-profile/) fournit des informations complètes sur les niveaux d'accès, les abonnements et les achats uniques d'un utilisateur dans l'application.
Vérifiez le statut du niveau d'accès pour déterminer si l'utilisateur dispose de l'accès requis à l'application.
| :::warning **Remarque :** si vous utilisez encore une version de StoreKit d'Apple inférieure à v2.0 et une version du SDK Adapty inférieure à v2.9.0, vous devez fournir le [secret partagé de l'App Store Apple](app-store-connection-configuration#step-5-enter-app-store-shared-secret) à la place. Cette méthode est actuellement dépréciée par Apple. ::: ## Changer d'abonnement lors d'un achat \{#change-subscription-when-making-a-purchase\} Lorsqu'un utilisateur choisit un nouvel abonnement plutôt que de renouveler l'abonnement en cours, le fonctionnement dépend du store. Sur Google Play, l'abonnement n'est pas mis à jour automatiquement. Vous devrez gérer le changement dans le code de votre application mobile comme décrit ci-dessous. Pour remplacer un abonnement par un autre sur Android, appelez la méthode `.makePurchase()` avec le paramètre supplémentaire suivant :Un objet [`AdaptyProfile`](https://android.adapty.io/adapty/com.adapty.models/-adapty-profile/). Ce modèle contient des informations sur les niveaux d'accès, les abonnements et les achats uniques.
Vérifiez le **statut du niveau d'accès** pour déterminer si l'utilisateur a accès à l'application.
| :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: --- # File: implement-observer-mode-android --- --- title: "Implémenter le mode Observer dans le SDK Android" description: "Implémentez le mode Observer dans Adapty pour suivre les événements d'abonnement des utilisateurs dans le SDK Android." --- Si vous avez déjà votre propre infrastructure d'achats et n'êtes pas encore prêt à passer entièrement à Adapty, vous pouvez explorer le [mode Observer](observer-vs-full-mode). Dans sa forme de base, le mode Observer offre des analyses avancées et une intégration transparente avec les systèmes d'attribution et d'analyse. Si cela répond à vos besoins, vous devez uniquement : 1. L'activer lors de la configuration du SDK Adapty en définissant le paramètre `observerMode` sur `true`. Suivez les instructions de configuration pour [Android](sdk-installation-android#activate-adapty-module-of-adapty-sdk). 2. [Signaler les transactions](report-transactions-observer-mode-android) depuis votre infrastructure d'achats existante à Adapty. ## Configuration du mode Observer \{#observer-mode-setup\} Activez le mode Observer si vous gérez vous-même les achats et l'état des abonnements, et que vous utilisez Adapty pour envoyer des événements d'abonnement et des analyses. :::important En mode Observer, le SDK Adapty ne clôture aucune transaction — assurez-vous donc de les gérer vous-même. :::1. Implémentez l'`AdaptyUiObserverModeHandler`. L'événement `onPurchaseInitiated` vous informe que l'utilisateur a lancé un achat. Vous pouvez déclencher votre flow d'achat personnalisé en réponse à ce callback :
1. Implémentez `AdaptyUiObserverModeHandler`. L'événement `onPurchaseInitiated` vous informe que l'utilisateur a initié un achat. Vous pouvez déclencher votre flow d'achat personnalisé en réponse à ce callback :
Pour iOS, StoreKit 1 : un objet [`SKPaymentTransaction`](https://developer.apple.com/documentation/storekit/skpaymenttransaction).
Pour iOS, StoreKit 2 : un objet [Transaction](https://developer.apple.com/documentation/storekit/transaction).
Pour Android : l'identifiant de type String (`purchase.getOrderId()`) de l'achat, où l'achat est une instance de la classe [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) de la bibliothèque de facturation.
|Pour iOS, StoreKit 1 : un objet [`SKPaymentTransaction`](https://developer.apple.com/documentation/storekit/skpaymenttransaction).
Pour iOS, StoreKit 2 : un objet [Transaction](https://developer.apple.com/documentation/storekit/transaction).
Pour Android : l'identifiant de chaîne (`purchase.getOrderId()`) de l'achat, où l'achat est une instance de la classe [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) de la bibliothèque de facturation.
| Pour le mode plein écran où les barres système chevauchent une partie de votre interface, obtenez les insets de la manière suivante :phoneNumber
firstName
lastName
| String | | gender | Enum, les valeurs autorisées sont : `female`, `male`, `other` | | birthday | Date | ### Attributs utilisateur personnalisés \{#custom-user-attributes\} Vous pouvez définir vos propres attributs personnalisés, généralement liés à l'utilisation de votre application. Par exemple, pour une application de fitness, il peut s'agir du nombre d'exercices par semaine ; pour une application d'apprentissage des langues, du niveau de connaissance de l'utilisateur, etc. Vous pouvez les utiliser dans des segments pour créer des paywalls et des offres ciblées, ainsi que dans les analyses pour déterminer quelles métriques produit ont le plus d'impact sur les revenus.Un objet [AdaptyProfile](https://android.adapty.io/adapty/com.adapty.models/-adapty-profile/). En général, il suffit de vérifier le statut du niveau d'accès du profil pour déterminer si l'utilisateur bénéficie d'un accès premium à l'application.
La méthode `.getProfile` fournit le résultat le plus récent, car elle interroge toujours l'API. Si, pour une raison quelconque (par exemple, absence de connexion internet), le SDK Adapty ne parvient pas à récupérer les informations depuis le serveur, les données en cache sont renvoyées. Il est également important de noter que le SDK Adapty met régulièrement à jour le cache `AdaptyProfile` afin de maintenir ces informations aussi récentes que possible.
| La méthode `.getProfile()` vous fournit le profil utilisateur à partir duquel vous pouvez obtenir le statut du niveau d'accès. Une application peut avoir plusieurs niveaux d'accès. Par exemple, si vous avez une application d'actualités et vendez des abonnements à différentes thématiques indépendamment, vous pouvez créer les niveaux d'accès « sports » et « science ». La plupart du temps, cependant, un seul niveau d'accès suffit — dans ce cas, utilisez simplement le niveau d'accès par défaut « premium ». Voici un exemple de vérification du niveau d'accès « premium » par défaut :optionnel
par défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc safe de l'utiliser pendant la session pour éviter des requêtes réseau.
Notez que le cache est conservé au redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement sur deux niveaux : le cache mis à jour régulièrement décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant si le CDN est inaccessible. Ce système garantit que vous obtenez toujours la dernière version de vos onboardings, même en cas de connexion internet limitée.
| | **loadTimeout** | par défaut : 5 s |Cette valeur limite le délai d'attente de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut dépasser légèrement le délai spécifié dans `loadTimeout`, car l'opération peut impliquer plusieurs requêtes en interne.
Pour Android : vous pouvez créer un `TimeInterval` avec des fonctions d'extension (comme `5.seconds`, où `.seconds` provient de `import com.adapty.utils.seconds`), ou `TimeInterval.seconds(5)`. Pour ne pas définir de limite, utilisez `TimeInterval.INFINITE`.
| Paramètres de la réponse : | Paramètre | Description | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Un objet [`AdaptyOnboarding`](https://android.adapty.io/adapty/com.adapty.models/-adapty-onboarding/) contenant : l'identifiant et la configuration de l'onboarding, le Remote Config et plusieurs autres propriétés. | ## Accélérer la récupération de l'onboarding avec l'onboarding de l'audience par défaut \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} En général, les onboardings sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'optimiser ce processus. Cependant, si vous avez de nombreuses audiences et onboardings et que vos utilisateurs ont une connexion internet faible, la récupération d'un onboarding peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un onboarding par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher. Pour cela, vous pouvez utiliser la méthode `getOnboardingForDefaultAudience`, qui récupère l'onboarding du placement spécifié pour l'audience **All Users**. Il est toutefois essentiel de comprendre que l'approche recommandée reste de récupérer l'onboarding avec la méthode `getOnboarding`, comme décrit dans la section [Récupérer un onboarding](#fetch-onboarding) ci-dessus. :::warning Préférez `getOnboarding` à `getOnboardingForDefaultAudience`, car cette dernière présente des limitations importantes : - **Problèmes de compatibilité** : peut créer des difficultés lors de la prise en charge de plusieurs versions de l'application, nécessitant soit des designs rétrocompatibles, soit d'accepter que les anciennes versions puissent s'afficher incorrectement. - **Aucune personnalisation** : affiche uniquement le contenu pour l'audience "All Users", sans ciblage basé sur le pays, l'attribution ou les attributs personnalisés. Si la récupération plus rapide l'emporte sur ces inconvénients pour votre cas d'usage, utilisez `getOnboardingForDefaultAudience` comme indiqué ci-dessous. Sinon, utilisez `getOnboarding` comme décrit [ci-dessus](#fetch-onboarding). ::: ```kotlin Adapty.getOnboardingForDefaultAudience("YOUR_PLACEMENT_ID") { result -> when (result) { is AdaptyResult.Success -> { val onboarding = result.value // Handle successful onboarding retrieval } is AdaptyResult.Error -> { val error = result.error // Handle error case } } } ``` Paramètres : | Paramètre | Présence | Description | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | requis | L'identifiant du [placement](placements) souhaité. Il s'agit de la valeur que vous avez indiquée lors de la création d'un placement dans l'Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc safe de l'utiliser pendant la session pour éviter des requêtes réseau.
Notez que le cache est conservé au redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement sur deux niveaux : le cache mis à jour régulièrement décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant si le CDN est inaccessible. Ce système garantit que vous obtenez toujours la dernière version de vos onboardings, même en cas de connexion internet limitée.
| --- # File: android-present-onboardings --- --- title: "Présenter les onboardings dans le SDK Android" description: "Apprenez à présenter les onboardings sur Android pour un engagement utilisateur efficace." --- :::tip **À partir du SDK v4**, vous pouvez créer des [flows](android-get-pb-paywalls) comme alternative plus puissante aux onboardings. Contrairement aux onboardings qui s'exécutent dans une WebView, les flows se rendent nativement sur l'appareil — vous offrant des animations plus fluides, un look and feel Android cohérent, des temps de chargement plus rapides et aucune dépendance au runtime WebView. Consultez [Obtenir les flows et paywalls](android-get-pb-paywalls) et [Afficher les flows et paywalls](android-present-paywalls) pour commencer. ::: Avant de commencer, assurez-vous que : 1. Vous avez installé le [SDK Adapty Android](sdk-installation-android) version 3.8.0 ou ultérieure. 2. Vous avez [créé un onboarding](create-onboarding). 3. Vous avez ajouté l'onboarding à un [placement](placements). Si vous avez personnalisé un onboarding avec l'Onboarding Builder, vous n'avez pas à vous soucier de son rendu dans votre code d'application mobile pour l'afficher à l'utilisateur. Un tel onboarding contient à la fois ce qui doit être affiché et comment il doit l'être. Pour afficher l'onboarding visuel à l'écran de l'appareil, vous devez d'abord le configurer. Pour ce faire, appelez la méthode `AdaptyUI.getOnboardingView()` ou créez directement le `OnboardingView` :
Par exemple, si un utilisateur appuie sur un bouton personnalisé comme **Login** ou **Allow notifications**, la méthode delegate `onCustomAction` sera déclenchée avec l'ID d'action défini dans le builder. Vous pouvez créer vos propres IDs, comme « allowNotifications ».
```kotlin showLineNumbers
class YourActivity : AppCompatActivity() {
private val eventListener = object : AdaptyOnboardingEventListener {
override fun onCustomAction(action: AdaptyOnboardingCustomAction, context: Context) {
when (action.actionId) {
"allowNotifications" -> {
// Request notification permissions
}
}
}
override fun onError(error: AdaptyOnboardingError, context: Context) {
// Handle errors
}
// ... other required delegate methods
}
}
```
Le JSON du paywall de secours local n'est pas valide.
Corrigez votre paywall anglais par défaut, puis remplacez les paywalls locaux invalides. Consultez la rubrique [Personnaliser le paywall avec Remote Config](customize-paywall-with-remote-config) pour savoir comment corriger un paywall, et [Définir les paywalls de secours locaux](fallback-paywalls) pour savoir comment remplacer les paywalls locaux.
| |CURRENT_SUBSCRIPTION_TO_UPDATE
\_NOT_FOUND_IN_HISTORY
| L'abonnement d'origine à remplacer est introuvable dans les abonnements actifs. | | [BILLING_SERVICE_TIMEOUT](https://developer.android.com/google/play/billing/errors#service_timeout_error_code_-3) | Cette erreur indique que la requête a atteint le délai d'attente maximal avant que Google Play puisse répondre. Cela peut être dû, par exemple, à un retard dans l'exécution de l'action demandée par l'appel à la Play Billing Library. | | [FEATURE_NOT_SUPPORTED](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#FEATURE_NOT_SUPPORTED()) | La fonctionnalité demandée n'est pas prise en charge par le Play Store sur l'appareil actuel. | | [BILLING_SERVICE_DISCONNECTED](https://developer.android.com/google/play/billing/errors#service_disconnected_error_code_-1) | Cette erreur indique que la connexion de l'application cliente au service Google Play Store via le `BillingClient` a été interrompue. | | [BILLING_SERVICE_UNAVAILABLE](https://developer.android.com/google/play/billing/errors#service_unavailable_error_code_2) | Cette erreur indique que le service Google Play Billing est actuellement indisponible. Dans la plupart des cas, cela signifie qu'il y a un problème de connexion réseau entre l'appareil client et les services Google Play Billing. | | [BILLING_UNAVAILABLE](https://developer.android.com/google/play/billing/errors#billing_unavailable_error_code_3) |Cette erreur indique qu'un problème de facturation s'est produit pendant le processus d'achat. Causes possibles :
1. L'application Play Store sur l'appareil de l'utilisateur est absente ou obsolète.
2. L'utilisateur se trouve dans un pays non pris en charge.
3. L'utilisateur fait partie d'un compte entreprise dont l'administrateur a désactivé les achats.
4. Google Play n'a pas pu débiter le moyen de paiement de l'utilisateur (par exemple, une carte de crédit expirée).
5. L'utilisateur n'est pas connecté à l'application Play Store.
| | [DEVELOPER_ERROR](https://developer.android.com/google/play/billing/errors#developer_error) | Cette erreur indique que vous utilisez une API de manière incorrecte. | | [BILLING_ERROR](https://developer.android.com/google/play/billing/errors#error_error_code_6) | Cette erreur indique un problème interne à Google Play lui-même. | | [ITEM_ALREADY_OWNED](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#ITEM_ALREADY_OWNED()) | Le produit a déjà été acheté. | | [ITEM_NOT_OWNED](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode#ITEM_NOT_OWNED()) | Cette erreur indique que l'action demandée sur l'article a échoué car l'utilisateur n'en est pas propriétaire. | | [BILLING_NETWORK_ERROR](https://developer.android.com/google/play/billing/errors#network_error_error_code_12) | Cette erreur indique qu'un problème de connexion réseau s'est produit entre l'appareil et les systèmes Play. | | NO_PRODUCT_IDS_FOUND |Cette erreur indique qu'aucun des produits du paywall n'est disponible dans le store.
Si vous rencontrez cette erreur, suivez les étapes ci-dessous pour la résoudre :
If the code expires before you authorize, or if you click **Deny**, run the following command again to restart the flow:
```bash
adapty auth login
```
## Manage authentication
### Check authentication status
To see your current authentication state, run:
```bash
adapty auth status
```
When authenticated, the output shows your email, a masked token prefix, and the path to the local config file:
```
Email: you@example.com
Token: abcd1234****
Config: ~/.config/adapty/config.json
```
When not authenticated:
```
Not authenticated. Run `adapty auth login`.
```
### Verify your token
To confirm your token is valid and see your account details, run:
```bash
adapty auth whoami
```
Unlike `adapty auth status`, this command makes a live request to the server to verify the token.
### Log out
To clear your stored credentials locally, run:
```bash
adapty auth logout
```
This clears `~/.config/adapty/config.json`. The token remains valid server-side until it expires — if you need to invalidate it immediately, use `adapty auth revoke` instead.
### Revoke your token
To invalidate the token on the server and clear it locally, run:
```bash
adapty auth revoke
```
Use this when you want to fully invalidate a token — for example, if your credentials may have been compromised. After revoking, run `adapty auth login` to authenticate again.
## Token errors
If a token is revoked or becomes invalid, CLI commands return a 401 error. To re-authenticate, run:
```bash
adapty auth login
```
---
# File: developer-cli-reference
---
---
title: "Référence complète du CLI Développeur Adapty"
description: "Référence complète de toutes les commandes du CLI Développeur Adapty."
---
:::link
Vous utilisez un assistant IA ? Une [compétence Adapty CLI](https://github.com/adaptyteam/adapty-cli/tree/main/skills/adapty-cli) est disponible pour aider les LLM à utiliser le CLI.
:::
Cet article liste toutes les commandes du CLI Adapty avec leurs arguments, options et valeurs acceptées.
:::link
Pour la configuration de l'authentification et la gestion des tokens, consultez [Authentification](developer-cli-authentication).
:::
## Indicateurs globaux \{#global-flags\}
Ces indicateurs sont disponibles sur toutes les commandes.
| Indicateur | Description |
|---|---|
| `--json` | Afficher en JSON plutôt qu'en texte formaté |
| `--help` | Afficher l'aide de la commande |
Toutes les commandes `list` acceptent également des indicateurs de pagination :
| Indicateur | Défaut | Description |
|---|---|---|
| `--page` | `1` | Numéro de page |
| `--page-size` | `20` | Éléments par page (max : 100) |
## Applications \{#apps\}
Gérez les applications de votre compte Adapty. Pour la configuration via le tableau de bord, consultez [Paramètres de l'application](general).
### adapty apps list
Listez toutes les applications de votre compte Adapty.
```bash
adapty apps list
```
Accepte les [options de pagination](#global-flags).
### adapty apps get
Obtenez les détails d'une application spécifique.
```bash
adapty apps get
:::note Pour suivre les événements d'abonnement, utilisez l'intégration [Webhook](webhook) dans Adapty ou intégrez directement votre service existant. ::: ## Cas 1 : Synchroniser les abonnés entre web et mobile \{#case-1-sync-subscribers-between-web-and-mobile\} Si vous utilisez des prestataires de paiement web comme Stripe, ChargeBee ou autres, vous pouvez synchroniser vos abonnés facilement. Voici comment : 1.
The user’s Adapty profile ID. Visible in the **Adapty ID** field in the [Adapty Dashboard -> **Profiles**](https://app.adapty.io/profiles/users) -> specific profile page.
Interchangeable with **adapty-customer-user-id**, use any of them.
| | **adapty-customer-user-id** |The user's ID in your system. Visible in the **Customer user ID** field in the [Adapty Dashboard -> **Profiles**](https://app.adapty.io/profiles/users) -> specific profile page.
Interchangeable with **adapty-profile-id**, use any of them.
⚠️ Works only if you
### Lors de la connexion/inscription \{#during-loginsignup\}
Si vous identifiez les utilisateurs après le lancement de l'application (par exemple, après leur connexion ou leur inscription), utilisez la méthode `identify` pour définir leur identifiant utilisateur client.
- Si vous **n'avez jamais utilisé cet identifiant utilisateur client auparavant**, Adapty le liera automatiquement au profil actuel.
- Si vous **avez déjà utilisé cet identifiant utilisateur client pour identifier l'utilisateur**, Adapty basculera vers le profil associé à cet identifiant.
:::tip
Lors de la création d'un identifiant utilisateur client, enregistrez-le avec les données de votre utilisateur afin de pouvoir envoyer le même identifiant lorsqu'il se connecte depuis de nouveaux appareils ou réinstalle votre application.
:::
Utilisez toujours `await` avec `identify` avant d'appeler d'autres méthodes du SDK. Les appels simultanés produisent `#3006 profileWasChanged` ou atterrissent sur le profil anonyme. Voir [Ordre des appels dans le SDK Capacitor](capacitor-sdk-call-order).
```typescript showLineNumbers
try {
await adapty.identify({ customerUserId: "YOUR_USER_ID" });
// successfully identified
} catch (error) {
// handle the error
}
```
### Lors de l'activation du SDK \{#during-the-sdk-activation\}
Si vous connaissez déjà un identifiant utilisateur client au moment d'activer le SDK, vous pouvez le transmettre dans la méthode `activate` plutôt que d'appeler `identify` séparément.
Si vous connaissez un identifiant utilisateur client mais ne le définissez qu'après l'activation, cela signifie qu'à l'activation, Adapty créera un nouveau profil vide et ne basculera vers le profil existant qu'après l'appel à `identify`.
Vous pouvez passer soit un identifiant utilisateur client existant (que vous avez déjà utilisé) soit un nouveau. Si vous en passez un nouveau, le profil créé lors de l'activation sera automatiquement lié à cet identifiant.
:::tip
Pour exclure les profils vides créés des analyses du tableau de bord, accédez à **App settings** et configurez la [**Installs definition for analytics**](general#4-installs-definition-for-analytics).
:::
```typescript showLineNumbers
await adapty.activate({
apiKey: "YOUR_PUBLIC_SDK_KEY",
params: {
customerUserId: "YOUR_USER_ID"
}
});
```
### Déconnecter les utilisateurs \{#log-users-out\}
Si votre application comporte un bouton de déconnexion, utilisez la méthode `logout`. Cela crée un nouvel identifiant de profil anonyme pour l'utilisateur.
```typescript showLineNumbers
try {
await adapty.logout();
// successful logout
} catch (error) {
// handle the error
}
```
:::info
Pour reconnecter les utilisateurs à l'application, utilisez la méthode `identify`.
:::
### Autoriser les achats sans connexion \{#allow-purchases-without-login\}
Si vos utilisateurs peuvent effectuer des achats avant et après leur connexion à votre application, aucune configuration supplémentaire n'est nécessaire :
Voici comment cela fonctionne :
1. Lorsqu'un utilisateur déconnecté effectue un achat, Adapty l'associe à son identifiant de profil anonyme.
2. Lorsque l'utilisateur se connecte à son compte, Adapty bascule vers son profil identifié.
- S'il s'agit d'un identifiant utilisateur client existant (déjà lié à un profil), Adapty synchronise automatiquement ses transactions.
- S'il s'agit d'un nouvel identifiant utilisateur client (par exemple, l'achat a été effectué avant l'inscription), Adapty attribue l'identifiant utilisateur client au profil actuel, de sorte que tout l'historique des achats est conservé.
---
# File: adapty-sdk-integration-skill-capacitor
---
---
title: "Intégrer Adapty dans votre application Capacitor avec la compétence d'intégration SDK"
description: "Utilisez la compétence adapty-sdk-integration pour intégrer le SDK Adapty dans votre application Capacitor de bout en bout avec votre outil de codage IA."
---
:::important
La compétence est en version bêta. Si elle se bloque ou se comporte de manière inattendue, suivez le [guide d'intégration étape par étape](adapty-cursor-capacitor) à la place — il guide votre outil IA à travers chaque étape avec la documentation appropriée.
:::
La [compétence adapty-sdk-integration](https://github.com/adaptyteam/adapty-sdk-integration-skill) automatise l'intégration Adapty de bout en bout : configuration du tableau de bord, installation du SDK, paywall et vérification à chaque étape. Elle détecte automatiquement votre plateforme et récupère la documentation Adapty pertinente à chaque étape.
**Outils compatibles** : Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Pour installer, choisissez le formulaire correspondant à votre outil. La liste complète se trouve dans le [README de la compétence](https://github.com/adaptyteam/adapty-sdk-integration-skill).
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex ou tout autre outil** — utilisez la [CLI skills](https://skills.sh) (notez que les compétences installées de cette façon ne se mettent pas à jour automatiquement) :
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Vous pouvez également cloner le dépôt et copier `skills/adapty-sdk-integration/` dans le répertoire des compétences de votre outil.
Après l'installation, exécutez la compétence dans votre projet :
```
/adapty-sdk-integration
```
La compétence pose quelques questions de configuration, puis guide à travers la configuration du tableau de bord, l'installation du SDK, le paywall et la vérification.
---
# File: adapty-cursor-capacitor
---
---
title: "Intégrer Adapty dans votre application Capacitor avec l'aide de l'IA"
description: "Un guide étape par étape pour intégrer Adapty dans votre application Capacitor en utilisant Cursor, Context7, ChatGPT, Claude ou d'autres outils IA."
---
Ce guide vous accompagne pas à pas dans l'intégration d'Adapty dans votre application Capacitor à l'aide d'un outil de codage IA — il vous suffit de lui fournir la bonne documentation Adapty dans le bon ordre.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Avant de commencer : configuration du tableau de bord \{#before-you-start-dashboard-setup\}
Adapty nécessite quelques étapes de configuration dans le tableau de bord avant d'écrire du code avec le SDK. Vous pouvez le faire avec un skill LLM interactif, ou manuellement via le Dashboard.
### Approche par compétence (recommandée) \{#skill-approach-recommended\}
La compétence Adapty CLI permet à votre LLM de configurer votre application, vos produits, vos niveaux d'accès, vos paywalls et vos placements directement — sans ouvrir le Dashboard à chaque étape. Il vous suffit de [connecter vos stores](integrate-payments) dans le Dashboard.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Une fois la compétence ajoutée, exécutez `/adapty-cli` dans votre agent. Il vous guidera à chaque étape — y compris lorsqu'il faudra ouvrir le Dashboard pour connecter vos stores.
### Approche via le tableau de bord \{#dashboard-approach\}
Si vous préférez tout configurer manuellement, voici ce dont vous avez besoin avant d'écrire du code. Votre LLM ne peut pas rechercher les valeurs du tableau de bord à votre place — vous devrez les fournir vous-même.
1. **Connectez vos stores** : Dans l'Adapty Dashboard, accédez à **App settings → General**. Connectez l'App Store et Google Play si votre application Capacitor cible les deux plateformes. C'est indispensable pour que les achats fonctionnent.
[Connecter les stores](integrate-payments)
2. **Copiez votre clé SDK publique** : dans l'Adapty Dashboard, rendez-vous dans **App settings → General**, puis repérez la section **API keys**. Dans le code, c'est la chaîne que vous passez à `adapty.activate()`.
3. **Créez au moins un produit** : dans l'Adapty Dashboard, accédez à la page **Products**. Vous ne référencez pas les produits directement dans le code — Adapty les transmet via les paywalls.
[Ajouter des produits](quickstart-products)
4. **Créez un paywall et un placement** : Dans l'Adapty Dashboard, créez un paywall sur la page **Paywalls**, puis assignez-le à un placement sur la page **Placements**. Dans le code, l'ID du placement est la chaîne que vous passez à `adapty.getFlow()`.
[Créer un paywall](quickstart-paywalls)
5. **Configurez les niveaux d'accès** : Dans l'Adapty Dashboard, configurez chaque produit sur la page **Products**. Dans le code, la chaîne vérifiée est `profile.accessLevels['premium']?.isActive`. Le niveau d'accès `premium` par défaut convient à la plupart des applications. Si les utilisateurs payants ont accès à différentes fonctionnalités selon le produit (par exemple, un plan `basic` ou un plan `pro`), [créez des niveaux d'accès supplémentaires](assigning-access-level-to-a-product) avant de commencer à coder.
:::tip
Une fois que vous avez les cinq éléments, vous êtes prêt à écrire du code. Dites à votre LLM : « Ma clé SDK publique est X, mon identifiant de placement est Y » pour qu'il génère le code d'initialisation et de récupération de flow correct.
:::
### Configurez quand vous êtes prêt \{#set-up-when-ready\}
Ces éléments ne sont pas obligatoires pour commencer à coder, mais vous en aurez besoin au fil de l'évolution de votre intégration :
- **Tests A/B** : Configurez-les sur la page **Placements**. Aucune modification de code requise.
[Tests A/B](ab-tests)
- **Paywalls et placements supplémentaires** : Ajoutez d'autres appels `getFlow` avec des ID de placement différents.
- **Intégrations analytiques** : Configurez-les sur la page **Integrations**. La configuration varie selon l'intégration. Consultez les [intégrations analytiques](analytics-integration) et les [intégrations d'attribution](attribution-integration).
## Alimentez votre LLM avec la documentation Adapty \{#feed-adapty-docs-to-your-llm\}
### Utiliser Context7 (recommandé)
[Context7](https://context7.com) est un serveur MCP qui donne à votre LLM un accès direct à la documentation Adapty à jour. Votre LLM récupère automatiquement les bonnes docs en fonction de vos questions — aucun collage d'URL manuel nécessaire.
Context7 fonctionne avec **Cursor**, **Claude Code**, **Windsurf** et d'autres outils compatibles MCP. Pour le configurer, exécutez :
```
npx ctx7 setup
```
Cela détecte votre éditeur et configure le serveur Context7. Pour une configuration manuelle, consultez le [dépôt GitHub Context7](https://github.com/upstash/context7).
Une fois configuré, référencez la bibliothèque Adapty dans vos prompts :
```
Use the adaptyteam/adapty-docs library to look up how to install the Capacitor SDK
```
:::warning
Même si Context7 supprime le besoin de coller manuellement des liens vers la documentation, l'ordre d'implémentation est important. Suivez le [guide d'implémentation](#implementation-walkthrough) ci-dessous étape par étape pour vous assurer que tout fonctionne.
:::
### Utilisez les docs en texte brut \{#use-plain-text-docs\}
Vous pouvez accéder à n'importe quelle doc Adapty en texte brut Markdown. Ajoutez `.md` à la fin de son URL, ou cliquez sur **Copy for LLM** sous le titre de l'article. Par exemple : [adapty-cursor-capacitor.md](https://adapty.io/docs/fr/adapty-cursor-capacitor.md).
Chaque étape du [guide d'implémentation](#implementation-walkthrough) ci-dessous inclut un bloc « Envoyer à votre LLM » avec des liens `.md` à coller.
Pour accéder à plus de documentation en une seule fois, consultez les [fichiers d'index et sous-ensembles par plateforme](#plain-text-doc-index-files) ci-dessous.
## Implémentation pas à pas \{#implementation-walkthrough\}
Le reste de ce guide vous accompagne à travers l'intégration d'Adapty dans l'ordre d'implémentation. Chaque étape inclut la documentation à envoyer à votre LLM, ce que vous devriez obtenir une fois terminé, et les problèmes courants.
### Planifiez votre intégration \{#plan-your-integration\}
Avant de vous lancer dans le code, demandez à votre LLM d'analyser votre projet et de créer un plan d'implémentation. Si votre outil IA dispose d'un mode planification (comme le mode plan de Cursor ou de Claude Code), utilisez-le pour que le LLM puisse lire à la fois la structure de votre projet et la documentation Adapty avant d'écrire quoi que ce soit.
Indiquez à votre LLM l'approche que vous utilisez pour les achats — cela détermine les guides qu'il devra suivre :
- [**Adapty Flow Builder**](adapty-flow-builder) : vous créez des flows dans le builder no-code d'Adapty, et le SDK les affiche automatiquement.
- [**Paywalls créés manuellement**](capacitor-making-purchases) : vous construisez votre propre interface de paywall dans le code, mais utilisez toujours Adapty pour récupérer les produits et gérer les achats.
- [**Mode observateur**](observer-vs-full-mode) : vous conservez votre infrastructure d'achats existante et utilisez Adapty uniquement pour les analyses et les intégrations.
Vous ne savez pas lequel choisir ? Consultez le [tableau comparatif dans le guide de démarrage rapide](capacitor-quickstart-paywalls).
### Installer et configurer le SDK \{#install-and-configure-the-sdk\}
Ajoutez la dépendance du SDK Adapty via npm et activez-la avec votre clé SDK publique. C'est la base — rien d'autre ne fonctionne sans elle.
**Guide :** [Installer et configurer le SDK Adapty](sdk-installation-capacitor)
:::info
Ce guide cible le SDK Adapty Capacitor v4 (beta) — l'API présentée dans le [quickstart](capacitor-quickstart-paywalls). La v4 est une version préliminaire, alors assurez-vous que votre LLM utilise la version exacte (`npm install @adapty/capacitor@4.0.1-beta.1`) plutôt que la dernière version stable 3.x. Consultez la [section d'installation du SDK 4.0](sdk-installation-capacitor#adapty-sdk-40-beta) et le [guide de migration](migration-to-capacitor-sdk-v4).
:::
Envoyez ceci à votre LLM :
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/fr/sdk-installation-capacitor.md
```
:::tip[Checkpoint]
- **Expected :** L'app se compile et s'exécute sur iOS et Android. La console affiche le log d'activation d'Adapty.
- **Gotcha :** "Public API key is missing" → vérifiez que vous avez remplacé le placeholder par votre vraie clé depuis **App settings**.
:::
### Afficher les paywalls et gérer les achats \{#show-paywalls-and-handle-purchases\}
Récupérez un paywall par identifiant de placement, affichez-le et gérez les événements d'achat. Les guides dont vous avez besoin dépendent de la façon dont vous gérez les achats.
Testez chaque achat en sandbox au fur et à mesure — n'attendez pas la fin. Consultez [Tester les achats en sandbox](test-purchases-in-sandbox) pour les instructions de configuration.
Passé dans l'objet optionnel `params`. Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `'return_cache_data_else_load'` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs ne disposeront peut-être pas des toutes dernières données, mais bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé qu'à la réinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement ainsi qu'un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos paywalls tout en assurant la fiabilité, même lorsque la connexion internet est limitée.
| | **loadTimeoutMs** | par défaut : 5 sec |Passé dans l'objet optionnel `params`. Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont retournés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai indiqué dans `loadTimeoutMs`, car l'opération peut comprendre différentes requêtes en coulisse.
| **N'inscrivez pas les IDs de produits en dur dans le code.** Le seul ID à coder en dur est l'ID de placement. Les flows et les paywalls étant configurés à distance, le nombre de produits et les offres disponibles peuvent changer à tout moment. Votre application doit gérer ces changements de manière dynamique — si un paywall retourne deux produits aujourd'hui et trois demain, tous doivent s'afficher sans modification du code. Paramètres de réponse : | Paramètre | Description | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | Un objet `AdaptyFlow` contenant les identifiants du flow (`id`, `variationId`), son nom, son placement, ses variantes de paywall (`paywalls`), ainsi que les Remote Configs éventuels (`remoteConfigs`). | ## Récupérer la configuration de la vue \{#fetch-the-view-configuration\} :::important Assurez-vous d'activer le bouton **Show on device** dans le builder. Si cette option n'est pas activée, la configuration de la vue ne sera pas disponible à la récupération. ::: Si le placement a été conçu dans le **Flow Builder** ou le **Paywall Builder**, Adapty génère l'interface utilisateur pour vous. Créez la vue avec `createFlowView`, puis [affichez le flow ou le paywall](capacitor-present-paywalls). Si le placement est un paywall personnalisé sans interface Builder, [gérez-le comme un paywall Remote Config](present-remote-config-paywalls-capacitor) à la place. Dans le SDK Capacitor, appelez directement `createFlowView` — il n'est pas nécessaire de récupérer d'abord la configuration de la vue. :::warning Le résultat de la méthode `createFlowView` ne peut être utilisé qu'une seule fois. Si vous en avez besoin à nouveau, appelez de nouveau la méthode `createFlowView`. L'appeler deux fois sans recréer la vue peut entraîner une erreur. ::: ```typescript showLineNumbers try { const view = await createFlowView(flow); } catch (error) { // handle the error } ``` Paramètres : | Paramètre | Présence | Description | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | obligatoire | Un objet `AdaptyFlow` permettant d'obtenir un contrôleur pour le flow/paywall souhaité. | | **locale** | optionnel | L'identifiant de la [localisation du flow](add-paywall-locale-in-adapty-paywall-builder) à utiliser pour afficher la vue — par exemple, `en` ou `pt-br`. Si omis, la vue s'affiche en `en`, ou dans la localisation par défaut du flow si celui-ci ne dispose pas de version `en`. Voir [Localisations et codes de langue](capacitor-localizations-and-locale-codes). | | **customTags** | optionnel | Définit un dictionnaire de balises personnalisées et leurs valeurs résolues. Les balises personnalisées servent de placeholders dans le contenu, remplacées dynamiquement par des chaînes spécifiques pour personnaliser le contenu du flow/paywall. Consultez la rubrique sur les balises personnalisées dans le Paywall Builder pour plus de détails. | | **prefetchProducts** | optionnel | Activez cette option pour optimiser le moment d'affichage des produits à l'écran. Lorsque la valeur est `true`, AdaptyUI récupère automatiquement les produits nécessaires. Par défaut : `true`. | | **android.enableSafeArea** | optionnel | Android uniquement (ignoré sur iOS). Imbriqué sous la clé `android`. Lorsque la valeur est `true`, la vue du flow applique les marges de zone sécurisée. Par défaut : `true`. La valeur par défaut convient à la plupart des cas. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation de flow](add-paywall-locale-in-adapty-paywall-builder) et comment utiliser correctement les codes de langue [ici](capacitor-localizations-and-locale-codes). ::: Une fois que vous avez la vue, [affichez le flow/paywall](capacitor-present-paywalls). ## Récupérer un flow ou un paywall pour l'audience par défaut afin d'accélérer le chargement \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les flows et les paywalls sont récupérés presque instantanément, donc vous n'avez pas à vous inquiéter d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et placements, et que vos utilisateurs disposent d'une connexion internet faible, la récupération d'un flow ou d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pourriez vouloir afficher un flow ou un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher du tout. Pour y remédier, vous pouvez utiliser la méthode `getFlowForDefaultAudience`, qui récupère le flow ou le paywall du placement spécifié pour l'audience **All Users**. Il est toutefois essentiel de comprendre que l'approche recommandée est de récupérer le flow ou le paywall via la méthode `getFlow`, comme décrit dans la section [Récupérer le flow/paywall](#fetch-flowpaywall) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getFlow` La méthode `getFlowForDefaultAudience` présente quelques inconvénients majeurs : - **Problèmes potentiels de rétrocompatibilité** : si vous devez afficher des paywalls différents selon les versions de l'application (version actuelle et futures versions), vous risquez de rencontrer des difficultés. Vous devrez soit concevoir des paywalls compatibles avec la version actuelle (legacy), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des paywalls qui ne s'affichent pas. - **Perte de ciblage** : tous les utilisateurs verront le même paywall conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment par pays, attribution marketing ou attributs personnalisés). Si vous acceptez ces inconvénients pour bénéficier d'une récupération de flow ou de paywall plus rapide, utilisez la méthode `getFlowForDefaultAudience` comme suit. Sinon, restez sur `getFlow` décrit [ci-dessus](#fetch-flowpaywall). ::: ```typescript showLineNumbers try { const flow = await adapty.getFlowForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', }); // the requested flow/paywall } catch (error) { // handle the error } ``` | Paramètre | Présence | Description | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | requis | L'identifiant du [Placement](placements). Il s'agit de la valeur que vous avez spécifiée lors de la création d'un placement dans votre Adapty Dashboard. | | **fetchPolicy** | défaut : `'reload_revalidating_cache_data'` |Passé dans l'objet optionnel `params`. Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `'return_cache_data_else_load'` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs risquent de ne pas obtenir les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après un redémarrage de l'application et n'est effacé que lors d'une réinstallation ou par un nettoyage manuel.
| ## Personnaliser les assets \{#customize-assets\} Pour personnaliser les images et vidéos de votre flow/paywall, implémentez des assets personnalisés. Les images et vidéos hero ont des IDs prédéfinis : `hero_image` et `hero_video`. Dans un bundle d'assets personnalisé, vous ciblez ces éléments par leurs IDs et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un ID personnalisé](custom-media) dans l'Adapty Dashboard. Par exemple, vous pouvez : - Afficher une image ou vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. Voici un exemple de la façon dont vous pouvez fournir des ressources personnalisées via un dictionnaire simple : ```typescript showLineNumbers const customAssets: Recordoptionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-paywall-locale-in-adapty-paywall-builder). Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et leur utilisation recommandée.
| | **params** | optionnel | Paramètres supplémentaires pour récupérer le paywall. | **Ne codez pas en dur les ID de produits.** Le seul ID à coder en dur est l'ID de placement. Les paywalls étant configurés à distance, le nombre de produits et les offres disponibles peuvent changer à tout moment. Votre application doit gérer ces changements de façon dynamique — si un paywall renvoie deux produits aujourd'hui et trois demain, affichez-les tous sans modifier le code. Paramètres de réponse : | Paramètre | Description | | :-------- |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | Un objet [`AdaptyPaywall`](https://capacitor.adapty.io/interfaces/adaptypaywall) contenant une liste d'identifiants de produits, l'identifiant du paywall, le Remote Config et plusieurs autres propriétés. | ## Récupérer la configuration d'affichage d'un paywall conçu avec le Paywall Builder \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Assurez-vous d'activer le bouton **Show on device** dans le Paywall Builder. Si cette option n'est pas activée, la configuration d'affichage ne pourra pas être récupérée. ::: Après avoir récupéré le paywall, vérifiez s'il inclut une `ViewConfiguration`, ce qui indique qu'il a été créé avec Paywall Builder. Cela vous guidera sur la façon d'afficher le paywall. Si la `ViewConfiguration` est présente, traitez-le comme un paywall Paywall Builder ; sinon, [gérez-le comme un paywall Remote Config](present-remote-config-paywalls-capacitor). Dans le SDK Capacitor, appelez directement la méthode `createPaywallView` sans récupérer manuellement la configuration de vue au préalable. :::warning Le résultat de la méthode `createPaywallView` ne peut être utilisé qu'une seule fois. Si vous avez besoin de l'utiliser à nouveau, appelez à nouveau la méthode `createPaywallView`. ::: ```typescript showLineNumbers if (paywall.hasViewConfiguration) { try { const view = await createPaywallView(paywall); } catch (error) { // handle the error } } else { // use your custom logic } ``` Paramètres : | Paramètre | Présence | Description | | :------------------- | :------- | :----------------------------------------------------------- | | **paywall** | required | Un objet `AdaptyPaywall` pour obtenir un contrôleur pour le paywall souhaité. | | **customTags** | optional | Définit un dictionnaire de tags personnalisés et leurs valeurs résolues. Les tags personnalisés servent de placeholders dans le contenu du paywall, remplacés dynamiquement par des chaînes spécifiques pour un contenu personnalisé. Consultez la rubrique Custom tags in paywall builder pour plus de détails. | | **prefetchProducts** | optional | Activez cette option pour optimiser le moment d'affichage des produits à l'écran. Lorsque la valeur est `true`, AdaptyUI récupère automatiquement les produits nécessaires. Par défaut : `false`. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation dans le Paywall Builder](add-paywall-locale-in-adapty-paywall-builder) et comment utiliser correctement les codes de locale [ici](capacitor-localizations-and-locale-codes). ::: Une fois la vue disponible, [affichez le paywall](capacitor-present-paywalls). ## Obtenir un paywall pour l'audience par défaut afin de l'afficher plus rapidement \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les paywalls se chargent presque instantanément, vous n'avez donc pas à vous soucier d'optimiser ce processus. Cependant, si vous avez de nombreuses audiences et paywalls et que vos utilisateurs disposent d'une connexion internet faible, le chargement d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un paywall par défaut pour garantir une expérience fluide plutôt que de ne rien afficher du tout. Pour remédier à cela, vous pouvez utiliser la méthode `getPaywallForDefaultAudience`, qui récupère le paywall du placement spécifié pour l'audience **All Users**. Il est toutefois essentiel de comprendre que l'approche recommandée est de récupérer le paywall via la méthode `getPaywall`, comme décrit dans la section [Récupérer les informations du paywall](#fetch-paywall-designed-with-paywall-builder) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getPaywall` La méthode `getPaywallForDefaultAudience` présente quelques inconvénients majeurs : - **Problèmes potentiels de compatibilité descendante** : si vous devez afficher des paywalls différents selon les versions de l'application (version actuelle et versions futures), vous devrez soit concevoir des paywalls compatibles avec la version actuelle (legacy), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des paywalls non affichés. - **Perte de ciblage** : tous les utilisateurs verront le même paywall conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (y compris par pays, attribution marketing ou attributs personnalisés). Si vous acceptez ces inconvénients pour bénéficier d'une récupération plus rapide des paywalls, utilisez la méthode `getPaywallForDefaultAudience` comme suit. Sinon, utilisez `getPaywall` décrit [ci-dessus](#fetch-paywall-designed-with-paywall-builder). ::: ```typescript showLineNumbers try { const paywall = await adapty.getPaywallForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en', }); // the requested paywall } catch (error) { // handle the error } ``` | Paramètre | Présence | Description | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | requis | L'identifiant du [placement](placements). C'est la valeur que vous avez spécifiée lors de la création d'un placement dans votre Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` le portugais brésilien.
Consultez [Localisations et codes de langue](capacitor-localizations-and-locale-codes) pour en savoir plus sur les codes de langue et nos recommandations d'utilisation.
| | **params** | optionnel | Paramètres supplémentaires pour récupérer le paywall. | ## Personnaliser les ressources \{#customize-assets\} Pour personnaliser les images et vidéos de votre paywall, utilisez des ressources personnalisées. Les images et vidéos hero ont des identifiants prédéfinis : `hero_image` et `hero_video`. Dans un bundle de ressources personnalisées, vous ciblez ces éléments par leur identifiant pour personnaliser leur comportement. Pour les autres images et vidéos, vous devez [définir un identifiant personnalisé](custom-media) dans l'Adapty Dashboard. Par exemple, vous pouvez : - Afficher une image ou une vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. Voici un exemple de la façon dont vous pouvez fournir des ressources personnalisées via un simple dictionnaire : ```typescript showLineNumbers const customAssets: Recordoptionnel
par défaut : `'reload_revalidating_cache_data'`
|Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `'return_cache_data_else_load'` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs risquent de ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact au redémarrage de l'application et n'est effacé qu'en cas de réinstallation ou de nettoyage manuel.
Le SDK Adapty stocke les flows et les paywalls sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](capacitor-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les flows et les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour garantir que vous obtenez toujours la dernière version de vos flows tout en assurant la fiabilité, même lorsque la connexion internet est limitée.
| | **params.loadTimeoutMs** |optionnel
par défaut : 5000 ms
|Cette valeur limite le délai d'attente (en millisecondes) pour cette méthode. Si le délai est dépassé, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeoutMs`, car l'opération peut reposer sur différentes requêtes en coulisse.
| :::note Dans la v4, `getFlow` ne prend plus de paramètre `locale`. Pour les paywalls personnalisés, toutes les locales disponibles sont renvoyées dans le Remote Config du flow (`flow.remoteConfigs`) — choisissez celle qui correspond à la langue de l'appareil ou aux paramètres de l'application. ::: Ne codez pas en dur les identifiants de produits ! Les flows étant configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent changer au fil du temps. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, votre application doit tous les afficher sans nécessiter de modification du code. La seule chose à coder en dur est l'identifiant du placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Un objet `AdaptyFlow` contenant le placement, les identifiants (`id`, `variationId`), le nom, ses variantes de paywall (`paywalls`), et un tableau `remoteConfigs` (une entrée par locale configurée). Pour récupérer les produits du flow, appelez `getPaywallProducts({ flow })`. | ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le flow, vous pouvez interroger le tableau de produits qui lui correspond : ```typescript showLineNumbers try { const products = await adapty.getPaywallProducts({ flow }); // the requested products list } catch (error) { console.error('Failed to fetch products:', error); } ``` Paramètres de la réponse : | Paramètre | Description | | :-------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Liste d'objets [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) avec : identifiant du produit, nom du produit, prix, devise, durée de l'abonnement et plusieurs autres propriétés. | Lors de la mise en œuvre de votre propre design de paywall, vous aurez probablement besoin d'accéder à ces propriétés depuis l'objet [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct). Les propriétés les plus couramment utilisées sont illustrées ci-dessous, mais consultez le document lié pour obtenir tous les détails sur l'ensemble des propriétés disponibles. | Propriété | Description | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Pour afficher le titre du produit, utilisez `product.localizedTitle`. La localisation est basée sur le pays du store sélectionné par l'utilisateur, et non sur la locale de l'appareil. | | **Price** | Pour afficher une version localisée du prix, utilisez `product.price?.localizedString`. Cette localisation est basée sur les informations de locale de l'appareil. Vous pouvez également accéder au prix sous forme de nombre avec `product.price?.amount`. La valeur sera fournie dans la devise locale. Pour obtenir le symbole de devise associé, utilisez `product.price?.currencySymbol`. | | **Subscription Period** | Pour afficher la période (ex. semaine, mois, année, etc.), utilisez `product.subscription?.localizedSubscriptionPeriod`. Cette localisation est basée sur la locale de l'appareil. Pour récupérer la période d'abonnement par programmation, utilisez `product.subscription?.subscriptionPeriod`. Vous pouvez alors accéder à la propriété `unit` pour obtenir la durée (`'day'`, `'week'`, `'month'`, `'year'` ou `'unknown'`). La valeur `numberOfUnits` vous donnera le nombre d'unités de période. Par exemple, pour un abonnement trimestriel, vous verrez `'month'` dans la propriété unit et `3` dans la propriété numberOfUnits. | | **Introductory Offer** | Pour afficher un badge ou tout autre indicateur signalant qu'un abonnement contient une offre de lancement, consultez la propriété `product.subscription?.offer?.phases`. Il s'agit d'une liste pouvant contenir jusqu'à deux phases de remise : la phase d'essai gratuit et la phase de prix de lancement. Chaque objet de phase contient les propriétés utiles suivantes :optionnel
par défaut : `'reload_revalidating_cache_data'`
|Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données mises en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d'utiliser `'return_cache_data_else_load'` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs peuvent ne pas obtenir les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc fiable de l'utiliser en cours de session pour éviter des requêtes réseau.
Notez que le cache reste intact après un redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
|optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](capacitor-localizations-and-locale-codes) pour plus d'informations sur les codes de langue et notre recommandation d'utilisation.
| | **params.fetchPolicy** |optionnel
par défaut : `'reload_revalidating_cache_data'`
|Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Cependant, si vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `'return_cache_data_else_load'` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront pas forcément les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, ce qui permet de l'utiliser en toute sécurité pendant la session afin d'éviter des requêtes réseau inutiles.
Notez que le cache est conservé après un redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
| | **params.loadTimeoutMs** |optionnel
par défaut : 5000 ms
|Cette valeur limite le délai d'attente (en millisecondes) pour cette méthode. Si le délai est dépassé, les données en cache ou le fallback local sont retournés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeoutMs`, car l'opération peut impliquer plusieurs requêtes en coulisse.
| **N'intégrez pas les identifiants produit en dur dans votre code.** Le seul identifiant à coder en dur est l'identifiant de placement. Les paywalls sont configurés à distance, donc le nombre de produits et d'offres disponibles peut changer à tout moment. Votre application doit gérer ces changements de façon dynamique — si un paywall retourne deux produits aujourd'hui et trois demain, affichez-les tous sans modifier le code. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Un objet [`AdaptyPaywall`](https://capacitor.adapty.io/interfaces/adaptypaywall) contenant : une liste d'identifiants de produits, l'identifiant du paywall, le Remote Config, et plusieurs autres propriétés. | ## Récupérer les produits \{#fetch-products\} Une fois que vous disposez du paywall, vous pouvez récupérer le tableau de produits qui lui correspond : ```typescript showLineNumbers try { const products = await adapty.getPaywallProducts({ paywall }); // the requested products list } catch (error) { console.error('Failed to fetch products:', error); } ``` Paramètres de la réponse : | Paramètre | Description | | :-------- |:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Liste d'objets [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct) comprenant : identifiant du produit, nom du produit, prix, devise, durée de l'abonnement, et plusieurs autres propriétés. | Lors de la mise en œuvre de votre propre design de paywall, vous aurez probablement besoin d'accéder à ces propriétés depuis l'objet [`AdaptyPaywallProduct`](https://capacitor.adapty.io/interfaces/adaptypaywallproduct). Les propriétés les plus couramment utilisées sont illustrées ci-dessous, mais consultez le document lié pour obtenir tous les détails sur l'ensemble des propriétés disponibles. | Propriété | Description | |--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Titre** | Pour afficher le titre du produit, utilisez `product.localizedTitle`. La localisation est basée sur le pays du store sélectionné par l'utilisateur, et non sur la langue de l'appareil. | | **Prix** | Pour afficher une version localisée du prix, utilisez `product.price?.localizedString`. Cette localisation est basée sur les informations de langue de l'appareil. Vous pouvez également accéder au prix sous forme numérique avec `product.price?.amount`. La valeur est fournie dans la devise locale. Pour obtenir le symbole de devise associé, utilisez `product.price?.currencySymbol`. | | **Période d'abonnement** | Pour afficher la période (ex. : semaine, mois, an, etc.), utilisez `product.subscription?.localizedSubscriptionPeriod`. Cette localisation est basée sur la langue de l'appareil. Pour récupérer la période d'abonnement de façon programmatique, utilisez `product.subscription?.subscriptionPeriod`. Vous pouvez ensuite accéder à la propriété `unit` pour obtenir la durée unitaire (`'day'`, `'week'`, `'month'`, `'year'` ou `'unknown'`). La valeur `numberOfUnits` indique le nombre d'unités de la période. Par exemple, pour un abonnement trimestriel, `unit` vaut `'month'` et `numberOfUnits` vaut `3`. | | **Offre de lancement** | Pour afficher un badge ou un indicateur signalant qu'un abonnement inclut une offre de lancement, consultez la propriété `product.subscription?.offer?.phases`. C'est une liste pouvant contenir jusqu'à deux phases de remise : la phase d'essai gratuit et la phase de prix de lancement. Chaque objet de phase contient les propriétés utiles suivantes :optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second la région.
Exemple : `en` signifie l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](capacitor-localizations-and-locale-codes) pour en savoir plus sur les codes de langue et notre façon de les utiliser.
| | **params.fetchPolicy** |optionnel
par défaut : `'reload_revalidating_cache_data'`
|Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Toutefois, si vos utilisateurs ont souvent une connexion instable, envisagez d'utiliser `'return_cache_data_else_load'` pour renvoyer les données en cache lorsqu'elles existent. Dans ce cas, les utilisateurs ne disposeront peut-être pas des toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser au cours d'une session pour éviter les requêtes réseau.
Notez que le cache est conservé après un redémarrage de l'application et n'est effacé qu'en cas de désinstallation ou de nettoyage manuel.
|optionnel
par défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **params.fetchPolicy** |optionnel
par défaut : `'reload_revalidating_cache_data'`
|Par défaut, le SDK essaie de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `'return_cache_data_else_load'` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé lors du redémarrage de l'application et n'est effacé que lors de la désinstallation ou via un nettoyage manuel.
| | **params.loadTimeoutMs** |optionnel
par défaut : 5000 ms
|Cette valeur limite le délai d'attente (en millisecondes) pour cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront retournés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeoutMs`, car l'opération peut impliquer différentes requêtes en arrière-plan.
| Paramètres de réponse : | Paramètre | Description | |:----------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **onboarding** | Un objet [`AdaptyOnboarding`](https://capacitor.adapty.io/interfaces/adaptyonboarding) contenant : l'identifiant et la configuration de l'onboarding, le Remote Config, et plusieurs autres propriétés. | ## Accélérer la récupération de l'onboarding avec l'onboarding d'audience par défaut \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} En général, les onboardings sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et onboardings et que vos utilisateurs ont une connexion internet faible, la récupération d'un onboarding peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un onboarding par défaut pour garantir une bonne expérience utilisateur plutôt que de n'afficher aucun onboarding. Pour cela, vous pouvez utiliser la méthode `getOnboardingForDefaultAudience`, qui récupère l'onboarding du placement spécifié pour l'audience **All Users**. Il est cependant essentiel de comprendre que l'approche recommandée reste de récupérer l'onboarding avec la méthode `getOnboarding`, comme décrit dans la section [Récupérer un onboarding](#fetch-onboarding) ci-dessus. :::warning Préférez `getOnboarding` à `getOnboardingForDefaultAudience`, car cette dernière présente des limitations importantes : - **Problèmes de compatibilité** : peut créer des problèmes lors de la prise en charge de plusieurs versions de l'application, nécessitant soit des designs rétrocompatibles, soit d'accepter que les anciennes versions s'affichent incorrectement. - **Pas de personnalisation** : affiche uniquement le contenu pour l'audience "All Users", sans ciblage basé sur le pays, l'attribution ou des attributs personnalisés. Si la rapidité de récupération justifie ces inconvénients pour votre cas d'usage, utilisez `getOnboardingForDefaultAudience` comme indiqué ci-dessous. Sinon, utilisez `getOnboarding` comme décrit [ci-dessus](#fetch-onboarding). ::: ```typescript showLineNumbers try { const onboarding = await adapty.getOnboardingForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en', params: { fetchPolicy: 'reload_revalidating_cache_data' // Load from server, fallback to cache } }); console.log('Default audience onboarding fetched successfully'); } catch (error) { console.error('Failed to fetch default audience onboarding:', error); } ``` Paramètres : | Paramètre | Présence | Description | |---------|--------|-----------| | **placementId** | requis | L'identifiant du [Placement](placements) souhaité. C'est la valeur que vous avez indiquée lors de la création d'un placement dans l'Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **params.fetchPolicy** |optionnel
par défaut : `'reload_revalidating_cache_data'`
|Par défaut, le SDK essaie de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `'return_cache_data_else_load'` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé lors du redémarrage de l'application et n'est effacé que lors de la désinstallation ou via un nettoyage manuel.
| --- # File: capacitor-present-onboardings --- --- title: "Présenter les onboardings dans le SDK Capacitor" description: "Découvrez comment présenter des onboardings sur Capacitor pour augmenter les conversions et les revenus." --- :::warning **Les onboardings sont dépréciés dans le SDK v4 et seront supprimés dans une prochaine version.** Ils ne reçoivent plus de correctifs ni d'améliorations. Utilisez les [flows](capacitor-get-pb-paywalls) à la place : contrairement aux onboardings, qui s'exécutent dans une WebView, les flows s'affichent nativement sur l'appareil — offrant des animations plus fluides, un aspect natif cohérent, des temps de chargement plus rapides et aucune dépendance à l'exécution WebView. Consultez [Obtenir les flows et paywalls](capacitor-get-pb-paywalls) et [Afficher les flows et paywalls](capacitor-present-paywalls) pour commencer. ::: Si vous avez personnalisé un onboarding à l'aide du builder, vous n'avez pas à vous soucier de son rendu dans le code de votre application mobile pour l'afficher à l'utilisateur. Un tel onboarding contient à la fois ce qui doit être affiché et la façon dont cela doit l'être. Avant de commencer, assurez-vous que : 1. Vous avez [créé un onboarding](create-onboarding). 2. Vous avez ajouté l'onboarding à un [placement](placements). ## Présenter un onboarding \{#present-onboarding\} Pour afficher un onboarding, utilisez la méthode `view.present()` sur la `view` créée par la méthode `createOnboardingView`. Chaque `view` ne peut être utilisée qu'une seule fois. Si vous devez afficher à nouveau l'onboarding, appelez `createOnboardingView` une nouvelle fois pour créer une nouvelle instance de `view`. :::warning Réutiliser la même `view` sans la recréer peut entraîner une erreur. ::: ```typescript showLineNumbers try { const view = await createOnboardingView(onboarding); view.setEventHandlers({ onClose: (actionId, meta) => { console.log('Onboarding closed:', actionId); return true; // Allow the onboarding to close }, onCustom: (actionId, meta) => { console.log('Custom action:', actionId); return false; // Don't close the onboarding } }); await view.present(); console.log('Onboarding presented successfully'); } catch (error) { console.error('Failed to present onboarding:', error); } ``` ## Configurer le style de présentation iOS \{#configure-ios-presentation-style\} Configurez la façon dont l'onboarding est présenté sur iOS en passant le paramètre `iosPresentationStyle` à la méthode `present()`. Ce paramètre accepte les valeurs `'full_screen'` (par défaut) ou `'page_sheet'`. ```typescript showLineNumbers await view.present({ iosPresentationStyle: 'page_sheet' }); ``` ## Personnaliser l'ouverture des liens dans les onboardings \{#customize-how-links-open-in-onboardings\} :::important La personnalisation de l'ouverture des liens dans les onboardings est prise en charge à partir du SDK Adapty v3.15. ::: Par défaut, les liens dans les onboardings s'ouvrent dans un navigateur intégré à l'application. Cela offre une expérience utilisateur fluide en affichant les pages web directement dans votre application, permettant aux utilisateurs de les consulter sans changer d'application. Si vous préférez ouvrir les liens dans un navigateur externe, vous pouvez personnaliser ce comportement en définissant le paramètre `openIn` sur `browser_out_app` : ```typescript showLineNumbers await view.present({ openIn: 'browser_out_app' }); // default — browser_in_app ``` ## Étapes suivantes \{#next-steps\} Une fois votre onboarding présenté, vous souhaiterez [gérer les interactions utilisateur et les événements](capacitor-handling-onboarding-events). Découvrez comment gérer les événements d'onboarding pour répondre aux actions des utilisateurs et suivre les analyses. --- # File: capacitor-handling-onboarding-events --- --- title: "Gérer les événements d'onboarding dans le SDK Capacitor" description: "Gérez les événements liés à l'onboarding dans Capacitor avec Adapty." --- :::warning **Les onboardings sont dépréciés dans le SDK v4 et seront supprimés dans une version future.** Ils ne reçoivent plus de correctifs ni d'améliorations. Utilisez les [flows](capacitor-get-pb-paywalls) à la place : contrairement aux onboardings qui s'exécutent dans une WebView, les flows s'affichent nativement sur l'appareil — offrant des animations plus fluides, un rendu natif cohérent, des temps de chargement réduits et aucune dépendance à l'environnement WebView. Consultez [Obtenir des flows et paywalls](capacitor-get-pb-paywalls) et [Afficher des flows et paywalls](capacitor-present-paywalls) pour commencer. ::: Les onboardings configurés avec le builder génèrent des événements auxquels votre application peut réagir. Utilisez la méthode `setEventHandlers` pour gérer ces événements lors d'une présentation d'écran autonome. Avant de commencer, assurez-vous que : 1. Vous avez [créé un onboarding](create-onboarding). 2. Vous avez ajouté l'onboarding à un [placement](placements). ## Configurer les gestionnaires d'événements \{#set-up-event-handlers\} Pour gérer les événements des onboardings, utilisez la méthode `view.setEventHandlers` : ```typescript showLineNumbers try { const view = await createOnboardingView(onboarding); view.setEventHandlers({ onAnalytics(event, meta) { console.log('Analytics event:', event); }, onClose(actionId, meta) { console.log('Onboarding closed:', actionId); return true; // Allow the onboarding to close }, onCustom(actionId, meta) { console.log('Custom action:', actionId); return false; // Don't close the onboarding }, onPaywall(actionId, meta) { console.log('Paywall action:', actionId); view.dismiss().then(() => { openPaywall(actionId); }); }, onStateUpdated(action, meta) { console.log('State updated:', action); }, onFinishedLoading(meta) { console.log('Onboarding finished loading'); }, onError(error) { console.error('Onboarding error:', error); }, }); await view.present(); } catch (error) { console.error('Failed to present onboarding:', error); } ``` ## Types d'événements \{#event-types\} Les sections suivantes décrivent les différents types d'événements que vous pouvez gérer. ### Gérer les actions personnalisées \{#handle-custom-actions\} Dans le builder, vous pouvez ajouter une action **personnalisée** à un bouton et lui attribuer un ID.
Vous pouvez ensuite utiliser cet ID dans votre code et le traiter comme une action personnalisée. Par exemple, si un utilisateur appuie sur un bouton personnalisé, comme **Login** ou **Allow notifications**, le gestionnaire d'événements sera déclenché avec le paramètre `actionId` correspondant à l'**Action ID** défini dans le builder. Vous pouvez créer vos propres IDs, comme "allowNotifications".
```typescript showLineNumbers
view.setEventHandlers({
onCustom(actionId, meta) {
switch (actionId) {
case 'login':
console.log('Login action triggered');
break;
case 'allow_notifications':
console.log('Allow notifications action triggered');
break;
}
return false; // Don't close the onboarding
},
});
```
:::important
Notez que vous devez gérer ce qui se passe lorsqu'un utilisateur ferme l'onboarding. Par exemple, vous devez arrêter d'afficher l'onboarding lui-même.
:::
```typescript showLineNumbers
view.setEventHandlers({
onClose(actionId, meta) {
console.log('Onboarding closed:', actionId);
return true; // Allow the onboarding to close
},
});
```
Ce code d'erreur indique que l'utilisateur a annulé une demande de paiement.
Aucune action n'est requise, mais en termes de logique métier, vous pouvez proposer une remise à votre utilisateur ou lui rappeler plus tard.
| | paymentInvalid | 3 | Cette erreur indique que l'un des paramètres de paiement n'a pas été reconnu par le store. | | paymentNotAllowed | 4 |Ce code d'erreur indique que l'utilisateur n'est pas autorisé à valider des paiements. Raisons possibles :
- Les paiements ne sont pas pris en charge dans le pays de l'utilisateur.
- L'utilisateur est mineur.
| | storeProductNotAvailable | 5 | Ce code d'erreur indique que le produit demandé est absent de l'App Store. Assurez-vous que le produit est disponible pour le pays utilisé. | | cloudServicePermissionDenied | 6 | Ce code d'erreur indique que l'utilisateur n'a pas autorisé l'accès aux informations du service Cloud. | | cloudServiceNetworkConnectionFailed | 7 | Ce code d'erreur indique que l'appareil n'a pas pu se connecter au réseau. | | cloudServiceRevoked | 8 | Ce code d'erreur indique que l'utilisateur a révoqué l'autorisation d'utiliser ce service cloud. | | privacyAcknowledgementRequired | 9 | Ce code d'erreur indique que l'utilisateur n'a pas encore accepté la politique de confidentialité du store. | | unauthorizedRequestData | 10 | Ce code d'erreur indique que la requête est mal construite. | | invalidOfferIdentifier | 11 |L'identifiant de l'offre n'est pas valide. Raisons possibles :
- Vous n'avez pas configuré d'offre avec cet identifiant dans l'App Store.
- Vous avez révoqué l'offre.
- Vous avez mal saisi l'identifiant de l'offre.
| | invalidSignature | 12 | Ce code d'erreur indique que la signature dans une remise de paiement n'est pas valide. Assurez-vous d'avoir renseigné le champ **In-app purchase Key ID** et téléchargé le fichier **In-App Purchase Private Key**. Consultez la rubrique [Configure App Store integration](app-store-connection-configuration) pour plus de détails. | | missingOfferParams | 13 |Cette erreur indique des problèmes avec l'intégration Adapty ou avec les offres.
Consultez [Configure App Store integration](app-store-connection-configuration) et [Offers](offers) pour savoir comment les configurer.
| | invalidOfferPrice | 14 | Ce code d'erreur indique que le prix que vous avez spécifié dans le store n'est plus valide. Les offres doivent toujours représenter un prix réduit. | ## Codes Android personnalisés \{#custom-android-codes\} | Erreur | Code | Description | |-----|----|-----------| | adaptyNotInitialized | 20 | Vous devez configurer correctement le SDK Adapty via la méthode `Adapty.activate`. Découvrez comment procéder [pour React Native](sdk-installation-reactnative). | | productNotFound | 22 | Cette erreur indique que le produit demandé à l'achat n'est pas disponible dans le store. | | invalidJson | 23 | Le JSON du paywall n'est pas valide. Corrigez-le dans l'Adapty Dashboard. Consultez la rubrique [Customize paywall with remote config](customize-paywall-with-remote-config) pour plus de détails. | | currentSubscriptionToUpdateNotFoundInHistory | 24 | L'abonnement d'origine à renouveler est introuvable. | | pendingPurchase | 25 | Cette erreur indique que l'état de l'achat est en attente plutôt qu'acheté. Consultez la page [Handling pending transactions](https://developer.android.com/google/play/billing/integrate#pending) dans la documentation Android Developer pour plus de détails. | | billingServiceTimeout | 97 | Cette erreur indique que la requête a atteint le délai d'expiration maximal avant que Google Play puisse répondre. Cela peut être causé, par exemple, par un retard dans l'exécution de l'action demandée par l'appel de la Play Billing Library. | | featureNotSupported | 98 | La fonctionnalité demandée n'est pas prise en charge par le Play Store sur l'appareil actuel. | | billingServiceDisconnected | 99 | Cette erreur fatale indique que la connexion de l'application cliente au service Google Play Store via le `BillingClient` a été interrompue. | | billingServiceUnavailable | 102 | Cette erreur temporaire indique que le service Google Play Billing est actuellement indisponible. Dans la plupart des cas, cela signifie qu'il y a un problème de connexion réseau entre l'appareil client et les services Google Play Billing. | | billingUnavailable | 103 |Cette erreur indique qu'une erreur de facturation utilisateur s'est produite pendant le processus d'achat. Exemples de situations où cela peut se produire :
1\. L'application Play Store sur l'appareil de l'utilisateur est obsolète.
2. L'utilisateur se trouve dans un pays non pris en charge.
3. L'utilisateur est un utilisateur entreprise, et son administrateur a désactivé les achats pour les utilisateurs.
4. Google Play ne peut pas débiter le moyen de paiement de l'utilisateur. Par exemple, la carte de crédit de l'utilisateur a peut-être expiré.
5. L'utilisateur n'est pas connecté à l'application Play Store.
| | developerError | 105 | Il s'agit d'une erreur fatale indiquant que vous utilisez incorrectement une API. | | billingError | 106 | Il s'agit d'une erreur fatale indiquant un problème interne avec Google Play lui-même. | | itemAlreadyOwned | 107 | Le produit consommable a déjà été acheté. | | itemNotOwned | 108 | Cette erreur indique que l'action demandée sur l'élément a échoué car | ## Codes StoreKit personnalisés \{#custom-storekit-codes\} | Erreur | Code | Description | |-----|----|-----------| | noProductIDsFound | 1000 |Cette erreur indique qu'aucun des produits du paywall n'est disponible dans le store.
Si vous rencontrez cette erreur, suivez les étapes ci-dessous pour la résoudre :
1. Vérifiez que tous les produits ont été ajoutés à l'Adapty Dashboard.
2. Assurez-vous que le Bundle ID de votre application correspond à celui d'Apple Connect.
3. Vérifiez que les identifiants de produits des stores correspondent à ceux que vous avez ajoutés au tableau de bord. Notez que les identifiants ne doivent pas contenir le Bundle ID, sauf s'il est déjà inclus dans le store.
4. Confirmez que le statut de paiement de l'application est actif dans vos paramètres fiscaux Apple. Assurez-vous que vos informations fiscales sont à jour et que vos certificats sont valides.
5. Vérifiez qu'un compte bancaire est associé à l'application afin qu'elle soit éligible à la monétisation.
6. Vérifiez si les produits sont disponibles dans toutes les régions. Assurez-vous également que vos produits sont à l'état **"Ready to Submit"**.
| | productRequestFailed | 1002 |Impossible de récupérer les produits disponibles pour le moment. Raison possible :
- Aucun cache n'a encore été créé et il n'y a pas de connexion Internet simultanément.
| | cantMakePayments | 1003 | Les achats intégrés ne sont pas autorisés sur cet appareil. | | noPurchasesToRestore | 1004 | Cette erreur indique que Google Play n'a pas trouvé d'achat à restaurer. | | cantReadReceipt | 1005 |Aucun reçu valide n'est disponible sur l'appareil. Cela peut poser problème lors des tests en sandbox.
Aucune action n'est requise, mais en termes de logique métier, vous pouvez proposer une remise à votre utilisateur ou lui rappeler plus tard.
| | productPurchaseFailed | 1006 | L'achat du produit a échoué. Cette erreur encapsule une erreur StoreKit sous-jacente — lisez l'erreur encapsulée (ou activez les logs détaillés pour la voir dans la console) pour connaître la raison réelle. L'erreur encapsulée est généralement l'un des codes StoreKit 0–14 du tableau ci-dessus — le plus souvent `paymentCancelled`, `paymentInvalid`, `paymentNotAllowed` ou `invalidOfferPrice`. Si vous ne pouvez pas identifier une raison précise, essayez un nouveau [profil sandbox](test-purchases-in-sandbox) ; si le problème persiste, contactez le support Apple. | | refreshReceiptFailed | 1010 | Cette erreur indique que le reçu n'a pas été reçu. Applicable à StoreKit 1 uniquement. | | receiveRestoredTransactionsFailed | 1011 | La restauration des achats a échoué. | ## Codes réseau personnalisés \{#custom-network-codes\} | Erreur | Code | Description | | :------------------- | :--- | :----------------------------------------------------------- | | notActivated | 2002 | Vous devez configurer correctement le SDK Adapty via la méthode `Adapty.activate`. Découvrez comment procéder [pour React Native](sdk-installation-reactnative). | | badRequest | 2003 | Requête incorrecte. | | serverError | 2004 | Erreur serveur. | | networkFailed | 2005 | La requête réseau a échoué. | | decodingFailed | 2006 | Cette erreur indique que le décodage de la réponse a échoué. | | encodingFailed | 2009 | Cette erreur indique que l'encodage de la requête a échoué. | | analyticsDisabled | 3000 | Nous ne pouvons pas traiter les événements analytics, car vous les avez désactivés. Consultez la rubrique [Analytics integration](analytics-integration) pour plus de détails. | | wrongParam | 3001 | Cette erreur indique que certains de vos paramètres sont incorrects : vide alors qu'il ne devrait pas l'être, mauvais type, etc. | | activateOnceError | 3005 | Il n'est pas possible d'appeler la méthode `.activate` plus d'une fois. | | profileWasChanged | 3006 | Le profil utilisateur a été modifié pendant l'opération. | | fetchTimeoutError | 3101 | Cette erreur signifie que le paywall n'a pas pu être récupéré dans le délai imparti. Pour éviter cette situation, [configurez des fallbacks locaux](fetch-paywalls-and-products). | | operationInterrupted | 9000 | Cette opération a été interrompue par le système. | --- # File: capacitor-sdk-migration-guides --- --- title: "Guides de migration pour le SDK Capacitor" description: "Guides de migration pour les versions du SDK Adapty Capacitor." --- Cette page regroupe tous les guides de migration pour le SDK Adapty Capacitor. Choisissez la version vers laquelle vous souhaitez migrer pour obtenir des instructions détaillées : - **[Migrer vers v4.0 (beta)](migration-to-capacitor-sdk-v4)** - [**Migrer vers v3.16**](migration-to-capacitor-316) --- # File: migration-to-capacitor-sdk-v4 --- --- title: "Migrer le SDK Adapty Capacitor vers la v. 4.0" description: "Migrez vers le SDK Adapty Capacitor v4.0 (bêta) en remplaçant les API paywall par des API flow, compatibles avec le Flow Builder et le Paywall Builder." --- Le SDK Adapty Capacitor 4.0 (bêta) introduit les flows et renomme les API paywall en conséquence. Les nouvelles API fonctionnent aussi bien avec le nouveau Flow Builder qu'avec le Paywall Builder existant — aucune modification de configuration n'est requise côté Adapty Dashboard. ## Référence rapide \{#quick-reference\} | v3 | v4 | |---|---| | `adapty.getPaywall({ placementId, locale?, params? })` | `adapty.getFlow({ placementId, params? })` | | `adapty.getPaywallForDefaultAudience({ placementId, locale?, params? })` | `adapty.getFlowForDefaultAudience({ placementId, params? })` | | `adapty.getPaywallProducts({ paywall })` | `adapty.getPaywallProducts({ flow })` | | `adapty.logShowPaywall({ paywall })` | `adapty.logShowFlow({ flow })` | | `AdaptyPaywall` (type) | `AdaptyFlow` + `AdaptyFlowPaywall` | | `createPaywallView(paywall, params?)` | `createFlowView(flow, params?)` | | `PaywallViewController` | `FlowViewController` | | `EventHandlers` (type) | `FlowEventHandlers` | | `CreatePaywallViewParamsInput` | `CreateFlowViewParamsInput` | | `onRenderingFailed` | `onError` | `AdaptyPaywallProduct` conserve son nom — les produits appartiennent toujours à un flow, et `getPaywallProducts` conserve également son nom, en prenant désormais un `AdaptyFlow`. Les méthodes `getFlow` et `getFlowForDefaultAudience` ne prennent plus de paramètre `locale` — passez-le plutôt à `createFlowView`. Les API d'achat et de profil (`makePurchase`, `restorePurchases`, `getProfile`, `identify`, `updateProfile`) et `setFallback` conservent les mêmes signatures, mais le fichier de secours lui-même doit être retéléchargé — voir [Fichiers de secours](#fallback-files). Les méthodes de vue `present`, `dismiss`, `setEventHandlers` et `showDialog`, ainsi que les gestionnaires d'événements `onCloseButtonPress`, `onUrlPress`, `onCustomAction`, `onProductSelected`, `onPurchaseStarted`, `onPurchaseCompleted`, `onPurchaseFailed`, `onRestoreStarted`, `onRestoreCompleted`, `onRestoreFailed`, `onLoadingProductsFailed`, `onWebPaymentNavigationFinished` et `onAndroidSystemBack` conservent les mêmes noms qu'en v3. Les méthodes d'onboarding fonctionnent toujours mais sont dépréciées — voir [Dépréciation de l'API onboarding](#onboarding-api-deprecation). Certains comportements par défaut ont changé — voir [Changements de comportement par défaut](#default-behavior-changes). ## Versions minimales \{#minimum-versions\} Les prérequis d'exécution sont inchangés depuis v3.16+ : **iOS 15.0**, **Android minSdk 24** et **Capacitor 8**. Aucune modification de la cible de déploiement n'est nécessaire. Il y a un nouveau prérequis de build : **Xcode 26 ou supérieur** — le SDK iOS natif Adapty 4.0.2 inclus dans cette version utilise Swift tools 6.2. v4 intègre les SDK natifs Adapty iOS 4.0.2 et Android BOM 4.0.1. ## Installation \{#installation\} ### Mettre à jour le package La v4.0 est une version préliminaire, il faut donc épingler la version exacte — npm ne sélectionne pas les versions préliminaires avec les plages caret/tilde : ```bash showLineNumbers npm install @adapty/capacitor@4.0.1-beta.1 ``` Synchronisez ensuite les projets natifs : ```bash showLineNumbers npx cap sync ``` ### iOS : Swift Package Manager uniquement \{#ios-swift-package-manager-only\} [Le dépôt de specs CocoaPods passe en lecture seule en décembre 2026](https://blog.cocoapods.org/CocoaPods-Specs-Repo/), donc à partir de la v4, le fichier `AdaptyCapacitor.podspec` est supprimé et le SDK s'installe sur iOS **uniquement via Swift Package Manager (SPM)**. Le projet iOS de votre application doit utiliser l'intégration SPM de Capacitor : - Nouvelles applications : ajoutez la plateforme iOS avec le gestionnaire de paquets SPM : ```bash showLineNumbers npx cap add ios --packagemanager SPM ``` - Applications existantes basées sur CocoaPods : migrez le projet iOS en suivant le [guide Capacitor pour utiliser SPM dans un projet existant](https://capacitorjs.com/docs/ios/spm#using-spm-in-an-existing-capacitor-project). Consultez [Installer le SDK Adapty](sdk-installation-capacitor) pour la configuration complète. ## Récupération des flows \{#fetching-flows\} ### getPaywall → getFlow Le type retourné passe de `AdaptyPaywall` à `AdaptyFlow`, et l'option `locale` quitte l'appel de récupération pour rejoindre `createFlowView` ; pour les paywalls personnalisés, toutes les locales sont retournées dans `flow.remoteConfigs` : ```diff showLineNumbers - const paywall = await adapty.getPaywall({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en' }); + const flow = await adapty.getFlow({ placementId: 'YOUR_PLACEMENT_ID' }); + const view = await createFlowView(flow, { locale: 'en' }); ``` `locale` reste optionnel dans `createFlowView` : omettez-le et la vue s'affiche en `en`, ou dans la localisation par défaut du flow si celui-ci ne dispose pas de `en`. Voir [Localisations et codes de langue](capacitor-localizations-and-locale-codes). `getPaywallForDefaultAudience` est renommé de la même façon : ```diff showLineNumbers - const paywall = await adapty.getPaywallForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID', locale: 'en' }); + const flow = await adapty.getFlowForDefaultAudience({ placementId: 'YOUR_PLACEMENT_ID' }); ``` ### getPaywallProducts(paywall) → getPaywallProducts(flow) `getPaywallProducts` conserve son nom mais accepte désormais un `AdaptyFlow` : ```diff showLineNumbers - const products = await adapty.getPaywallProducts({ paywall }); + const products = await adapty.getPaywallProducts({ flow }); ``` ### Fichiers de secours \{#fallback-files\} Le format du fichier de secours [a changé avec le SDK v4](fallback-flows). Téléchargez le nouveau fichier depuis **[Placements](https://app.adapty.io/placements)** > **Fallbacks** et intégrez-le dans votre application. ## Modèle de données \{#data-model\} `getFlow` retourne un `AdaptyFlow` au lieu d'un `AdaptyPaywall`, et la structure de l'objet a changé : | Champ v3 `AdaptyPaywall` | Champ v4 `AdaptyFlow` | Action | |---|---|---| | `remoteConfig?` (unique) | `remoteConfigs?: AdaptyRemoteConfig[]` (tableau) | Un flow porte un Remote Config par langue configurée. Lisez celui qui correspond à l'utilisateur : `flow.remoteConfigs?.find((c) => c.lang === 'en')`. | | `products` | `flow.paywalls[i].productIdentifiers` | Les identifiants de produits se trouvent désormais sur chaque variation du flow, et non sur le flow lui-même. | | `webPurchaseUrl?` | `flow.paywalls[i].webPurchaseUrl` | Déplacé du flow vers chaque variation de paywall. | | `version?: number` | `flowVersionId?: string` | Renommé, et le type est passé de `number` à `string`. | | `hasViewConfiguration` | supprimé | Supprimez tout contrôle `hasViewConfiguration` de votre code — `createFlowView` lève désormais une exception à la place (voir [Affichage des flows](#displaying-flows)). | | `requestLocale` | supprimé | La langue ne fait plus partie du modèle. | | _(nouveau)_ | `paywalls: AdaptyFlowPaywall[]` | Chaque entrée correspond à une variation de paywall dans le flow. | | _(nouveau)_ | `responseCreatedAt: number` | Horodatage de la réponse du serveur, en millisecondes. | `hasViewConfiguration` et `requestLocale` restent sur `AdaptyOnboarding` — seul le modèle de flow les supprime. Les identifiants de produits ont été déplacés du flow vers chaque variante : ```diff showLineNumbers - const ids = paywall.products; + const ids = flow.paywalls[0].productIdentifiers; ``` ## Méthodes de paywall web \{#web-paywall-methods\} `openWebPaywall` et `createWebPaywallUrl` conservent leurs noms, mais l'option `paywallOrProduct` accepte désormais un `AdaptyFlowPaywall` (une variante de flow) plutôt qu'un `AdaptyPaywall`. Vous pouvez toujours passer un `AdaptyPaywallProduct`. Vérifiez que `flow.paywalls` n'est pas vide avant de lire la première entrée : ```diff showLineNumbers const flow = await adapty.getFlow({ placementId: 'YOUR_PLACEMENT_ID' }); - await adapty.openWebPaywall({ paywallOrProduct: paywall }); + await adapty.openWebPaywall({ paywallOrProduct: flow.paywalls[0] }); ``` ## Suivi des vues de flow \{#tracking-flow-views\} ### logShowPaywall → logShowFlow `logShowPaywall` est renommé en `logShowFlow` et prend désormais un `AdaptyFlow`. L'événement est toujours enregistré pour la même variation, donc les métriques de funnel et de test A/B existantes continuent de fonctionner sans modification du tableau de bord. ```diff showLineNumbers - await adapty.logShowPaywall({ paywall }); + await adapty.logShowFlow({ flow }); ``` Comme dans la v3, vous n'avez pas besoin d'appeler cette méthode lors de l'affichage de flows ou de paywalls rendus par le [Flow Builder](adapty-flow-builder) ou le [Paywall Builder](adapty-paywall-builder) — Adapty suit ces vues automatiquement. ## Affichage des flows \{#displaying-flows\} ### createPaywallView → createFlowView Renommez la fonction factory et passez l'`AdaptyFlow`. Le contrôleur retourné est renommé de `PaywallViewController` en `FlowViewController`, mais ses méthodes (`present`, `dismiss`, `setEventHandlers`, `showDialog`) restent inchangées. Le type des paramètres est renommé de `CreatePaywallViewParamsInput` en `CreateFlowViewParamsInput` : ```diff showLineNumbers - import { createPaywallView } from '@adapty/capacitor'; + import { createFlowView } from '@adapty/capacitor'; - const view = await createPaywallView(paywall); + const view = await createFlowView(flow); await view.present(); ``` `createFlowView` lève une `AdaptyError` si le flow n'a pas de vue configurée — ce qui remplace la vérification `hasViewConfiguration` de la v3 : ```diff showLineNumbers - if (paywall.hasViewConfiguration) { - const view = await createPaywallView(paywall); - await view.present(); - } + try { + const view = await createFlowView(flow); + await view.present(); + } catch (error) { + // the flow has no view configured, or view creation failed + } ``` :::note Une vue de flow est à usage unique : après avoir appelé `dismiss()`, la vue est détruite et ses gestionnaires d'événements sont effacés. Appelez à nouveau `createFlowView` pour afficher le flow une nouvelle fois. ::: ### Marges de zone sécurisée Android \{#android-safe-area-paddings\} `CreateFlowViewParamsInput` ajoute un nouveau paramètre : `enableSafeArea`, qui contrôle les marges de zone sécurisée Android à l'exécution. Il est imbriqué sous la clé `android` et vaut `true` par défaut : ```typescript showLineNumbers const view = await createFlowView(flow, { android: { enableSafeArea: true }, }); ``` ## Gestion des événements \{#handling-events\} L'interface du gestionnaire d'événements est renommée de `EventHandlers` en `FlowEventHandlers`, et un callback est renommé. Les corps des gestionnaires existants n'ont pas besoin d'être modifiés — il suffit de renommer : ```diff showLineNumbers - onRenderingFailed: (error) => { /* … */ }, + onError: (error) => { /* … */ }, ``` Tous les autres gestionnaires d'événements conservent leur nom. Deux d'entre eux reçoivent également un deuxième argument : `onPurchaseCompleted` devient `(purchaseResult, product)` et `onPurchaseFailed` devient `(error, product)`, où `product` est l'`AdaptyPaywallProduct` concerné. Consultez [Gérer les événements de flow et de paywall](capacitor-handling-events) pour la liste complète. v4 ajoute également quelques fonctionnalités que vous pouvez activer : - Les méthodes `adapty.openWebUrl({ url, openIn })` et `adapty.requestAppReview()` — elles alimentent les gestionnaires par défaut `onUrlPress` et `onRequestAppReview`, de sorte que les URLs et les demandes d'évaluation de l'application sont gérées nativement sans configuration particulière. Ne les appelez directement que si vous remplacez ces gestionnaires. - Gestion des achats en mode Observateur dans les flows via les nouveaux gestionnaires `onObserverPurchaseInitiated` / `onObserverRestoreInitiated`. Voir [Présenter des flows en mode Observateur](capacitor-present-flows-in-observer-mode). ## Changements de comportement par défaut \{#default-behavior-changes\} Ces changements ne provoquent pas d'erreurs de compilation, testez-les donc à l'exécution : - **`onAndroidSystemBack`**: Le comportement par défaut est passé de la fermeture de la vue à son maintien ouvert. Pour retrouver l'ancien comportement, renvoyez `true` depuis le handler. - **`onPurchaseCompleted`**: Le comportement par défaut est passé de la fermeture de la vue (sauf si l'utilisateur a annulé l'achat) à son maintien ouvert dans tous les cas. Pour retrouver l'ancien comportement, renvoyez `purchaseResult.type !== 'user_cancelled'` depuis le handler. - **`onRestoreCompleted`**: Le comportement par défaut est passé de la fermeture de la vue après une restauration réussie à son maintien ouvert. Pour retrouver l'ancien comportement, renvoyez `true` depuis le handler. - **`onUrlPress`**: Le comportement par défaut ouvre désormais l'URL via la couche native, en respectant le paramètre de navigateur intégré ou externe configuré dans le tableau de bord. Surchargez le handler pour ouvrir les URL vous-même. - **Les vues sont à usage unique** : après `dismiss()`, la vue est détruite. Appelez `createFlowView` à nouveau pour afficher le flow une nouvelle fois. ## API supprimées \{#removed-apis\} ### Exports supprimés Ces symboles ne sont plus exportés depuis `@adapty/capacitor`. Supprimez leurs imports : - **`AdaptyPaywall`** : Utilisez `AdaptyFlow` et `AdaptyFlowPaywall` à la place. - **`ProductReference`** : Utilisez `AdaptyProductIdentifier`, accessible via `flow.paywalls[i].productIdentifiers`. - **`AdaptyPaywallBuilder`** : Supprimé. Les flows et paywalls s'affichent nativement. - **`AdaptyAndroidSubscriptionUpdateParameters`** : Utilisez la structure imbriquée des paramètres d'achat `android` (voir ci-dessous). ### activate: lockMethodsUntilReady `lockMethodsUntilReady` (déjà obsolète et sans effet en v3) est supprimé. Retirez-le de votre appel `activate` — le conserver ne compile plus : ```diff showLineNumbers - await adapty.activate({ apiKey: 'PUBLIC_SDK_KEY', params: { lockMethodsUntilReady: true } }); + await adapty.activate({ apiKey: 'PUBLIC_SDK_KEY' }); ``` ### makePurchase : paramètres Android \{#makepurchase-android-parameters\} La forme Android plate (deprecated) de `MakePurchaseParamsInput` est supprimée — seule la forme imbriquée subsiste. Déplacez les paramètres d'achat Android dans `params: { android: { ... } }`. Consultez [Effectuer des achats](capacitor-making-purchases) pour un exemple complet. ## Dépréciation de l'API onboarding \{#onboarding-api-deprecation\} L'ancienne API onboarding est dépréciée depuis la v4.0 au profit du [Flow Builder](adapty-flow-builder). Elle fonctionne toujours, mais sera supprimée dans une future version — prévoyez donc la migration de vos onboardings vers le Flow Builder. Symboles dépréciés : `getOnboarding`, `getOnboardingForDefaultAudience`, `createOnboardingView` et `OnboardingViewController`. --- # File: migration-to-capacitor-316 --- --- title: "Migrer le SDK Adapty Capacitor vers v3.16" description: "Migrez vers le SDK Adapty Capacitor v3.16 pour de meilleures performances et de nouvelles fonctionnalités de monétisation." --- À partir de la version 3.16.0 du SDK Adapty, Capacitor 8 est requis. Si vous avez besoin de Capacitor 7, utilisez la version 3.15 du SDK Adapty. Pour passer au SDK Capacitor v3.16, assurez-vous que votre projet utilise Capacitor 8. Si vous utilisez encore Capacitor 7, deux options s'offrent à vous : 1. **Passer à Capacitor 8** : Suivez le [guide officiel de migration Capacitor](https://capacitorjs.com/docs/updating/8-0) pour mettre à jour votre projet, puis installez le SDK Adapty v3.16. 2. **Rester sur le SDK Adapty v3.15** : Si la mise à niveau vers Capacitor 8 n'est pas envisageable, continuez à utiliser le SDK Adapty v3.15, qui prend en charge Capacitor 7. --- # End of Documentation _Generated on: 2026-08-04T15:08:25.967Z_ _Successfully processed: 45/45 files_ # FLUTTER - Adapty Documentation (Full Content) This file contains the complete content of all documentation pages for this platform. Locale: fr Generated on: 2026-08-04T15:08:25.970Z Total files: 53 --- # File: flutter-sdk-overview --- --- title: "Flutter SDK overview" description: "Découvrez le SDK Flutter d'Adapty et ses fonctionnalités clés." --- [](https://github.com/adaptyteam/AdaptySDK-Flutter/releases) Bienvenue ! Notre mission : rendre les achats intégrés aussi simples que possible 🚀 Le SDK Flutter d'Adapty vous libère des contraintes liées aux achats intégrés pour que vous puissiez vous concentrer sur l'essentiel : créer des applications formidables. Voici ce que nous gérons pour vous : - Gestion des achats, validation des reçus et gestion des abonnements prêts à l'emploi - Création et test de flows et de paywalls sans mise à jour de l'application - Analyses d'achats détaillées sans configuration – cohortes, LTV, churn et analyse d'entonnoir inclus - Statut d'abonnement utilisateur toujours à jour entre les sessions et les appareils - Intégration de votre application avec des services d'attribution marketing et d'analyse en une seule ligne de code :::note Avant de plonger dans le code, vous devrez intégrer Adapty avec App Store Connect et Google Play Console, puis configurer les produits dans le tableau de bord. Consultez notre [guide de démarrage rapide](quickstart) pour tout configurer en premier. ::: ## Commencer \{#get-started\} For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command. Voici ce que nous allons couvrir dans le guide d'intégration : 1. [Installer et configurer le SDK](sdk-installation-flutter) : Ajoutez le SDK comme dépendance à votre projet et activez-le dans le code. 2. [Activer les achats via les flows](flutter-quickstart-paywalls) : Configurez le flux d'achat pour que les utilisateurs puissent acheter des produits. Pour construire votre propre interface, consultez plutôt [Implémenter les paywalls manuellement](flutter-quickstart-manual). 3. [Vérifier le statut de l'abonnement](flutter-check-subscription-status) : Vérifiez automatiquement l'état de l'abonnement de l'utilisateur et contrôlez son accès au contenu payant. 4. [Identifier les utilisateurs (optionnel)](flutter-quickstart-identify) : Associez les utilisateurs à leurs profils Adapty pour garantir que leurs données sont stockées de manière cohérente sur tous les appareils. ### Le voir en action \{#see-it-in-action\} Vous voulez voir comment tout s'assemble ? On a ce qu'il vous faut : - **Application exemple** : Consultez notre [exemple complet](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example) qui illustre la configuration complète ## Concepts principaux \{#main-concepts\} Avant de plonger dans le code, familiarisons-nous avec les concepts clés qui font fonctionner Adapty. Ce qui fait la force de l'approche d'Adapty, c'est que seuls les placements sont codés en dur dans votre application. Tout le reste – produits, designs de paywalls, tarification et offres – peut être géré de façon flexible depuis l'Adapty Dashboard sans mise à jour de l'application : 1. [**Produit**](product) - Tout ce qui est disponible à l'achat dans votre application – abonnement, produit consommable ou accès à vie. 2. **Flow ou paywall** - Des produits regroupés avec une configuration, attachés à un placement. Deux variantes : - **[Flow](adapty-flow-builder)** - Interface visuelle sans code, construite dans le Flow Builder. Adapty affiche l'interface et gère l'achat pour vous. - **[Paywall](paywalls)** - Pas de configuration visuelle ; vous construisez l'interface dans votre propre code et appelez `makePurchase` vous-même. Voir [Implémenter les paywalls manuellement](flutter-quickstart-manual). Dans le code SDK, les deux sont récupérés via la même méthode `getFlow`. 3. [**Placement**](placements) - Un point stratégique dans le parcours utilisateur où vous souhaitez afficher un flow ou un paywall. Pensez aux placements comme au « où » et au « quand » de votre stratégie de monétisation. Les placements courants incluent : - `main` - L'emplacement principal de votre paywall - `onboarding` - Affiché pendant le flow d'onboarding de l'utilisateur - `settings` - Accessible depuis les paramètres de votre application Commencez par les bases comme `main` ou `onboarding` pour votre première intégration, puis [réfléchissez aux autres endroits dans votre application où les utilisateurs pourraient être prêts à acheter](choose-meaningful-placements). 4. [**Profil**](profiles-crm) - Lorsque les utilisateurs achètent un produit, leur profil se voit attribuer un **niveau d'accès** que vous utilisez pour définir l'accès aux fonctionnalités payantes. --- # File: sdk-installation-flutter --- --- title: "Installer et configurer le SDK Flutter" description: "Guide étape par étape pour installer le SDK Adapty sur Flutter pour les applications basées sur des abonnements." --- Le SDK Adapty comprend deux modules clés pour une intégration fluide dans votre application Flutter : - **Core Adapty** : Ce SDK essentiel est nécessaire au bon fonctionnement d'Adapty dans votre application. - **AdaptyUI** : Ce module est nécessaire si vous utilisez le [Adapty Paywall Builder](adapty-paywall-builder), un outil no-code convivial pour créer facilement des paywalls multiplateformes. :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez notre [exemple d'application](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example), qui illustre la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: ## Prérequis \{#requirements\} Le SDK Adapty prend en charge iOS 13.0+, mais nécessite iOS 15.0+ pour fonctionner correctement avec les paywalls créés dans le Paywall Builder. Adapty Flutter SDK 4.0 — qui ajoute la prise en charge du [Flow Builder](adapty-flow-builder) — relève les exigences minimales à **iOS 15.0+**, **Xcode 26+** et **Flutter 3.32.0+** (Dart 3.8.0+). Consultez [Adapty SDK 4.0](#adapty-sdk-40-swift-package-manager) ci-dessous pour les détails d'installation. :::info Adapty est compatible avec Google Play Billing Library jusqu'à la version 8.x. Par défaut, Adapty fonctionne avec Google Play Billing Library v7.0.0, mais si vous souhaitez forcer une version ultérieure, vous pouvez [ajouter la dépendance](https://developer.android.com/google/play/billing/integrate#dependency) manuellement. ::: :::info L'installation du SDK correspond à l'étape 5 de la configuration d'Adapty. Avant que les achats fonctionnent dans votre app, vous devez également connecter votre app aux stores, puis créer des produits, un paywall et un placement dans l'Adapty Dashboard. Le [guide de démarrage rapide](quickstart) décrit toutes les étapes requises. ::: ## Installer le SDK Adapty \{#install-adapty-sdk\} [](https://github.com/adaptyteam/AdaptySDK-Flutter/releases) :::important Les étapes ci-dessous installent le dernier SDK stable (3.x). Si vous avez besoin de la v4 — requise pour le [Flow Builder](adapty-flow-builder) et utilisée par le [démarrage rapide](flutter-quickstart-paywalls) — suivez plutôt [Adapty SDK 4.0 : Swift Package Manager](#adapty-sdk-40-swift-package-manager) ci-dessous. ::: 1. Ajoutez Adapty à votre fichier `pubspec.yaml` : ```yaml showLineNumbers title="pubspec.yaml" dependencies: adapty_flutter: ^
### Lors de la connexion/inscription \{#during-loginsignup\}
Si vous identifiez les utilisateurs après le lancement de l'application (par exemple, après leur connexion ou leur inscription), utilisez la méthode `identify` pour définir leur customer user ID.
- Si vous **n'avez jamais utilisé ce customer user ID auparavant**, Adapty le liera automatiquement au profil actuel.
- Si vous **avez déjà utilisé ce customer user ID pour identifier l'utilisateur**, Adapty basculera vers le profil associé à ce customer user ID.
:::important
Les customer user IDs doivent être uniques pour chaque utilisateur. Si vous codez en dur la valeur du paramètre, tous les utilisateurs seront considérés comme un seul.
:::
Utilisez toujours `await` avec `identify` avant d'appeler d'autres méthodes du SDK. Les appels simultanés produisent l'erreur `#3006 profileWasChanged` ou aboutissent sur le profil anonyme. Voir [Ordre des appels dans le SDK Flutter](flutter-sdk-call-order).
```dart showLineNumbers
try {
await Adapty().identify(customerUserId); // Unique for each user
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
}
```
### Lors de l'activation du SDK \{#during-the-sdk-activation\}
Si vous connaissez déjà un customer user ID au moment d'activer le SDK, vous pouvez l'envoyer dans la méthode `activate` au lieu d'appeler `identify` séparément.
Si vous connaissez un customer user ID mais ne le définissez qu'après l'activation, cela signifie qu'au moment de l'activation, Adapty créera un nouveau profil anonyme et ne basculera vers le profil existant qu'après votre appel à `identify`.
Vous pouvez passer un customer user ID existant (que vous avez déjà utilisé) ou un nouveau. Si vous en passez un nouveau, le nouveau profil créé lors de l'activation sera automatiquement lié au customer user ID.
:::note
Par défaut, la création de profils anonymes n'affecte pas les tableaux de bord analytiques, car les installations sont comptées sur la base des identifiants d'appareil.
Un identifiant d'appareil représente une seule installation de l'application depuis le store sur un appareil et n'est régénéré qu'après la réinstallation de l'application.
Il ne dépend pas du fait qu'il s'agisse d'une première ou d'une énième installation, ni de l'utilisation d'un customer user ID existant.
La création d'un profil (lors de l'activation du SDK ou de la déconnexion), la connexion ou la mise à jour de l'application sans réinstallation ne génère pas d'événements d'installation supplémentaires.
Si vous souhaitez compter les installations sur la base d'utilisateurs uniques plutôt que d'appareils, accédez à **App settings** et configurez [**Installs definition for analytics**](general#4-installs-definition-for-analytics).
:::
```dart showLineNumbers"
try {
await Adapty().activate(
configuration: AdaptyConfiguration(apiKey: 'YOUR_API_KEY')
..withCustomerUserId(YOUR_CUSTOMER_USER_ID) // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
);
} catch (e) {
// handle the error
}
```
### Déconnecter les utilisateurs \{#log-users-out\}
Si votre application dispose d'un bouton de déconnexion, utilisez la méthode `logout`.
:::important
La déconnexion d'un utilisateur crée un nouveau profil anonyme pour cet utilisateur.
:::
```dart showLineNumbers
try {
await Adapty().logout();
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle unknown error
}
```
:::info
Pour reconnecter les utilisateurs à l'application, utilisez la méthode `identify`.
:::
### Autoriser les achats sans connexion \{#allow-purchases-without-login\}
Si vos utilisateurs peuvent effectuer des achats avant et après leur connexion à votre application, vous devez vous assurer qu'ils conserveront leur accès après la connexion :
1. Lorsqu'un utilisateur déconnecté effectue un achat, Adapty le lie à son identifiant de profil anonyme.
2. Lorsque l'utilisateur se connecte à son compte, Adapty bascule vers son profil identifié.
- S'il s'agit d'un nouveau customer user ID (par exemple, l'achat a été effectué avant l'inscription), Adapty attribue le customer user ID au profil actuel, de sorte que tout l'historique des achats est conservé.
- S'il s'agit d'un customer user ID existant (déjà lié à un profil), vous devez obtenir le niveau d'accès réel après le changement de profil. Vous pouvez soit appeler [`getProfile`](flutter-check-subscription-status) juste après l'identification, soit [écouter les mises à jour du profil](flutter-check-subscription-status) pour que les données se synchronisent automatiquement.
## Prochaines étapes \{#next-steps\}
Félicitations ! Vous avez mis en place la logique de paiement intégré dans votre application ! Nous vous souhaitons tout le succès possible pour la monétisation de votre app !
Pour tirer encore plus parti d'Adapty, vous pouvez explorer ces sujets :
- [**Tests**](troubleshooting-test-purchases) : Vérifiez que tout fonctionne comme prévu
- [**Onboardings**](flutter-onboardings) : Engagez les utilisateurs avec des onboardings et fidélisez-les
- [**Intégrations**](configuration) : Intégrez des services d'attribution marketing et d'analyse en une seule ligne de code
- [**Définir des attributs de profil personnalisés**](flutter-setting-user-attributes) : Ajoutez des attributs personnalisés aux profils utilisateurs et créez des segments pour lancer des tests A/B ou afficher différents paywalls à différents utilisateurs
---
# File: adapty-sdk-integration-skill-flutter
---
---
title: "Intégrer Adapty dans votre application Flutter avec la compétence d'intégration SDK"
description: "Utilisez la compétence adapty-sdk-integration pour intégrer le SDK Adapty dans votre application Flutter de bout en bout avec votre outil de codage IA."
---
:::important
La compétence est en bêta. Si elle se bloque ou se comporte de manière inattendue, suivez le [guide d'intégration étape par étape](adapty-cursor-flutter) à la place — il guide votre outil IA à travers chaque étape avec la documentation appropriée.
:::
La [compétence adapty-sdk-integration](https://github.com/adaptyteam/adapty-sdk-integration-skill) automatise l'intégration Adapty de bout en bout : configuration du tableau de bord, installation du SDK, paywall et vérification à chaque étape. Elle détecte automatiquement votre plateforme et récupère la documentation Adapty pertinente à chaque étape.
**Outils compatibles** : Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Pour installer, choisissez le formulaire correspondant à votre outil. La liste complète se trouve dans le [README de la compétence](https://github.com/adaptyteam/adapty-sdk-integration-skill).
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex ou tout autre outil** — utilisez la [CLI skills](https://skills.sh) (notez que les compétences installées de cette façon ne se mettent pas à jour automatiquement) :
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Vous pouvez également cloner le dépôt et copier `skills/adapty-sdk-integration/` dans le répertoire des compétences de votre outil.
Après l'installation, exécutez la compétence dans votre projet :
```
/adapty-sdk-integration
```
La compétence pose quelques questions de configuration, puis guide à travers la configuration du tableau de bord, l'installation du SDK, le paywall et la vérification.
---
# File: adapty-cursor-flutter
---
---
title: "Intégrer Adapty dans votre application Flutter avec l'aide de l'IA"
description: "Un guide étape par étape pour intégrer Adapty dans votre application Flutter avec Cursor, Context7, ChatGPT, Claude ou d'autres outils IA."
---
Ce guide vous accompagne pas à pas dans l'intégration d'Adapty dans votre application Flutter à l'aide d'un outil IA — vous lui fournissez les bonnes docs Adapty dans le bon ordre.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Avant de commencer : configuration du tableau de bord \{#before-you-start-dashboard-setup\}
Adapty nécessite une configuration du tableau de bord avant d'écrire le moindre code SDK. Vous pouvez le faire via un skill LLM interactif ou manuellement depuis le Dashboard.
### Approche par skill (recommandée) \{#skill-approach-recommended\}
Le skill Adapty CLI permet à votre LLM de configurer votre app, vos produits, vos niveaux d'accès, vos paywalls et vos placements directement — sans ouvrir le Dashboard à chaque étape. Vous avez seulement besoin de [connecter vos stores](integrate-payments) dans le Dashboard.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Une fois le skill ajouté, lancez `/adapty-cli` dans votre agent. Il vous guidera à travers chaque étape — y compris quand ouvrir le Dashboard pour connecter vos stores.
### Approche manuelle \{#dashboard-approach\}
Si vous préférez tout configurer manuellement, voici ce dont vous avez besoin avant d'écrire du code. Votre LLM ne peut pas récupérer les valeurs du tableau de bord à votre place — vous devrez les lui fournir.
1. **Connectez vos stores** : Dans l'Adapty Dashboard, allez dans **App settings → General**. Connectez l'App Store et Google Play si votre application Flutter cible les deux plateformes. C'est indispensable pour que les achats fonctionnent.
[Connecter les stores](integrate-payments)
2. **Copiez votre clé SDK publique** : Dans l'Adapty Dashboard, allez dans **App settings → General**, puis trouvez la section **API keys**. Dans le code, c'est la chaîne que vous passez à la configuration d'Adapty.
3. **Créez au moins un produit** : Dans l'Adapty Dashboard, allez sur la page **Products**. Vous ne référencez pas les produits directement dans le code — Adapty les fournit via les paywalls.
[Ajouter des produits](quickstart-products)
4. **Créez un paywall et un placement** : Dans l'Adapty Dashboard, créez un paywall sur la page **Paywalls**, puis assignez-le à un placement sur la page **Placements**. Dans le code, l'ID de placement est la chaîne que vous passez à `Adapty().getPaywall()`.
[Créer un paywall](quickstart-paywalls)
5. **Configurez les niveaux d'accès** : Dans l'Adapty Dashboard, configurez-les par produit sur la page **Products**. Dans le code, la chaîne vérifiée dans `profile.accessLevels['premium']?.isActive`. Le niveau d'accès `premium` par défaut convient à la plupart des apps. Si les utilisateurs payants accèdent à des fonctionnalités différentes selon le produit (par exemple, un plan `basic` vs. un plan `pro`), [créez des niveaux d'accès supplémentaires](assigning-access-level-to-a-product) avant de commencer à coder.
:::tip
Une fois ces cinq éléments en place, vous êtes prêt à coder. Dites à votre LLM : « Ma clé SDK publique est X, mon ID de placement est Y » pour qu'il génère le code d'initialisation et de récupération des paywalls correct.
:::
### À configurer quand vous serez prêt \{#set-up-when-ready\}
Ces éléments ne sont pas nécessaires pour commencer à coder, mais ils deviendront utiles à mesure que votre intégration avance :
- **Tests A/B** : À configurer sur la page **Placements**. Aucune modification de code requise.
[Tests A/B](ab-tests)
- **Paywalls et placements supplémentaires** : Ajoutez des appels `getPaywall` avec différents IDs de placement.
- **Intégrations analytiques** : À configurer sur la page **Integrations**. La configuration varie selon l'intégration. Voir [intégrations analytiques](analytics-integration) et [intégrations d'attribution](attribution-integration).
## Fournir la documentation Adapty à votre LLM \{#feed-adapty-docs-to-your-llm\}
### Utiliser Context7 (recommandé) \{#use-context7-recommended\}
[Context7](https://context7.com) est un serveur MCP qui donne à votre LLM un accès direct à la documentation Adapty à jour. Votre LLM récupère automatiquement les bonnes docs en fonction de vos questions — sans avoir à coller des URLs manuellement.
Context7 fonctionne avec **Cursor**, **Claude Code**, **Windsurf** et d'autres outils compatibles MCP. Pour le configurer, exécutez :
```
npx ctx7 setup
```
Cette commande détecte votre éditeur et configure le serveur Context7. Pour une configuration manuelle, consultez le [dépôt GitHub de Context7](https://github.com/upstash/context7).
Une fois configuré, référencez la bibliothèque Adapty dans vos prompts :
```
Use the adaptyteam/adapty-docs library to look up how to install the Flutter SDK
```
:::warning
Même si Context7 élimine le besoin de coller des liens de documentation manuellement, l'ordre d'implémentation est important. Suivez le [guide d'implémentation](#implementation-walkthrough) ci-dessous étape par étape pour vous assurer que tout fonctionne.
:::
### Utiliser les docs en texte brut \{#use-plain-text-docs\}
Vous pouvez accéder à n'importe quelle doc Adapty en Markdown brut. Ajoutez `.md` à la fin de son URL, ou cliquez sur **Copy for LLM** sous le titre de l'article. Par exemple : [adapty-cursor-flutter.md](https://adapty.io/docs/fr/adapty-cursor-flutter.md).
Chaque étape du [guide d'implémentation](#implementation-walkthrough) ci-dessous contient un bloc « À envoyer à votre LLM » avec des liens `.md` à coller.
Pour accéder à davantage de documentation d'un coup, consultez les [fichiers d'index et sous-ensembles spécifiques à chaque plateforme](#plain-text-doc-index-files) ci-dessous.
## Guide d'implémentation \{#implementation-walkthrough\}
La suite de ce guide parcourt l'intégration d'Adapty dans l'ordre d'implémentation. Chaque étape inclut les docs à envoyer à votre LLM, ce que vous devriez observer une fois terminé, et les problèmes courants.
### Planifier votre intégration \{#plan-your-integration\}
Avant de vous lancer dans le code, demandez à votre LLM d'analyser votre projet et de créer un plan d'implémentation. Si votre outil IA prend en charge un mode de planification (comme le mode plan de Cursor ou Claude Code), utilisez-le pour que le LLM puisse lire à la fois la structure de votre projet et les docs Adapty avant d'écrire du code.
Dites à votre LLM quelle approche vous utilisez pour les achats — cela détermine les guides à suivre :
- [**Adapty Paywall Builder**](adapty-paywall-builder) : Vous créez des paywalls dans l'éditeur no-code d'Adapty, et le SDK les affiche automatiquement.
- [**Paywalls créés manuellement**](flutter-making-purchases) : Vous construisez votre propre interface de paywall dans le code, mais utilisez quand même Adapty pour récupérer les produits et gérer les achats.
- [**Mode Observer**](observer-vs-full-mode) : Vous conservez votre infrastructure d'achats existante et utilisez Adapty uniquement pour les analyses et les intégrations.
Vous ne savez pas quoi choisir ? Lisez le [tableau comparatif dans le guide de démarrage rapide](flutter-quickstart-paywalls).
### Installer et configurer le SDK \{#install-and-configure-the-sdk\}
Ajoutez la dépendance au SDK Adapty avec `flutter pub add` et activez-le avec votre clé SDK publique. C'est la base — rien d'autre ne fonctionnera sans ça.
**Guide :** [Installer et configurer le SDK Adapty](sdk-installation-flutter)
À envoyer à votre LLM :
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/fr/sdk-installation-flutter.md
```
:::tip[Point de contrôle]
- **Attendu :** L'application se compile et s'exécute sur iOS et Android. La console de débogage affiche le log d'activation d'Adapty.
- **Point d'attention :** « Public API key is missing » → vérifiez que vous avez remplacé le placeholder par votre vraie clé depuis les paramètres de l'app.
:::
### Afficher les paywalls et gérer les achats \{#show-paywalls-and-handle-purchases\}
Récupérez un paywall par ID de placement, affichez-le et gérez les événements d'achat. Les guides dont vous avez besoin dépendent de votre approche pour les achats.
Testez chaque achat en sandbox au fur et à mesure — n'attendez pas la fin. Consultez [Tester les achats en sandbox](test-purchases-in-sandbox) pour les instructions de configuration.
Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser durant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la réinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement ainsi qu'un serveur de secours indépendant au cas où le CDN serait inaccessible. Ce système est conçu pour garantir que vous obtenez toujours la dernière version de vos paywalls tout en assurant la fiabilité, même lorsque la connexion internet est limitée.
| | **loadTimeout** | défaut : 5 sec |Une `Duration` qui limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront retournés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre différentes requêtes en arrière-plan.
| ## Paramètres de réponse \{#response-parameters\} | Paramètre | Description | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | Un objet `AdaptyFlow` contenant les identifiants du flow (`instanceIdentity`, `variationId`), son nom, son placement, ses variations de paywall (`paywalls`), ainsi que les éventuelles configurations distantes (`remoteConfigs`). | ## Récupérer la configuration de la vue \{#fetch-the-view-configuration\} :::important Veillez à activer le bouton **Show on device** dans le builder. Si cette option n'est pas activée, la configuration de la vue ne sera pas disponible pour être récupérée. ::: Si le placement a été conçu dans le **Flow Builder** ou le **Paywall Builder**, Adapty génère l'interface pour vous — la propriété `hasViewConfiguration` du flow récupéré est `true`. Créez la vue avec `createFlowView`, puis [présentez le flow ou le paywall](flutter-present-paywalls). Si le placement est un paywall personnalisé sans interface Builder (`hasViewConfiguration` vaut `false`), [gérez-le comme un paywall Remote Config](present-remote-config-paywalls-flutter) à la place. :::warning Le résultat de la méthode `createFlowView` ne peut être présenté qu'une seule fois. Si vous devez le présenter à nouveau, appelez la méthode `createFlowView` une nouvelle fois. ::: ```dart showLineNumbers try { final view = await AdaptyUI().createFlowView(flow: flow); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` Paramètres : | Paramètre | Présence | Description | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | obligatoire | Un objet `AdaptyFlow` permettant d'obtenir une vue pour le flow/paywall souhaité. | | **locale** | optionnel | L'identifiant de la [localisation du flow](add-paywall-locale-in-adapty-paywall-builder) utilisée pour afficher la vue — par exemple, `en` ou `pt-br`. Si omis, la vue s'affiche en `en`, ou dans la localisation par défaut du flow si celui-ci n'a pas de version `en`. Voir [Localisations et codes de langue](flutter-localizations-and-locale-codes). | | **customTags** | optionnel | Définit une map de tags personnalisés et de leurs valeurs résolues. Les tags personnalisés servent de placeholders dans le contenu, remplacés dynamiquement par des chaînes spécifiques pour personnaliser le contenu du flow/paywall. Consultez la rubrique [Tags personnalisés dans le Paywall Builder](custom-tags-in-paywall-builder) pour plus de détails. | | **preloadProducts** | optionnel | Activez cette option pour optimiser le moment d'affichage des produits à l'écran. Lorsque la valeur est `true`, AdaptyUI récupère automatiquement les produits nécessaires. Par défaut : `false`. | | **loadTimeout** | optionnel | Une `Duration` qui limite le temps de chargement de la configuration de la vue. Si le délai est dépassé, les données en cache ou le fallback local sont utilisés. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation de flow](add-paywall-locale-in-adapty-paywall-builder) et comment utiliser correctement les codes de langue [ici](flutter-localizations-and-locale-codes). ::: Une fois que vous avez la vue, [présentez le flow/paywall](flutter-present-paywalls). ## Récupérer un flow ou un paywall pour l'audience par défaut afin d'accélérer le chargement \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les flows et les paywalls sont récupérés presque instantanément, et vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et placements, et que vos utilisateurs ont une connexion internet faible, la récupération d'un flow ou d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pourriez vouloir afficher un flow ou un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher du tout. Pour y remédier, vous pouvez utiliser la méthode `getFlowForDefaultAudience`, qui récupère le flow ou le paywall du placement spécifié pour l'audience **All Users**. Cependant, il est important de comprendre que l'approche recommandée est de récupérer le flow ou le paywall via la méthode `getFlow`, comme décrit dans la section [Récupérer le flow/paywall](#fetch-flowpaywall) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getFlow` La méthode `getFlowForDefaultAudience` présente quelques inconvénients importants : - **Problèmes potentiels de rétrocompatibilité** : si vous devez afficher des paywalls différents selon les versions de l'application (actuelle et future), vous pourrez rencontrer des difficultés. Vous devrez soit concevoir des paywalls compatibles avec la version actuelle (héritée), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des paywalls non affichés. - **Perte de ciblage** : tous les utilisateurs verront le même paywall conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment selon les pays, l'attribution marketing ou vos propres attributs personnalisés). Si vous acceptez ces inconvénients pour bénéficier d'un chargement plus rapide des flows ou des paywalls, utilisez la méthode `getFlowForDefaultAudience` comme suit. Sinon, restez sur `getFlow` décrit [ci-dessus](#fetch-flowpaywall). ::: ```dart showLineNumbers try { final flow = await Adapty().getFlowForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID'); // the requested flow/paywall } on AdaptyError catch (adaptyError) { // handle error } catch (e) { // handle unknown error } ``` | Paramètre | Présence | Description | |---------|--------|-----------| | **placementId** | obligatoire | L'identifiant du [Placement](placements). C'est la valeur que vous avez spécifiée lors de la création d'un placement dans votre Adapty Dashboard. | | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont confrontés à une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs risquent de ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la réinstallation de l'application ou via un nettoyage manuel.
| ## Personnaliser les ressources \{#customize-assets\} Pour personnaliser les images et vidéos dans votre flow/paywall, implémentez des ressources personnalisées. Les images et vidéos hero ont des IDs prédéfinis : `hero_image` et `hero_video`. Dans un bundle de ressources personnalisées, vous ciblez ces éléments par leurs IDs et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un ID personnalisé](custom-media) dans Adapty Dashboard. Par exemple, vous pouvez : - Afficher une image ou une vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. Voici un exemple de la façon dont vous pouvez fournir des ressources personnalisées via un simple dictionnaire : ```dart final customAssets = { // Show a local image using a custom ID 'custom_image': AdaptyCustomAsset.localImageAsset( assetId: 'assets/images/image_name.png', ), // Show a local video with a preview image 'hero_video': AdaptyCustomAsset.localVideoAsset( assetId: 'assets/videos/custom_video.mp4', ), }; try { final view = await AdaptyUI().createFlowView( flow: flow, customAssets: customAssets, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` :::note Si une ressource est introuvable, le flow/paywall reviendra à son apparence par défaut. ::: ## Configurer les minuteries définies par le développeur \{#set-up-developer-defined-timers\} Pour utiliser des minuteries personnalisées dans votre application mobile, transmettez une map `customTimers` à la méthode `createFlowView`. Chaque clé de la map correspond à un identifiant de minuterie, et sa valeur est un objet `DateTime` qui définit quand la minuterie se termine. Voici un exemple : ```dart showLineNumbers try { final view = await AdaptyUI().createFlowView( flow: flow, customTimers: { 'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)), 'CUSTOM_TIMER_NY': DateTime(2027, 1, 1), // New Year 2027 }, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` Dans cet exemple, `CUSTOM_TIMER_NY` et `CUSTOM_TIMER_6H` sont les **Timer ID**s des minuteries définies par le développeur dans l'Adapty Dashboard. La map `customTimers` permet à votre application de mettre à jour dynamiquement chaque minuterie avec la valeur correcte. Par exemple : - `CUSTOM_TIMER_NY` : le temps restant jusqu'à la fin du minuteur, comme le jour du Nouvel An. - `CUSTOM_TIMER_6H` : le temps restant dans une période de 6 heures qui a démarré lorsque l'utilisateur a ouvert le flow.optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-paywall-locale-in-adapty-paywall-builder). Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](flutter-localizations-and-locale-codes) pour plus d'informations sur les codes de langue et notre recommandation d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne disposeront peut-être pas des toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé lors du redémarrage de l'application et n'est effacé que lors de la réinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour vous garantir d'obtenir toujours la dernière version de vos paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut être composée de différentes requêtes en interne.
Pour Android : vous pouvez créer un `TimeInterval` avec des fonctions d'extension (comme `5.seconds`, où `.seconds` provient de `import com.adapty.utils.seconds`), ou `TimeInterval.seconds(5)`. Pour ne pas définir de limite, utilisez `TimeInterval.INFINITE`.
| ## Paramètres de réponse \{#response-parameters\} | Paramètre | Description | | :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Un objet [`AdaptyPaywall`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywall-class.html) contenant une liste d'identifiants de produits, l'identifiant du paywall, le Remote Config et plusieurs autres propriétés. | ## Récupérer la configuration d'affichage d'un paywall conçu avec le Paywall Builder \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Assurez-vous d'activer le bouton **Show on device** dans le Paywall Builder. Si cette option n'est pas activée, la configuration d'affichage ne pourra pas être récupérée. ::: Après avoir récupéré le paywall, vérifiez s'il contient un `ViewConfiguration`, ce qui indique qu'il a été créé avec le Paywall Builder. Cela vous guidera sur la façon d'afficher le paywall. Si le `ViewConfiguration` est présent, traitez-le comme un paywall Paywall Builder ; sinon, [traitez-le comme un paywall Remote Config](present-remote-config-paywalls-flutter). ```dart showLineNumbers try { final view = await AdaptyUI().createPaywallView( paywall: paywall, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` Une fois que vous avez la vue, [affichez le paywall](flutter-present-paywalls). ## Obtenir un paywall pour une audience par défaut afin d'accélérer la récupération \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les paywalls sont récupérés presque instantanément, il n'est donc pas nécessaire de chercher à optimiser ce processus. Cependant, si vous avez de nombreuses audiences et paywalls et que vos utilisateurs disposent d'une connexion internet faible, la récupération d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher du tout. Pour résoudre ce problème, vous pouvez utiliser la méthode `getPaywallForDefaultAudience`, qui récupère le paywall du placement spécifié pour l'audience **All Users**. Cependant, il est essentiel de comprendre que l'approche recommandée est de récupérer le paywall via la méthode `getPaywall`, comme détaillé dans la section [Récupérer les informations du paywall](flutter-get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getPaywall` La méthode `getPaywallForDefaultAudience` présente quelques inconvénients importants : - **Problèmes potentiels de compatibilité descendante** : si vous devez afficher des paywalls différentes pour différentes versions de l'application (actuelle et futures), vous risquez de rencontrer des difficultés. Vous devrez soit concevoir des paywalls compatibles avec la version actuelle (legacy), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des paywalls non affichées. - **Perte de ciblage** : tous les utilisateurs verront la même paywall conçue pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment par pays, attribution marketing ou attributs personnalisés). Si vous êtes prêt à accepter ces inconvénients pour bénéficier d'une récupération plus rapide du paywall, utilisez la méthode `getPaywallForDefaultAudience` comme suit. Sinon, utilisez `getPaywall` décrit [ci-dessus](#fetch-paywall-designed-with-paywall-builder). ::: ```dart showLineNumbers try { final paywall = await Adapty().getPaywallForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID'); } on AdaptyError catch (adaptyError) { // handle error } catch (e) { // handle unknown error } ``` :::note La méthode `getPaywallForDefaultAudience` est disponible à partir de la version 3.2.0 du SDK Flutter. ::: | Paramètre | Présence | Description | |---------|--------|-----------| | **placementId** | requis | L'identifiant du [Placement](placements). C'est la valeur que vous avez spécifiée lors de la création d'un placement dans votre Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et notre recommandation d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs ne disposent peut-être pas des toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache n'est pas effacé au redémarrage de l'application ; il n'est supprimé que lors d'une réinstallation ou d'un nettoyage manuel.
| ## Personnaliser les assets \{#customize-assets\} Pour personnaliser les images et vidéos de votre paywall, implémentez des assets personnalisés. Les images et vidéos hero ont des identifiants prédéfinis : `hero_image` et `hero_video`. Dans un bundle d'assets personnalisés, vous ciblez ces éléments par leurs identifiants pour personnaliser leur comportement. Pour les autres images et vidéos, vous devez [définir un identifiant personnalisé](custom-media) dans l'Adapty Dashboard. Par exemple, vous pouvez : - Afficher une image ou une vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. :::important Pour utiliser cette fonctionnalité, mettez à jour le SDK Flutter d'Adapty vers la version 3.8.0 ou supérieure. ::: Voici un exemple montrant comment fournir des ressources personnalisées via un simple dictionnaire : ```dart final customAssets = { // Show a local image using a custom ID 'custom_image': AdaptyCustomAsset.localImageAsset( assetId: 'assets/images/image_name.png', ), // Show a local video with a preview image 'hero_video': AdaptyCustomAsset.localVideoAsset( assetId: 'assets/videos/custom_video.mp4', ), }; try { final view = await AdaptyUI().createPaywallView( paywall: paywall, customAssets: customAssets, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` :::note Si un asset est introuvable, le paywall reviendra à son apparence par défaut. ::: ## Configurer les minuteries définies par le développeur \{#set-up-developer-defined-timers\} Pour utiliser des minuteries personnalisées dans votre application mobile, passez une map `customTimers` à la méthode `createPaywallView`. Chaque clé de la map est un identifiant de minuterie, et sa valeur est un objet `DateTime` qui définit quand la minuterie se termine. Voici un exemple : ```dart showLineNumbers try { final view = await AdaptyUI().createPaywallView( paywall: paywall, customTimers: { 'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)), 'CUSTOM_TIMER_NY': DateTime(2025, 1, 1), // New Year 2025 }, ); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` Dans cet exemple, `CUSTOM_TIMER_NY` et `CUSTOM_TIMER_6H` sont les **Timer ID**s des minuteurs définis par le développeur dans l'Adapty Dashboard. La map `customTimers` permet à votre application de mettre à jour dynamiquement chaque minuteur avec la valeur correcte. Par exemple : - `CUSTOM_TIMER_NY` : le temps restant jusqu'à la fin du minuteur, par exemple le Jour de l'An. - `CUSTOM_TIMER_6H` : le temps restant dans une période de 6 heures démarrée lorsque l'utilisateur a ouvert le paywall.
## Le nombre de vues du paywall est trop élevé \{#the-paywall-view-number-is-too-big\}
**Problème** : Le nombre de vues du paywall affiche le double de la valeur attendue.
**Cause** : Vous appelez peut-être `logShowFlow` (SDK Flutter v4+) / `logShowPaywall` dans votre code, ce qui duplique le compteur de vues si vous utilisez le Paywall Builder ou le Flow Builder. Pour les flows et les paywalls créés avec ces outils, les statistiques sont suivies automatiquement — il n'est donc pas nécessaire d'appeler cette méthode.
**Solution** : Vérifiez que vous n'appelez pas `logShowFlow` (SDK Flutter v4+) / `logShowPaywall` dans votre code si vous utilisez le Paywall Builder ou le Flow Builder.
## Autres problèmes \{#other-issues\}
**Problème** : Vous rencontrez d'autres problèmes liés au Paywall Builder qui ne sont pas couverts ci-dessus.
**Solution** : Mettez à jour le SDK vers la dernière version à l'aide des [guides de migration](flutter-sdk-migration-guides) si nécessaire. De nombreux problèmes sont résolus dans les versions plus récentes du SDK.
---
# File: flutter-present-flows-in-observer-mode
---
---
title: "Présenter des flows en mode Observer dans le SDK Flutter"
description: "Présentez des flows et des paywalls Paywall Builder en mode Observer dans votre application Flutter tout en gérant les achats avec votre propre code."
---
Si vous avez personnalisé un flow ou un paywall avec le builder, vous n'avez pas besoin de vous soucier du rendu dans votre code d'application mobile pour l'afficher à l'utilisateur. Ce type de flow ou paywall contient à la fois ce qui doit être affiché et comment il doit l'être.
:::warning
Cette section concerne uniquement le [mode Observer](observer-vs-full-mode). Si vous ne travaillez pas en mode Observer, consultez la rubrique [Afficher des flows & paywalls](flutter-present-paywalls).
:::
:::info
Cette fonctionnalité nécessite Adapty Flutter SDK 4.0 ou version ultérieure — elle n'était auparavant disponible que dans les SDK natifs iOS et Android. Consultez le [guide de migration](migration-to-flutter-sdk-v4) pour effectuer la mise à niveau.
:::
Par défaut, le SDK essaie de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les paywalls en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](flutter-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement et un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour garantir que vous obtenez toujours la dernière version de vos paywalls tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre différentes requêtes en interne.
| :::note Dans la v4, `getFlow` ne prend pas de paramètre `locale`. Pour les paywalls personnalisés, toutes les localisations disponibles sont retournées dans les Remote Configs du flow (`flow.remoteConfigs`) — choisissez celle qui correspond à la langue de l'appareil ou au paramètre de l'application. Voir [Localisations et codes de langue](flutter-localizations-and-locale-codes). ::: Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Un objet `AdaptyFlow` contenant les identifiants du flow (`instanceIdentity`, `variationId`), son nom, son placement, ses variantes de paywall (`paywalls`) et les Remote Configs éventuels (`remoteConfigs`). | ## Récupérer les produits \{#fetch-products\} Une fois que vous disposez du flow, vous pouvez interroger le tableau de produits qui lui correspond : ```dart showLineNumbers try { final products = await Adapty().getPaywallProducts(flow: flow); // the requested products array } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { // handle the error } ``` Paramètres de réponse : | Paramètre | Description | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | Liste d'objets [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) avec : identifiant du produit, nom du produit, prix, devise, durée de l'abonnement et plusieurs autres propriétés. | Lors de l'implémentation de votre propre design de paywall, vous aurez probablement besoin d'accéder à ces propriétés depuis l'objet [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html). Les propriétés les plus couramment utilisées sont présentées ci-dessous, mais consultez le document lié pour obtenir tous les détails sur l'ensemble des propriétés disponibles. | Propriété | Description | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Pour afficher le titre du produit, utilisez `product.localizedTitle`. La localisation est basée sur le pays du store sélectionné par l'utilisateur, et non sur la langue de l'appareil. | | **Price** | Pour afficher une version localisée du prix, utilisez `product.price.localizedString`. La localisation est basée sur les paramètres régionaux de l'appareil. Vous pouvez aussi accéder au prix sous forme numérique via `product.price.amount`. La valeur est fournie dans la devise locale. Pour obtenir le symbole de devise associé, utilisez `product.price.currencySymbol`. | | **Subscription Period** | Pour afficher la période (ex. semaine, mois, année, etc.), utilisez `product.subscription?.localizedPeriod`. La localisation est basée sur les paramètres régionaux de l'appareil. Pour récupérer la période d'abonnement par programmation, utilisez `product.subscription?.period`. Vous pouvez ensuite accéder à l'enum `unit` pour obtenir la durée (i.e. day, week, month, year ou unknown). La valeur `numberOfUnits` vous donne le nombre d'unités de période. Par exemple, pour un abonnement trimestriel, vous verrez `AdaptyPeriodUnit.month` dans la propriété unit, et `3` dans la propriété numberOfUnits. | | **Introductory Offer** | Pour afficher un badge ou tout autre indicateur signalant qu'un abonnement contient une offre de lancement, consultez la propriété `product.subscription?.offer?.phases`. Il s'agit d'une liste pouvant contenir jusqu'à deux phases de remise : la phase d'essai gratuit et la phase de prix de lancement. Chaque objet de phase contient les propriétés utiles suivantes :Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
|optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](flutter-localizations-and-locale-codes) pour plus d'informations sur les codes de langue et la façon dont nous recommandons de les utiliser.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache lorsqu'elles existent. Dans ce cas, les utilisateurs ne disposeront peut-être pas des toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la désinstallation ou via un nettoyage manuel.
Le SDK Adapty stocke les paywalls sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](flutter-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour garantir que vous obtenez toujours la dernière version de vos paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont retournés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut être composée de différentes requêtes en interne.
| N'utilisez pas d'identifiants de produits codés en dur ! Étant donné que les paywalls sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent évoluer au fil du temps. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, elle doit afficher les 3 sans nécessiter de modification du code. La seule chose à coder en dur est l'identifiant de placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Un objet [`AdaptyPaywall`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywall-class.html) contenant : une liste d'identifiants de produits, l'identifiant du paywall, le Remote Config et plusieurs autres propriétés. | ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le paywall, vous pouvez récupérer le tableau de produits qui lui correspond : ```dart showLineNumbers try { final products = await Adapty().getPaywallProducts(paywall: paywall); // the requested products array } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` Paramètres de la réponse : | Paramètre | Description | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | Liste d'objets [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html) avec : identifiant du produit, nom du produit, prix, devise, durée de l'abonnement et plusieurs autres propriétés. | Lors de la mise en œuvre de votre propre design de paywall, vous aurez probablement besoin d'accéder à ces propriétés depuis l'objet [`AdaptyPaywallProduct`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyPaywallProduct-class.html). Les propriétés les plus couramment utilisées sont présentées ci-dessous, mais consultez le document lié pour obtenir tous les détails sur l'ensemble des propriétés disponibles. | Propriété | Description | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Pour afficher le titre du produit, utilisez `product.localizedTitle`. La localisation est basée sur le pays du store sélectionné par l'utilisateur, et non sur la locale de l'appareil. | | **Price** | Pour afficher une version localisée du prix, utilisez `product.price.localizedString`. Cette localisation est basée sur la locale de l'appareil. Vous pouvez également accéder au prix sous forme de nombre avec `product.price.amount`. La valeur sera fournie dans la devise locale. Pour obtenir le symbole de devise associé, utilisez `product.price.currencySymbol`. | | **Subscription Period** | Pour afficher la période (par exemple semaine, mois, année, etc.), utilisez `product.subscription?.localizedPeriod`. Cette localisation est basée sur la locale de l'appareil. Pour récupérer la période d'abonnement par programmation, utilisez `product.subscription?.period`. Vous pouvez ensuite accéder à l'enum `unit` pour obtenir la durée (c'est-à-dire day, week, month, year ou unknown). La valeur `numberOfUnits` vous donnera le nombre d'unités de période. Par exemple, pour un abonnement trimestriel, vous verrez `AdaptyPeriodUnit.month` dans la propriété unit, et `3` dans la propriété numberOfUnits. | | **Introductory Offer** | Pour afficher un badge ou un autre indicateur signalant qu'un abonnement contient une offre de lancement, consultez la propriété `product.subscription?.offer?.phases`. Il s'agit d'une liste pouvant contenir jusqu'à deux phases de réduction : la phase d'essai gratuit et la phase de prix de lancement. Chaque objet de phase contient les propriétés utiles suivantes :optionnel
défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](flutter-localizations-and-locale-codes) pour plus d'informations sur les codes de langue et la façon dont nous recommandons de les utiliser.
| | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc fiable à utiliser durant la session pour éviter des requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
|Si la requête a abouti, la réponse contient cet objet. Un objet [AdaptyProfile](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyProfile-class.html) fournit des informations complètes sur les niveaux d'accès, les abonnements et les achats uniques d'un utilisateur dans l'application.
Vérifiez le statut du niveau d'accès pour déterminer si l'utilisateur dispose de l'accès requis à l'application.
| :::warning **Remarque :** si vous utilisez encore la version StoreKit d'Apple inférieure à v2.0 et une version du SDK Adapty inférieure à v2.9.0, vous devez fournir le [secret partagé de l'App Store Apple](app-store-connection-configuration#step-5-enter-app-store-shared-secret) à la place. Cette méthode est désormais dépréciée par Apple. ::: ## Changer d'abonnement lors d'un achat \{#change-subscription-when-making-a-purchase\} Lorsqu'un utilisateur opte pour un nouvel abonnement plutôt que de renouveler l'abonnement en cours, le comportement dépend du store : - Pour l'App Store, l'abonnement est automatiquement mis à jour au sein du groupe d'abonnements. Si un utilisateur souscrit un abonnement d'un groupe alors qu'il possède déjà un abonnement d'un autre groupe, les deux abonnements seront actifs simultanément. - Pour Google Play, l'abonnement n'est pas automatiquement mis à jour. Vous devrez gérer le changement dans le code de votre application mobile comme décrit ci-dessous. Pour remplacer un abonnement par un autre sur Android, appelez la méthode `.makePurchase()` avec le paramètre supplémentaire : ```dart showLineNumbers try { final subscriptionUpdateParams = AdaptyAndroidSubscriptionUpdateParameters( 'OLD_PRODUCT_ID', AdaptyAndroidSubscriptionUpdateReplacementMode.immediateWithTimeProration, ); final result = await Adapty().makePurchase( product: product, parameters: AdaptyPurchaseParameters( subscriptionUpdateParams: subscriptionUpdateParams, ), ); // successful cross-grade } on AdaptyError catch (adaptyError) { // Handle the error } catch (e) { // Handle the error } ``` Paramètre de requête supplémentaire : | Paramètre | Présence | Description | | :--------------------------- | :------- |:--------------------------------------------------------------------------------------------------------| | **parameters** | requis | un objet `AdaptyPurchaseParameters` dont le champ `subscriptionUpdateParams` est défini sur un objet [`AdaptyAndroidSubscriptionUpdateParameters`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyAndroidSubscriptionUpdateParameters-class.html). | Vous pouvez en savoir plus sur les abonnements et les modes de remplacement dans la documentation Google Developer : - [À propos des modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Recommandations de Google pour les modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - Mode de remplacement [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Remarque : cette méthode est disponible uniquement pour les montées de version d'abonnement. Les passages à une version inférieure ne sont pas pris en charge. - Mode de remplacement [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Remarque : le changement d'abonnement effectif n'aura lieu qu'à la fin de la période de facturation en cours. ## Utiliser des codes promo sur iOS \{#redeem-offer-codes-in-ios\}Un objet [`AdaptyProfile`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyProfile-class.html). Ce modèle contient les informations sur les niveaux d'accès, les abonnements et les achats uniques.
Vérifiez le **statut du niveau d'accès** pour déterminer si l'utilisateur a accès à l'application.
| :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: --- # File: implement-observer-mode-flutter --- --- title: "Implémenter le mode Observer dans le SDK Flutter" description: "Implémentez le mode Observer dans Adapty pour suivre les événements d'abonnement des utilisateurs dans le SDK Flutter." --- Si vous disposez déjà de votre propre infrastructure d'achat et n'êtes pas prêt à basculer complètement vers Adapty, vous pouvez explorer le [mode Observer](observer-vs-full-mode). Dans sa forme de base, le mode Observer offre des analyses avancées et une intégration transparente avec les systèmes d'attribution et d'analytics. Si cela correspond à vos besoins, vous devez uniquement : 1. L'activer lors de la configuration du SDK Adapty en définissant le paramètre `observerMode` sur `true`. Suivez les instructions d'installation pour [Flutter](sdk-installation-flutter#activate-adapty-module-of-adapty-sdk). 2. [Signaler les transactions](report-transactions-observer-mode-flutter) depuis votre infrastructure d'achat existante vers Adapty. ## Configuration du mode Observer \{#observer-mode-setup\} Activez le mode Observer si vous gérez vous-même les achats et le statut des abonnements, et que vous utilisez Adapty uniquement pour envoyer les événements d'abonnement et les données analytics. :::important En mode Observer, le SDK Adapty ne clôture aucune transaction — assurez-vous donc de les gérer vous-même. ::: ```dart showLineNumbers title="main.dart" await Adapty().activate( configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY') ..withObserverMode(true) // Enable observer mode ..withLogLevel(AdaptyLogLevel.verbose), ); ``` Paramètres : | Paramètre | Description | | --------------------------- | ------------------------------------------------------------ | | observerMode | Valeur booléenne qui contrôle le [mode Observer](observer-vs-full-mode). La valeur par défaut est `false`. | ## Utiliser les paywalls Adapty en mode Observer \{#using-adapty-paywalls-in-observer-mode\} Si vous souhaitez également utiliser les paywalls et les fonctionnalités de test A/B d'Adapty, c'est possible — mais cela nécessite une configuration supplémentaire en mode Observer. Voici ce que vous devrez faire en plus des étapes ci-dessus : 1. Affichez les paywalls normalement pour les [paywalls Remote Config](present-remote-config-paywalls-flutter). 3. [Associez les paywalls](report-transactions-observer-mode-flutter) aux transactions d'achat. :::tip Dans le SDK v4, vous pouvez également présenter des flows et des paywalls générés par Adapty en mode Observer : enregistrez un `AdaptyUIObserverModeResolver` pour effectuer l'achat ou la restauration avec votre propre code lorsqu'un utilisateur appuie sur le bouton correspondant. Voir [Présenter des flows en mode Observer](flutter-present-flows-in-observer-mode). ::: --- # File: report-transactions-observer-mode-flutter --- --- title: "Signaler les transactions en Observer Mode dans le SDK Flutter" description: "Signalez les transactions d'achat en Adapty Observer Mode pour les informations utilisateur et le suivi des revenus dans le SDK Flutter." ---phoneNumber
firstName
lastName
| String | | gender | Enum, valeurs autorisées : `female`, `male`, `other` | | birthday | Date | ### Attributs utilisateur personnalisés \{#custom-user-attributes\} Vous pouvez définir vos propres attributs personnalisés, généralement liés à l'utilisation de votre application. Par exemple, pour une application de fitness, il peut s'agir du nombre d'exercices par semaine ; pour une application d'apprentissage des langues, du niveau de connaissance de l'utilisateur, etc. Vous pouvez les utiliser dans des segments pour créer des paywalls et des offres ciblées, et dans vos analyses pour identifier quelles métriques produit influencent le plus les revenus. ```dart showLineNumbers try { final builder = AdaptyProfileParametersBuilder() ..setCustomStringAttribute('value1', 'key1') ..setCustomDoubleAttribute(1.0, 'key2'); await Adapty().updateProfile(builder.build()); } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` Pour supprimer une clé existante, utilisez la méthode `.withRemoved(customAttributeForKey:)` : ```dart showLineNumbers try { final builder = AdaptyProfileParametersBuilder() ..removeCustomAttribute('key1') ..removeCustomAttribute('key2'); await Adapty().updateProfile(builder.build()); } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` Il peut arriver que vous ayez besoin de connaître les attributs personnalisés déjà définis. Pour cela, utilisez le champ `customAttributes` de l'objet `AdaptyProfile`. :::warning Gardez à l'esprit que la valeur de `customAttributes` peut ne pas être à jour, car les attributs utilisateur peuvent être envoyés depuis différents appareils à tout moment. Les attributs sur le serveur peuvent donc avoir été modifiés depuis la dernière synchronisation. ::: ### Limites \{#limits\} - Maximum 30 attributs personnalisés par utilisateur - Les noms de clés peuvent comporter jusqu'à 30 caractères. Le nom de clé peut contenir des caractères alphanumériques ainsi que : `_` `-` `.` - La valeur peut être une chaîne de caractères ou un nombre flottant de 50 caractères maximum. --- # File: flutter-listen-subscription-changes --- --- title: "Vérifier le statut d'abonnement dans le SDK Flutter" description: "Suivez et gérez le statut d'abonnement des utilisateurs dans Adapty pour améliorer la rétention client dans votre app Flutter." --- Avec Adapty, suivre le statut d'abonnement est simple. Pas besoin d'insérer manuellement des identifiants de produits dans votre code. Il vous suffit de vérifier la présence d'un [niveau d'accès](access-level) actif pour confirmer l'abonnement d'un utilisateur.Un objet [AdaptyProfile](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyProfile-class.html). En général, il suffit de vérifier le statut du niveau d'accès du profil pour déterminer si l'utilisateur bénéficie d'un accès premium à l'app.
La méthode `.getProfile` fournit le résultat le plus à jour car elle interroge toujours l'API. Si, pour une raison quelconque (par exemple, absence de connexion internet), le SDK Adapty ne parvient pas à récupérer les informations depuis le serveur, les données du cache sont renvoyées. Il est également important de noter que le SDK Adapty met à jour régulièrement le cache `AdaptyProfile` afin de maintenir ces informations aussi à jour que possible.
| La méthode `.getProfile()` vous fournit le profil utilisateur depuis lequel vous pouvez obtenir le statut du niveau d'accès. Vous pouvez avoir plusieurs niveaux d'accès par app. Par exemple, si vous avez une application d'actualités et vendez des abonnements à différentes thématiques indépendamment, vous pouvez créer les niveaux d'accès "sports" et "science". Mais la plupart du temps, un seul niveau d'accès suffit ; dans ce cas, vous pouvez simplement utiliser le niveau d'accès "premium" par défaut. Voici un exemple de vérification du niveau d'accès "premium" par défaut : ```dart showLineNumbers try { final profile = await Adapty().getProfile(); if (profile?.accessLevels['premium']?.isActive ?? false) { // grant access to premium features } } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { } ``` ### Écouter les mises à jour du statut d'abonnement \{#listening-for-subscription-status-updates\} Chaque fois que l'abonnement d'un utilisateur change, Adapty déclenche un événement. Pour recevoir les messages d'Adapty, une configuration supplémentaire est nécessaire : ```dart showLineNumbers Adapty().didUpdateProfileStream.listen((profile) { // handle any changes to subscription state }); ``` Adapty déclenche également un événement au démarrage de l'application. Dans ce cas, le statut d'abonnement mis en cache est transmis. ### Cache du statut d'abonnement \{#subscription-status-cache\} Le cache implémenté dans le SDK Adapty stocke le statut d'abonnement du profil. Ainsi, même si le serveur est indisponible, les données en cache restent accessibles pour fournir les informations relatives au statut d'abonnement du profil. Il est cependant important de noter qu'il n'est pas possible d'interroger directement le cache. Le SDK interroge périodiquement le serveur toutes les minutes pour détecter les mises à jour ou modifications liées au profil. En cas de changements, comme de nouvelles transactions ou d'autres mises à jour, ceux-ci sont envoyés dans le cache afin de le maintenir synchronisé avec le serveur. --- # File: flutter-deal-with-att --- --- title: "Gérer l'ATT dans le SDK Flutter" description: "Commencez avec Adapty sur Flutter pour simplifier la configuration et la gestion des abonnements." --- Si votre application utilise le framework AppTrackingTransparency et affiche une demande d'autorisation de suivi à l'utilisateur, vous devez envoyer le [statut d'autorisation](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) à Adapty. ```dart showLineNumbers final builder = AdaptyProfileParametersBuilder() ..setAppTrackingTransparencyStatus(AdaptyIOSAppTrackingTransparencyStatus.authorized); try { await Adapty().updateProfile(builder.build()); } on AdaptyError catch (adaptyError) { // handle the error } catch (e) { // handle unknown error } ``` :::warning Nous vous recommandons vivement d'envoyer cette valeur le plus tôt possible dès qu'elle change — c'est la seule façon de transmettre les données en temps voulu aux intégrations que vous avez configurées. ::: --- # File: kids-mode-flutter --- --- title: "Mode Enfants dans le SDK Flutter" description: "Activez facilement le Mode Enfants pour respecter les politiques d'Apple et de Google. Aucune donnée IDFA, GAID ni publicitaire collectée dans le SDK Flutter." --- Si votre application Flutter est destinée aux enfants, vous devez respecter les politiques d'[Apple](https://developer.apple.com/kids/) et de [Google](https://support.google.com/googleplay/android-developer/answer/9893335). Si vous utilisez le SDK Adapty, quelques étapes simples vous permettront de le configurer pour satisfaire ces politiques et passer les revues des stores. ## Qu'est-ce qui est requis ? \{#whats-required\} Vous devez configurer le SDK Adapty pour désactiver la collecte de : - [IDFA (Identifier for Advertisers)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers) (iOS) - [Android Advertising ID (AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248) (Android) - [adresse IP](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) De plus, nous recommandons d'utiliser l'identifiant utilisateur client avec précaution. Un identifiant au format `optionnel
défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag est pour la langue, le second est pour la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
| | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK essaie de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement en deux couches : le cache régulièrement mis à jour décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant au cas où le CDN serait inaccessible. Ce système est conçu pour vous garantir toujours la dernière version de vos onboardings tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | défaut : 5 sec |Cette valeur limite le délai d'attente pour cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront retournés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut impliquer différentes requêtes en coulisses.
| Paramètres de réponse : | Paramètre | Description | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Un objet [`AdaptyOnboarding`](https://pub.dev/documentation/adapty_flutter/latest/adapty_flutter/AdaptyOnboarding-class.html) contenant : l'identifiant et la configuration de l'onboarding, le Remote Config, et plusieurs autres propriétés. | ## Accélérer la récupération de l'onboarding avec l'onboarding de l'audience par défaut \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} En général, les onboardings sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et onboardings et que vos utilisateurs ont une connexion internet faible, la récupération d'un onboarding peut prendre plus de temps que souhaité. Dans ces situations, vous pourriez vouloir afficher un onboarding par défaut pour garantir une expérience utilisateur fluide plutôt que de n'afficher aucun onboarding. Pour y remédier, vous pouvez utiliser la méthode `getOnboardingForDefaultAudience`, qui récupère l'onboarding du placement spécifié pour l'audience **All Users**. Cependant, il est crucial de comprendre que l'approche recommandée reste de récupérer l'onboarding avec la méthode `getOnboarding`, comme décrit dans la section [Récupérer un onboarding](#fetch-onboarding) ci-dessus. :::warning Préférez `getOnboarding` à `getOnboardingForDefaultAudience`, car cette dernière présente des limitations importantes : - **Problèmes de compatibilité** : Peut créer des problèmes lors de la prise en charge de plusieurs versions de l'application, nécessitant soit des designs rétrocompatibles, soit d'accepter que les anciennes versions puissent s'afficher incorrectement. - **Pas de personnalisation** : Affiche uniquement le contenu pour l'audience « All Users », supprimant le ciblage basé sur le pays, l'attribution ou les attributs personnalisés. Si une récupération plus rapide l'emporte sur ces inconvénients pour votre cas d'utilisation, utilisez `getOnboardingForDefaultAudience` comme indiqué ci-dessous. Sinon, utilisez `getOnboarding` comme décrit [ci-dessus](#fetch-onboarding). ::: ```dart showLineNumbers try { final onboarding = await Adapty().getOnboardingForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID'); } on AdaptyError catch (adaptyError) { // handle error } catch (e) { // handle unknown error } ``` Paramètres : | Paramètre | Présence | Description | |-----------------|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | requis | L'identifiant du [Placement](placements) souhaité. C'est la valeur que vous avez spécifiée lors de la création d'un placement dans l'Adapty Dashboard. | | **locale** |optionnel
défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag est pour la langue, le second est pour la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
| | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK essaie de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement en deux couches : le cache régulièrement mis à jour décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant au cas où le CDN serait inaccessible. Ce système est conçu pour vous garantir toujours la dernière version de vos onboardings tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| --- # File: flutter-present-onboardings --- --- title: "Afficher les onboardings dans Flutter SDK" description: "Découvrez comment présenter efficacement les onboardings pour générer plus de conversions." --- :::warning **Les onboardings sont dépréciés dans le SDK v4 et seront supprimés dans une prochaine version.** Ils ne reçoivent plus de correctifs ni d'améliorations. Utilisez plutôt les [flows](flutter-get-pb-paywalls) : contrairement aux onboardings qui s'exécutent dans une WebView, les flows s'affichent nativement sur l'appareil — pour des animations plus fluides, un rendu natif cohérent, des temps de chargement réduits, et sans dépendance au runtime WebView. Consultez [Obtenir des flows et paywalls](flutter-get-pb-paywalls) et [Afficher des flows et paywalls](flutter-present-paywalls) pour démarrer. ::: Si vous avez personnalisé un onboarding à l'aide du builder, vous n'avez pas à vous soucier de son rendu dans le code de votre application Flutter pour l'afficher à l'utilisateur. Un tel onboarding contient à la fois ce qui doit être affiché et la manière dont cela doit l'être. Avant de commencer, vérifiez que : 1. Vous avez installé le [SDK Flutter Adapty](sdk-installation-flutter) version 3.8.0 ou ultérieure. 2. Vous avez [créé un onboarding](create-onboarding). 3. Vous avez ajouté l'onboarding à un [placement](placements). Le SDK Flutter Adapty propose deux façons d'afficher les onboardings : - **Écran autonome** - **Widget intégré** ## Afficher en écran autonome \{#present-as-standalone-screen\} Pour afficher un onboarding en écran autonome, utilisez la méthode `onboardingView.present()` sur l'`onboardingView` créé par la méthode `createOnboardingView`. Chaque `view` ne peut être utilisée qu'une seule fois. Si vous devez afficher l'onboarding à nouveau, appelez `createOnboardingView` une nouvelle fois pour créer une nouvelle instance d'`onboardingView`. :::warning Réutiliser le même `onboardingView` sans le recréer peut provoquer une erreur `AdaptyUIError.viewAlreadyPresented`. ::: ```dart showLineNumbers title="Flutter" try { await onboardingView.present(); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ### Fermer l'onboarding \{#dismiss-the-onboarding\} Pour fermer l'onboarding par programmation, utilisez la méthode `dismiss()` : ```dart showLineNumbers title="Flutter" try { await onboardingView.dismiss(); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ### Configurer le style de présentation iOS \{#configure-ios-presentation-style\} Configurez la façon dont l'onboarding est présenté sur iOS en passant le paramètre `iosPresentationStyle` à la méthode `present()`. Ce paramètre accepte les valeurs `AdaptyUIIOSPresentationStyle.fullScreen` (par défaut) ou `AdaptyUIIOSPresentationStyle.pageSheet`. ```dart showLineNumbers try { await onboardingView.present(iosPresentationStyle: AdaptyUIIOSPresentationStyle.pageSheet); } on AdaptyError catch (e) { // handle the error } catch (e) { // handle the error } ``` ## Intégrer dans la hiérarchie de widgets \{#embed-in-widget-hierarchy\} Pour intégrer un onboarding dans votre arbre de widgets existant, utilisez directement le widget `AdaptyUIOnboardingPlatformView` dans votre hiérarchie de widgets Flutter. ```dart showLineNumbers title="Flutter" AdaptyUIOnboardingPlatformView( onboarding: onboarding, // The onboarding object you fetched onDidFinishLoading: (meta) { }, onDidFailWithError: (error) { }, onCloseAction: (meta, actionId) { }, onPaywallAction: (meta, actionId) { }, onCustomAction: (meta, actionId) { }, onStateUpdatedAction: (meta, elementId, params) { }, onAnalyticsEvent: (meta, event) { }, ) ``` :::note Pour que la platform view Android fonctionne, assurez-vous que votre `MainActivity` étend `FlutterFragmentActivity` : ```kotlin showLineNumbers title="Kotlin" class MainActivity : FlutterFragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } } ``` ::: ## Chargement pendant l'onboarding \{#loader-during-onboarding\} Lors de l'affichage d'un onboarding, vous pouvez remarquer un bref écran de chargement entre votre splash screen et l'onboarding, le temps que la vue sous-jacente s'initialise. Vous pouvez gérer cela de différentes façons selon vos besoins. #### Contrôler le splash screen via onDidFinishLoading \{#control-splash-screen-using-ondidfinishloading\} :::note Cette approche est uniquement disponible lors de l'intégration de l'onboarding en tant que widget. Elle n'est pas disponible pour la présentation en écran autonome. ::: L'approche multiplateforme recommandée consiste à maintenir votre splash screen ou votre overlay personnalisé visible jusqu'à ce que l'onboarding soit entièrement chargé, puis à le masquer manuellement. Lorsque vous utilisez le widget intégré, superposez votre propre widget au-dessus de lui et masquez l'overlay lorsque `onDidFinishLoading` se déclenche : ```dart showLineNumbers title="Flutter" AdaptyUIOnboardingPlatformView( onboarding: onboarding, onDidFinishLoading: (meta) { // Hide your custom splash screen or overlay here }, // ... other callbacks ) ``` ### Personnaliser le loader natif \{#customize-native-loader\} :::important Cette approche est spécifique à chaque plateforme et nécessite la maintenance de code UI natif. Elle n'est pas recommandée sauf si vous maintenez déjà des couches natives distinctes dans votre application. ::: Si vous avez besoin de personnaliser le loader par défaut lui-même, vous pouvez le remplacer par des mises en page spécifiques à chaque plateforme. Cette approche nécessite des implémentations séparées pour Android et iOS : - **iOS** : Ajoutez `AdaptyOnboardingPlaceholderView.xib` à votre projet Xcode - **Android** : Créez `adapty_onboarding_placeholder_view.xml` dans `res/layout` et définissez-y un placeholder ## Personnaliser l'ouverture des liens dans les onboardings \{#customize-how-links-open-in-onboardings\} :::important La personnalisation de l'ouverture des liens dans les onboardings est disponible à partir du SDK Adapty v3.15.1. ::: Par défaut, les liens dans les onboardings s'ouvrent dans un navigateur intégré à l'application. Cela offre une expérience utilisateur fluide en affichant les pages web directement dans votre application, sans avoir à changer d'app. Si vous préférez ouvrir les liens dans un navigateur externe, vous pouvez personnaliser ce comportement en définissant le paramètre `externalUrlsPresentation` sur `AdaptyWebPresentation.externalBrowser` :
Vous pouvez ensuite utiliser cet ID dans votre code et le traiter comme une action personnalisée. Par exemple, si un utilisateur appuie sur un bouton personnalisé, comme **Login** ou **Allow notifications**, la méthode déléguée `onboardingController` sera déclenchée avec le cas `.custom(id:)` et le paramètre `actionId` correspond à l'**Action ID** du builder. Vous pouvez créer vos propres IDs, comme « allowNotifications ».
```dart
// Full-screen presentation
void onboardingViewOnCustomAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
String actionId,
) {
switch (actionId) {
case 'login':
_login();
break;
case 'allow_notifications':
_allowNotifications();
break;
}
}
// Embedded widget
onCustomAction: (meta, actionId) {
_handleCustomAction(actionId);
}
```
:::important
Notez que vous devez gérer ce qui se passe lorsqu'un utilisateur ferme l'onboarding. Par exemple, vous devez arrêter d'afficher l'onboarding lui-même.
:::
```dart showLineNumbers title="Flutter"
// Full-screen presentation
void onboardingViewOnCloseAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
String actionId,
) {
await view.dismiss();
}
// Embedded widget
onCloseAction: (meta, actionId) {
Navigator.of(context).pop();
}
```
Ce code d'erreur indique que l'utilisateur a annulé une demande de paiement.
Aucune action n'est requise, mais d'un point de vue logique métier, vous pouvez proposer une remise à votre utilisateur ou lui rappeler l'offre ultérieurement.
| | [paymentInvalid](https://developer.apple.com/documentation/storekit/skerror/code/paymentinvalid) | 3 | Cette erreur indique que l'un des paramètres de paiement n'a pas été reconnu par l'App Store. | | [paymentNotAllowed](https://developer.apple.com/documentation/storekit/skerror/code/paymentnotallowed) | 4 | Ce code d'erreur indique que l'utilisateur n'est pas autorisé à valider des paiements. | | [storeProductNotAvailable](https://developer.apple.com/documentation/storekit/skerror/code/storeproductnotavailable) | 5 | Ce code d'erreur indique que le produit demandé n'est pas disponible dans le store.L'[`identifiant`](https://developer.apple.com/documentation/storekit/skpaymentdiscount/identifier) de l'offre n'est pas valide. Par exemple, vous n'avez pas configuré d'offre avec cet identifiant dans l'App Store, ou vous avez révoqué l'offre.
Assurez-vous de configurer les offres souhaitées dans AppStore Connect et de transmettre un identifiant d'offre valide.
| | [invalidSignature](https://developer.apple.com/documentation/storekit/skerror/code/invalidsignature) | 12 | Ce code d'erreur indique que la signature d'une remise sur paiement n'est pas valide. | | [missingOfferParams](https://developer.apple.com/documentation/storekit/skerror/code/missingofferparams) | 13 | Ce code d'erreur indique que des paramètres sont manquants dans une remise sur paiement. | | [invalidOfferPrice](https://developer.apple.com/documentation/storekit/skerror/code/invalidofferprice/) | 14 | Ce code d'erreur indique que le prix que vous avez spécifié dans App Store Connect n'est plus valide. Les offres doivent toujours correspondre à un prix réduit. | ## Codes Android personnalisés \{#custom-android-codes\} | Erreur | Code | Solution | |-----|----|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | adaptyNotInitialized | 20 | Vous devez configurer correctement le SDK Adapty via la méthode `Adapty.activate`. Découvrez comment procéder [pour Flutter]( sdk-installation-flutter#activate-adapty-module-of-adapty-sdk). | | productNotFound | 22 | Cette erreur indique que le produit demandé pour l'achat n'est pas disponible dans le store. | | invalidJson | 23 | Le JSON du paywall n'est pas valide. Corrigez-le dans l'Adapty Dashboard. Consultez la rubrique [Personnaliser un paywall avec le Remote Config](customize-paywall-with-remote-config) pour savoir comment y remédier. | | currentSubscriptionToUpdateNotFoundInHistory | 24 | L'abonnement d'origine qui doit être renouvelé est introuvable. | | pendingPurchase | 25 | Cette erreur indique que l'état de l'achat est en attente et non finalisé. Consultez la page [Handling pending transactions](https://developer.android.com/google/play/billing/integrate#pending) dans la documentation Android Developer pour plus de détails. | | billingServiceTimeout | 97 | Cette erreur indique que la requête a atteint le délai d'expiration maximal avant que Google Play puisse répondre. Cela peut être dû, par exemple, à un retard dans l'exécution de l'action demandée par l'appel à la bibliothèque Play Billing. | | featureNotSupported | 98 | La fonctionnalité demandée n'est pas prise en charge par le Play Store sur l'appareil actuel. | | billingServiceDisconnected | 99 | Cette erreur fatale indique que la connexion de l'application cliente au service Google Play Store via le `BillingClient` a été interrompue. | | billingServiceUnavailable | 102 | Cette erreur temporaire indique que le service Google Play Billing est actuellement indisponible. Dans la plupart des cas, cela signifie qu'il y a un problème de connexion réseau entre l'appareil client et les services Google Play Billing. | | billingUnavailable | 103 |Cette erreur indique qu'une erreur de facturation utilisateur s'est produite lors du processus d'achat. Voici quelques exemples de cas où cela peut se produire :
1\. L'application Play Store sur l'appareil de l'utilisateur n'est pas à jour.
2. L'utilisateur se trouve dans un pays non pris en charge.
3. L'utilisateur est un utilisateur entreprise et son administrateur a désactivé les achats pour les utilisateurs.
4. Google Play n'est pas en mesure de débiter le mode de paiement de l'utilisateur. Par exemple, la carte de crédit de l'utilisateur a peut-être expiré.
5. L'utilisateur n'est pas connecté à l'application Play Store.
| | developerError | 105 | Il s'agit d'une erreur fatale indiquant que vous utilisez une API de manière incorrecte. | | billingError | 106 | Il s'agit d'une erreur fatale indiquant un problème interne à Google Play lui-même. | | itemAlreadyOwned | 107 | Le produit consommable a déjà été acheté. | | itemNotOwned | 108 | Cette erreur indique que l'action demandée sur l'article a échoué sin | ## Codes StoreKit personnalisés \{#custom-storekit-codes\} | Erreur | Code | Solution | |-----------------------------------------------------------------------------------------------------|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | noProductIDsFound | 1000 |Cette erreur indique qu'aucun des produits demandés sur le paywall n'est disponible à l'achat dans l'App Store, même s'ils y sont répertoriés. Cette erreur peut parfois s'accompagner d'un avertissement `InvalidProductIdentifiers`. Si l'avertissement apparaît sans erreur, ignorez-le.
Si vous rencontrez cette erreur, suivez les étapes de la section [Correctif pour l'erreur Code-1000 `noProductIDsFound`](InvalidProductIdentifiers-flutter).
| | noProductsFound | 1001 | Cette erreur indique que le produit demandé à l'achat n'est pas disponible dans le store. | | productRequestFailed | 1002 | Impossible de récupérer les produits disponibles pour le moment. | | cantMakePayments | 1003 | Les achats intégrés ne sont pas autorisés sur cet appareil. Consultez le [guide](cantMakePayments-flutter) de dépannage. | | noPurchasesToRestore | 1004 | Cette erreur indique que l'App Store n'a trouvé aucun achat à restaurer. | | [cantReadReceipt](https://developer.apple.com/documentation/storekit/skerror/code/paymentcancelled) | 1005 |Aucun reçu valide n'est disponible sur l'appareil. Cela peut poser problème lors des tests en sandbox.
En sandbox, vous n'aurez pas de fichier de reçu valide tant que vous n'avez pas effectué un achat — assurez-vous d'en faire un avant d'y accéder. Lors des tests en sandbox, vérifiez également que vous êtes connecté sur l'appareil avec un compte sandbox Apple valide.
| | productPurchaseFailed | 1006 | L'achat du produit a échoué. Cette erreur encapsule une erreur StoreKit sous-jacente — lisez l'erreur encapsulée (ou activez les logs verbeux pour la voir dans la console) pour en connaître la raison réelle. L'erreur encapsulée correspond généralement à l'un des codes StoreKit 0–14 du tableau ci-dessus — le plus souvent `paymentCancelled`, `paymentInvalid`, `paymentNotAllowed` ou `invalidOfferPrice`. Si vous ne parvenez pas à identifier une raison précise, essayez un nouveau [profil sandbox](test-purchases-in-sandbox) ; si l'échec persiste, contactez le support Apple. | | missingOfferSigningParams | 1007 |Cette erreur indique un problème d'intégration Adapty ou avec les offres.
Consultez [Configurer l'intégration App Store](app-store-connection-configuration) et [Offres](offers) pour savoir comment les configurer.
| | refreshReceiptFailed | 1010 | Cette erreur indique que le reçu n'a pas été reçu. Applicable à StoreKit 1 uniquement. | | receiveRestoredTransactionsFailed | 1011 | La restauration des achats a échoué. | ## Codes réseau personnalisés \{#custom-network-codes\} | Erreur | Code | Solution | | :------------------- | :--- |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | notActivated | 2002 | Le SDK Adapty n'est pas activé.
2. Cliquez sur le nom du groupe d'abonnements. Vos produits s'affichent dans la section **Subscriptions**.
3. Assurez-vous que le produit que vous testez est marqué **Ready to Submit**.
4. Comparez l'ID du produit dans le tableau avec celui de l'onglet [**Products**](https://app.adapty.io/products) dans l'Adapty Dashboard. Si les ID ne correspondent pas, copiez l'ID du produit depuis le tableau et [créez un produit](create-product) avec cet ID dans l'Adapty Dashboard.
## Étape 3. Vérifier la disponibilité du produit \{#step-4-check-product-availability\}
1. Retournez dans **App Store Connect** et ouvrez la même section **Subscriptions**.
2. Cliquez sur le nom du groupe d'abonnements pour afficher vos produits.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à la section **Availability** et vérifiez que tous les pays et régions requis y sont listés.
## Étape 4. Vérifier les prix du produit \{#step-5-check-product-prices\}
1. Retournez dans la section **Monetization** → **Subscriptions** d'**App Store Connect**.
2. Cliquez sur le nom du groupe d'abonnements.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à **Subscription Pricing** et développez la section **Current Pricing for New Subscribers**.
5. Assurez-vous que tous les prix requis sont bien listés.
## Étape 5. Vérifier que le statut paid, le compte bancaire et les formulaires fiscaux sont actifs \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. Sur la page d'accueil d'[**App Store Connect**](https://appstoreconnect.apple.com/), cliquez sur **Business**.
2. Sélectionnez le nom de votre entreprise.
3. Faites défiler vers le bas et vérifiez que votre **Paid Apps Agreement**, votre **Bank Account** et vos **Tax forms** affichent tous le statut **Active**.
En suivant ces étapes, vous devriez pouvoir résoudre l'avertissement `InvalidProductIdentifiers` et rendre vos produits disponibles dans le store.
## Étape 6. Recréer le produit s'il est bloqué \{#step-6-recreate-the-product-if-its-stuck\}
Les étapes 1 à 5 peuvent toutes être validées — statut `Approved`, Bundle ID correspondant, clé API valide — et pourtant le SDK renvoie quand même `1000 noProductIDsFound`. Dans ce cas, le produit est peut-être bloqué dans le registre d'Apple. Il arrive que le registre de produits d'Apple entre dans un état où un produit existe dans l'interface d'App Store Connect mais n'est pas exposé au chemin de recherche StoreKit.
Supprimez le produit dans App Store Connect et recréez-le avec le même ID de produit. Attendez jusqu'à 24 heures après la recréation pour que la propagation s'effectue.
---
# File: cantMakePayments-flutter
---
---
title: "Correction de l'erreur Code-1003 cantMakePayment dans le SDK Flutter"
description: "Résolvez l'erreur de paiement lors de la gestion des abonnements dans Adapty."
---
L'erreur 1003, `cantMakePayments`, indique que les achats intégrés ne peuvent pas être effectués sur cet appareil.
Si vous rencontrez l'erreur `cantMakePayments`, cela est généralement dû à l'une des raisons suivantes :
- Restrictions de l'appareil : L'erreur n'est pas liée à Adapty. Consultez les solutions ci-dessous.
- Configuration du mode Observateur : La méthode `makePurchase` et le mode Observateur ne peuvent pas être utilisés simultanément. Consultez la section ci-dessous.
## Problème : Restrictions de l'appareil \{#issue-device-restrictions\}
| Problème | Solution |
|--------------------------------|-------------------------------------------------------------------------------------------------------------|
| Restrictions Screen Time | Désactivez les restrictions d'achat intégré dans [Screen Time](https://support.apple.com/en-us/102470) |
| Compte suspendu | Contactez le support Apple pour résoudre les problèmes de compte |
| Restrictions régionales | Utilisez un compte App Store d'une région prise en charge |
## Problème : Utilisation simultanée du mode Observateur et de makePurchase \{#issue-using-both-observer-mode-and-makepurchase\}
Si vous utilisez `makePurchases` pour gérer les achats, vous n'avez pas besoin d'utiliser le mode Observateur. Le [mode Observateur](observer-vs-full-mode) n'est nécessaire que si vous implémentez vous-même la logique d'achat.
Ainsi, si vous utilisez `makePurchase`, vous pouvez supprimer en toute sécurité l'activation du mode Observateur dans le code d'initialisation du SDK.
---
# File: flutter-sdk-migration-guides
---
---
title: "Guides de migration Flutter SDK"
description: "Guides de migration pour les versions du SDK Flutter Adapty."
---
Cette page regroupe tous les guides de migration pour le SDK Flutter Adapty. Choisissez la version vers laquelle vous souhaitez migrer pour obtenir des instructions détaillées :
- **[Migrer vers la v4.0](migration-to-flutter-sdk-v4)**
- **[Migrer vers la v3.8](flutter-migration-guide-38)**
- **[Migrer vers la v3.4](migration-to-flutter-sdk-34)**
- **[Migrer vers la v3.3](migration-to-flutter330)**
- **[Migrer vers la v3.0](migration-to-flutter-sdk-v3)**
---
# File: migration-to-flutter-sdk-v4
---
---
title: "Migrer vers le SDK Flutter Adapty v. 4.0"
description: "Migrez vers le SDK Flutter Adapty v4.0 en remplaçant les API paywall par des API flow, compatibles avec le Flow Builder et le Paywall Builder."
---
Le SDK Flutter Adapty 4.0 introduit les flows et renomme les API paywall en conséquence. Les nouvelles API fonctionnent aussi bien avec le nouveau Flow Builder qu'avec le Paywall Builder existant — aucune modification de configuration n'est requise côté Adapty Dashboard.
## Référence rapide \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty().getPaywall(placementId: id)` | `Adapty().getFlow(placementId: id)` |
| `Adapty().getPaywallForDefaultAudience(placementId: id)` | `Adapty().getFlowForDefaultAudience(placementId: id)` |
| `Adapty().getPaywallProducts(paywall: paywall)` | `Adapty().getPaywallProducts(flow: flow)` |
| `Adapty().logShowPaywall(paywall: paywall)` | `Adapty().logShowFlow(flow: flow)` |
| `AdaptyPaywall` (type) | `AdaptyFlow` |
| `AdaptyPaywallFetchPolicy` (type) | `AdaptyFlowFetchPolicy` |
| `AdaptyUI().createPaywallView(paywall: paywall)` | `AdaptyUI().createFlowView(flow: flow)` |
| `AdaptyUIPaywallView` (type) | `AdaptyUIFlowView` |
| `AdaptyUIPaywallPlatformView` (widget) | `AdaptyUIFlowPlatformView` |
| `AdaptyUI().presentPaywallView(view)` / `dismissPaywallView(view)` | `AdaptyUI().presentFlowView(view)` / `dismissFlowView(view)` |
| `AdaptyUIPaywallsEventsObserver` | `AdaptyUIFlowsEventsObserver` |
| `AdaptyUI().setPaywallsEventsObserver(observer)` | `AdaptyUI().setFlowsEventsObserver(observer)` |
| `paywallViewDid*` callbacks | `flowViewDid*` callbacks |
| `paywallViewDidFailRendering` | `flowViewDidReceiveError` |
`AdaptyPaywallProduct` conserve son nom — les produits appartiennent toujours à un flow, et `getPaywallProducts` prend désormais un `AdaptyFlow`. Vous ne passez plus de `locale` lors de la récupération d'un flow. Les API d'achat et de profil (`makePurchase`, `restorePurchases`, `getProfile`, `identify`, etc.) sont inchangées, tout comme les méthodes de vue `present`, `dismiss` et `showDialog`. Certains comportements par défaut ont changé — voir [Changements des comportements par défaut](#default-behavior-changes).
## Versions minimales \{#minimum-versions\}
Adapty Flutter SDK 4.0 relève les exigences minimales :
- **iOS 15.0** — cible de déploiement iOS minimale, relevée depuis iOS 13.0.
- **Xcode 26** ou version ultérieure — le SDK iOS natif utilise Swift tools 6.2.
- **Flutter 3.32.0** (Dart 3.8.0) ou version ultérieure.
## Installation \{#installation\}
### Mettre à jour le package \{#update-the-package\}
Le package à installer dépend de si votre application utilise le mode enfant.
Pour la plupart des applications, mettez à jour `adapty_flutter` vers la v4.0 dans votre `pubspec.yaml` :
```yaml showLineNumbers title="pubspec.yaml"
dependencies:
adapty_flutter: 4.0.0
```
Si votre application utilise le mode enfant, spécifiez `adapty_flutter_kids` à la place :
```yaml showLineNumbers title="pubspec.yaml"
dependencies:
adapty_flutter_kids: 4.0.0
```
Ce **package autonome** supprime le code IDFA et de suivi publicitaire pour se conformer aux exigences de l'App Store. Mettez à jour le chemin d'import Dart vers `package:adapty_flutter_kids/adapty_flutter.dart`. Pour le reste, la migration est exactement la même que pour le package standard.
Le mode Kids requiert également de désactiver la collecte d'adresses IP dans l'Adapty Dashboard — consultez [Kids Mode](kids-mode-flutter) pour la configuration complète.
### iOS : les SDK natifs passent désormais par Swift Package Manager
[Le dépôt de specs CocoaPods passe en lecture seule en décembre 2026](https://blog.cocoapods.org/CocoaPods-Specs-Repo/), aussi à partir de la v4 le SDK iOS natif **n'est plus distribué via CocoaPods** — le plugin le récupère uniquement via **Swift Package Manager**.
Si vous utilisez Flutter 3.32–3.43, activez le support de Swift Package Manager une seule fois :
```bash
flutter config --enable-swift-package-manager
```
Flutter 3.44 et versions ultérieures activent Swift Package Manager par défaut, aucune action n'est donc nécessaire.
## Récupérer des flows \{#fetching-flows\}
### getPaywall → getFlow
Le type retourné passe de `AdaptyPaywall` à `AdaptyFlow`, et il n'est plus nécessaire de passer un `locale` — lorsque vous affichez un flow, la localisation est résolue automatiquement ; pour les paywalls personnalisés, toutes les locales configurées sont retournées dans `flow.remoteConfigs` :
```diff showLineNumbers
- final paywall = await Adapty().getPaywall(placementId: 'YOUR_PLACEMENT_ID', locale: 'en');
+ final flow = await Adapty().getFlow(placementId: 'YOUR_PLACEMENT_ID');
```
`getPaywallForDefaultAudience` est renommé de la même manière :
```diff showLineNumbers
- final paywall = await Adapty().getPaywallForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID', locale: 'en');
+ final flow = await Adapty().getFlowForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID');
```
Le type de politique de récupération est renommé de `AdaptyPaywallFetchPolicy` en `AdaptyFlowFetchPolicy` ; ses options (`reloadRevalidatingCacheData`, `returnCacheDataElseLoad`, `returnCacheDataIfNotExpiredElseLoad`) restent inchangées.
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` garde son nom mais prend désormais un `AdaptyFlow` via le paramètre `flow` :
```diff showLineNumbers
- final products = await Adapty().getPaywallProducts(paywall: paywall);
+ final products = await Adapty().getPaywallProducts(flow: flow);
```
### Fichiers de secours \{#fallback-files\}
Le format des fichiers de secours [a changé avec le SDK v4](fallback-flows). Téléchargez le nouveau fichier depuis **[Placements](https://app.adapty.io/placements)** > **Fallbacks** et intégrez-le dans votre application.
## Modèle de données \{#data-model\}
`getFlow` renvoie un `AdaptyFlow` au lieu d'un `AdaptyPaywall`, et la structure de l'objet a changé :
| Membre v3 `AdaptyPaywall` | Membre v4 `AdaptyFlow` | Action |
|---|---|---|
| `remoteConfig` (unique, nullable) | `remoteConfigs` (liste) | Un flow contient un Remote Config par langue configurée. Le getter `remoteConfig` existe toujours et renvoie la première entrée ; pour choisir une langue spécifique, cherchez dans `remoteConfigs` par son `locale`. |
| `productIdentifiers` | `productIdentifiers` | Conservé, mais désormais collecté pour toutes les variations de paywall du flow. Les identifiants par variation se trouvent sur `flow.paywalls[i].productIdentifiers`. |
| `hasViewConfiguration` | `hasViewConfiguration` | Inchangé. |
| `placementId` (déprécié) | supprimé | Utilisez `flow.placement.id`. |
| `revision` (déprécié) | supprimé | Utilisez `flow.placement.revision`. |
| `vendorProductIds` (déprécié) | supprimé | Utilisez `productIdentifiers`. |
| _(nouveau)_ | `paywalls` (liste de `AdaptyFlowPaywall`) | Chaque entrée est une variation de paywall dans le flow, avec son propre `name`, `variationId` et `productIdentifiers`. |
`AdaptyPaywallViewConfiguration` n'est plus exposé — la configuration de vue est désormais opaque. Supprimez toute référence à ce type.
## Méthodes de paywall web \{#web-paywall-methods\}
`openWebPaywall` et `createWebPaywallUrl` conservent leurs noms, mais le paramètre `paywall` attend désormais un `AdaptyFlowPaywall` (une variante de flow) au lieu d'un `AdaptyPaywall`. Vous pouvez toujours passer un `AdaptyPaywallProduct` à la place.
```diff showLineNumbers
final flow = await Adapty().getFlow(placementId: 'YOUR_PLACEMENT_ID');
- await Adapty().openWebPaywall(paywall: paywall);
+ if (flow.paywalls.isNotEmpty) {
+ await Adapty().openWebPaywall(paywall: flow.paywalls[0]);
+ }
```
## Suivi des vues de flow \{#tracking-flow-views\}
### logShowPaywall → logShowFlow
`logShowPaywall` est renommé en `logShowFlow` et accepte désormais un `AdaptyFlow`. L'événement est toujours enregistré pour la même variation, donc les métriques de funnel et de test A/B existantes continuent de fonctionner sans modifications du tableau de bord.
```diff showLineNumbers
- await Adapty().logShowPaywall(paywall: paywall);
+ await Adapty().logShowFlow(flow: flow);
```
Comme dans la v3, vous n'avez pas besoin d'appeler cette méthode lors de l'affichage de flows ou de paywalls créés avec le [Flow Builder](adapty-flow-builder) ou le [Paywall Builder](adapty-paywall-builder) — Adapty suit ces vues automatiquement.
## Affichage des flows \{#displaying-flows\}
### createPaywallView → createFlowView
Renommez la méthode et passez l'`AdaptyFlow` via le paramètre `flow`. Les autres paramètres (`loadTimeout`, `preloadProducts`, `customTags`, `customTimers`, `customAssets`, `productPurchaseParams`) restent inchangés, ainsi que les méthodes de la vue `present`, `dismiss` et `showDialog` :
```diff showLineNumbers
- final view = await AdaptyUI().createPaywallView(paywall: paywall);
+ final view = await AdaptyUI().createFlowView(flow: flow);
await view.present();
```
### AdaptyUIPaywallView → AdaptyUIFlowView
Le type de vue est renommé. Sa propriété `paywallVariationId` (dépréciée) est supprimée — utilisez `variationId` :
```diff showLineNumbers
- void flowViewDidAppear(AdaptyUIPaywallView view) {
+ void flowViewDidAppear(AdaptyUIFlowView view) {
```
### AdaptyUIPaywallPlatformView → AdaptyUIFlowPlatformView
Si vous intégrez la vue en tant que widget dans votre arbre de widgets, renommez-la et passez le paramètre `flow`. Les callbacks d'événements (`onDidAppear`, `onDidFinishPurchase`, etc.) conservent leurs noms :
```diff showLineNumbers
- AdaptyUIPaywallPlatformView(
- paywall: paywall,
+ AdaptyUIFlowPlatformView(
+ flow: flow,
onDidFinishPurchase: (view, product, purchaseResult) { /* … */ },
)
```
:::note
Une vue de flow créée avec `createFlowView` est à usage unique : après avoir appelé `dismiss()`, la vue est libérée de la mémoire et ne peut plus être présentée de nouveau — appelez `createFlowView` à nouveau pour afficher le flow une nouvelle fois.
:::
## Gestion des événements \{#handling-events\}
La classe d'observateur est renommée de `AdaptyUIPaywallsEventsObserver` en `AdaptyUIFlowsEventsObserver`, sa méthode d'enregistrement de `setPaywallsEventsObserver` en `setFlowsEventsObserver`, et tous les callbacks `paywallViewDid*` en `flowViewDid*` :
```diff showLineNumbers
- class MyObserver extends AdaptyUIPaywallsEventsObserver {
+ class MyObserver extends AdaptyUIFlowsEventsObserver {
@override
- void paywallViewDidPerformAction(AdaptyUIPaywallView view, AdaptyUIAction action) {
+ void flowViewDidPerformAction(AdaptyUIFlowView view, AdaptyUIAction action) {
// …
}
}
- AdaptyUI().setPaywallsEventsObserver(this);
+ AdaptyUI().setFlowsEventsObserver(this);
```
Trois callbacks sont désormais **obligatoires** — votre observateur ne compilera pas sans eux :
- **`flowViewDidFinishPurchase`**: Était optionnel en v3, où le comportement par défaut fermait la vue après un achat. Vous décidez maintenant de la suite : continuer le flow ou appeler `view.dismiss()`.
- **`flowViewDidFinishRestore`**: Obligatoire, comme en v3.
- **`flowViewDidReceiveError`**: Remplace `paywallViewDidFailRendering` et reçoit désormais aussi les autres erreurs de vue.
Deux changements mineurs :
- `setFlowsEventsObserver` (et `setOnboardingsEventsObserver`) acceptent désormais `null` pour détacher un observateur précédemment défini, afin que le SDK ne le conserve plus.
- Le nouveau callback optionnel `flowViewDidReceiveAnalyticEvent` est réservé aux événements analytiques personnalisés provenant d'un flow. Les flows n'émettent pas encore ces événements vers votre code, vous n'avez donc pas besoin de l'implémenter.
v4 ajoute également des fonctionnalités que vous pouvez activer à la demande :
- `AdaptyUI().setObserverModeResolver(...)` avec un `AdaptyUIObserverModeResolver` — gère les achats et restaurations initiés depuis les flows lorsque le SDK s'exécute en [mode Observateur](implement-observer-mode-flutter). Auparavant, cette fonctionnalité n'était disponible que dans les SDK natifs iOS et Android. Voir [Présenter les flows en mode Observateur](flutter-present-flows-in-observer-mode).
- `AdaptyUI().setSystemRequestsHandler(...)` avec un `AdaptyUISystemRequestsHandler` — réservé aux requêtes système provenant d'un flow (demandes de permissions OS et demandes d'avis App Store). Les flows ne déclenchent pas encore ces requêtes, vous n'avez donc pas besoin d'enregistrer un handler.
## API supprimées \{#removed-apis\}
Ces symboles étaient dépréciés dans la version 3.x et sont supprimés dans la v4 :
### setFallbackPaywalls → setFallback
```diff showLineNumbers
- await Adapty().setFallbackPaywalls(assetId);
+ await Adapty().setFallback(assetId);
```
### withIdfaCollectionDisabled → withAppleIdfaCollectionDisabled
```diff showLineNumbers
configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
- ..withIdfaCollectionDisabled(true),
+ ..withAppleIdfaCollectionDisabled(true),
```
### Autres membres supprimés
- **`AdaptyPurchaseResultSuccess.jwsTransaction`** : Utilisez `appleJwsTransaction`.
- **`AdaptyUIFlowView.paywallVariationId`** : Utilisez `variationId`.
- **`AdaptyUIObserver` et `AdaptyUI().setObserver(...)`** : Utilisez `AdaptyUIFlowsEventsObserver` et `setFlowsEventsObserver(...)`.
## Changements de comportement par défaut \{#default-behavior-changes\}
Ces changements n'entraînent pas d'erreurs de compilation ; testez-les donc au moment de l'exécution :
- **Achat réussi** : En v3, le `paywallViewDidFinishPurchase` par défaut fermait la vue. En v4, `flowViewDidFinishPurchase` est obligatoire et n'a pas de comportement par défaut — fermez la vue vous-même si c'est ce que vous souhaitez.
- **Bouton retour système Android** : Il ne ferme plus un flow par défaut. L'action est transmise à `flowViewDidPerformAction` sous la forme `AndroidSystemBackAction` — gérez-la là si vous voulez que le bouton retour ferme le flow.
- **Ouverture d'URL** : Le `flowViewDidPerformAction` par défaut gère désormais `OpenUrlAction` en ouvrant l'URL nativement (en respectant le paramètre navigateur intégré ou externe du tableau de bord), en plus de fermer la vue sur `CloseAction`. Surchargez le callback pour gérer les URL vous-même.
- **Erreurs de vue** : `flowViewDidReceiveError` est obligatoire, et la fermeture dépend de votre implémentation. Si votre intégration v3 reposait sur la fermeture automatique de la vue en cas d'erreur de rendu, appelez `view.dismiss()` dans ce callback.
- **Cycle de vie de la vue** : Fermer une vue de flow ou d'onboarding la libère de la mémoire. Une vue fermée ne peut plus être réaffichée — créez-en une nouvelle à la place.
## Dépréciation de l'API onboarding \{#onboarding-api-deprecation\}
L'API onboarding héritée est dépréciée depuis la v4.0 au profit du [Flow Builder](adapty-flow-builder). Elle fonctionne toujours, et votre IDE signale les symboles dépréciés via leurs annotations `@Deprecated` — aucun avertissement n'est émis à l'exécution. Ces symboles seront supprimés dans une prochaine version, pensez donc à migrer vos onboardings vers le Flow Builder.
Symboles dépréciés : `getOnboarding`, `getOnboardingForDefaultAudience`, `createOnboardingView`, `presentOnboardingView`, `dismissOnboardingView`, `setOnboardingsEventsObserver`, `AdaptyOnboarding`, `AdaptyUIOnboardingView`, `AdaptyUIOnboardingPlatformView`, `AdaptyUIOnboardingsEventsObserver`, ainsi que les modèles d'état, de saisie et d'analytique d'onboarding.
---
# File: flutter-migration-guide-310
---
---
title: "Guide de migration vers Flutter Adapty SDK 3.10.0"
description: ""
---
Adapty SDK 3.10.0 est une version majeure qui apporte des améliorations nécessitant toutefois quelques étapes de migration de votre part :
1. Mettre à jour la méthode `makePurchase` pour utiliser `AdaptyPurchaseParameters` à la place des paramètres individuels.
2. Remplacer `vendorProductIds` par `productIdentifiers` dans le modèle `AdaptyPaywall`.
## Mettre à jour la méthode makePurchase \{#update-makepurchase-method\}
La méthode `makePurchase` utilise désormais `AdaptyPurchaseParameters` à la place des arguments individuels `subscriptionUpdateParams` et `isOfferPersonalized`. Cela offre une meilleure sécurité des types et permet d'étendre les paramètres d'achat à l'avenir.
```diff showLineNumbers
- final purchaseResult = await adapty.makePurchase(
- product: product,
- subscriptionUpdateParams: subscriptionUpdateParams,
- isOfferPersonalized: true,
- );
+ final parameters = AdaptyPurchaseParametersBuilder()
+ ..setSubscriptionUpdateParams(subscriptionUpdateParams)
+ ..setIsOfferPersonalized(true)
+ ..setObfuscatedAccountId('your-account-id')
+ ..setObfuscatedProfileId('your-profile-id');
+ final purchaseResult = await adapty.makePurchase(
+ product: product,
+ parameters: parameters.build(),
+ );
```
Si aucun paramètre supplémentaire n'est nécessaire, vous pouvez simplement utiliser :
```dart showLineNumbers
final purchaseResult = await adapty.makePurchase(
product: product,
);
```
## Mettre à jour l'utilisation du modèle AdaptyPaywall \{#update-adaptypaywall-model-usage\}
La propriété `vendorProductIds` a été dépréciée au profit de `productIdentifiers`. La nouvelle propriété retourne des objets `AdaptyProductIdentifier` au lieu de simples chaînes de caractères, offrant une structure d'informations produit plus cohérente.
```diff showLineNumbers
- paywall.vendorProductIds.map((vendorId) =>
- ListTextTile(title: vendorId)
- ).toList()
+ paywall.productIdentifiers.map((productId) =>
+ ListTextTile(title: productId.vendorProductId)
+ ).toList()
```
L'objet `AdaptyProductIdentifier` donne accès à l'identifiant de produit du vendor via la propriété `vendorProductId`, conservant ainsi la même fonctionnalité tout en offrant une meilleure structure pour les évolutions futures.
## Compatibilité ascendante \{#backward-compatibility\}
Les deux modifications maintiennent la compatibilité ascendante :
- Les anciens paramètres de `makePurchase` sont dépréciés mais restent fonctionnels
- La propriété `vendorProductIds` est dépréciée mais reste accessible
- Le code existant continuera de fonctionner, même si des avertissements de dépréciation apparaîtront
Nous vous recommandons de mettre à jour votre code pour utiliser les nouvelles API afin de garantir la compatibilité future et de profiter de la meilleure sécurité des types et extensibilité offertes.
---
# File: flutter-migration-guide-38
---
---
title: "Migrer le SDK Adapty Flutter vers v3.8"
description: "Migrez vers le SDK Adapty Flutter v3.8 pour de meilleures performances et de nouvelles fonctionnalités de monétisation."
---
Adapty SDK 3.8.0 est une version majeure qui apporte des améliorations pouvant nécessiter quelques étapes de migration de votre côté.
1. Mettez à jour le nom de la classe observer et de ses méthodes.
2. Mettez à jour le nom de la méthode pour les paywalls de secours.
3. Mettez à jour le nom de la classe view dans les méthodes de gestion des événements.
## Mettre à jour le nom de la classe observer et de ses méthodes \{#update-observer-class-and-method-names\}
La classe observer et sa méthode d'enregistrement ont été renommées :
```diff showLineNumbers
- class MyObserver extends AdaptyUIObserver {
+ class MyObserver extends AdaptyUIPaywallsEventsObserver {
@override
void paywallViewDidPerformAction(AdaptyUIView view, AdaptyUIAction action) {
// Handle action
}
}
// Register observer
- AdaptyUI().setObserver(this);
+ AdaptyUI().setPaywallsEventsObserver(this);
```
## Mettre à jour le nom de la méthode pour les paywalls de secours \{#update-fallback-paywalls-method-name\}
La méthode pour définir les paywalls de secours a été simplifiée :
```diff showLineNumbers
try {
- await Adapty.setFallbackPaywalls(assetId);
+ await Adapty.setFallback(assetId);
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle the error
}
```
## Mettre à jour le nom de la classe view dans les méthodes de gestion des événements \{#update-view-class-name-in-event-handling-methods\}
Toutes les méthodes de gestion des événements utilisent désormais la nouvelle classe `AdaptyUIPaywallView` à la place de `AdaptyUIView` :
```diff showLineNumbers
- void paywallViewDidPerformAction(AdaptyUIView view, AdaptyUIAction action)
+ void paywallViewDidPerformAction(AdaptyUIPaywallView view, AdaptyUIAction action)
- void paywallViewDidSelectProduct(AdaptyUIView view, AdaptyPaywallProduct product)
+ void paywallViewDidSelectProduct(AdaptyUIPaywallView view, AdaptyPaywallProduct product)
- void paywallViewDidStartPurchase(AdaptyUIView view, AdaptyPaywallProduct product)
+ void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product)
- void paywallViewDidFinishPurchase(AdaptyUIView view, AdaptyPaywallProduct product, AdaptyProfile profile)
+ void paywallViewDidFinishPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyProfile profile)
- void paywallViewDidFailPurchase(AdaptyUIView view, AdaptyPaywallProduct product, AdaptyError error)
+ void paywallViewDidFailPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product, AdaptyError error)
- void paywallViewDidFinishRestore(AdaptyUIView view, AdaptyProfile profile)
+ void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile)
- void paywallViewDidFailRestore(AdaptyUIView view, AdaptyError error)
+ void paywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error)
- void paywallViewDidFailLoadingProducts(AdaptyUIView view, AdaptyIOSProductsFetchPolicy? fetchPolicy, AdaptyError error)
+ void paywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyIOSProductsFetchPolicy? fetchPolicy, AdaptyError error)
- void paywallViewDidFailRendering(AdaptyUIView view, AdaptyError error)
+ void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error)
```
---
# File: migration-to-flutter-sdk-34
---
---
title: "Migrer le SDK Flutter Adapty vers la v3.4"
description: "Migrez vers le SDK Flutter Adapty v3.4 pour de meilleures performances et de nouvelles fonctionnalités de monétisation."
---
Le SDK Adapty 3.4.0 est une version majeure qui introduit des améliorations nécessitant des étapes de migration de votre côté.
## Mettre à jour les fichiers de paywall de secours \{#update-fallback-paywall-files\}
Mettez à jour vos fichiers de paywall de secours pour assurer la compatibilité avec la nouvelle version du SDK :
1. [Téléchargez les fichiers de paywall de secours mis à jour](fallback-paywalls) depuis l'Adapty Dashboard.
2. [Remplacez les paywalls de secours existants dans votre application mobile](flutter-use-fallback-paywalls) par les nouveaux fichiers.
## Mettre à jour l'implémentation du mode Observateur \{#update-implementation-of-observer-mode\}
Si vous utilisez le mode Observateur, veillez à mettre à jour son implémentation.
Auparavant, différentes méthodes étaient utilisées pour signaler les transactions à Adapty. Dans la nouvelle version, la méthode `reportTransaction` doit être utilisée de manière cohérente sur Android et iOS. Cette méthode signale explicitement chaque transaction à Adapty, garantissant qu'elle est bien reconnue. Si un paywall a été utilisé, transmettez l'ID de variation pour associer la transaction à celui-ci.
:::warning
**Ne sautez pas le signalement des transactions !**
Si vous n'appelez pas `reportTransaction`, Adapty ne reconnaîtra pas la transaction, elle n'apparaîtra pas dans les analyses et ne sera pas envoyée aux intégrations.
:::
```diff showLineNumbers
- // every time when calling transaction.finish()
- if (Platform.isAndroid) {
- try {
- await Adapty().restorePurchases();
- } on AdaptyError catch (adaptyError) {
- // handle the error
- } catch (e) {
- }
- }
try {
// every time when calling transaction.finish()
await Adapty().reportTransaction(
"YOUR_TRANSACTION_ID",
variationId: "PAYWALL_VARIATION_ID", // optional
);
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
// handle the error
}
```
---
# File: migration-to-flutter330
---
---
title: "Migrer le SDK Adapty Flutter vers v3.3"
description: "Migrez vers le SDK Adapty Flutter v3.3 pour de meilleures performances et de nouvelles fonctionnalités de monétisation."
---
Le SDK Adapty 3.3.0 est une version majeure qui apporte des améliorations pouvant nécessiter quelques étapes de migration de votre part.
1. Mettre à jour la méthode de fourniture des paywalls de secours.
2. Supprimer la méthode `getProductsIntroductoryOfferEligibility`.
3. Mettre à jour les configurations d'intégration pour Adjust, AirBridge, Amplitude, AppMetrica, Appsflyer, Branch, Facebook Ads, Firebase et Google Analytics, Mixpanel, OneSignal, Pushwoosh.
4. Mettre à jour l'implémentation du mode Observer.
## Mettre à jour la méthode de fourniture des paywalls de secours \{#update-method-for-providing-fallback-paywalls\}
Auparavant, la méthode attendait le paywall de secours sous forme de chaîne JSON (`jsonString`), mais elle prend désormais le chemin vers le fichier de secours local (`assetId`) à la place.
```diff showLineNumbers
import 'dart:async' show Future;
import 'dart:io' show Platform;
-import 'package:flutter/services.dart' show rootBundle;
-final filePath = Platform.isIOS ? 'assets/ios_fallback.json' : 'assets/android_fallback.json';
-final jsonString = await rootBundle.loadString(filePath);
+final assetId = Platform.isIOS ? 'assets/ios_fallback.json' : 'assets/android_fallback.json';
try {
- await adapty.setFallbackPaywalls(jsonString);
+ await adapty.setFallbackPaywalls(assetId);
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
}
```
Pour un exemple de code complet, consultez la page [Utiliser les paywalls de secours](flutter-use-fallback-paywalls).
## Supprimer la méthode `getProductsIntroductoryOfferEligibility` \{#remove-getproductsintroductoryoffereligibility-method\}
Avant le SDK Adapty iOS 3.3.0, l'objet produit incluait toujours les offres, que l'utilisateur y soit éligible ou non. Vous deviez vérifier manuellement l'éligibilité avant d'utiliser l'offre.
Désormais, l'objet produit n'inclut une offre que si l'utilisateur y est éligible. Cela signifie que vous n'avez plus besoin de vérifier l'éligibilité — si une offre est présente, l'utilisateur est éligible.
## Mettre à jour la configuration du SDK des intégrations tierces \{#update-third-party-integration-sdk-configuration\}
Pour que les intégrations fonctionnent correctement avec le SDK Adapty Flutter 3.3.0 et les versions ultérieures, mettez à jour vos configurations SDK pour les intégrations suivantes, comme décrit dans les sections ci-dessous.
### Adjust
Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la [configuration du SDK pour l'intégration Adjust](adjust#connect-your-app-to-adjust).
```diff showLineNumbers
import 'package:adjust_sdk/adjust.dart';
import 'package:adjust_sdk/adjust_config.dart';
try {
final adid = await Adjust.getAdid();
if (adid == null) {
// handle the error
}
+ await Adapty().setIntegrationIdentifier(
+ key: "adjust_device_id",
+ value: adid,
+ );
final attributionData = await Adjust.getAttribution();
var attribution = MapUne valeur booléenne contrôlant le [mode Observer](observer-vs-full-mode). Activez-le si vous gérez vous-même les achats et le statut des abonnements, et utilisez Adapty uniquement pour envoyer des événements d'abonnement et des données analytiques.
La valeur par défaut est `false`.
🚧 En mode Observer, le SDK Adapty ne fermera aucune transaction. Assurez-vous donc de les gérer vous-même.
| | **withCustomerUserId** | optionnel | Un identifiant de l'utilisateur dans votre système. Nous l'envoyons dans les événements d'abonnement et d'analyse pour attribuer les événements au bon profil. Vous pouvez également retrouver vos utilisateurs par `customerUserId` dans le menu [**Profiles and Segments**](https://app.adapty.io/profiles/users). | | **withIdfaCollectionDisabled** | optionnel |Définissez à `true` pour désactiver la collecte et le partage de l'IDFA.
le partage de l'adresse IP de l'utilisateur.
La valeur par défaut est `false`.
Pour plus de détails sur la collecte de l'IDFA, consultez la section [Intégration Analytics](analytics-integration#disable-collection-of-advertising-identifiers).
| | **withIpAddressCollectionDisabled** | optionnel |Définissez à `true` pour désactiver la collecte et le partage de l'adresse IP de l'utilisateur.
La valeur par défaut est `false`.
| ### Activer le module AdaptyUI du SDK Adapty \{#activate-adaptyui-module-of-adapty-sdk\} Vous devez configurer le module AdaptyUI uniquement si vous prévoyez d'utiliser le [Paywall Builder](adapty-paywall-builder) : ```dart showLineNumbers title="Dart" try { final mediaCache = AdaptyUIMediaCacheConfiguration( memoryStorageTotalCostLimit: 100 * 1024 * 1024, // 100MB memoryStorageCountLimit: 2147483647, // 2^31 - 1, max int value in Dart diskStorageSizeLimit: 100 * 1024 * 1024, // 100MB ); await AdaptyUI().activate( configuration: AdaptyUIConfiguration(mediaCache: mediaCache), observer:
### Lors de la connexion/inscription \{#during-loginsignup\}
Si vous identifiez les utilisateurs après le lancement de l'application (par exemple, après qu'ils se soient connectés ou inscrits), utilisez la méthode `identify` pour définir leur customer user ID.
- Si vous **n'avez pas encore utilisé ce customer user ID**, Adapty le liera automatiquement au profil actuel.
- Si vous **avez déjà utilisé ce customer user ID pour identifier l'utilisateur**, Adapty basculera vers le profil associé à ce customer user ID.
:::important
Les customer user IDs doivent être uniques pour chaque utilisateur. Si vous codez en dur la valeur du paramètre, tous les utilisateurs seront considérés comme un seul.
:::
Attendez toujours que `identify` soit résolu (`await`) avant d'appeler d'autres méthodes du SDK. Les appels simultanés produisent l'erreur `#3006 profileWasChanged` ou atterrissent sur le profil anonyme. Voir [Ordre des appels dans le SDK iOS](ios-sdk-call-order).
Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé au redémarrage de l'app et n'est effacé que lors de la désinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement en deux couches : le cache régulièrement mis à jour décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement et un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos paywalls tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 s |Cette valeur limite le délai d'attente de cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre plusieurs requêtes en interne.
| Paramètres de réponse : | Paramètre | Description | | :-------- | :---------- | | Flow | Un objet `AdaptyFlow` contenant le placement, les identifiants (`id`, `variationId`), le nom, les Remote Configs et un indicateur `hasViewConfiguration` précisant si le flow inclut une configuration de vue. Pour récupérer les produits réels en vue d'un préchargement, d'une interface personnalisée ou de vérifications programmatiques, appelez `getPaywallProducts(flow:)`. | ## Récupérer la configuration de vue \{#fetch-the-view-configuration\} Après avoir récupéré le flow ou le paywall, vérifiez s'il inclut une configuration de vue via `flow.hasViewConfiguration`. Cet indicateur distingue la façon dont le placement a été conçu dans l'Adapty Dashboard : - **`true`** — le placement a été conçu dans le **Flow Builder** (un flow) ou le **Paywall Builder** (un paywall). Adapty génère l'interface pour vous. Continuez avec les étapes ci-dessous pour récupérer la configuration de vue et [présenter le flow ou le paywall](ios-present-paywalls). - **`false`** — le placement est un paywall personnalisé sans interface Builder. Utilisez la méthode `getFlowConfiguration` pour charger la configuration de vue. ```swift showLineNumbers guard flow.hasViewConfiguration else { // handle as remote config paywall return } let flowConfiguration = try await AdaptyUI.getFlowConfiguration(forFlow: flow) ``` Paramètres : | Paramètre | Présence | Description | | :----------------------- | :------------- | :---------- | | **forFlow** | requis | Un objet `AdaptyFlow` obtenu via `Adapty.getFlow`. | | **locale** |optionnel
par défaut : `nil`
| L'identifiant de la [localisation du paywall](add-paywall-locale-in-adapty-paywall-builder). Attendu sous la forme d'un code de langue avec un ou deux sous-tags séparés par `-` (ex. : `en`, `pt-br`). Voir [Localisations et codes de langue](localizations-and-locale-codes). | | **loadTimeout** | par défaut : 5 s | Cette valeur limite le délai d'attente de cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront renvoyés. Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre plusieurs requêtes en interne. | | **products** | optionnel | Fournissez un tableau d'objets `AdaptyPaywallProduct` pour optimiser le moment d'affichage des produits à l'écran. Si `nil` est passé, AdaptyUI récupérera automatiquement les produits nécessaires. | | **systemRequestsHandler** | optionnel | Un objet conforme à `AdaptySystemRequestsHandler` qui gère les demandes d'autorisations système et d'évaluation déclenchées par les actions du flow. Requis uniquement si votre flow inclut de telles actions. | | **assetsResolver** | optionnel | Un dictionnaire `[String: AdaptyCustomAsset]` qui remplace les images et vidéos dans le flow/paywall. Voir [Personnaliser les assets](#customize-assets). | | **timerResolver** | optionnel | Un objet conforme à `AdaptyTimerResolver` qui fournit les dates de fin pour les timers définis par le développeur. Voir [Configurer les timers définis par le développeur](#set-up-developer-defined-timers). | Une fois chargé, [présentez le flow/paywall](ios-present-paywalls). ## Récupérer un flow ou un paywall pour l'audience par défaut afin d'accélérer la récupération \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les flows et paywalls sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et placements et que vos utilisateurs ont une connexion lente, la récupération d'un flow ou d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un flow ou un paywall par défaut pour garantir une expérience fluide plutôt que de ne rien afficher du tout. Pour cela, vous pouvez utiliser la méthode `getFlowForDefaultAudience`, qui récupère le flow ou le paywall du placement spécifié pour l'audience **All Users**. Il est toutefois essentiel de comprendre que l'approche recommandée reste de récupérer le flow ou le paywall avec la méthode `getFlow`, comme indiqué dans la section [Récupérer un flow/paywall](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getFlow` La méthode `getFlowForDefaultAudience` présente quelques inconvénients importants : - **Problèmes potentiels de compatibilité ascendante** : Si vous devez afficher des paywalls différents selon les versions de l'app (actuelle et futures), vous pourrez rencontrer des difficultés. Vous devrez soit concevoir des paywalls compatibles avec la version actuelle (legacy), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des paywalls non rendus. - **Perte de ciblage** : Tous les utilisateurs verront le même paywall conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment basé sur les pays, l'attribution marketing ou vos propres attributs personnalisés). Si vous acceptez ces inconvénients pour bénéficier d'une récupération plus rapide du flow ou du paywall, utilisez la méthode `getFlowForDefaultAudience` comme suit. Sinon, utilisez `getFlow` décrit [ci-dessus](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder). ::: ```swift showLineNumbers Adapty.getFlowForDefaultAudience(placementId: "YOUR_PLACEMENT_ID") { result in switch result { case let .success(flow): // the requested flow case let .failure(error): // handle the error } } ``` | Paramètre | Présence | Description | |---------|--------|-----------| | **placementId** | requis | L'identifiant du [Placement](placements). C'est la valeur que vous avez indiquée lors de la création d'un placement dans votre Adapty Dashboard. | | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé au redémarrage de l'app et n'est effacé que lors de la désinstallation ou d'un nettoyage manuel.
| ## Personnaliser les assets \{#customize-assets\} Pour personnaliser les images et vidéos dans votre paywall/flow, implémentez les assets personnalisés. Les images et vidéos hero ont des IDs prédéfinis : `hero_image` et `hero_video`. Dans un bundle d'assets personnalisés, vous ciblez ces éléments par leurs IDs et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un ID personnalisé](custom-media) dans le tableau de bord Adapty. Par exemple, vous pouvez : - Afficher une image ou une vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. - Fournir la résolution en pixels d'une vidéo afin que le lecteur réserve l'espace de mise en page (ratio = `width / height`) avant le chargement de la vidéo. Passez `nil` pour ignorer cela. Voici un exemple de fourniture d'assets personnalisés via un simple dictionnaire : ```swift showLineNumbers let customAssets: [String: AdaptyCustomAsset] = [ // Show a local image using a custom ID "custom_image": .image( .uiImage(value: UIImage(named: "image_name")!) ), // Show a local preview image while a remote main image is loading "hero_image": .image( .remote( url: URL(string: "https://example.com/image.jpg")!, preview: UIImage(named: "preview_image") ) ), // Show a local video with a preview image and a known resolution "hero_video": .video( .file( url: Bundle.main.url(forResource: "custom_video", withExtension: "mp4")!, preview: .uiImage(value: UIImage(named: "video_preview")!), resolution: CGSize(width: 1080, height: 1920) ) ), ] let flowConfig = try await AdaptyUI.getFlowConfiguration( forFlow: flow, assetsResolver: customAssets ) ``` :::note Si un asset est introuvable, le paywall/flow utilisera son apparence par défaut. ::: ## Configurer les timers définis par le développeur \{#set-up-developer-defined-timers\} Pour utiliser des timers personnalisés dans votre app mobile, créez un objet conforme au protocole `AdaptyTimerResolver`. Cet objet définit comment chaque timer personnalisé doit être rendu. Si vous préférez, vous pouvez utiliser directement un dictionnaire `[String: Date]`, car il est déjà conforme à ce protocole. Voici un exemple : ```swift showLineNumbers @MainActor struct AdaptyTimerResolverImpl: AdaptyTimerResolver { func timerEndAtDate(for timerId: String) -> Date { switch timerId { case "CUSTOM_TIMER_6H": Date(timeIntervalSinceNow: 3600.0 * 6.0) // 6 hours case "CUSTOM_TIMER_NY": Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 1)) ?? Date(timeIntervalSinceNow: 3600.0) default: Date(timeIntervalSinceNow: 3600.0) // 1 hour } } } ``` Dans cet exemple, `CUSTOM_TIMER_NY` et `CUSTOM_TIMER_6H` sont les **Timer ID** des timers définis par le développeur que vous avez configurés dans l'Adapty Dashboard. Le `timerResolver` garantit que votre app met à jour dynamiquement chaque timer avec la valeur correcte. Par exemple : - `CUSTOM_TIMER_NY` : le temps restant jusqu'à la fin du timer, comme le Nouvel An. - `CUSTOM_TIMER_6H` : le temps restant dans une période de 6 heures qui a démarré lorsque l'utilisateur a ouvert le paywall.optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-paywall-locale-in-adapty-paywall-builder). Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Voir [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et notre façon de les utiliser.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé au redémarrage de l'app et n'est effacé que lors de la désinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement en deux couches : le cache régulièrement mis à jour décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement et un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos paywalls tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 s |Cette valeur limite le délai d'attente de cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre plusieurs requêtes en interne.
| Paramètres de réponse : | Paramètre | Description | | :-------- | :---------- | | Paywall | Un objet [`AdaptyPaywall`](https://swift.adapty.io/documentation/adapty/adaptypaywall) avec une liste d'IDs de produits, l'identifiant du paywall, le Remote Config et plusieurs autres propriétés. | ## Récupérer la configuration de vue d'un paywall conçu avec le Paywall Builder \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Veillez à activer le bouton **Show on device** dans le Paywall Builder. Si cette option n'est pas activée, la configuration de vue ne sera pas disponible à la récupération. ::: Après avoir récupéré le paywall, vérifiez s'il inclut une configuration de vue, ce qui indique qu'il a été créé avec le Paywall Builder. Cela vous guidera sur la façon d'afficher le paywall. Si la configuration de vue est présente, traitez-le comme un paywall Paywall Builder ; sinon, [gérez-le comme un paywall Remote Config](present-remote-config-paywalls). Utilisez la méthode `getPaywallConfiguration` pour charger la configuration de vue. ```swift showLineNumbers guard paywall.hasViewConfiguration else { // use your custom logic return } do { let paywallConfiguration = try await AdaptyUI.getPaywallConfiguration( forPaywall: paywall, products: products ) // use loaded configuration } catch { // handle the error } ``` Paramètres : | Paramètre | Présence | Description | | :----------------------- | :------------- | :---------- | | **paywall** | requis | Un objet `AdaptyPaywall` pour obtenir un contrôleur pour le paywall souhaité. | | **loadTimeout** | par défaut : 5 s | Cette valeur limite le délai d'attente de cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront renvoyés. Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre plusieurs requêtes en interne. | | **products** | optionnel | Fournissez un tableau d'objets `AdaptyPaywallProduct` pour optimiser le moment d'affichage des produits à l'écran. Si `nil` est passé, AdaptyUI récupérera automatiquement les produits nécessaires. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation Paywall Builder](add-paywall-locale-in-adapty-paywall-builder) et comment utiliser correctement les codes de langue [ici](localizations-and-locale-codes). ::: Une fois chargé, [présentez le paywall](ios-present-paywalls). ## Récupérer un paywall pour l'audience par défaut afin d'accélérer la récupération \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les paywalls sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et paywalls et que vos utilisateurs ont une connexion lente, la récupération d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un paywall par défaut pour garantir une expérience fluide plutôt que de ne rien afficher du tout. Pour cela, vous pouvez utiliser la méthode `getPaywallForDefaultAudience`, qui récupère le paywall du placement spécifié pour l'audience **All Users**. Il est toutefois essentiel de comprendre que l'approche recommandée reste de récupérer le paywall avec la méthode `getPaywall`, comme indiqué dans la section [Récupérer un paywall](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getPaywall` La méthode `getPaywallForDefaultAudience` présente quelques inconvénients importants : - **Problèmes potentiels de compatibilité ascendante** : Si vous devez afficher des paywalls différents selon les versions de l'app (actuelle et futures), vous pourrez rencontrer des difficultés. Vous devrez soit concevoir des paywalls compatibles avec la version actuelle (legacy), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des paywalls non rendus. - **Perte de ciblage** : Tous les utilisateurs verront le même paywall conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment basé sur les pays, l'attribution marketing ou vos propres attributs personnalisés). Si vous acceptez ces inconvénients pour bénéficier d'une récupération plus rapide du paywall, utilisez la méthode `getPaywallForDefaultAudience` comme suit. Sinon, utilisez `getPaywall` décrit [ci-dessus](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder). ::: ```swift showLineNumbers Adapty.getPaywallForDefaultAudience(placementId: "YOUR_PLACEMENT_ID", locale: "en") { result in switch result { case let .success(paywall): // the requested paywall case let .failure(error): // handle the error } } ``` :::note La méthode `getPaywallForDefaultAudience` est disponible à partir de la version 2.11.2 du SDK iOS. ::: | Paramètre | Présence | Description | |---------|--------|-----------| | **placementId** | requis | L'identifiant du [Placement](placements). C'est la valeur que vous avez indiquée lors de la création d'un placement dans votre Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Voir [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et notre façon de les utiliser.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé au redémarrage de l'app et n'est effacé que lors de la désinstallation ou d'un nettoyage manuel.
| ## Personnaliser les assets \{#customize-assets\} Pour personnaliser les images et vidéos dans votre paywall, implémentez les assets personnalisés. Les images et vidéos hero ont des IDs prédéfinis : `hero_image` et `hero_video`. Dans un bundle d'assets personnalisés, vous ciblez ces éléments par leurs IDs et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un ID personnalisé](custom-media) dans le tableau de bord Adapty. Par exemple, vous pouvez : - Afficher une image ou une vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. :::important Pour utiliser cette fonctionnalité, mettez à jour le SDK iOS Adapty vers la version 3.7.0 ou supérieure. ::: Voici un exemple de fourniture d'assets personnalisés via un simple dictionnaire : ```swift showLineNumbers let customAssets: [String: AdaptyCustomAsset] = [ // Show a local image using a custom ID "custom_image": .image( .uiImage(value: UIImage(named: "image_name")!) ), // Show a local preview image while a remote main image is loading "hero_image": .image( .remote( url: URL(string: "https://example.com/image.jpg")!, preview: UIImage(named: "preview_image") ) ), // Show a local video with a preview image "hero_video": .video( .file( url: Bundle.main.url(forResource: "custom_video", withExtension: "mp4")!, preview: .uiImage(value: UIImage(named: "video_preview")!) ) ), ] let paywallConfig = try await AdaptyUI.getPaywallConfiguration( forPaywall: paywall, assetsResolver: customAssets ) ``` :::note Si un asset est introuvable, le paywall utilisera son apparence par défaut. ::: ## Configurer les timers définis par le développeur \{#set-up-developer-defined-timers\} Pour utiliser des timers personnalisés dans votre app mobile, créez un objet conforme au protocole `AdaptyTimerResolver`. Cet objet définit comment chaque timer personnalisé doit être rendu. Si vous préférez, vous pouvez utiliser directement un dictionnaire `[String: Date]`, car il est déjà conforme à ce protocole. Voici un exemple : ```swift showLineNumbers @MainActor struct AdaptyTimerResolverImpl: AdaptyTimerResolver { func timerEndAtDate(for timerId: String) -> Date { switch timerId { case "CUSTOM_TIMER_6H": Date(timeIntervalSinceNow: 3600.0 * 6.0) // 6 hours case "CUSTOM_TIMER_NY": Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 1)) ?? Date(timeIntervalSinceNow: 3600.0) default: Date(timeIntervalSinceNow: 3600.0) // 1 hour } } } ``` Dans cet exemple, `CUSTOM_TIMER_NY` et `CUSTOM_TIMER_6H` sont les **Timer ID** des timers définis par le développeur que vous avez configurés dans l'Adapty Dashboard. Le `timerResolver` garantit que votre app met à jour dynamiquement chaque timer avec la valeur correcte. Par exemple : - `CUSTOM_TIMER_NY` : le temps restant jusqu'à la fin du timer, comme le Nouvel An. - `CUSTOM_TIMER_6H` : le temps restant dans une période de 6 heures qui a démarré lorsque l'utilisateur a ouvert le paywall.
## Le nombre de vues du paywall est trop élevé \{#the-paywall-view-number-is-too-big\}
**Problème** : Le nombre de vues du paywall affiche le double du chiffre attendu.
**Raison** : Vous appelez peut-être `logShowFlow` (SDK iOS v4+) / `logShowPaywall` dans votre code, ce qui duplique le compteur de vues si vous utilisez le Paywall Builder ou le Flow Builder. Pour les flows et les paywalls créés avec ces outils, les analytics sont suivis automatiquement — vous n'avez donc pas besoin d'utiliser cette méthode.
**Solution** : Vérifiez que vous n'appelez pas `logShowFlow` (SDK iOS v4+) / `logShowPaywall` dans votre code si vous utilisez le Paywall Builder ou le Flow Builder.
## Autres problèmes \{#other-issues\}
**Problème** : Vous rencontrez d'autres problèmes liés au Paywall Builder qui ne sont pas abordés ci-dessus.
**Solution** : Mettez à jour le SDK vers la dernière version à l'aide des [guides de migration](ios-sdk-migration-guides) si nécessaire. De nombreux problèmes sont résolus dans les versions récentes du SDK.
---
# File: ios-present-paywall-builder-paywalls-in-observer-mode
---
---
title: "Afficher les paywalls Paywall Builder en mode Observer dans le SDK iOS"
description: "Apprenez à afficher les paywalls PB en mode observer pour de meilleures informations."
---
Si vous avez personnalisé un paywall avec le Paywall Builder, vous n'avez pas à vous soucier de son rendu dans le code de votre application mobile pour l'afficher à l'utilisateur. Un tel paywall contient à la fois ce qui doit être affiché et comment il doit l'être.
:::warning
Cette section concerne uniquement le [mode Observer](observer-vs-full-mode). Si vous ne travaillez pas en mode Observer, consultez [iOS - Afficher les paywalls Paywall Builder](ios-present-paywalls).
:::
Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser en cours de session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la désinstallation ou via un nettoyage manuel.
Le SDK Adapty stocke les flows et les paywalls sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les flows et les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local sont retournés.
Notez que dans de rares cas, cette méthode peut dépasser légèrement le délai spécifié dans `loadTimeout`, car l'opération peut impliquer différentes requêtes en arrière-plan.
| :::note Dans la v4, le paramètre `locale` a été déplacé hors de `getFlow` et placé dans `getFlowConfiguration` (utilisé uniquement lors du rendu avec AdaptyUI). Pour les paywalls personnalisés, toutes les locales disponibles sont retournées ensemble dans `flow.remoteConfigs` — choisissez celle qui correspond à la langue de l'appareil de l'utilisateur ou au paramètre de votre application. ::: N'encodez pas en dur les identifiants de produits ! Puisque les flows sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent changer avec le temps. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, votre application doit tous les afficher sans nécessiter de modification du code. La seule chose à encoder en dur est l'identifiant du placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Un objet `AdaptyFlow` contenant le placement, les identifiants (`id`, `variationId`), le nom, un tableau `remoteConfigs` (une entrée par locale configurée) et un indicateur `hasViewConfiguration`. Pour récupérer les produits du flow, appelez `getPaywallProducts(flow:)`. | ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le flow, vous pouvez interroger le tableau de produits qui lui correspond :Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs font face à une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne disposeront peut-être pas des toutes dernières données, mais bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter des requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
|optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et la façon dont nous recommandons de les utiliser.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK essaie de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser en cours de session pour éviter les requêtes réseau.
Notez que le cache reste intact après un redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls en deux couches : le cache régulièrement mis à jour décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour garantir que vous obtenez toujours la dernière version de vos paywalls tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comporter différentes requêtes en arrière-plan.
| N'encodez pas les IDs de produits en dur ! Puisque les paywalls sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent évoluer au fil du temps. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, votre application doit les afficher tous les 3 sans nécessiter de modification du code. La seule chose à encoder en dur est l'ID du placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Un objet [`AdaptyPaywall`](https://swift.adapty.io/documentation/adapty/adaptypaywall) contenant : une liste d'identifiants de produits, l'identifiant du paywall, le Remote Config, et plusieurs autres propriétés. | ## Récupérer les produits \{#fetch-products\} Une fois le paywall récupéré, vous pouvez interroger le tableau de produits qui lui correspond :optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données mises en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs risquent de ne pas obtenir les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé lors du redémarrage de l'application et n'est effacé qu'en cas de réinstallation ou de nettoyage manuel.
|Si la requête a abouti, la réponse contient cet objet. Un objet [AdaptyProfile](https://swift.adapty.io/documentation/adapty/adaptyprofile) fournit des informations complètes sur les niveaux d'accès, les abonnements et les achats uniques d'un utilisateur au sein de l'application.
Vérifiez le statut du niveau d'accès pour déterminer si l'utilisateur dispose de l'accès requis à l'application.
| :::warning **Remarque :** si vous utilisez encore StoreKit d'Apple en version inférieure à v2.0 et le SDK Adapty en version inférieure à v2.9.0, vous devez fournir le [secret partagé de l'App Store Apple](app-store-connection-configuration#step-5-enter-app-store-shared-secret) à la place. Cette méthode est actuellement dépréciée par Apple. ::: ## Achats intégrés depuis l'App Store \{#in-app-purchases-from-the-app-store\} Lorsqu'un utilisateur initie un achat dans l'App Store et que la transaction est transmise à votre application, vous avez deux options : - **Traiter la transaction immédiatement :** Retournez `true` dans `shouldAddStorePayment`. L'écran d'achat Apple s'affichera immédiatement. - **Stocker l'objet produit pour un traitement ultérieur :** Retournez `false` dans `shouldAddStorePayment`, puis appelez `makePurchase` avec le produit stocké plus tard. Cela peut être utile si vous souhaitez afficher quelque chose de personnalisé à l'utilisateur avant de déclencher un achat. Voici le code complet : ```swift showLineNumbers title="Swift" final class YourAdaptyDelegateImplementation: AdaptyDelegate { nonisolated func shouldAddStorePayment(for product: AdaptyDeferredProduct) -> Bool { // 1a. // Return `true` to continue the transaction in your app. The Apple purchase system screen will show automatically. // 1b. // Store the product object and return `false` to defer or cancel the transaction. false } // 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate func continueDeferredPurchase() async { let storedProduct: AdaptyDeferredProduct = // get the product object from 1b. do { try await Adapty.makePurchase(product: storedProduct) } catch { // handle the error } } } ``` ## Utiliser des codes de réduction sur iOS \{#redeem-offer-codes-in-ios\}Un objet [`AdaptyProfile`](https://swift.adapty.io/documentation/adapty/adaptyprofile). Ce modèle contient des informations sur les niveaux d'accès, les abonnements et les achats uniques.
Vérifiez le **statut du niveau d'accès** pour déterminer si l'utilisateur a accès à l'application.
| :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: --- # File: ios-transaction-management --- --- title: "Gestion avancée des transactions dans le SDK iOS" description: "Terminez les transactions manuellement dans votre application iOS avec le SDK Adapty." --- :::note La gestion avancée des transactions est prise en charge dans le SDK iOS Adapty à partir de la version 3.12. ::: La gestion avancée des transactions dans Adapty vous donne plus de contrôle sur la façon dont les transactions sont gérées, vérifiées et finalisées. Elle introduit trois fonctionnalités optionnelles qui fonctionnent ensemble : | Fonctionnalité | Objectif | |-------------------------------------------------------------|----------| | [`appAccountToken`](#assign-appaccounttoken) | Lie les transactions Apple à votre identifiant utilisateur interne | | [`jwsTransaction`](#access-the-jws-representation) | Fournit le payload de transaction signé par Apple pour la validation | | [Finalisation manuelle](#control-transaction-finishing-behavior) | Vous permet de finaliser les transactions uniquement après confirmation du succès par votre backend | Ensemble, ces outils vous permettent de construire des flux de validation personnalisés robustes pendant qu'Adapty continue de synchroniser les transactions avec son backend. :::important La plupart des applications n'en ont pas besoin. Par défaut, Adapty valide et finalise automatiquement les transactions StoreKit. Utilisez ce guide uniquement si vous gérez votre propre validation côté backend ou si vous souhaitez contrôler entièrement le cycle de vie des achats. ::: ## Assigner `appAccountToken` \{#assign-appaccounttoken\} [`appAccountToken`](https://developer.apple.com/documentation/storekit/product/purchaseoption/appaccounttoken(_:)) est un **UUID** qui vous permet de lier les transactions de l'App Store à l'identité interne de vos utilisateurs. StoreKit associe ce token à chaque transaction, ce qui permet à votre backend de faire correspondre les données App Store à vos utilisateurs. Utilisez un UUID stable généré par utilisateur et réutilisez-le pour le même compte sur tous les appareils. Cela garantit que les achats et les notifications App Store restent correctement liés. Vous pouvez définir le token de deux façons — lors de l'activation du SDK ou lors de l'identification de l'utilisateur. :::important Vous devez toujours passer `appAccountToken` avec `customerUserId`. Si vous ne passez que le token, il ne sera pas inclus dans la transaction. :::Pour StoreKit 1 : un objet [SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction).
Pour StoreKit 2 : un objet [Transaction](https://developer.apple.com/documentation/storekit/transaction).
|phoneNumber
firstName
lastName
| String | | gender | Enum, valeurs autorisées : `female`, `male`, `other` | | birthday | Date | ### Attributs utilisateur personnalisés \{#custom-user-attributes\} Vous pouvez définir vos propres attributs personnalisés, généralement liés à l'utilisation de votre application. Par exemple, pour une application de fitness, il peut s'agir du nombre d'exercices par semaine ; pour une application d'apprentissage des langues, du niveau de connaissance de l'utilisateur, etc. Vous pouvez les utiliser dans des segments pour créer des paywalls et des offres ciblées, et les exploiter dans vos analyses pour identifier quelles métriques produit influencent le plus les revenus. ```swift showLineNumbers do { builder = try builder.with(customAttribute: "value1", forKey: "key1") } catch { // handle key/value validation error } ``` Pour supprimer une clé existante, utilisez la méthode `.withRemoved(customAttributeForKey:)` : ```swift showLineNumbers do { builder = try builder.withRemoved(customAttributeForKey: "key2") } catch { // handle error } ``` Il peut arriver que vous ayez besoin de consulter les attributs personnalisés déjà définis. Pour cela, utilisez le champ `customAttributes` de l'objet `AdaptyProfile`. :::warning Gardez à l'esprit que la valeur de `customAttributes` peut ne pas être à jour, car les attributs utilisateur peuvent être envoyés depuis différents appareils à tout moment — les attributs côté serveur ont donc pu changer depuis la dernière synchronisation. ::: ### Limites \{#limits\} - Jusqu'à 30 attributs personnalisés par utilisateur - Les noms de clés peuvent comporter jusqu'à 30 caractères. Ils peuvent contenir des caractères alphanumériques ainsi que les caractères suivants : `_` `-` `.` - La valeur peut être une chaîne de caractères ou un nombre décimal, avec 50 caractères maximum. --- # File: subscription-status --- --- title: "Vérifier le statut d'abonnement dans le SDK iOS" description: "Suivez et gérez le statut d'abonnement des utilisateurs dans Adapty pour améliorer la rétention." --- Avec Adapty, suivre le statut d'abonnement est simple. Vous n'avez pas à insérer manuellement des identifiants de produits dans votre code. Il vous suffit de vérifier le statut d'abonnement d'un utilisateur en contrôlant l'existence d'un [niveau d'accès](access-level) actif. Avant de commencer à vérifier le statut d'abonnement, configurez les [notifications serveur App Store](enable-app-store-server-notifications). ## Niveau d'accès et objet AdaptyProfile \{#access-level-and-the-adaptyprofile-object\} Les niveaux d'accès sont des propriétés de l'objet [AdaptyProfile](https://swift.adapty.io/documentation/adapty/adaptyprofile). Nous recommandons de récupérer le profil au démarrage de votre application, par exemple lorsque vous [identifiez un utilisateur](identifying-users#set-customer-user-id-on-configuration), puis de le mettre à jour à chaque modification. Vous pouvez ainsi utiliser l'objet profil sans avoir à le redemander constamment. Pour être notifié des mises à jour du profil, écoutez les changements comme décrit dans la section [Écouter les mises à jour du statut d'abonnement](subscription-status#listening-for-subscription-status-updates) ci-dessous. :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: ## Récupérer le niveau d'accès depuis le serveur \{#retrieving-the-access-level-from-the-server\} Pour obtenir le niveau d'accès depuis le serveur, utilisez la méthode `.getProfile()` :Un objet [AdaptyProfile](https://swift.adapty.io/documentation/adapty/adaptyprofile). En général, il suffit de vérifier le statut du niveau d'accès du profil pour déterminer si l'utilisateur bénéficie d'un accès premium à l'application.
La méthode `.getProfile` fournit le résultat le plus à jour, car elle interroge toujours l'API. Si, pour une raison quelconque (par exemple, absence de connexion Internet), le SDK Adapty ne parvient pas à récupérer les informations depuis le serveur, les données en cache sont retournées. Il est également important de noter que le SDK Adapty met à jour le cache `AdaptyProfile` régulièrement afin de maintenir ces informations aussi à jour que possible.
| La méthode `.getProfile()` vous fournit le profil utilisateur depuis lequel vous pouvez obtenir le statut du niveau d'accès. Vous pouvez avoir plusieurs niveaux d'accès par application. Par exemple, si vous avez une application de journal et que vous vendez des abonnements à différents sujets indépendamment, vous pouvez créer des niveaux d'accès « sports » et « science ». Mais la plupart du temps, vous n'aurez besoin que d'un seul niveau d'accès ; dans ce cas, vous pouvez simplement utiliser le niveau d'accès par défaut « premium ». Voici un exemple pour vérifier le niveau d'accès « premium » par défaut :optionnel
par défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de locale](localizations-and-locale-codes) pour plus d'informations sur les codes de locale et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne verront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé après le redémarrage de l'application et n'est effacé qu'en cas de réinstallation ou de nettoyage manuel.
Le SDK Adapty stocke les onboardings localement en deux couches : le cache régulièrement mis à jour décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos onboardings tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut impliquer différentes requêtes en interne.
| Paramètres de réponse : | Paramètre | Description | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Un objet [`AdaptyOnboarding`](https://swift.adapty.io/documentation/adapty/adaptyonboarding) contenant : l'identifiant et la configuration de l'onboarding, le Remote Config, et plusieurs autres propriétés. | ## Accélérer la récupération des onboardings avec l'onboarding de l'audience par défaut \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} En général, les onboardings sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et onboardings et que vos utilisateurs ont une connexion internet faible, la récupération d'un onboarding peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un onboarding par défaut pour garantir une expérience fluide plutôt que de ne rien afficher. Pour y remédier, vous pouvez utiliser la méthode `getOnboardingForDefaultAudience`, qui récupère l'onboarding du placement spécifié pour l'audience **All Users**. Il est toutefois essentiel de comprendre que l'approche recommandée est de récupérer l'onboarding via la méthode `getOnboarding`, comme détaillé dans la section [Récupérer un onboarding](#fetch-onboarding) ci-dessus. :::warning Préférez `getOnboarding` à `getOnboardingForDefaultAudience`, car cette dernière présente des limitations importantes : - **Problèmes de compatibilité** : Peut créer des difficultés pour la prise en charge de plusieurs versions d'application, nécessitant soit des designs rétrocompatibles, soit d'accepter que les anciennes versions s'affichent incorrectement. - **Absence de personnalisation** : Affiche uniquement le contenu pour l'audience « All Users », sans ciblage basé sur le pays, l'attribution ou les attributs personnalisés. Si la récupération plus rapide l'emporte sur ces inconvénients dans votre cas, utilisez `getOnboardingForDefaultAudience` comme indiqué ci-dessous. Sinon, utilisez `getOnboarding` comme décrit [ci-dessus](#fetch-onboarding). ::: ```swift showLineNumbers Adapty.getOnboardingForDefaultAudience(placementId: "YOUR_PLACEMENT_ID") { result in switch result { case let .success(onboarding): // the requested onboarding case let .failure(error): // handle the error } } ``` Paramètres : | Paramètre | Présence | Description | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | obligatoire | L'identifiant du [Placement](placements) souhaité. C'est la valeur que vous avez spécifiée lors de la création d'un placement dans l'Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de locale](localizations-and-locale-codes) pour plus d'informations sur les codes de locale et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne verront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé après le redémarrage de l'application et n'est effacé qu'en cas de réinstallation ou de nettoyage manuel.
Le SDK Adapty stocke les onboardings localement en deux couches : le cache régulièrement mis à jour décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos onboardings tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| --- # File: ios-present-onboardings --- --- title: "Présenter les onboardings dans le SDK iOS" description: "Découvrez comment présenter des onboardings sur iOS pour booster vos conversions et vos revenus." --- :::tip **À partir du SDK v4**, vous pouvez créer des [flows](get-pb-paywalls) comme alternative plus puissante aux onboardings. Contrairement aux onboardings qui s'exécutent dans une WebView, les flows s'affichent nativement sur l'appareil — ce qui vous offre des animations plus fluides, un rendu cohérent avec l'interface iOS, des temps de chargement plus rapides et aucune dépendance à l'environnement WebView. Consultez [Obtenir des flows et paywalls](get-pb-paywalls) et [Afficher des flows et paywalls](ios-present-paywalls) pour démarrer. ::: Si vous avez personnalisé un onboarding avec le builder, vous n'avez pas à vous soucier de son rendu dans votre code d'application mobile pour l'afficher à l'utilisateur. Un tel onboarding contient à la fois ce qui doit être affiché et la façon dont il doit l'être. Avant de commencer, assurez-vous que : 1. Vous avez installé [le SDK Adapty iOS](sdk-installation-ios) version 3.8.0 ou ultérieure. 2. Vous avez [créé un onboarding](create-onboarding). 3. Vous avez ajouté l'onboarding à un [placement](placements). ## Présenter des onboardings en Swift \{#present-onboardings-in-swift\} Pour afficher l'onboarding visuel sur l'écran de l'appareil, procédez comme suit : 1. Obtenez la configuration de vue de l'onboarding avec la méthode `.getOnboardingConfiguration`. 2. Initialisez l'onboarding visuel que vous souhaitez afficher avec la méthode `.onboardingController` : Paramètres de la requête : | Paramètre | Présence | Description | |:---------------------------------|:----------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **onboarding configuration** | requis | Un objet `AdaptyUI.OnboardingConfiguration` contenant toutes les propriétés de l'onboarding. Utilisez la méthode `AdaptyUI.getOnboardingConfiguration` pour l'obtenir. | | **delegate** | requis | Un `AdaptyOnboardingControllerDelegate` pour écouter les événements de l'onboarding. | Retourne : | Objet | Description | |:---------------------------------|:---------------------------------------------------------------| | **AdaptyOnboardingController** | Un objet représentant l'écran d'onboarding demandé | 3. Une fois l'objet créé avec succès, vous pouvez l'afficher à l'écran de l'appareil : ```swift showLineNumbers title="Swift" import Adapty import AdaptyUI // 0. Get an onboarding if you haven't done it yet let onboarding = try await Adapty.getOnboarding(placementId: "YOUR_PLACEMENT_ID") // 1. Obtain the onboarding view configuration: let configuration = try AdaptyUI.getOnboardingConfiguration(forOnboarding: onboarding) // 2. Create Onboarding View Controller let onboardingController = try AdaptyUI.onboardingController( with: configuration, delegate:
Vous pouvez ensuite utiliser cet identifiant dans votre code et le traiter comme une action personnalisée. Par exemple, si un utilisateur appuie sur un bouton personnalisé tel que **Login** ou **Allow notifications**, la méthode déléguée `onboardingController` sera déclenchée avec le cas `.custom(id:)` et le paramètre `actionId` correspond à l'**Action ID** défini dans le builder. Vous pouvez créer vos propres identifiants, par exemple "allowNotifications".
```swift showLineNumbers
func onboardingController(_ controller: AdaptyOnboardingController, onCustomAction action: AdaptyOnboardingsCustomAction) {
if action.actionId == "allowNotifications" {
// Request notification permissions
}
}
func onboardingController(_ controller: AdaptyOnboardingController, didFailWithError error: AdaptyUIError) {
// Handle errors
}
```
:::important
Notez que vous devez gérer ce qui se passe lorsqu'un utilisateur ferme l'onboarding. Par exemple, vous devez arrêter d'afficher l'onboarding lui-même.
:::
Par exemple :
```swift showLineNumbers
func onboardingController(_ controller: AdaptyOnboardingController, onCloseAction action: AdaptyOnboardingsCloseAction) {
controller.dismiss(animated: true)
}
```
Ce code d'erreur indique que l'utilisateur a annulé une demande de paiement.
Aucune action n'est requise, mais d'un point de vue métier, vous pouvez proposer une réduction à votre utilisateur ou lui rappeler plus tard.
| | [paymentInvalid](https://developer.apple.com/documentation/storekit/skerror/code/paymentinvalid) | 3 | Cette erreur indique qu'un des paramètres de paiement n'a pas été reconnu par l'App Store. | | [paymentNotAllowed](https://developer.apple.com/documentation/storekit/skerror/code/paymentnotallowed) | 4 | Ce code d'erreur indique que l'utilisateur n'est pas autorisé à valider des paiements. | | [storeProductNotAvailable](https://developer.apple.com/documentation/storekit/skerror/code/storeproductnotavailable) | 5 | Ce code d'erreur indique que le produit demandé n'est pas disponible dans le store.L'[`identifiant`](https://developer.apple.com/documentation/storekit/skpaymentdiscount/identifier) de l'offre n'est pas valide. Par exemple, vous n'avez pas configuré d'offre avec cet identifiant dans l'App Store, ou vous avez révoqué l'offre.
Assurez-vous de configurer les offres souhaitées dans App Store Connect et de transmettre un identifiant d'offre valide.
| | [invalidSignature](https://developer.apple.com/documentation/storekit/skerror/code/invalidsignature) | 12 | Ce code d'erreur indique que la signature dans une remise de paiement n'est pas valide. | | [missingOfferParams](https://developer.apple.com/documentation/storekit/skerror/code/missingofferparams) | 13 | Ce code d'erreur indique que des paramètres sont manquants dans une remise de paiement. | | [invalidOfferPrice](https://developer.apple.com/documentation/storekit/skerror/code/invalidofferprice/) | 14 | Ce code d'erreur indique que le prix que vous avez spécifié dans App Store Connect n'est plus valide. Les offres doivent toujours correspondre à un prix réduit. | | noProductIDsFound | 1000 |Cette erreur indique qu'aucun des produits que vous avez demandés sur le paywall n'est disponible à l'achat dans l'App Store, même s'ils y sont répertoriés. Cette erreur peut parfois s'accompagner d'un avertissement `InvalidProductIdentifiers`. Si l'avertissement apparaît sans erreur, ignorez-le.
Si vous rencontrez cette erreur, suivez les étapes de la section [Correction de l'erreur Code-1000 `noProductIDsFound`](InvalidProductIdentifiers).
| | productRequestFailed | 1002 | Impossible de récupérer les produits disponibles pour le moment. | | cantMakePayments | 1003 | Les achats intégrés ne sont pas autorisés sur cet appareil. Consultez le [guide](cantMakePayments) de dépannage. | | [cantReadReceipt](https://developer.apple.com/documentation/storekit/skerror/code/paymentcancelled) | 1005 |Aucun reçu valide n'est disponible sur l'appareil. Cela peut poser problème lors des tests en sandbox.
En sandbox, vous n'aurez pas de fichier de reçu valide tant que vous n'aurez pas effectué un achat, assurez-vous donc d'en faire un avant d'y accéder. Lors des tests en sandbox, vérifiez également que vous êtes connecté sur l'appareil avec un compte sandbox Apple valide.
| | productPurchaseFailed | 1006 | L'achat du produit a échoué. Cette erreur encapsule une erreur StoreKit sous-jacente — lisez `originalError` (ou activez les logs détaillés pour la voir dans la console) pour connaître la raison réelle. L'erreur encapsulée correspond généralement à l'un des codes StoreKit 0–14 du tableau ci-dessus — le plus souvent `paymentCancelled`, `paymentInvalid`, `paymentNotAllowed` ou `invalidOfferPrice`. Si vous ne pouvez pas identifier une raison précise, essayez un nouveau [profil sandbox](test-purchases-in-sandbox) ; si le problème persiste, contactez le support Apple. | | refreshReceiptFailed | 1010 | L'opération de rafraîchissement du reçu a échoué. | | fetchSubscriptionStatusFailed | 1020 | Impossible de récupérer le statut de l'abonnement depuis l'App Store. | | unknownTransactionId | 1030 | L'identifiant de transaction est inconnu. | | paymentPendingError | 1050 | Le paiement est actuellement en attente. | ## Erreurs réseau \{#network-errors\} | Erreur | Code | Solution | | :------------- | :--- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | notActivated | 2002 | Le SDK Adapty n'est pas activé.
2. Cliquez sur le nom du groupe d'abonnements. Vos produits s'affichent dans la section **Subscriptions**.
3. Assurez-vous que le produit testé est bien marqué **Ready to Submit**. Si ce n'est pas le cas, suivez les instructions sur la page [Produit dans l'App Store](app-store-products).
4. Comparez l'identifiant du produit dans le tableau avec celui de l'onglet [**Products**](https://app.adapty.io/products) dans l'Adapty Dashboard. Si les identifiants ne correspondent pas, copiez l'identifiant depuis le tableau et [créez un produit](create-product) avec cet identifiant dans l'Adapty Dashboard.
## Étape 3. Vérifier la disponibilité du produit \{#step-4-check-product-availability\}
1. Retournez dans **App Store Connect** et ouvrez la même section **Subscriptions**.
2. Cliquez sur le nom du groupe d'abonnements pour afficher vos produits.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à la section **Availability** et vérifiez que tous les pays et régions requis y figurent.
## Étape 4. Vérifier les prix du produit \{#step-5-check-product-prices\}
1. Retournez dans la section **Monetization** → **Subscriptions** dans **App Store Connect**.
2. Cliquez sur le nom du groupe d'abonnements.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à **Subscription Pricing** et développez la section **Current Pricing for New Subscribers**.
5. Vérifiez que tous les prix requis sont bien listés.
## Étape 5. Vérifier le statut des applications payantes, le compte bancaire et les formulaires fiscaux
1. Sur la page d'accueil d'**[App Store Connect](https://appstoreconnect.apple.com/)**, cliquez sur **Business**.
2. Sélectionnez le nom de votre entreprise.
3. Faites défiler vers le bas et vérifiez que votre **Paid Apps Agreement**, votre **Bank Account** et vos **Tax forms** affichent tous le statut **Active**.
En suivant ces étapes, vous devriez pouvoir résoudre l'avertissement `InvalidProductIdentifiers` et rendre vos produits disponibles dans le store.
## Étape 6. Recréer le produit s'il est bloqué
Les étapes 1 à 5 peuvent toutes être validées — statut `Approved`, Bundle ID correspondant, clé API valide — et pourtant le SDK renvoie toujours `1000 noProductIDsFound`. Dans ce cas, le produit est peut-être bloqué dans le registre d'Apple. Il arrive que le registre des produits d'Apple entre dans un état où un produit existe dans l'interface d'App Store Connect mais n'est pas exposé au chemin de recherche StoreKit.
Supprimez le produit dans App Store Connect et recréez-le avec le même identifiant de produit. Comptez jusqu'à 24 heures après la recréation pour la propagation.
---
# File: cantMakePayments
---
---
title: "Correction de l'erreur Code-1003 cantMakePayment"
description: "Résolvez l'erreur de paiement lors de la gestion des abonnements dans Adapty."
---
L'erreur 1003, `cantMakePayments`, indique que les achats intégrés ne peuvent pas être effectués sur cet appareil.
Si vous rencontrez l'erreur `cantMakePayments`, cela est généralement dû à l'une des raisons suivantes :
- Restrictions de l'appareil : L'erreur n'est pas liée à Adapty. Consultez les solutions ci-dessous.
- Configuration du mode Observateur : La méthode `makePurchase` et le mode Observateur ne peuvent pas être utilisés simultanément. Consultez la section ci-dessous.
## Problème : Restrictions de l'appareil \{#issue-device-restrictions\}
| Problème | Solution |
|--------------------------------|-------------------------------------------------------------------------------------------------------------|
| Restrictions Screen Time | Désactivez les restrictions d'achat intégré dans [Screen Time](https://support.apple.com/en-us/102470) |
| Compte suspendu | Contactez le support Apple pour résoudre les problèmes de compte |
| Restrictions régionales | Utilisez un compte App Store d'une région prise en charge |
## Problème : Utilisation simultanée du mode Observateur et de makePurchase \{#issue-using-both-observer-mode-and-makepurchase\}
Si vous utilisez `makePurchases` pour gérer les achats, vous n'avez pas besoin d'utiliser le mode Observateur. Le [mode Observateur](observer-vs-full-mode) n'est nécessaire que si vous implémentez vous-même la logique d'achat.
Ainsi, si vous utilisez `makePurchase`, vous pouvez supprimer en toute sécurité l'activation du mode Observateur dans le code d'initialisation du SDK.
---
# File: ios-sdk-migration-guides
---
---
title: "Guides de migration iOS SDK"
description: "Guides de migration pour les versions du SDK Adapty iOS."
---
Cette page regroupe tous les guides de migration pour le SDK Adapty iOS. Choisissez la version vers laquelle vous souhaitez migrer pour obtenir des instructions détaillées :
- [**Migrer vers v4.0**](migration-to-ios-sdk-v4)
- [**Migrer vers v3.15**](migration-to-ios-315)
- **[Migrer vers v3.4](migration-to-ios-sdk-34)**
- **[Migrer vers v3.3](migration-to-ios330)**
- **[Migrer vers v3.0](migration-to-ios-sdk-v3)**
---
# File: migration-to-ios-sdk-v4
---
---
title: "Migrer le SDK iOS Adapty vers la v4.0"
description: "Migrez vers le SDK iOS Adapty v4.0 en remplaçant les API paywall par des API flow, compatibles avec le Flow Builder et le Paywall Builder."
---
Le SDK iOS Adapty 4.0 introduit les flows et renomme les API paywall en conséquence. Les nouvelles API fonctionnent aussi bien avec le nouveau Flow Builder qu'avec le Paywall Builder existant — aucune modification de configuration n'est requise côté Adapty Dashboard.
## Référence rapide \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty.getPaywall(placementId:locale:)` | `Adapty.getFlow(placementId:)` |
| `AdaptyUI.getPaywallConfiguration(forPaywall:)` | `AdaptyUI.getFlowConfiguration(forFlow:locale:)` |
| `Adapty.getPaywallProducts(paywall:)` | `Adapty.getPaywallProducts(flow:)` |
| `Adapty.logShowPaywall(_:)` | `Adapty.logShowFlow(_:)` |
| `AdaptyPaywallController` | `AdaptyFlowController` |
| `AdaptyPaywallControllerDelegate` | `AdaptyFlowControllerDelegate` |
| `AdaptyUI.paywallController(with:delegate:)` | `AdaptyUI.flowController(with:delegate:)` |
| `.paywall()` (modificateur SwiftUI) | `.flow()` |
| `AdaptyPaywallView` | `AdaptyFlowView` |
| `didFailRenderingWith:` / `didFailRendering:` | `didReceiveError:` |
| `didFinishPurchase` (optionnel, fermeture automatique en cas de succès) | `didFinishPurchase` (requis, pas de fermeture automatique) |
| Produits de package `Adapty_KidsMode` / `AdaptyUI_KidsMode` | Trait de package `KidsMode` |
| `Adapty.updateAttribution(_:source:)` (`source: String`) | `Adapty.updateAttribution(_:source:)` (`source: AdaptyAttributionSource`) |
| `Adapty.setIntegrationIdentifier(key:value:)` | `Adapty.setIntegrationIdentifier(_:)` (`AdaptyIntegrationIdentifier`) |
## Version iOS minimale \{#minimum-ios-version\}
Adapty iOS SDK 4.0 fait passer la cible de déploiement minimale d'iOS 13.0 à **iOS 15.0**. Définissez la cible de déploiement iOS de votre projet à 15.0 ou une version ultérieure avant de procéder à la mise à niveau.
## Installation : CocoaPods n'est plus pris en charge \{#installation-cocoapods-no-longer-supported\}
Adapty iOS SDK 4.0 abandonne le support de CocoaPods. Installez le SDK avec [Swift Package Manager](sdk-installation-ios#install-adapty-sdk).
Si votre projet utilise encore CocoaPods, supprimez les pods `Adapty` et `AdaptyUI` de votre `Podfile`, exécutez `pod install` pour les supprimer, puis ajoutez le package dans Xcode via **File → Add Package Dependency** en utilisant `https://github.com/adaptyteam/AdaptySDK-iOS.git`.
## Mode Enfants : produits séparés remplacés par un trait de package \{#kids-mode-separate-products-replaced-by-a-package-trait\}
Dans la v3, vous activiez le [Mode Enfants](kids-mode) en sélectionnant les produits de package distincts **Adapty_KidsMode** et **AdaptyUI_KidsMode** et en renommant vos imports. Dans la v4.0, ces produits ont été supprimés. Le Mode Enfants est désormais un trait de package Swift nommé `KidsMode` sur le package Adapty standard — son activation exclut IDFA et AdSupport de l'ensemble du SDK à la compilation.
Pour migrer :
1. Dans la fenêtre **Choose Package Products**, sélectionnez les produits standard **Adapty** et **AdaptyUI** au lieu de **Adapty_KidsMode** et **AdaptyUI_KidsMode**.
2. Activez le trait `KidsMode`. Dans Xcode 26.4 ou version ultérieure, activez-le pour la dépendance AdaptySDK-iOS dans la vue **Package Dependencies** de votre projet. Si vous ajoutez Adapty en tant que dépendance dans `Package.swift` (nécessite `swift-tools-version` 6.1 ou version ultérieure), activez-le à cet endroit :
```swift showLineNumbers title="Package.swift"
.package(
url: "https://github.com/adaptyteam/AdaptySDK-iOS.git",
from: "4.0.0",
traits: ["KidsMode"]
)
```
3. Remettez vos imports sur les modules standard :
```diff showLineNumbers
- import Adapty_KidsMode
- import AdaptyUI_KidsMode
+ import Adapty
+ import AdaptyUI
```
:::note
Les versions de Xcode antérieures à 26.4 ne permettent pas d'activer les traits pour un projet Xcode depuis l'interface. Dans ce cas, ajoutez un petit package Swift local qui dépend d'Adapty avec le trait `KidsMode` activé, et faites dépendre votre cible d'application de ce package.
:::
## APIs supprimées \{#removed-apis\}
- **`Adapty.getPaywallProductsWithoutDeterminingOffer(paywall:)`** — supprimée. Tous les produits incluent désormais les informations sur les offres, ce qui rend la vérification séparée d'éligibilité inutile.
- **`AdaptyPaywallProductWithoutDeterminingOffer`** — supprimée. Les callbacks qui utilisaient auparavant ce type (comme `didSelectProduct`) transmettent maintenant `AdaptyPaywallProduct`.
## Les achats intégrés promus sur l'App Store temporairement supprimés \{#app-store-promoted-in-app-purchases-temporarily-removed\}
Dans le cadre de la migration vers StoreKit 2, le SDK iOS Adapty 4.0 supprime la prise en charge des achats intégrés promus sur l'App Store. La méthode delegate `shouldAddStorePayment(for:)` et le type `AdaptyDeferredProduct` qu'elle reçoit ne sont pas disponibles dans la version 4.0.
:::warning
Cette suppression est temporaire — la prise en charge des achats intégrés promus sera de retour dans une version ultérieure 4.x. Si votre application repose sur des achats intégrés promus, restez sur le SDK iOS 3.x jusqu'au retour de cette fonctionnalité.
:::
## Récupération des paywalls \{#fetching-paywalls\}
### getPaywall + getPaywallConfiguration → getFlow + getFlowConfiguration
Les types retournés passent de `AdaptyPaywall` / `AdaptyUI.PaywallConfiguration` à `AdaptyFlow` / `AdaptyUI.FlowConfiguration`. Le paramètre `locale` quitte l'appel de récupération et se déplace vers `getFlowConfiguration` :
```diff showLineNumbers
- let paywall = try await Adapty.getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en")
- let paywallConfiguration = try await AdaptyUI.getPaywallConfiguration(forPaywall: paywall)
+ let flow = try await Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID")
+ let flowConfiguration = try await AdaptyUI.getFlowConfiguration(forFlow: flow, locale: "en")
```
### getPaywallProducts(paywall:) → getPaywallProducts(flow:)
`getPaywallProducts` prend désormais un `AdaptyFlow` retourné par `Adapty.getFlow` :
```diff showLineNumbers
- let products = try await Adapty.getPaywallProducts(paywall: paywall)
+ let products = try await Adapty.getPaywallProducts(flow: flow)
```
### Fichiers de secours \{#fallback-files\}
Le format du fichier de secours [a changé avec le SDK v4](fallback-flows). Téléchargez le nouveau fichier depuis **[Placements](https://app.adapty.io/placements)** > **Fallbacks** et intégrez-le à votre application.
## Suivi des vues de paywall \{#tracking-paywall-views\}
### logShowPaywall(_:) → logShowFlow(_:)
`logShowPaywall` est renommé en `logShowFlow` et prend désormais un `AdaptyFlow` à la place d'un `AdaptyPaywall`. L'événement est toujours enregistré pour la même variation, donc les métriques de funnel et de test A/B existantes continuent de fonctionner sans modification du tableau de bord.
```diff showLineNumbers
- try await Adapty.logShowPaywall(paywall)
+ try await Adapty.logShowFlow(flow)
```
Comme dans la v3, vous n'avez pas besoin d'appeler cette méthode lors de l'affichage des flows ou des paywalls générés par le [Flow Builder](adapty-flow-builder) ou le [Paywall Builder](adapty-paywall-builder) — Adapty suit ces vues automatiquement.
## didFinishPurchase est maintenant obligatoire \{#didfinishpurchase-is-now-required\}
Dans la v3, `didFinishPurchase` était facultatif : si vous ne l'implémentiez pas, le paywall se fermait automatiquement après un achat réussi. Dans la v4.0, ce comportement de fermeture automatique par défaut a été supprimé afin qu'un flow puisse continuer après un achat réussi — par exemple, pour afficher les écrans restants de votre flow. Vous décidez désormais ce qui se passe après un achat : fermer l'écran, ou ne rien faire pour laisser le flow continuer.
- **UIKit** : les conformeurs à `AdaptyFlowControllerDelegate` doivent implémenter `didFinishPurchase` — cette méthode n'a plus d'implémentation par défaut.
- **SwiftUI** : la closure `didFinishPurchase` de `.flow(...)` et `AdaptyFlowView(...)` est désormais non-optionnelle, au même titre que `didFailPurchase` et `didFinishRestore`.
Pour conserver le comportement de la v3, fermez l'écran vous-même :
```swift showLineNumbers title="Swift"
func flowController(
_ controller: AdaptyFlowController,
didFinishPurchase product: AdaptyPaywallProduct,
purchaseResult: AdaptyPurchaseResult
) {
if !purchaseResult.isPurchaseCancelled {
controller.dismiss(animated: true)
}
}
```
## UIKit \{#uikit\}
### AdaptyPaywallController → AdaptyFlowController
Renommez le type de contrôleur et la méthode factory :
```diff showLineNumbers
- let controller = try AdaptyUI.paywallController(
- with: paywallConfiguration,
- delegate: self
- )
+ let controller = try AdaptyUI.flowController(
+ with: flowConfiguration,
+ delegate: self
+ )
```
### AdaptyPaywallControllerDelegate → AdaptyFlowControllerDelegate
Renommez le protocole et mettez à jour chaque signature de méthode. Notez que `didSelectProduct` reçoit désormais `AdaptyPaywallProduct` au lieu de l'`AdaptyPaywallProductWithoutDeterminingOffer` supprimé, et `didFinishPurchase` [doit maintenant être implémenté](#didfinishpurchase-is-now-required) — il n'a plus d'implémentation par défaut.
```diff showLineNumbers
- class YourClass: AdaptyPaywallControllerDelegate {
+ class YourClass: AdaptyFlowControllerDelegate {
- func paywallControllerDidAppear(_ controller: AdaptyPaywallController) { }
+ func flowControllerDidAppear(_ controller: AdaptyFlowController) { }
- func paywallControllerDidDisappear(_ controller: AdaptyPaywallController) { }
+ func flowControllerDidDisappear(_ controller: AdaptyFlowController) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didPerform action: AdaptyUI.Action) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didPerform action: AdaptyUI.Action) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didSelectProduct product: AdaptyPaywallProductWithoutDeterminingOffer) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didSelectProduct product: AdaptyPaywallProduct) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didStartPurchase product: AdaptyPaywallProduct) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didStartPurchase product: AdaptyPaywallProduct) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFinishPurchase product: AdaptyPaywallProduct,
- purchaseResult: AdaptyPurchaseResult) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFinishPurchase product: AdaptyPaywallProduct,
+ purchaseResult: AdaptyPurchaseResult) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailPurchase product: AdaptyPaywallProduct,
- error: AdaptyError) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFailPurchase product: AdaptyPaywallProduct,
+ error: AdaptyError) { }
- func paywallControllerDidStartRestore(_ controller: AdaptyPaywallController) { }
+ func flowControllerDidStartRestore(_ controller: AdaptyFlowController) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFinishRestoreWith profile: AdaptyProfile) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFinishRestoreWith profile: AdaptyProfile) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailRestoreWith error: AdaptyError) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFailRestoreWith error: AdaptyError) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailRenderingWith error: AdaptyUIError) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didReceiveError error: AdaptyUIError) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFailLoadingProductsWith error: AdaptyError) -> Bool { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFailLoadingProductsWith error: AdaptyError) -> Bool { }
- func paywallController(_ controller: AdaptyPaywallController,
- didPartiallyLoadProducts failedIds: [String]) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didPartiallyLoadProducts failedIds: [String]) { }
- func paywallController(_ controller: AdaptyPaywallController,
- didFinishWebPaymentNavigation product: AdaptyPaywallProduct?,
- error: AdaptyError?) { }
+ func flowController(_ controller: AdaptyFlowController,
+ didFinishWebPaymentNavigation product: AdaptyPaywallProduct?,
+ error: AdaptyError?) { }
}
```
## SwiftUI \{#swiftui\}
### Modificateur `.paywall()` → `.flow()` \{#paywall-modifier--flow\}
Renommez le modificateur, mettez à jour le nom du paramètre de configuration, et ajoutez la closure [`didFinishPurchase`](#didfinishpurchase-is-now-required) (désormais obligatoire) :
```diff showLineNumbers
@State var flowPresented = false // rename freely — the variable name is your choice
var body: some View {
Text("Hello, AdaptyUI!")
- .paywall(
+ .flow(
isPresented: $flowPresented,
- paywallConfiguration: paywallConfiguration,
+ flowConfiguration: flowConfiguration,
+ didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
didFailPurchase: { product, error in /* handle the error */ },
didFinishRestore: { profile in /* check access level and dismiss */ },
didFailRestore: { error in /* handle the error */ },
- didFailRendering: { error in flowPresented = false }
+ didReceiveError: { error in flowPresented = false }
)
}
```
Le callback renommé se déclenche pour les mêmes erreurs de rendu que `didFailRendering`, plus les nouvelles erreurs d'exécution provenant du script de flow (exceptions JavaScript avec le code `AdaptyUIError` `4105` — `.jsException`). Les corps de handler existants ne nécessitent aucune modification — il suffit de renommer le paramètre.
### AdaptyPaywallView → AdaptyFlowView
Renommez la vue, mettez à jour le paramètre de configuration, ajoutez la closure [`didFinishPurchase`](#didfinishpurchase-is-now-required) (désormais obligatoire), et mettez à jour toute closure `didSelectProduct` — elle reçoit maintenant `AdaptyPaywallProduct` à la place du type supprimé `AdaptyPaywallProductWithoutDeterminingOffer` :
```diff showLineNumbers
- AdaptyPaywallView(
- paywallConfiguration: paywallConfiguration,
- didSelectProduct: { product: AdaptyPaywallProductWithoutDeterminingOffer in /* handle */ },
+ AdaptyFlowView(
+ flowConfiguration: flowConfiguration,
+ didSelectProduct: { product: AdaptyPaywallProduct in /* handle */ },
+ didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
didFailPurchase: { product, error in /* handle the error */ },
didFinishRestore: { profile in /* check access level and dismiss */ },
didFailRestore: { error in /* handle the error */ },
- didFailRendering: { error in /* handle the error */ }
+ didReceiveError: { error in /* handle the error */ }
)
```
## Ressources personnalisées AdaptyUI \{#adaptyui-custom-assets\}
### AdaptyUICustomVideoAsset
Deux changements affectent tous les appels existants :
- `.player` accepte désormais `AVPlayer` au lieu de `AVQueuePlayer`.
- Chaque cas a reçu un paramètre supplémentaire `resolution: CGSize?` en fin de signature. Passez `nil` pour conserver le comportement actuel, ou indiquez la taille réelle en pixels afin que le lecteur puisse réserver l'espace de mise en page (ratio = `width / height`) avant le chargement de la vidéo.
```diff showLineNumbers
- case file(url: URL, preview: AdaptyUICustomImageAsset?)
- case remote(url: URL, preview: AdaptyUICustomImageAsset?)
- case player(item: AVPlayerItem, player: AVQueuePlayer, preview: AdaptyUICustomImageAsset?)
+ case file(url: URL, preview: AdaptyUICustomImageAsset?, resolution: CGSize?)
+ case remote(url: URL, preview: AdaptyUICustomImageAsset?, resolution: CGSize?)
+ case player(item: AVPlayerItem, player: AVPlayer, preview: AdaptyUICustomImageAsset?, resolution: CGSize?)
```
## Identifiants d'attribution et d'intégration \{#attribution-and-integration-identifiers\}
### updateAttribution(_:source:)
Le paramètre `source` passe du type `String` au nouveau type `AdaptyAttributionSource`, et l'ancien `AdaptyProfile.AttributionSource` imbriqué est renommé en `AdaptyAttributionSource` au niveau supérieur. Utilisez l'une des sources prédéfinies, ou passez un littéral de chaîne pour toute autre source — `AdaptyAttributionSource` est conforme à `ExpressibleByStringLiteral`, donc les appels existants avec des littéraux de chaîne continuent de compiler.
```diff showLineNumbers
- try await Adapty.updateAttribution(attribution, source: "adjust")
+ try await Adapty.updateAttribution(attribution, source: .adjust)
```
Sources prédéfinies : `.appleAds`, `.adjust`, `.appsflyer`, `.branch`, `.tenjin`. Si vous conservez la source dans une variable `String`, encapsulez-la : `AdaptyAttributionSource(rawValue: yourSource)`.
### setIntegrationIdentifier(_:)
`setIntegrationIdentifier(key:value:)` est remplacé par une méthode variadique qui accepte une ou plusieurs valeurs `AdaptyIntegrationIdentifier`. Utilisez les méthodes factory prédéfinies plutôt que des clés de type chaîne brute :
```diff showLineNumbers
- try await Adapty.setIntegrationIdentifier(key: "appsflyer_id", value: uid)
+ try await Adapty.setIntegrationIdentifier(.appsflyerId(uid))
```
Vous pouvez définir plusieurs identifiants en un seul appel :
```swift showLineNumbers
try await Adapty.setIntegrationIdentifier(
.appsflyerId(uid),
.adjustDeviceId(adid)
)
```
Remplacez chaque ancienne chaîne de clé par sa méthode factory correspondante :
| v3 key | v4 factory |
|---|---|
| `"adjust_device_id"` | `.adjustDeviceId(_:)` |
| `"airbridge_device_id"` | `.airbridgeDeviceId(_:)` |
| `"amplitude_user_id"` | `.amplitudeUserId(_:)` |
| `"amplitude_device_id"` | `.amplitudeDeviceId(_:)` |
| `"appmetrica_device_id"` | `.appmetricaDeviceId(_:)` |
| `"appmetrica_profile_id"` | `.appmetricaProfileId(_:)` |
| `"appsflyer_id"` | `.appsflyerId(_:)` |
| `"branch_id"` | `.branchId(_:)` |
| `"facebook_anonymous_id"` | `.facebookAnonymousId(_:)` |
| `"firebase_app_instance_id"` | `.firebaseAppInstanceId(_:)` |
| `"mixpanel_user_id"` | `.mixpanelUserId(_:)` |
| `"one_signal_subscription_id"` | `.oneSignalSubscriptionId(_:)` |
| `"one_signal_player_id"` | `.oneSignalPlayerId(_:)` |
| `"posthog_distinct_user_id"` | `.posthogDistinctUserId(_:)` |
| `"pushwoosh_hwid"` | `.pushwooshHWID(_:)` |
| `"tenjin_analytics_installation_id"` | `.tenjinAnalyticsInstallationId(_:)` |
---
# File: migration-to-ios-315
---
---
title: "Migrer le SDK iOS Adapty vers la v3.15"
description: "Migrez vers le SDK iOS Adapty v3.15 pour de meilleures performances et de nouvelles fonctionnalités de monétisation."
---
Si vous utilisez le [Paywall Builder](adapty-paywall-builder) en [mode Observer](observer-vs-full-mode), à partir du SDK iOS 3.15, vous devez implémenter une nouvelle méthode `observerModeDidInitiateRestorePurchases(onStartRestore:onFinishRestore:)`. Cette méthode offre un meilleur contrôle sur la logique de restauration, vous permettant de gérer les restaurations d'achats dans votre flow personnalisé. Pour tous les détails d'implémentation, consultez [Afficher les paywalls du Paywall Builder en mode Observer](ios-present-paywall-builder-paywalls-in-observer-mode).
```diff showLineNumbers
func observerMode(didInitiatePurchase product: AdaptyPaywallProduct,
onStartPurchase: @escaping () -> Void,
onFinishPurchase: @escaping () -> Void) {
// use the product object to handle the purchase
// use the onStartPurchase and onFinishPurchase callbacks to notify AdaptyUI about the process of the purchase
}
+ func observerModeDidInitiateRestorePurchases(onStartRestore: @escaping () -> Void,
+ onFinishRestore: @escaping () -> Void) {
+ // use the onStartRestore and onFinishRestore callbacks to notify AdaptyUI about the process of the restore
+ }
```
---
# File: migration-to-ios-sdk-34
---
---
title: "Migrer vers le SDK Adapty iOS v3.4"
description: "Migrez vers le SDK Adapty iOS v3.4 pour de meilleures performances et de nouvelles fonctionnalités de monétisation."
---
Le SDK Adapty 3.4.0 est une version majeure qui introduit des améliorations nécessitant des étapes de migration de votre côté.
## Mettre à jour l'activation du SDK Adapty \{#update-adapty-sdk-activation\}
### Lors de la connexion/inscription \{#during-loginsignup\}
Si vous identifiez les utilisateurs après le lancement de l'application (par exemple, après qu'ils se sont connectés ou inscrits), utilisez la méthode `identify` pour définir leur customer user ID.
- Si vous **n'avez pas encore utilisé ce customer user ID**, Adapty le liera automatiquement au profil actuel.
- Si vous **avez déjà utilisé ce customer user ID pour identifier l'utilisateur**, Adapty basculera vers le profil associé à ce customer user ID.
:::important
Les customer user IDs doivent être uniques pour chaque utilisateur. Si vous codez la valeur du paramètre en dur, tous les utilisateurs seront considérés comme un seul et même utilisateur.
:::
Attendez que `identify` se termine (dans son callback `onSuccess`) avant d'appeler d'autres méthodes du SDK. Des appels simultanés peuvent atterrir sur le profil anonyme. Voir [Ordre des appels dans le SDK Kotlin Multiplatform](kmp-sdk-call-order).
```kotlin showLineNumbers
Adapty.identify("YOUR_USER_ID") // Unique for each user
.onSuccess {
// successful identify
}
.onError { error ->
// handle the error
}
```
### Lors de l'activation du SDK \{#during-the-sdk-activation\}
Si vous connaissez déjà un customer user ID au moment d'activer le SDK, vous pouvez l'envoyer dans la méthode `activate` au lieu d'appeler `identify` séparément.
Si vous connaissez un customer user ID mais ne le définissez qu'après l'activation, cela signifie qu'à l'activation, Adapty créera un nouveau profil anonyme et ne basculera vers le profil existant qu'après votre appel à `identify`.
Vous pouvez passer un customer user ID existant (que vous avez déjà utilisé) ou un nouveau. Si vous en passez un nouveau, le nouveau profil créé lors de l'activation sera automatiquement lié au customer user ID.
:::note
Par défaut, la création de profils anonymes n'affecte pas les tableaux de bord d'analyse, car les installations sont comptées en fonction des ID d'appareil.
Un ID d'appareil représente une seule installation de l'application depuis le store sur un appareil et n'est régénéré qu'après la réinstallation de l'application.
Il ne dépend pas du fait qu'il s'agisse d'une première ou d'une énième installation, ni de l'utilisation d'un customer user ID existant.
La création d'un profil (lors de l'activation du SDK ou de la déconnexion), la connexion ou la mise à jour de l'application sans réinstallation ne génèrent pas d'événements d'installation supplémentaires.
Si vous souhaitez compter les installations en fonction des utilisateurs uniques plutôt que des appareils, accédez à **App settings** et configurez [**Installs definition for analytics**](general#4-installs-definition-for-analytics).
:::
```kotlin showLineNumbers
AdaptyConfig.Builder("PUBLIC_SDK_KEY")
.withCustomerUserId("user123") // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
.build()
```
### Déconnecter les utilisateurs \{#log-users-out\}
Si vous avez un bouton pour déconnecter les utilisateurs, utilisez la méthode `logout`.
:::important
La déconnexion d'un utilisateur crée un nouveau profil anonyme pour cet utilisateur.
:::
```kotlin showLineNumbers
Adapty.logout()
.onSuccess {
// successful logout
}
.onError { error ->
// handle the error
}
```
:::info
Pour reconnecter des utilisateurs à l'application, utilisez la méthode `identify`.
:::
### Autoriser les achats sans connexion \{#allow-purchases-without-login\}
Si vos utilisateurs peuvent effectuer des achats avant et après leur connexion à votre application, vous devez vous assurer qu'ils conserveront leur accès après la connexion :
1. Lorsqu'un utilisateur non connecté effectue un achat, Adapty l'associe à son ID de profil anonyme.
2. Lorsque l'utilisateur se connecte à son compte, Adapty bascule vers son profil identifié.
- S'il s'agit d'un nouveau customer user ID (par exemple, l'achat a été effectué avant l'inscription), Adapty attribue le customer user ID au profil actuel, de sorte que tout l'historique des achats est conservé.
- S'il s'agit d'un customer user ID existant (le customer user ID est déjà lié à un profil), vous devez obtenir le niveau d'accès réel après le changement de profil. Vous pouvez soit appeler [`getProfile`](kmp-check-subscription-status) juste après l'identification, soit [écouter les mises à jour du profil](kmp-check-subscription-status) pour que les données se synchronisent automatiquement.
## Étapes suivantes \{#next-steps\}
Félicitations ! Vous avez implémenté la logique de paiement intégré dans votre application ! Nous vous souhaitons beaucoup de succès dans la monétisation de votre application !
Pour tirer encore plus parti d'Adapty, vous pouvez explorer ces sujets :
- [**Tests**](troubleshooting-test-purchases) : Vérifiez que tout fonctionne comme prévu
- [**Intégrations**](configuration) : Intégrez des services d'attribution marketing et d'analyse en une seule ligne de code
- [**Définir des attributs de profil personnalisés**](kmp-setting-user-attributes) : Ajoutez des attributs personnalisés aux profils utilisateurs et créez des segments pour lancer des tests A/B ou afficher des paywalls différents à différents utilisateurs
---
# File: adapty-sdk-integration-skill-kmp
---
---
title: "Intégrer Adapty dans votre application Kotlin Multiplatform avec la compétence d'intégration SDK"
description: "Utilisez la compétence adapty-sdk-integration pour intégrer le SDK Adapty dans votre application Kotlin Multiplatform de bout en bout avec votre outil de codage IA."
---
:::important
La compétence est en version bêta. Si elle se bloque ou se comporte de manière inattendue, suivez le [guide d'intégration étape par étape](adapty-cursor-kmp) à la place — il guide votre outil IA à travers chaque étape avec la documentation appropriée.
:::
La [compétence adapty-sdk-integration](https://github.com/adaptyteam/adapty-sdk-integration-skill) automatise l'intégration Adapty de bout en bout : configuration du tableau de bord, installation du SDK, paywall et vérification à chaque étape. Elle détecte automatiquement votre plateforme et récupère la documentation Adapty pertinente à chaque étape.
**Outils compatibles** : Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Pour installer, choisissez le formulaire correspondant à votre outil. La liste complète se trouve dans le [README de la compétence](https://github.com/adaptyteam/adapty-sdk-integration-skill).
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex ou tout autre outil** — utilisez la [CLI skills](https://skills.sh) (notez que les compétences installées de cette façon ne se mettent pas à jour automatiquement) :
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Vous pouvez également cloner le dépôt et copier `skills/adapty-sdk-integration/` dans le répertoire des compétences de votre outil.
Après l'installation, exécutez la compétence dans votre projet :
```
/adapty-sdk-integration
```
La compétence pose quelques questions de configuration, puis guide à travers la configuration du tableau de bord, l'installation du SDK, le paywall et la vérification.
---
# File: adapty-cursor-kmp
---
---
title: "Intégrer Adapty dans votre application Kotlin Multiplatform avec l'aide de l'IA"
description: "Un guide étape par étape pour intégrer Adapty dans votre application Kotlin Multiplatform avec Cursor, Context7, ChatGPT, Claude ou d'autres outils IA."
---
Ce guide vous accompagne pas à pas dans l'intégration d'Adapty dans votre application Kotlin Multiplatform à l'aide d'un outil IA — vous lui fournissez la bonne documentation Adapty dans le bon ordre.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Avant de commencer : configuration du tableau de bord \{#before-you-start-dashboard-setup\}
Adapty nécessite une configuration préalable dans le tableau de bord avant d'écrire le moindre code SDK. Vous pouvez le faire via un skill LLM interactif ou manuellement depuis le Dashboard.
### Approche par skill (recommandée) \{#skill-approach-recommended\}
Le skill Adapty CLI permet à votre LLM de configurer votre application, vos produits, niveaux d'accès, paywalls et placements directement — sans ouvrir le Dashboard à chaque étape. Vous devez uniquement [connecter vos stores](integrate-payments) dans le Dashboard.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Une fois le skill ajouté, lancez `/adapty-cli` dans votre agent. Il vous guidera à chaque étape — y compris quand ouvrir le Dashboard pour connecter vos stores.
### Approche manuelle \{#dashboard-approach\}
Si vous préférez tout configurer manuellement, voici ce dont vous avez besoin avant d'écrire du code. Votre LLM ne peut pas récupérer les valeurs du tableau de bord à votre place — vous devrez les fournir vous-même.
1. **Connectez vos stores** : dans l'Adapty Dashboard, rendez-vous dans **App settings → General**. Connectez l'App Store et Google Play si votre application KMP cible les deux plateformes. C'est indispensable pour que les achats fonctionnent.
[Connecter les stores](integrate-payments)
2. **Copiez votre clé SDK publique** : dans l'Adapty Dashboard, rendez-vous dans **App settings → General**, puis trouvez la section **API keys**. Dans le code, c'est la chaîne que vous passez au builder de configuration Adapty.
3. **Créez au moins un produit** : dans l'Adapty Dashboard, rendez-vous sur la page **Products**. Vous ne référencez pas les produits directement dans le code — Adapty les transmet via les paywalls.
[Ajouter des produits](quickstart-products)
4. **Créez un paywall et un placement** : dans l'Adapty Dashboard, créez un paywall sur la page **Paywalls**, puis associez-le à un placement sur la page **Placements**. Dans le code, l'ID du placement est la chaîne que vous passez à `Adapty.getPaywall("YOUR_PLACEMENT_ID")`.
[Créer un paywall](quickstart-paywalls)
5. **Configurez les niveaux d'accès** : dans l'Adapty Dashboard, configurez-les par produit sur la page **Products**. Dans le code, la chaîne vérifiée dans `profile.accessLevels["premium"]?.isActive`. Le niveau d'accès `premium` par défaut convient à la plupart des applications. Si les utilisateurs payants ont accès à des fonctionnalités différentes selon le produit (par exemple, un plan `basic` vs. un plan `pro`), [créez des niveaux d'accès supplémentaires](assigning-access-level-to-a-product) avant de commencer à coder.
:::tip
Une fois ces cinq éléments en place, vous êtes prêt à écrire du code. Dites à votre LLM : « Ma clé SDK publique est X, mon ID de placement est Y » pour qu'il génère le code d'initialisation et de récupération des paywalls correct.
:::
### À configurer quand vous êtes prêt \{#set-up-when-ready\}
Ces éléments ne sont pas requis pour commencer à coder, mais vous en aurez besoin au fil de votre intégration :
- **Tests A/B** : à configurer sur la page **Placements**. Aucune modification de code nécessaire.
[Tests A/B](ab-tests)
- **Paywalls et placements supplémentaires** : ajoutez des appels `getPaywall` avec différents IDs de placement.
- **Intégrations analytics** : à configurer sur la page **Integrations**. La configuration varie selon l'intégration. Voir [intégrations analytics](analytics-integration) et [intégrations attribution](attribution-integration).
## Alimenter votre LLM avec la documentation Adapty \{#feed-adapty-docs-to-your-llm\}
### Utiliser Context7 (recommandé) \{#use-context7-recommended\}
[Context7](https://context7.com) est un serveur MCP qui donne à votre LLM un accès direct à la documentation Adapty à jour. Votre LLM récupère automatiquement les bonnes docs en fonction de ce que vous demandez — plus besoin de coller des URL manuellement.
Context7 fonctionne avec **Cursor**, **Claude Code**, **Windsurf** et d'autres outils compatibles MCP. Pour le configurer, exécutez :
```
npx ctx7 setup
```
Cette commande détecte votre éditeur et configure le serveur Context7. Pour une configuration manuelle, consultez le [dépôt GitHub Context7](https://github.com/upstash/context7).
Une fois configuré, référencez la bibliothèque Adapty dans vos prompts :
```
Use the adaptyteam/adapty-docs library to look up how to install the Kotlin Multiplatform SDK
```
:::warning
Même si Context7 évite de coller des liens de documentation manuellement, l'ordre d'implémentation reste important. Suivez la [procédure d'implémentation](#implementation-walkthrough) ci-dessous étape par étape pour vous assurer que tout fonctionne.
:::
### Utiliser la documentation en texte brut \{#use-plain-text-docs\}
Vous pouvez accéder à n'importe quelle page de documentation Adapty en Markdown brut. Ajoutez `.md` à la fin de son URL, ou cliquez sur **Copy for LLM** sous le titre de l'article. Par exemple : [adapty-cursor-kmp.md](https://adapty.io/docs/fr/adapty-cursor-kmp.md).
Chaque étape de la [procédure d'implémentation](#implementation-walkthrough) ci-dessous inclut un bloc « À envoyer à votre LLM » avec des liens `.md` à coller.
Pour accéder à plus de documentation en une fois, consultez les [fichiers d'index et sous-ensembles par plateforme](#plain-text-doc-index-files) ci-dessous.
## Procédure d'implémentation \{#implementation-walkthrough\}
La suite de ce guide parcourt l'intégration d'Adapty dans l'ordre d'implémentation. Chaque étape inclut les docs à envoyer à votre LLM, ce que vous devriez observer une fois terminé, et les problèmes courants.
### Planifier votre intégration \{#plan-your-integration\}
Avant de vous lancer dans le code, demandez à votre LLM d'analyser votre projet et de créer un plan d'implémentation. Si votre outil IA dispose d'un mode de planification (comme le mode plan de Cursor ou Claude Code), utilisez-le pour que le LLM puisse lire à la fois la structure de votre projet et la documentation Adapty avant d'écrire du code.
Indiquez à votre LLM quelle approche vous utilisez pour les achats — cela détermine les guides à suivre :
- [**Adapty Paywall Builder**](adapty-paywall-builder) : vous créez des paywalls dans le builder no-code d'Adapty, et le SDK les affiche automatiquement.
- [**Paywalls créés manuellement**](kmp-making-purchases) : vous construisez votre propre interface de paywall dans le code, mais utilisez quand même Adapty pour récupérer les produits et gérer les achats.
- [**Mode Observer**](observer-vs-full-mode) : vous conservez votre infrastructure d'achat existante et utilisez Adapty uniquement pour les analytics et les intégrations.
Vous ne savez pas lequel choisir ? Lisez le [tableau comparatif dans le guide de démarrage rapide](kmp-quickstart-paywalls).
### Installer et configurer le SDK \{#install-and-configure-the-sdk\}
Ajoutez la dépendance du SDK Adapty via Gradle et activez-le avec votre clé SDK publique. C'est la base — rien d'autre ne fonctionne sans ça.
**Guide :** [Installer et configurer le SDK Adapty](sdk-installation-kotlin-multiplatform)
À envoyer à votre LLM :
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/fr/sdk-installation-kotlin-multiplatform.md
```
:::tip[Checkpoint]
- **Attendu :** L'application se compile et se lance. Logcat (Android) ou la console Xcode (iOS) affiche le log d'activation Adapty.
- **Point d'attention :** « Public API key is missing » → vérifiez que vous avez remplacé le placeholder par votre vraie clé depuis App settings.
:::
### Afficher les paywalls et gérer les achats \{#show-paywalls-and-handle-purchases\}
Récupérez un paywall par ID de placement, affichez-le et gérez les événements d'achat. Les guides nécessaires dépendent de la façon dont vous gérez les achats.
Testez chaque achat en sandbox au fur et à mesure — n'attendez pas la fin. Consultez [Tester les achats en sandbox](test-purchases-in-sandbox) pour les instructions de configuration.
Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion internet instable, envisagez d'utiliser `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'obtiendront pas forcément les toutes dernières données, mais le chargement sera plus rapide, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les flows et paywalls localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour les récupérer plus rapidement et un serveur de secours indépendant si le CDN est inaccessible. Ce système est conçu pour vous garantir toujours la dernière version tout en assurant la fiabilité, même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 s |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut dépasser légèrement le délai spécifié dans `loadTimeout`, car l'opération peut impliquer différentes requêtes en coulisses.
Pour Kotlin Multiplatform : vous pouvez créer une `Duration` avec des fonctions d'extension comme `5.seconds`, où `.seconds` provient de `kotlin.time.Duration.Companion.seconds`.
| Paramètres de réponse : | Paramètre | Description | | :-------- | :---------- | | Flow | Un objet `AdaptyFlow` contenant le placement, les identifiants (`instanceIdentity`, `variationId`), le nom, les variantes de paywall (`paywalls` — une liste d'`AdaptyFlowPaywall`) et les Remote Configs (`remoteConfigs` — une liste avec une entrée par locale). Pour récupérer les produits réels en vue d'un préchargement, d'une interface personnalisée ou de vérifications programmatiques, appelez `getPaywallProducts(flow)`. | ## Récupérer la configuration de vue \{#fetch-the-view-configuration\} Après avoir récupéré le flow ou le paywall, chargez sa configuration de vue et créez la vue en une seule étape avec la méthode `createFlowView`. Il n'y a pas d'indicateur séparé à vérifier : si le placement a été conçu dans le **Flow Builder** (un flow) ou le **Paywall Builder** (un paywall), `createFlowView` renvoie la vue prête à être présentée. Si le placement est un paywall personnalisé sans interface Builder, `createFlowView` renvoie une `AdaptyResult.Error` — [traitez-le comme un paywall Remote Config](present-remote-config-paywalls-kmp). :::important Assurez-vous d'activer le bouton **Show on device** dans le Flow Builder. Si cette option n'est pas activée, la configuration de vue ne sera pas disponible pour la récupération. ::: ```kotlin showLineNumbers AdaptyUI.createFlowView( flow = flow, loadTimeout = 5.seconds, preloadProducts = true ).onSuccess { view -> // use view }.onError { error -> // the flow has no view configured, or view creation failed } ``` | Paramètre | Présence | Description | | :--------------------------- | :------------- | :----------------------------------------------------------- | | **flow** | requis | Un objet `AdaptyFlow` obtenu via `Adapty.getFlow`. | | **loadTimeout** | optionnel | Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés. Notez que dans de rares cas, cette méthode peut dépasser légèrement le délai spécifié dans `loadTimeout`, car l'opération peut impliquer différentes requêtes en coulisses. Vous pouvez utiliser des fonctions d'extension comme `5.seconds` de `kotlin.time.Duration.Companion`. | | **preloadProducts** | optionnel | Définissez sur `true` pour précharger les produits et améliorer les performances. Lorsqu'activé, les produits sont chargés à l'avance, réduisant le temps nécessaire pour afficher le flow ou le paywall. | | **productPurchaseParams** | optionnel | Une map d'[`AdaptyProductIdentifier`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-product-identifier/) vers [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/). Utilisez-la pour configurer des paramètres d'achat spécifiques, comme les offres personnalisées ou les paramètres de mise à jour d'abonnement pour des produits individuels dans le flow ou le paywall. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation dans le Builder](add-paywall-locale-in-adapty-paywall-builder). ::: Une fois chargé, [présentez le flow ou le paywall](kmp-present-paywalls). ## Récupérer un flow ou paywall pour l'audience par défaut afin d'accélérer la récupération \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les flows et paywalls sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et placements, et que vos utilisateurs ont une connexion internet faible, la récupération d'un flow ou d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pourriez vouloir afficher un flow ou un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher du tout. Pour y remédier, vous pouvez utiliser la méthode `getFlowForDefaultAudience`, qui récupère le flow ou le paywall du placement spécifié pour l'audience **All Users**. Il est toutefois crucial de comprendre que l'approche recommandée consiste à récupérer le flow ou le paywall avec la méthode `getFlow`, comme décrit dans la section [Récupérer un flow/paywall](#fetch-flowpaywall) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getFlow` La méthode `getFlowForDefaultAudience` présente quelques inconvénients notables : - **Problèmes potentiels de compatibilité ascendante** : si vous devez afficher des flows différents selon les versions de l'application (actuelle et future), vous pourriez rencontrer des difficultés. Vous devrez soit concevoir des flows compatibles avec la version actuelle (legacy), soit accepter que les utilisateurs avec la version actuelle (legacy) puissent rencontrer des problèmes avec des flows non rendus. - **Perte de ciblage** : tous les utilisateurs verront le même flow conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment par pays, attribution marketing ou vos propres attributs personnalisés). Si vous acceptez ces inconvénients pour bénéficier d'une récupération plus rapide des flows ou paywalls, utilisez la méthode `getFlowForDefaultAudience` comme suit. Sinon, restez sur `getFlow` décrit [ci-dessus](#fetch-flowpaywall). ::: ```kotlin showLineNumbers Adapty.getFlowForDefaultAudience( placementId = "YOUR_PLACEMENT_ID", fetchPolicy = AdaptyPaywallFetchPolicy.Default, ).onSuccess { flow -> // the requested flow }.onError { error -> // handle the error } ``` | Paramètre | Présence | Description | |---------|--------|-----------| | **placementId** | requis | L'identifiant du [Placement](placements). C'est la valeur que vous avez spécifiée lors de la création d'un placement dans votre Adapty Dashboard. | | **fetchPolicy** | par défaut : `AdaptyPaywallFetchPolicy.Default` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion internet instable, envisagez d'utiliser `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'obtiendront pas forcément les toutes dernières données, mais le chargement sera plus rapide, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
| ## Personnaliser les ressources \{#customize-assets\} Pour personnaliser les images et vidéos dans votre flow ou paywall, implémentez des ressources personnalisées. Les images et vidéos hero ont des identifiants prédéfinis : `hero_image` et `hero_video`. Dans un bundle de ressources personnalisées, vous ciblez ces éléments par leurs identifiants et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un identifiant personnalisé](custom-media) dans le tableau de bord Adapty. Par exemple, vous pouvez : - Afficher une image ou une vidéo différente pour certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. Voici un exemple illustrant comment fournir des ressources personnalisées via une map : :::info Le SDK Kotlin Multiplatform ne prend en charge que les ressources locales. Pour le contenu distant, vous devez télécharger et mettre en cache les ressources localement avant de les utiliser dans les ressources personnalisées. ::: ```kotlin showLineNumbers // Import generated Res class for accessing resources viewModelScope.launch { // Get URIs for bundled resources using Res.getUri() val heroImagePath = Res.getUri("files/images/hero_image.png") val demoVideoPath = Res.getUri("files/videos/demo_video.mp4") // Or read image as byte data val imageByteData = Res.readBytes("files/images/avatar.png") // Create custom assets map val customAssets: Mapoptionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-paywall-locale-in-adapty-paywall-builder). Ce paramètre est attendu sous la forme d'un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de locale](localizations-and-locale-codes) pour plus d'informations sur les codes de locale et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `AdaptyPaywallFetchPolicy.Default` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion internet instable, envisagez d'utiliser `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'obtiendront pas forcément les toutes dernières données, mais le chargement sera plus rapide, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement et un serveur de secours indépendant si le CDN est inaccessible. Ce système est conçu pour vous garantir toujours la dernière version de vos paywalls tout en assurant la fiabilité, même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 s |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut dépasser légèrement le délai spécifié dans `loadTimeout`, car l'opération peut impliquer différentes requêtes en coulisses.
Pour Kotlin Multiplatform : vous pouvez créer un `TimeInterval` avec des fonctions d'extension (comme `5.seconds`, où `.seconds` provient de `import com.adapty.utils.seconds`), ou `TimeInterval.seconds(5)`. Pour ne pas définir de limite, utilisez `TimeInterval.INFINITE`.
| Paramètres de réponse : | Paramètre | Description | | :-------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | Un objet [`AdaptyPaywall`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall/) contenant une liste d'identifiants de produits, l'identifiant du paywall, la Remote Config et plusieurs autres propriétés. | ## Récupérer la configuration de vue d'un paywall conçu avec le Paywall Builder \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Assurez-vous d'activer le bouton **Show on device** dans le Paywall Builder. Si cette option n'est pas activée, la configuration de vue ne sera pas disponible pour la récupération. ::: Après avoir récupéré le paywall, vérifiez s'il inclut une `ViewConfiguration`, ce qui indique qu'il a été créé avec le Paywall Builder. Cela vous guidera sur la façon d'afficher le paywall. Si la `ViewConfiguration` est présente, traitez-le comme un paywall Paywall Builder ; sinon, [traitez-le comme un paywall Remote Config](present-remote-config-paywalls-kmp). Utilisez la méthode `createPaywallView` pour charger la configuration de vue. ```kotlin showLineNumbers if (paywall.hasViewConfiguration) { AdaptyUI.createPaywallView( paywall = paywall, loadTimeout = 5.seconds, preloadProducts = true ).onSuccess { paywallView -> // use paywallView }.onError { error -> // handle the error } } else { // use your custom logic } ``` | Paramètre | Présence | Description | | :--------------------------- | :------------- | :----------------------------------------------------------- | | **paywall** | requis | Un objet `AdaptyPaywall` permettant d'obtenir un contrôleur pour le paywall souhaité. | | **loadTimeout** | optionnel | Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés. Notez que dans de rares cas, cette méthode peut dépasser légèrement le délai spécifié dans `loadTimeout`, car l'opération peut impliquer différentes requêtes en coulisses. Vous pouvez utiliser des fonctions d'extension comme `5.seconds` de `kotlin.time.Duration.Companion`. | | **preloadProducts** | optionnel | Définissez sur `true` pour précharger les produits et améliorer les performances. Lorsqu'activé, les produits sont chargés à l'avance, réduisant le temps nécessaire pour afficher le paywall. | | **productPurchaseParams** | optionnel | Une map d'[`AdaptyProductIdentifier`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-product-identifier/) vers [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/). Utilisez-la pour configurer des paramètres d'achat spécifiques, comme les offres personnalisées ou les paramètres de mise à jour d'abonnement pour des produits individuels dans le paywall. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation dans le Paywall Builder](add-paywall-locale-in-adapty-paywall-builder). ::: Une fois chargé, [présentez le paywall](kmp-present-paywalls). ## Récupérer un paywall pour l'audience par défaut afin d'accélérer la récupération \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les paywalls sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et paywalls, et que vos utilisateurs ont une connexion internet faible, la récupération d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pourriez vouloir afficher un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher du tout. Pour y remédier, vous pouvez utiliser la méthode `getPaywallForDefaultAudience`, qui récupère le paywall du placement spécifié pour l'audience **All Users**. Il est toutefois crucial de comprendre que l'approche recommandée consiste à récupérer le paywall avec la méthode `getPaywall`, comme décrit dans la section [Récupérer les informations du paywall](#fetch-paywall-designed-with-paywall-builder) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getPaywall` La méthode `getPaywallForDefaultAudience` présente quelques inconvénients notables : - **Problèmes potentiels de compatibilité ascendante** : si vous devez afficher des paywalls différents selon les versions de l'application (actuelle et future), vous pourriez rencontrer des difficultés. Vous devrez soit concevoir des paywalls compatibles avec la version actuelle (legacy), soit accepter que les utilisateurs avec la version actuelle (legacy) puissent rencontrer des problèmes avec des paywalls non rendus. - **Perte de ciblage** : tous les utilisateurs verront le même paywall conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment par pays, attribution marketing ou vos propres attributs personnalisés). Si vous acceptez ces inconvénients pour bénéficier d'une récupération plus rapide des paywalls, utilisez la méthode `getPaywallForDefaultAudience` comme suit. Sinon, restez sur `getPaywall` décrit [ci-dessus](#fetch-paywall-designed-with-paywall-builder). ::: ```kotlin showLineNumbers Adapty.getPaywallForDefaultAudience( placementId = "YOUR_PLACEMENT_ID", locale = "en", fetchPolicy = AdaptyPaywallFetchPolicy.Default, ).onSuccess { paywall -> // the requested paywall }.onError { error -> // handle the error } ``` | Paramètre | Présence | Description | |---------|--------|-----------| | **placementId** | requis | L'identifiant du [Placement](placements). C'est la valeur que vous avez spécifiée lors de la création d'un placement dans votre Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre est attendu sous la forme d'un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de locale](localizations-and-locale-codes) pour plus d'informations sur les codes de locale et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `AdaptyPaywallFetchPolicy.Default` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion internet instable, envisagez d'utiliser `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'obtiendront pas forcément les toutes dernières données, mais le chargement sera plus rapide, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
| ## Personnaliser les ressources \{#customize-assets\} Pour personnaliser les images et vidéos dans votre paywall, implémentez des ressources personnalisées. Les images et vidéos hero ont des identifiants prédéfinis : `hero_image` et `hero_video`. Dans un bundle de ressources personnalisées, vous ciblez ces éléments par leurs identifiants et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un identifiant personnalisé](custom-media) dans le tableau de bord Adapty. Par exemple, vous pouvez : - Afficher une image ou une vidéo différente pour certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. :::important Pour utiliser cette fonctionnalité, mettez à jour le SDK Adapty vers la version 3.7.0 ou supérieure. ::: Voici un exemple illustrant comment fournir des ressources personnalisées via une map : :::info Le SDK Kotlin Multiplatform ne prend en charge que les ressources locales. Pour le contenu distant, vous devez télécharger et mettre en cache les ressources localement avant de les utiliser dans les ressources personnalisées. ::: ```kotlin showLineNumbers // Import generated Res class for accessing resources viewModelScope.launch { // Get URIs for bundled resources using Res.getUri() val heroImagePath = Res.getUri("files/images/hero_image.png") val demoVideoPath = Res.getUri("files/videos/demo_video.mp4") // Or read image as byte data val imageByteData = Res.readBytes("files/images/avatar.png") // Create custom assets map val customAssets: Map
## Le nombre de vues du paywall est trop élevé \{#the-paywall-view-number-is-too-big\}
**Problème** : Le nombre de vues du paywall affiche le double du nombre attendu.
**Cause** : Vous appelez peut-être `logShowFlow` (SDK v4+) / `logShowPaywall` dans votre code, ce qui duplique le nombre de vues si vous utilisez le Paywall Builder ou le Flow Builder. Pour les flows et les paywalls créés avec ces outils, les statistiques sont suivies automatiquement, vous n'avez donc pas besoin d'utiliser cette méthode.
**Solution** : Assurez-vous de ne pas appeler `logShowFlow` (SDK v4+) / `logShowPaywall` dans votre code si vous utilisez le Paywall Builder ou le Flow Builder.
---
# File: kmp-implement-paywalls-manually
---
---
title: "Implémenter les paywalls manuellement dans le SDK Kotlin Multiplatform"
description: "Découvrez comment implémenter les paywalls manuellement dans votre application Kotlin Multiplatform avec le SDK Adapty."
---
## Accepter les achats \{#accept-purchases\}
Si vous travaillez avec des paywalls que vous avez implémentés vous-même, vous pouvez déléguer la gestion des achats à Adapty via la méthode `makePurchase`. Ainsi, nous gérons tous les scénarios utilisateur et vous n'avez qu'à traiter les résultats des achats.
:::important
`makePurchase` fonctionne avec les produits créés dans l'Adapty Dashboard. Veillez à configurer les produits et les moyens de les récupérer dans le tableau de bord en suivant le [guide de démarrage rapide](quickstart).
:::
Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d'utiliser `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne disposeront peut-être pas des toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, ce qui permet de l'utiliser en toute sécurité pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou d'un nettoyage manuel.
Le SDK Adapty stocke les flows et les paywalls sur deux niveaux : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](kmp-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les flows et les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant au cas où le CDN serait inaccessible. Ce système est conçu pour garantir que vous disposez toujours de la dernière version de vos flows et paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai indiqué dans `loadTimeout`, car l'opération peut comprendre différentes requêtes en arrière-plan.
| Ne codez pas en dur les identifiants de produits ! Étant donné que les flows sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent changer au fil du temps. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, votre application doit tous les afficher sans nécessiter de modifications du code. La seule chose que vous devez coder en dur est l'identifiant du placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Un objet `AdaptyFlow` contenant : l'identifiant du flow, les variantes de paywall (`paywalls` — chacune avec ses propres identifiants de produits), une liste `remoteConfigs` (une entrée par locale configurée), ainsi que plusieurs autres propriétés. Pour récupérer les produits du flow, appelez `getPaywallProducts(flow)`. | :::note Dans la v4, `getFlow` n'a pas de paramètre `locale`. Lorsque vous affichez un flow avec `createFlowView`, la localisation est résolue automatiquement. Pour les paywalls personnalisés, toutes les localisations disponibles sont retournées ensemble dans `flow.remoteConfigs` — choisissez celle qui correspond à la langue de l'appareil ou aux paramètres de votre application. Consultez [Localisations et codes de langue](kmp-localizations-and-locale-codes) pour plus de détails. ::: ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le flow, vous pouvez récupérer le tableau de produits qui lui correspond : ```kotlin showLineNumbers Adapty.getPaywallProducts(flow).onSuccess { products -> // the requested products }.onError { error -> // handle the error } ``` Paramètres de la réponse : | Paramètre | Description | | :-------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Liste d'objets [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) contenant : identifiant du produit, nom du produit, prix, devise, durée de l'abonnement et plusieurs autres propriétés. | Lorsque vous implémentez votre propre design de flow, vous aurez probablement besoin d'accéder à ces propriétés de l'objet [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/). Les propriétés les plus couramment utilisées sont présentées ci-dessous, mais consultez le document lié pour obtenir tous les détails sur l'ensemble des propriétés disponibles. | Propriété | Description | |----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Pour afficher le titre du produit, utilisez `product.localizedTitle`. La localisation est basée sur le pays du store sélectionné par l'utilisateur, et non sur la locale de l'appareil. | | **Price** | Pour afficher le prix dans un format localisé, utilisez `product.price.localizedString`. Cette localisation est basée sur la locale de l'appareil. Vous pouvez également accéder au prix sous forme numérique via `product.price.amount`. La valeur est fournie dans la devise locale. Pour obtenir le symbole de devise correspondant, utilisez `product.price.currencySymbol`. | | **Subscription Period** | Pour afficher la période (ex. : semaine, mois, année, etc.), utilisez `product.subscriptionDetails?.localizedSubscriptionPeriod`. Cette localisation est basée sur la locale de l'appareil. Pour récupérer la période d'abonnement de manière programmatique, utilisez `product.subscriptionDetails?.subscriptionPeriod`. Vous pouvez ensuite accéder à l'enum `unit` pour obtenir la durée (c'est-à-dire DAY, WEEK, MONTH, YEAR ou UNKNOWN). La valeur `numberOfUnits` vous donne le nombre d'unités de période. Par exemple, pour un abonnement trimestriel, vous verrez `MONTH` dans la propriété unit et `3` dans la propriété numberOfUnits. | | **Introductory Offer** | Pour afficher un badge ou tout autre indicateur signalant qu'un abonnement contient une offre de lancement, consultez la propriété `product.subscriptionDetails?.introductoryOfferPhases`. Il s'agit d'une liste pouvant contenir jusqu'à deux phases de remise : la phase d'essai gratuit et la phase de prix de lancement. Chaque objet de phase contient les propriétés utiles suivantes :Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d'utiliser `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache lorsqu'elles existent. Dans ce cas, les utilisateurs ne bénéficieront peut-être pas des toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc tout à fait sûr de l'utiliser pendant la session afin d'éviter des requêtes réseau inutiles.
Notez que le cache est conservé après le redémarrage de l'application et n'est effacé que lors de la désinstallation ou d'un nettoyage manuel.
|optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
| | **fetchPolicy** | par défaut : `AdaptyPaywallFetchPolicy.Default` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne bénéficieront peut-être pas des toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session afin d'éviter des requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](kmp-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour garantir que vous recevez toujours la dernière version de vos paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut reposer sur plusieurs requêtes en arrière-plan.
| Ne codez pas les identifiants de produits en dur ! Puisque les paywalls sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent changer au fil du temps. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, votre application doit tous les afficher sans nécessiter de modification du code. La seule chose à coder en dur est l'identifiant de placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Un objet [`AdaptyPaywall`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall/) contenant : une liste d'identifiants de produit, l'identifiant du paywall, le Remote Config, et plusieurs autres propriétés. | ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le paywall, vous pouvez interroger le tableau de produits qui lui correspond : ```kotlin showLineNumbers Adapty.getPaywallProducts(paywall).onSuccess { products -> // the requested products }.onError { error -> // handle the error } ``` Paramètres de la réponse : | Paramètre | Description | | :-------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Liste d'objets [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/) contenant : l'identifiant du produit, son nom, son prix, la devise, la durée de l'abonnement et plusieurs autres propriétés. | Lors de l'implémentation de votre propre design de paywall, vous aurez probablement besoin d'accéder à ces propriétés depuis l'objet [`AdaptyPaywallProduct`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-paywall-product/). Les propriétés les plus couramment utilisées sont présentées ci-dessous, mais consultez le document lié pour obtenir tous les détails sur l'ensemble des propriétés disponibles. | Propriété | Description | |----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Pour afficher le titre du produit, utilisez `product.localizedTitle`. La localisation est basée sur le pays du store sélectionné par l'utilisateur, et non sur la locale de l'appareil lui-même. | | **Price** | Pour afficher une version localisée du prix, utilisez `product.price.localizedString`. Cette localisation est basée sur les informations de locale de l'appareil. Vous pouvez aussi accéder au prix sous forme numérique via `product.price.amount`. La valeur sera fournie dans la devise locale. Pour obtenir le symbole de la devise associée, utilisez `product.price.currencySymbol`. | | **Subscription Period** | Pour afficher la période (par exemple : semaine, mois, année, etc.), utilisez `product.subscriptionDetails?.localizedSubscriptionPeriod`. Cette localisation est basée sur la locale de l'appareil. Pour récupérer la période d'abonnement de manière programmatique, utilisez `product.subscriptionDetails?.subscriptionPeriod`. Vous pouvez ensuite accéder à l'enum `unit` pour obtenir la durée (c'est-à-dire DAY, WEEK, MONTH, YEAR ou UNKNOWN). La valeur `numberOfUnits` vous donne le nombre d'unités de période. Par exemple, pour un abonnement trimestriel, vous verrez `MONTH` dans la propriété unit et `3` dans la propriété numberOfUnits. | | **Introductory Offer** | Pour afficher un badge ou tout autre indicateur signalant qu'un abonnement contient une offre de lancement, consultez la propriété `product.subscriptionDetails?.introductoryOfferPhases`. Il s'agit d'une liste pouvant contenir jusqu'à deux phases de remise : la phase d'essai gratuit et la phase de prix de lancement. Chaque objet de phase contient les propriétés utiles suivantes :optionnel
défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second la région.
Exemple : `en` correspond à l'anglais, `pt-br` représente le portugais brésilien.
| | **fetchPolicy** | défaut : `AdaptyPaywallFetchPolicy.Default` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Cependant, si vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d'utiliser `AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache lorsqu'elles existent. Dans ce cas, les utilisateurs n'auront pas forcément les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, ce qui permet de l'utiliser sans risque durant la session pour éviter les requêtes réseau.
Notez que le cache est conservé après le redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
|Si la requête a abouti, la réponse contient cet objet. Un objet [AdaptyProfile](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-profile/) fournit des informations complètes sur les niveaux d'accès, les abonnements et les achats uniques d'un utilisateur au sein de l'application.
Vérifiez le statut du niveau d'accès pour déterminer si l'utilisateur dispose des droits d'accès requis.
| :::warning **Remarque :** si vous utilisez encore la version StoreKit d'Apple inférieure à la v2.0 et une version du SDK Adapty inférieure à la v2.9.0, vous devez fournir le [secret partagé de l'App Store Apple](app-store-connection-configuration#step-5-enter-app-store-shared-secret) à la place. Cette méthode est actuellement dépréciée par Apple. ::: ## Changer d'abonnement lors d'un achat \{#change-subscription-when-making-a-purchase\} Lorsqu'un utilisateur opte pour un nouvel abonnement plutôt que de renouveler son abonnement actuel, le comportement dépend du store. Sur Google Play, l'abonnement n'est pas mis à jour automatiquement. Vous devrez gérer le changement dans le code de votre application mobile comme décrit ci-dessous. Pour remplacer l'abonnement par un autre sur Android, appelez la méthode `.makePurchase()` avec le paramètre supplémentaire : ```kotlin showLineNumbers val subscriptionUpdateParams = AdaptyAndroidSubscriptionUpdateParameters( oldSubVendorProductId = "old_subscription_product_id", replacementMode = AdaptyAndroidSubscriptionUpdateReplacementMode.CHARGE_FULL_PRICE ) val purchaseParams = AdaptyPurchaseParameters.Builder() .setSubscriptionUpdateParams(subscriptionUpdateParams) .build() Adapty.makePurchase( product = product, parameters = purchaseParams ).onSuccess { purchaseResult -> when (purchaseResult) { is AdaptyPurchaseResult.Success -> { val profile = purchaseResult.profile // successful cross-grade } is AdaptyPurchaseResult.UserCanceled -> { // user canceled the purchase flow } is AdaptyPurchaseResult.Pending -> { // the purchase has not been finished yet, e.g. user will pay offline by cash } } }.onError { error -> // Handle the error } ``` Paramètre de requête supplémentaire : | Paramètre | Présence | Description | |:---------------|:----------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **parameters** | optionnel | un objet [`AdaptyAndroidSubscriptionUpdateParameters`](https://kmp.adapty.io/////adapty/com.adapty.kmp.models/-adapty-android-subscription-update-parameters/) transmis via [`AdaptyPurchaseParameters`](https://kmp.adapty.io/adapty/com.adapty.kmp.models/-adapty-purchase-parameters/). | Vous pouvez en savoir plus sur les abonnements et les modes de remplacement dans la documentation Google Developer : - [À propos des modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Recommandations de Google pour les modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - Mode de remplacement [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Remarque : cette méthode est disponible uniquement pour les mises à niveau d'abonnement. Les rétrogradations ne sont pas prises en charge. - Mode de remplacement [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Remarque : le changement d'abonnement effectif n'aura lieu qu'à la fin de la période de facturation de l'abonnement actuel. ## Utiliser des codes promotionnels sur iOS \{#redeem-offer-codes-in-ios\}Un objet [`AdaptyProfile`](https://kmp.adapty.io//////adapty/com.adapty.kmp.models/-adapty-profile/). Ce modèle contient des informations sur les niveaux d'accès, les abonnements et les achats uniques.
Vérifiez le **statut du niveau d'accès** pour déterminer si l'utilisateur a accès à l'application.
| :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: --- # File: implement-observer-mode-kmp --- --- title: "Implémenter le mode Observateur dans le SDK Kotlin Multiplatform" description: "Implémentez le mode Observateur dans Adapty pour suivre les événements d'abonnement des utilisateurs dans le SDK Kotlin Multiplatform." --- Si vous disposez déjà de votre propre infrastructure d'achats et que vous n'êtes pas prêt à basculer complètement vers Adapty, vous pouvez explorer le [mode Observateur](observer-vs-full-mode). Dans sa forme de base, le mode Observateur offre des analyses avancées et une intégration fluide avec les systèmes d'attribution et d'analytique. Si cela répond à vos besoins, il vous suffit de : 1. L'activer lors de la configuration du SDK Adapty en définissant le paramètre `observerMode` à `true`. Suivez les instructions de configuration pour [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform). 2. [Signaler les transactions](report-transactions-observer-mode-kmp) depuis votre infrastructure d'achats existante à Adapty. :::tip Dans la version 4 du SDK, vous pouvez également présenter des flows et des paywalls rendus par Adapty en mode Observateur : lorsqu'un utilisateur appuie sur le bouton d'achat ou de restauration, le SDK transmet l'action à votre code afin que vous puissiez effectuer l'achat ou la restauration vous-même. Consultez [Présenter des flows en mode Observateur](kmp-present-flows-in-observer-mode). ::: ## Configuration du mode Observateur \{#observer-mode-setup\} Activez le mode Observateur si vous gérez vous-même les achats et le statut des abonnements, et que vous utilisez Adapty pour envoyer les événements d'abonnement et les données analytiques. :::important En mode Observateur, le SDK Adapty ne fermera aucune transaction — assurez-vous de les gérer de votre côté. ::: ```kotlin showLineNumbers val config = AdaptyConfig .Builder("PUBLIC_SDK_KEY") .withObserverMode(true) // default false .build() Adapty.activate(configuration = config) .onSuccess { Log.d("Adapty", "SDK initialised in observer mode") } .onError { error -> Log.e("Adapty", "Adapty init error: ${error.message}") } ``` Paramètres : | Paramètre | Description | | --------------------------- | ------------------------------------------------------------ | | observerMode | Une valeur booléenne qui contrôle le [mode Observateur](observer-vs-full-mode). La valeur par défaut est `false`. | ## Utiliser les paywalls Adapty en mode Observateur \{#using-adapty-paywalls-in-observer-mode\} Si vous souhaitez également utiliser les paywalls et les fonctionnalités de test A/B d'Adapty, c'est possible — mais cela nécessite une configuration supplémentaire en mode Observateur. Voici ce que vous devrez faire en plus des étapes ci-dessus : 1. Affichez les paywalls normalement pour les [paywalls avec Remote Config](present-remote-config-paywalls-kmp). 3. [Associez les paywalls](report-transactions-observer-mode-kmp) aux transactions d'achat. --- # File: report-transactions-observer-mode-kmp --- --- title: "Déclarer les transactions en mode Observateur dans le SDK Kotlin Multiplatform" description: "Déclarez les transactions d'achat en mode Observateur d'Adapty pour les insights utilisateurs et le suivi des revenus dans le SDK Kotlin Multiplatform." --- En mode Observateur, le SDK Adapty ne peut pas suivre automatiquement les achats effectués via votre système d'achat existant. Vous devez déclarer les transactions depuis votre store. Il est essentiel de configurer cela **avant** de publier votre application pour éviter des erreurs dans les analyses. Utilisez `reportTransaction` pour déclarer explicitement chaque transaction afin qu'Adapty la reconnaisse. :::warning **Ne sautez pas la déclaration des transactions !** Si vous n'appelez pas `reportTransaction`, Adapty ne reconnaîtra pas la transaction, elle n'apparaîtra pas dans les analyses et ne sera pas envoyée aux intégrations. ::: Si vous utilisez les paywalls Adapty, incluez le `variationId` lors de la déclaration d'une transaction. Cela associe l'achat au paywall qui l'a déclenché, garantissant ainsi des analyses de paywall précises. ```kotlin showLineNumbers Adapty.reportTransaction( transactionId = "your_transaction_id", variationId = paywall.variationId ).onSuccess { profile -> // Transaction reported successfully // profile contains updated user data }.onError { error -> // handle the error } ``` Paramètres : | Paramètre | Présence | Description | | --------------- | ---------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | transactionId | obligatoire | L'identifiant de transaction de votre achat dans le store. Il s'agit généralement du token d'achat ou de l'identifiant de transaction renvoyé par le store. | | variationId | optionnel | L'identifiant de chaîne de la variante. Vous pouvez l'obtenir via la propriété `variationId` de l'objet [AdaptyPaywall](https://kmp.adapty.io//////adapty/com.adapty.kmp.models/-adapty-paywall/). | --- # File: kmp-troubleshoot-purchases --- --- title: "Résoudre les problèmes d'achats dans le SDK Kotlin Multiplatform" description: "Résoudre les problèmes d'achats dans le SDK Kotlin Multiplatform" --- Ce guide vous aide à résoudre les problèmes courants lors de l'implémentation manuelle des achats dans le SDK Kotlin Multiplatform. ## makePurchase s'exécute avec succès, mais le profil n'est pas mis à jour \{#makepurchase-is-called-successfully-but-the-profile-is-not-being-updated\} **Problème** : La méthode `makePurchase` se termine avec succès, mais le profil de l'utilisateur et le statut d'abonnement ne sont pas mis à jour dans Adapty. **Cause** : Cela indique généralement une configuration incomplète du Google Play Store ou des problèmes de configuration. **Solution** : Assurez-vous d'avoir complété toutes les [étapes de configuration Google Play](initial-android). ## makePurchase est appelée deux fois \{#makepurchase-is-invoked-twice\} **Problème** : La méthode `makePurchase` est appelée plusieurs fois pour le même achat. **Cause** : Cela se produit généralement lorsque le flow d'achat est déclenché plusieurs fois en raison de problèmes de gestion de l'état de l'interface ou d'interactions rapides de l'utilisateur. **Solution** : Assurez-vous d'avoir complété toutes les [étapes de configuration Google Play](initial-android). ## AdaptyError.cantMakePayments en mode observateur \{#adaptyerror-cantmakepayments-in-observer-mode\} **Problème** : Vous obtenez `AdaptyError.cantMakePayments` lors de l'utilisation de `makePurchase` en mode observateur. **Cause** : En mode observateur, vous devez gérer les achats de votre côté, et non utiliser la méthode `makePurchase` d'Adapty. **Solution** : Si vous utilisez `makePurchase` pour les achats, désactivez le mode observateur. Vous devez soit utiliser `makePurchase`, soit gérer les achats de votre côté en mode observateur. Consultez [Implémenter le mode observateur](implement-observer-mode-kmp) pour plus de détails. ## Erreur Adapty : (code : 103, message : Play Market request failed on purchases updated: responseCode=3, debugMessage=Billing Unavailable, detail: null) \{#adapty-error-code-103-message-play-market-request-failed-on-purchases-updated-responsecode3-debugmessagebilling-unavailable-detail-null\} **Problème** : Vous recevez une erreur de facturation indisponible depuis le Google Play Store. **Cause** : Cette erreur n'est pas liée à Adapty. Il s'agit d'une erreur de la bibliothèque Google Play Billing indiquant que la facturation n'est pas disponible sur l'appareil. **Solution** : Cette erreur n'est pas liée à Adapty. Vous pouvez en savoir plus dans la documentation du Play Store : [Handle BillingResult response codes](https://developer.android.com/google/play/billing/errors#billing_unavailable_error_code_3) | Play Billing | Android Developers. ## makePurchasesCompletionHandlers introuvable \{#not-found-makepurchasescompletionhandlers\} **Problème** : Vous rencontrez des problèmes avec `makePurchasesCompletionHandlers` qui ne peut pas être trouvé. **Cause** : Cela est généralement lié à des problèmes de test en sandbox. **Solution** : Créez un nouvel utilisateur sandbox et réessayez. Cela résout souvent les problèmes de gestionnaire de fin d'achat liés au sandbox. --- # File: kmp-user --- --- title: "Utilisateurs & accès dans le SDK Kotlin Multiplatform" description: "Apprenez à gérer les utilisateurs et les niveaux d'accès dans votre application Kotlin Multiplatform avec le SDK Adapty." --- Cette page regroupe tous les guides pour travailler avec les utilisateurs et les niveaux d'accès dans votre application Kotlin Multiplatform. Choisissez le sujet dont vous avez besoin : - **[Identifier les utilisateurs](kmp-identifying-users)** - Apprenez à identifier les utilisateurs dans votre application - **[Mettre à jour les données utilisateur](kmp-setting-user-attributes)** - Définir les attributs utilisateur et les données de profil - **[Écouter les changements de statut d'abonnement](kmp-listen-subscription-changes)** - Surveiller les changements d'abonnement en temps réel - **[Mode Enfants](kids-mode-kmp)** - Implémenter le mode Enfants pour votre application --- # File: kmp-identifying-users --- --- title: "Identifier les utilisateurs dans le SDK Kotlin Multiplatform" description: "Identifiez les utilisateurs dans Adapty pour améliorer les expériences d'abonnement personnalisées." --- Adapty crée un identifiant de profil interne pour chaque utilisateur. Cependant, si vous disposez de votre propre système d'authentification, vous devez définir votre propre Customer User ID. Vous pouvez retrouver les utilisateurs par leur Customer User ID dans la section [Profiles](profiles-crm) et l'utiliser dans l'[API côté serveur](getting-started-with-server-side-api), qui sera envoyé à toutes les intégrations. ### Définir le Customer User ID lors de la configuration \{#setting-customer-user-id-on-configuration\} Si vous disposez d'un identifiant utilisateur au moment de la configuration, passez-le simplement comme paramètre `customerUserId` à la méthode `.activate()` : ```kotlin showLineNumbers Adapty.activate( AdaptyConfig.Builder("PUBLIC_SDK_KEY") .withCustomerUserId("YOUR_USER_ID") .build() ).onSuccess { // successful activation }.onError { error -> // handle the error } } ``` :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: ### Définir le Customer User ID après la configuration \{#setting-customer-user-id-after-configuration\} Si vous n'avez pas d'identifiant utilisateur lors de la configuration du SDK, vous pouvez le définir ultérieurement à tout moment avec la méthode `.identify()`. Les cas d'usage les plus courants sont après l'inscription ou la connexion, lorsque l'utilisateur passe du statut d'utilisateur anonyme à celui d'utilisateur authentifié. ```kotlin showLineNumbers Adapty.identify("YOUR_USER_ID").onSuccess { // successful identify }.onError { error -> // handle the error } ``` Paramètres de la requête : - **Customer User ID** (obligatoire) : un identifiant utilisateur sous forme de chaîne de caractères. :::warning Nouvelle soumission des données utilisateur importantes Dans certains cas, par exemple lorsqu'un utilisateur se reconnecte à son compte, les serveurs d'Adapty disposent déjà d'informations sur cet utilisateur. Dans ces situations, le SDK Adapty bascule automatiquement vers le nouvel utilisateur. Si vous avez transmis des données à l'utilisateur anonyme, comme des attributs personnalisés ou des attributions provenant de réseaux tiers, vous devez soumettre à nouveau ces données pour l'utilisateur identifié. Il est également important de noter que vous devez redemander tous les paywalls et produits après avoir identifié l'utilisateur, car les données du nouvel utilisateur peuvent être différentes. ::: ### Déconnexion et reconnexion \{#logging-out-and-logging-in\} Vous pouvez déconnecter l'utilisateur à tout moment en appelant la méthode `.logout()` : ```kotlin showLineNumbers Adapty.logout().onSuccess { // successful logout }.onError { error -> // handle the error } ``` Vous pouvez ensuite reconnecter l'utilisateur avec la méthode `.identify()`. ## Associer un `appAccountToken` (iOS) \{#assign-appaccounttoken-ios\} [`iosAppAccountToken`](https://developer.apple.com/documentation/storekit/product/purchaseoption/appaccounttoken(_:)) est un **UUID** qui vous permet de relier les transactions App Store à l'identité interne de vos utilisateurs. StoreKit associe ce token à chaque transaction, ce qui permet à votre backend de faire correspondre les données App Store à vos utilisateurs. Utilisez un UUID stable généré par utilisateur et réutilisez-le pour le même compte sur tous les appareils. Cela garantit que les achats et les notifications App Store restent correctement associés. Vous pouvez définir le token de deux façons : lors de l'activation du SDK ou lors de l'identification de l'utilisateur. :::important Vous devez toujours passer `iosAppAccountToken` avec `customerUserId`. Si vous ne passez que le token, il ne sera pas inclus dans la transaction. ::: ```kotlin showLineNumbers // During configuration: Adapty.activate( AdaptyConfig.Builder("PUBLIC_SDK_KEY") .withCustomerUserId( id = "YOUR_USER_ID", iosAppAccountToken = "YOUR_IOS_APP_ACCOUNT_TOKEN" ) .build() ).onSuccess { // successful activation }.onError { error -> // handle the error } // Or when identifying users Adapty.identify( customerUserId = "YOUR_USER_ID", iosAppAccountToken = "YOUR_IOS_APP_ACCOUNT_TOKEN" ).onSuccess { // successful identify }.onError { error -> // handle the error } ``` ## Définir des identifiants de compte obscurcis (Android) \{#set-obfuscated-account-ids-android\} Google Play exige des identifiants de compte obscurcis dans certains cas d'usage pour renforcer la confidentialité et la sécurité des utilisateurs. Ces identifiants aident Google Play à identifier les achats tout en préservant l'anonymat des informations utilisateur, ce qui est particulièrement important pour la prévention des fraudes et l'analyse. Vous aurez peut-être besoin de définir ces identifiants si votre application traite des données utilisateur sensibles ou si vous devez vous conformer à des réglementations spécifiques en matière de confidentialité. Les identifiants obscurcis permettent à Google Play de suivre les achats sans exposer les identifiants réels des utilisateurs. :::important Vous devez toujours passer `androidObfuscatedAccountId` avec `customerUserId`. Si vous ne passez que l'identifiant de compte obscurcis, il ne sera pas inclus dans la transaction. ::: ```kotlin showLineNumbers // During configuration: Adapty.activate( AdaptyConfig.Builder("PUBLIC_SDK_KEY") .withCustomerUserId( id = "YOUR_USER_ID", androidObfuscatedAccountId = "YOUR_OBFUSCATED_ACCOUNT_ID" ) .build() ).onSuccess { // successful activation }.onError { error -> // handle the error } // Or when identifying users Adapty.identify( customerUserId = "YOUR_USER_ID", androidObfuscatedAccountId = "YOUR_OBFUSCATED_ACCOUNT_ID" ).onSuccess { // successful identify }.onError { error -> // handle the error } ``` ## Détecter les utilisateurs sur plusieurs appareils \{#detect-users-across-devices\} Lors de l'activation du SDK, il lit automatiquement les droits existants de l'utilisateur depuis StoreKit (iOS) ou Google Play Billing (Android) et les synchronise avec le backend Adapty. Un abonnement actif apparaît sur le profil Adapty sans que l'application n'appelle `restorePurchases`. Ce qui **ne** se produit **pas** automatiquement, c'est la reconnaissance qu'un profil sur un nouvel appareil appartient au même utilisateur que le profil sur l'appareil d'origine. Adapty fait correspondre les profils par Customer User ID, donc la continuité d'identité dépend de ce que vous utilisez comme CUID. **Ce qu'Adapty peut détecter entre les appareils** | Votre configuration | Ce qu'Adapty détecte | Ce que vous devez faire | | --- | --- | --- | | Customer User ID = `device_id` (sans connexion à l'application) | Le nouvel appareil reçoit un CUID différent et donc un profil différent. L'abonnement se synchronise avec le nouveau profil via un événement **Access level updated**, mais `subscription_started` ne se déclenche pas — le nouveau profil est traité comme un héritier de l'achat d'origine. Les analyses basées sur `subscription_started` sous-compteront les utilisateurs de retour. | Utilisez un identifiant de compte stable comme Customer User ID pour qu'un utilisateur de retour corresponde au profil existant sur tous les appareils. | | Customer User ID = identifiant de compte stable (connexion sur chaque appareil) | Le SDK synchronise automatiquement l'abonnement lors de l'appel `activate()`, et `identify()` fait correspondre le profil existant par CUID. | Aucune configuration supplémentaire n'est nécessaire — l'identité et l'abonnement se résolvent automatiquement. | | Héritier du partage familial Apple | Le membre de la famille reçoit l'abonnement uniquement via un événement **Access level updated** — `subscription_started` ne se déclenche pas. | Écoutez **Access level updated**. Consultez [Apple Family Sharing](apple-family-sharing) pour la matrice complète des événements. | | Même compte Apple/Google, utilisateurs in-app différents | Le premier profil à enregistrer l'achat devient le parent. Les profils suivants voient l'abonnement via une chaîne d'héritiers, avec un seul événement **Access level updated**. | Exigez une connexion, puis choisissez un [mode de partage](sharing-paid-access-between-user-accounts) adapté à votre modèle. | **Restaurer les achats sur un nouvel appareil** Proposez un bouton « Restaurer les achats » initié par l'utilisateur sur votre paywall. Les directives App Review d'Apple (règle 3.1.1) l'exigent, et il sert de solution de secours quand la synchronisation automatique rate un cas limite. Ce bouton doit appeler `restorePurchases` dans votre SDK. Un appel programmatique à `restorePurchases` au premier lancement n'est pas nécessaire pour une utilisation normale — le SDK effectue déjà l'équivalent lors de l'appel `activate()`. Réservez les appels programmatiques pour forcer une vérification fraîche du reçu, par exemple lors du débogage d'un accès manquant après la fin de `activate()`. --- # File: kmp-setting-user-attributes --- --- title: "Définir les attributs utilisateur dans le SDK Kotlin Multiplatform" description: "Découvrez comment définir les attributs utilisateur dans Adapty pour améliorer la segmentation des audiences." --- Vous pouvez définir des attributs optionnels tels que l'adresse e-mail, le numéro de téléphone, etc., pour les utilisateurs de votre application. Vous pouvez ensuite utiliser ces attributs pour créer des [segments](segments) d'utilisateurs ou simplement les consulter dans le CRM. ### Définir les attributs utilisateur \{#setting-user-attributes\} Pour définir les attributs utilisateur, appelez la méthode `.updateProfile()` : ```kotlin showLineNumbers val builder = AdaptyProfileParameters.Builder() .withEmail("email@email.com") .withPhoneNumber("+18888888888") .withFirstName("John") .withLastName("Appleseed") .withGender(AdaptyProfile.Gender.FEMALE) .withBirthday(AdaptyProfile.Date(1970, 1, 3)) Adapty.updateProfile(builder.build()) .onSuccess { // profile updated successfully } .onError { error -> // handle the error } ``` Notez que les attributs précédemment définis avec la méthode `updateProfile` ne seront pas réinitialisés. :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: ### Liste des clés autorisées \{#the-allowed-keys-list\} Les clés `phoneNumber
firstName
lastName
| String | | gender | Enum, les valeurs autorisées sont : `AdaptyProfile.Gender.FEMALE`, `AdaptyProfile.Gender.MALE`, `AdaptyProfile.Gender.OTHER` | | birthday | Date | ### Attributs utilisateur personnalisés \{#custom-user-attributes\} Vous pouvez définir vos propres attributs personnalisés. Ils sont généralement liés à l'utilisation de votre application. Par exemple, pour une application de fitness, il peut s'agir du nombre d'exercices par semaine ; pour une application d'apprentissage des langues, du niveau de connaissance de l'utilisateur, etc. Vous pouvez les utiliser dans des segments pour créer des paywalls et des offres ciblés, et les exploiter dans vos analyses pour identifier quelles métriques produit influencent le plus les revenus. ```kotlin showLineNumbers val builder = AdaptyProfileParameters.Builder() builder.withCustomAttribute("key1", "value1") ``` Pour supprimer une clé existante, utilisez la méthode `.withRemovedCustomAttribute()` : ```kotlin showLineNumbers val builder = AdaptyProfileParameters.Builder() builder.withRemovedCustomAttribute("key2") ``` Il peut parfois être utile de connaître les attributs personnalisés déjà définis. Pour cela, utilisez le champ `customAttributes` de l'objet `AdaptyProfile`. :::warning Gardez à l'esprit que la valeur de `customAttributes` peut ne pas être à jour, car les attributs utilisateur peuvent être envoyés depuis différents appareils à tout moment. Les attributs sur le serveur ont donc pu être modifiés depuis la dernière synchronisation. ::: ### Limites \{#limits\} - Jusqu'à 30 attributs personnalisés par utilisateur - Les noms de clés peuvent contenir jusqu'à 30 caractères. Ils peuvent inclure des caractères alphanumériques ainsi que les caractères suivants : `_` `-` `.` - La valeur peut être une chaîne de caractères ou un nombre à virgule flottante, sans dépasser 50 caractères. --- # File: kmp-listen-subscription-changes --- --- title: "Vérifier le statut d'abonnement dans le SDK Kotlin Multiplatform" description: "Suivez et gérez le statut d'abonnement des utilisateurs dans Adapty pour améliorer la rétention client dans votre application Kotlin Multiplatform." --- Avec Adapty, suivre le statut d'abonnement est simple. Vous n'avez pas besoin d'insérer manuellement des identifiants de produits dans votre code. Vous pouvez vérifier le statut d'abonnement d'un utilisateur en contrôlant l'existence d'un [niveau d'accès](access-level) actif. Avant de commencer à vérifier le statut d'abonnement, configurez les [notifications développeur en temps réel (RTDN)](enable-real-time-developer-notifications-rtdn). ## Niveau d'accès et objet AdaptyProfile \{#access-level-and-the-adaptyprofile-object\} Les niveaux d'accès sont des propriétés de l'objet [AdaptyProfile](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-profile/). Nous vous recommandons de récupérer le profil au démarrage de votre application, par exemple lorsque vous [identifiez un utilisateur](android-identifying-users#setting-customer-user-id-on-configuration), puis de le mettre à jour dès qu'une modification survient. Vous pouvez ainsi utiliser l'objet profil sans avoir à le redemander à chaque fois. Pour être notifié des mises à jour du profil, écoutez les changements de profil comme décrit dans la section [Écouter les mises à jour du profil, y compris les niveaux d'accès](android-listen-subscription-changes) ci-dessous. :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: ## Récupérer le niveau d'accès depuis le serveur \{#retrieving-the-access-level-from-the-server\} Pour obtenir le niveau d'accès depuis le serveur, utilisez la méthode `.getProfile()` : ```kotlin showLineNumbers Adapty.getProfile().onSuccess { profile -> // check the access }.onError { error -> // handle the error } ``` Paramètres de la réponse : | Paramètre | Description | | --------- |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Profile |Un objet [AdaptyProfile](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-profile/). En général, il suffit de vérifier le statut du niveau d'accès du profil pour déterminer si l'utilisateur bénéficie d'un accès premium à l'application.
La méthode `.getProfile` fournit le résultat le plus récent car elle interroge toujours l'API. Si, pour une raison quelconque (par exemple, absence de connexion internet), le SDK Adapty ne parvient pas à récupérer les informations depuis le serveur, les données du cache sont renvoyées. Il est également important de noter que le SDK Adapty met à jour le cache `AdaptyProfile` régulièrement, afin de maintenir ces informations aussi à jour que possible.
| La méthode `.getProfile()` vous fournit le profil utilisateur à partir duquel vous pouvez obtenir le statut du niveau d'accès. Vous pouvez avoir plusieurs niveaux d'accès par application. Par exemple, si vous avez une application de presse et vendez des abonnements à différents sujets indépendamment, vous pouvez créer des niveaux d'accès « sports » et « science ». Mais la plupart du temps, vous n'aurez besoin que d'un seul niveau d'accès ; dans ce cas, vous pouvez simplement utiliser le niveau d'accès « premium » par défaut. Voici un exemple de vérification du niveau d'accès « premium » par défaut : ```kotlin showLineNumbers Adapty.getProfile().onSuccess { profile -> if (profile.accessLevels["premium"]?.isActive == true) { // grant access to premium features } }.onError { error -> // handle the error } ``` ### Écouter les mises à jour du statut d'abonnement \{#listening-for-subscription-status-updates\} Chaque fois que l'abonnement d'un utilisateur change, Adapty déclenche un événement. Pour recevoir les messages d'Adapty, vous devez effectuer quelques configurations supplémentaires : ```kotlin showLineNumbers Adapty.setOnProfileUpdatedListener { profile -> // handle any changes to subscription state } ``` Adapty déclenche également un événement au démarrage de l'application. Dans ce cas, le statut d'abonnement mis en cache est transmis. ### Cache du statut d'abonnement \{#subscription-status-cache\} Le cache intégré au SDK Adapty stocke le statut d'abonnement du profil. Ainsi, même si le serveur est indisponible, les données en cache restent accessibles pour fournir des informations sur le statut d'abonnement du profil. Il est toutefois important de noter qu'il n'est pas possible d'interroger directement le cache. Le SDK interroge périodiquement le serveur toutes les minutes pour vérifier les mises à jour ou modifications liées au profil. Si des modifications sont détectées, comme de nouvelles transactions ou d'autres mises à jour, elles sont transmises aux données en cache afin de les maintenir synchronisées avec le serveur. --- # File: kmp-deal-with-att --- --- title: "Gérer l'ATT dans le SDK Kotlin Multiplatform" description: "Démarrez avec Adapty sur Kotlin Multiplatform pour simplifier la configuration et la gestion des abonnements." --- Si votre application utilise le framework AppTrackingTransparency et présente une demande d'autorisation de suivi à l'utilisateur, vous devez envoyer le [statut d'autorisation](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) à Adapty. ```kotlin showLineNumbers val profileParameters = AdaptyProfileParameters.Builder() .withAttStatus(3) // 3 = ATTrackingManagerAuthorizationStatusAuthorized .build() Adapty.updateProfile(profileParameters) .onSuccess { // ATT status updated successfully } .onError { error -> // handle AdaptyError } ``` :::warning Nous vous recommandons vivement d'envoyer cette valeur le plus tôt possible dès qu'elle change — c'est la seule façon de transmettre les données en temps voulu aux intégrations que vous avez configurées. ::: --- # File: kids-mode-kmp --- --- title: "Mode Enfants dans le SDK Kotlin Multiplatform" description: "Activez facilement le Mode Enfants pour respecter les politiques Google. Aucune collecte de GAID ou de données publicitaires dans le SDK Kotlin Multiplatform." --- Si votre application Kotlin Multiplatform est destinée aux enfants, vous devez respecter les politiques de [Google](https://support.google.com/googleplay/android-developer/answer/9893335). Si vous utilisez le SDK Adapty, quelques étapes simples vous permettront de le configurer pour satisfaire ces politiques et passer les revues des stores. ## Ce qui est requis \{#whats-required\} Vous devez configurer le SDK Adapty pour désactiver la collecte de : - [IDFA (Identifier for Advertisers)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers) (iOS) - [Android Advertising ID (AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248) (Android) - [Adresse IP](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) De plus, nous recommandons d'utiliser l'identifiant utilisateur client avec précaution. Un identifiant au format `optionnel
par défaut : `en`
| L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second la région.Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tentera de charger les données depuis le serveur et retournera les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs n'obtiendront peut-être pas les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser durant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé qu'à la réinstallation de l'application ou lors d'un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos onboardings tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront retournés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre plusieurs requêtes en interne.
| Paramètres de la réponse : | Paramètre | Description | |:----------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Un objet [`AdaptyOnboarding`](https://kmp.adapty.io///adapty/com.adapty.kmp.models/-adapty-onboarding/) contenant : l'identifiant et la configuration de l'onboarding, le Remote Config, et plusieurs autres propriétés. | ## Accélérer la récupération des onboardings avec l'onboarding de l'audience par défaut \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} En général, les onboardings sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et onboardings et que vos utilisateurs ont une connexion internet faible, la récupération d'un onboarding peut prendre plus de temps que souhaité. Dans ce cas, vous pourriez vouloir afficher un onboarding par défaut pour garantir une expérience fluide plutôt que de ne rien afficher du tout. Pour y remédier, vous pouvez utiliser la méthode `getOnboardingForDefaultAudience`, qui récupère l'onboarding du placement spécifié pour l'audience **All Users**. Il est toutefois essentiel de comprendre que l'approche recommandée reste de récupérer l'onboarding via la méthode `getOnboarding`, comme détaillé dans la section [Récupérer un onboarding](#fetch-onboarding) ci-dessus. :::warning Préférez `getOnboarding` à `getOnboardingForDefaultAudience`, car cette dernière présente des limitations importantes : - **Problèmes de compatibilité** : peut créer des problèmes lors de la prise en charge de plusieurs versions de l'application, nécessitant soit des designs rétrocompatibles, soit d'accepter que les anciennes versions puissent s'afficher incorrectement. - **Pas de personnalisation** : affiche uniquement le contenu pour l'audience « All Users », sans ciblage basé sur le pays, l'attribution ou les attributs personnalisés. Si une récupération plus rapide l'emporte sur ces inconvénients pour votre cas d'usage, utilisez `getOnboardingForDefaultAudience` comme indiqué ci-dessous. Sinon, utilisez `getOnboarding` comme décrit [ci-dessus](#fetch-onboarding). ::: ```kotlin showLineNumbers Adapty.getOnboardingForDefaultAudience( placementId = "YOUR_PLACEMENT_ID", locale = "en", fetchPolicy = AdaptyPaywallFetchPolicy.Default, ).onSuccess { paywall -> // the requested paywall }.onError { error -> // handle the error } ``` Paramètres : | Paramètre | Présence | Description | |---------|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | requis | L'identifiant du [Placement](placements) souhaité. Il s'agit de la valeur que vous avez spécifiée lors de la création d'un placement dans l'Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
| L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second la région.Par défaut, le SDK tentera de charger les données depuis le serveur et retournera les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs n'obtiendront peut-être pas les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser durant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé qu'à la réinstallation de l'application ou lors d'un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos onboardings tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| --- # File: kmp-present-onboardings --- --- title: "Présenter les onboardings dans le SDK Kotlin Multiplatform" description: "Découvrez comment présenter efficacement les onboardings pour augmenter vos conversions." --- :::warning **Les onboardings sont dépréciés dans le SDK v4 et seront supprimés dans une prochaine version.** Ils ne reçoivent plus de correctifs ni d'améliorations. Utilisez les [flows](kmp-get-pb-paywalls) à la place : contrairement aux onboardings qui s'exécutent dans une WebView, les flows s'affichent nativement sur l'appareil — offrant des animations plus fluides, un rendu natif cohérent, des temps de chargement plus rapides et aucune dépendance à l'environnement WebView. Consultez [Obtenir des flows & paywalls](kmp-get-pb-paywalls) et [Afficher des flows & paywalls](kmp-present-paywalls) pour commencer. ::: Si vous avez personnalisé un onboarding via le builder, vous n'avez pas besoin de vous soucier de son rendu dans le code de votre application Kotlin Multiplatform pour l'afficher à l'utilisateur. Un tel onboarding contient à la fois ce qui doit être affiché et comment cela doit l'être. Avant de commencer, assurez-vous que : 1. Vous avez installé le [SDK Adapty Kotlin Multiplatform](sdk-installation-kotlin-multiplatform) 3.16.1 ou une version ultérieure. 2. Vous avez [créé un onboarding](create-onboarding). 3. Vous avez ajouté l'onboarding à un [placement](placements). Le SDK Adapty Kotlin Multiplatform offre deux façons de présenter les onboardings : - **Avec Compose Multiplatform** - **Sans Compose Multiplatform** ## Avec Compose Multiplatform \{#with-compose-multiplatform\} Pour afficher un onboarding, utilisez la méthode `view.present()` sur la `view` créée par la méthode `createOnboardingView`. Chaque `view` ne peut être utilisée qu'une seule fois. Si vous devez afficher l'onboarding à nouveau, appelez `createOnboardingView` une nouvelle fois pour créer une nouvelle instance de `view`. :::warning Réutiliser la même `view` sans la recréer peut entraîner une erreur. ::: ```kotlin showLineNumbers title="Kotlin Multiplatform" viewModelScope.launch { AdaptyUI.createOnboardingView(onboarding = onboarding).onSuccess { view -> view.present() }.onError { error -> // handle the error } } ``` ### Configurer le style de présentation iOS \{#configure-ios-presentation-style\} Configurez la façon dont l'onboarding est présenté sur iOS en passant le paramètre `iosPresentationStyle` à la méthode `present()`. Le paramètre accepte les valeurs `AdaptyUIIOSPresentationStyle.FULLSCREEN` (par défaut) ou `AdaptyUIIOSPresentationStyle.PAGESHEET`. ```kotlin showLineNumbers viewModelScope.launch { val view = AdaptyUI.createOnboardingView(onboarding = onboarding).getOrNull() view?.present(iosPresentationStyle = AdaptyUIIOSPresentationStyle.PAGESHEET) } ``` ### Personnaliser l'ouverture des liens dans les onboardings \{#customize-how-links-open-in-onboardings\} Par défaut, les liens dans les onboardings s'ouvrent dans un navigateur intégré à l'application. Cela offre une expérience utilisateur fluide en affichant les pages web directement dans votre application, permettant aux utilisateurs de les consulter sans changer d'app. Si vous préférez ouvrir les liens dans un navigateur externe, vous pouvez personnaliser ce comportement en définissant le paramètre `externalUrlsPresentation` sur `AdaptyWebPresentation.EXTERNAL_BROWSER` : ```kotlin showLineNumbers viewModelScope.launch { AdaptyUI.createOnboardingView( onboarding = onboarding, externalUrlsPresentation = AdaptyWebPresentation.EXTERNAL_BROWSER // default – IN_APP_BROWSER ).onSuccess { view -> view.present() }.onError { error -> // handle the error } } ``` ## Sans Compose Multiplatform \{#without-compose-multiplatform\} :::note `createNativeOnboardingView` fait partie du module principal `io.adapty:adapty-kmp`. Si votre projet n'utilise pas Compose Multiplatform, vous n'avez pas besoin de la dépendance `io.adapty:adapty-kmp-ui`. ::: Pour intégrer un onboarding sans Compose Multiplatform, appelez `createNativeOnboardingView`. Cette méthode retourne un `AdaptyNativeOnboardingView` que vous ajoutez à votre layout :
Par exemple, si un utilisateur appuie sur un bouton personnalisé comme **Login** ou **Allow notifications**, la méthode déléguée `onCustomAction` sera déclenchée avec l'identifiant d'action défini dans le builder. Vous pouvez créer vos propres identifiants, par exemple « allowNotifications ».
```kotlin
class MyAdaptyUIOnboardingsEventsObserver : AdaptyUIOnboardingsEventsObserver {
override fun onboardingViewOnCustomAction(
view: AdaptyUIOnboardingView,
meta: AdaptyUIOnboardingMeta,
actionId: String
) {
when (actionId) {
"openPaywall" -> {
// Display paywall from onboarding
// You would typically fetch and present a new paywall here
mainUiScope.launch {
// Example: Get paywall by placement ID
// val paywallResult = Adapty.getPaywall("your_placement_id")
// paywallResult.onSuccess { paywall ->
// val paywallViewResult = AdaptyUI.createPaywallView(paywall)
// paywallViewResult.onSuccess { paywallView ->
// paywallView.present()
// }
// }
}
}
"allowNotifications" -> {
// Handle notification permissions
}
else -> {
// Handle other custom actions
}
}
}
}
// Set up the observer
AdaptyUI.setOnboardingsEventsObserver(MyAdaptyUIOnboardingsEventsObserver())
```
2. Cliquez sur le nom du groupe d'abonnements. Vos produits s'affichent dans la section **Subscriptions**.
3. Assurez-vous que le produit que vous testez est marqué **Ready to Submit**. Si ce n'est pas le cas, suivez les instructions de la page [Produit dans l'App Store](app-store-products).
4. Comparez l'identifiant du produit dans le tableau avec celui de l'onglet [**Products**](https://app.adapty.io/products) dans l'Adapty Dashboard. Si les identifiants ne correspondent pas, copiez l'identifiant du produit depuis le tableau et [créez un produit](create-product) avec cet identifiant dans l'Adapty Dashboard.
## Étape 3. Vérifier la disponibilité du produit \{#step-4-check-product-availability\}
1. Retournez dans **App Store Connect** et ouvrez la même section **Subscriptions**.
2. Cliquez sur le nom du groupe d'abonnements pour afficher vos produits.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à la section **Availability** et vérifiez que tous les pays et régions requis y figurent.
## Étape 4. Vérifier les prix du produit \{#step-5-check-product-prices\}
1. Retournez dans la section **Monetization** → **Subscriptions** d'**App Store Connect**.
2. Cliquez sur le nom du groupe d'abonnements.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à **Subscription Pricing** et développez la section **Current Pricing for New Subscribers**.
5. Vérifiez que tous les prix requis sont bien listés.
## Étape 5. Vérifier le statut de paiement de l'app, le compte bancaire et les formulaires fiscaux \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. Sur la page d'accueil d'[**App Store Connect**](https://appstoreconnect.apple.com/), cliquez sur **Business**.
2. Sélectionnez le nom de votre entreprise.
3. Faites défiler vers le bas et vérifiez que votre **Paid Apps Agreement**, votre **Bank Account** et vos **Tax forms** affichent tous le statut **Active**.
En suivant ces étapes, vous devriez pouvoir résoudre l'avertissement `InvalidProductIdentifiers` et mettre vos produits en ligne dans le store.
## Étape 6. Recréer le produit s'il est bloqué \{#step-6-recreate-the-product-if-its-stuck\}
Les étapes 1 à 5 peuvent toutes être validées — statut `Approved`, Bundle ID correspondant, clé API valide — et pourtant le SDK continue de renvoyer `1000 noProductIDsFound`. Dans ce cas, le produit est peut-être bloqué dans le registre d'Apple. Il arrive que le registre de produits d'Apple entre dans un état où un produit existe dans l'interface d'App Store Connect mais n'est pas exposé au chemin de recherche StoreKit.
Supprimez le produit dans App Store Connect et recréez-le avec le même identifiant de produit. Attendez jusqu'à 24 heures après la recréation pour que la propagation s'effectue.
---
# File: cantMakePayments-kmp
---
---
title: "Correction de l'erreur Code-1003 cantMakePayment dans le SDK Kotlin Multiplatform"
description: "Résolvez l'erreur de paiement lors de la gestion des abonnements dans Adapty."
---
L'erreur 1003, `cantMakePayments`, indique que les achats intégrés ne peuvent pas être effectués sur cet appareil.
Si vous rencontrez l'erreur `cantMakePayments`, cela est généralement dû à l'une des raisons suivantes :
- Restrictions de l'appareil : L'erreur n'est pas liée à Adapty. Consultez les solutions ci-dessous.
- Configuration du mode Observateur : La méthode `makePurchase` et le mode Observateur ne peuvent pas être utilisés simultanément. Consultez la section ci-dessous.
## Problème : Restrictions de l'appareil \{#issue-device-restrictions\}
| Problème | Solution |
|--------------------------------|-------------------------------------------------------------------------------------------------------------|
| Restrictions Screen Time | Désactivez les restrictions d'achat intégré dans [Screen Time](https://support.apple.com/en-us/102470) |
| Compte suspendu | Contactez le support Apple pour résoudre les problèmes de compte |
| Restrictions régionales | Utilisez un compte App Store d'une région prise en charge |
## Problème : Utilisation simultanée du mode Observateur et de makePurchase \{#issue-using-both-observer-mode-and-makepurchase\}
Si vous utilisez `makePurchases` pour gérer les achats, vous n'avez pas besoin d'utiliser le mode Observateur. Le [mode Observateur](observer-vs-full-mode) n'est nécessaire que si vous implémentez vous-même la logique d'achat.
Ainsi, si vous utilisez `makePurchase`, vous pouvez supprimer en toute sécurité l'activation du mode Observateur dans le code d'initialisation du SDK.
---
# File: kmp-sdk-migration-guides
---
---
title: "Guides de migration du SDK Kotlin Multiplatform"
description: "Guides de migration pour les versions du SDK Adapty Kotlin Multiplatform."
---
Cette page contient tous les guides de migration pour le SDK Adapty Kotlin Multiplatform. Choisissez la version vers laquelle vous souhaitez migrer pour obtenir des instructions détaillées :
- **[Migrer vers la v4.0 (beta)](migration-to-kmp-sdk-v4)**
- **[Migrer vers la v3.15](migration-to-kmp-315)**
---
# File: migration-to-kmp-sdk-v4
---
---
title: "Migrer le SDK Adapty Kotlin Multiplatform vers la v. 4.0"
description: "Migrez vers le SDK Adapty Kotlin Multiplatform v4.0 (beta) en remplaçant les API de paywall par des API de flow, compatibles avec le Flow Builder et le Paywall Builder."
---
Le SDK Adapty Kotlin Multiplatform 4.0 (beta) introduit les flows et renomme les API de paywall en conséquence. Les nouvelles API fonctionnent aussi bien avec le nouveau Flow Builder qu'avec le Paywall Builder existant — aucune modification de configuration n'est requise côté Adapty Dashboard.
## Référence rapide \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty.getPaywall(placementId, locale)` | `Adapty.getFlow(placementId)` |
| `Adapty.getPaywallForDefaultAudience(placementId, locale)` | `Adapty.getFlowForDefaultAudience(placementId)` |
| `Adapty.getPaywallProducts(paywall)` | `Adapty.getPaywallProducts(flow)` |
| `Adapty.logShowPaywall(paywall)` | `Adapty.logShowFlow(flow)` |
| `AdaptyPaywall` | `AdaptyFlow` |
| `AdaptyUI.createPaywallView(paywall, ...)` | `AdaptyUI.createFlowView(flow, ...)` |
| `AdaptyUI.createNativePaywallView(...)` → `AdaptyNativePaywallView` | `AdaptyUI.createNativeFlowView(...)` → `AdaptyNativeFlowView` |
| `AdaptyUIPaywallView` | `AdaptyUIFlowView` |
| `AdaptyUI.presentPaywallView(view)` / `dismissPaywallView(view)` | `AdaptyUI.presentFlowView(view)` / `dismissFlowView(view)` |
| `AdaptyUI.setPaywallsEventsObserver(observer)` | `AdaptyUI.setFlowsEventsObserver(observer)` |
| `AdaptyUI.registerPaywallEventsListener` / `unregisterPaywallEventsListener` | `AdaptyUI.registerFlowEventsListener` / `unregisterFlowEventsListener` |
| `AdaptyUIPaywallsEventsObserver` | `AdaptyUIFlowsEventsObserver` |
| `AdaptyUIPaywallPlatformView(paywall, ...)` | `AdaptyUIFlowPlatformView(flow, ...)` |
| `paywallViewDidPerformAction`, `paywallViewDidAppear` et autres callbacks `paywallView...` | `flowViewDidPerformAction`, `flowViewDidAppear` et autres callbacks `flowView...` |
| `paywallViewDidFailRendering` | `flowViewDidReceiveError` |
`AdaptyPaywallProduct` conserve son nom — les produits appartiennent toujours à un flow, et `getPaywallProducts` conserve également son nom, en prenant désormais un `AdaptyFlow`. Les méthodes `getFlow` et `getFlowForDefaultAudience` ne prennent plus de paramètre `locale`. Les API d'achat et de profil (`makePurchase`, `restorePurchases`, `getProfile`, `identify`, `updateProfile`) ainsi que `setFallback` conservent les mêmes signatures, mais le fichier de secours lui-même doit être retéléchargé — voir [Fichiers de secours](#fallback-files). Les méthodes d'onboarding fonctionnent toujours mais sont dépréciées — voir [Dépréciation de l'API d'onboarding](#onboarding-api-deprecation). Certains comportements par défaut ont changé — voir [Changements de comportement par défaut](#default-behavior-changes).
## Installation \{#installation\}
La v4.0 est une version préliminaire, donc épinglez la version exacte — Gradle ne sélectionne pas les versions préliminaires via les plages dynamiques :
```toml showLineNumbers title="libs.versions.toml"
[versions]
adapty-kmp = "4.0.0-beta.1"
[libraries]
adapty-kmp = { module = "io.adapty:adapty-kmp", version.ref = "adapty-kmp" }
adapty-kmp-ui = { module = "io.adapty:adapty-kmp-ui", version.ref = "adapty-kmp" }
```
Le module `adapty-kmp-ui` n'est nécessaire que si vous affichez des flows et des paywalls avec la couche Compose Multiplatform (`view.present()`). Consultez [Installer le SDK Adapty](sdk-installation-kotlin-multiplatform) pour la configuration complète.
Les SDK natifs Adapty sous-jacents sont mis à jour vers leurs versions 4.x sur les deux plateformes et sont résolus automatiquement — aucune modification de build n'est nécessaire. La cible de déploiement iOS reste **15.0**, inchangée dans cette version.
## Récupération des flows \{#fetching-flows\}
### getPaywall → getFlow
Le type retourné passe de `AdaptyPaywall` à `AdaptyFlow`, et le paramètre `locale` est supprimé — lorsque vous affichez un flow, la locale est résolue automatiquement ; pour les paywalls personnalisés, toutes les locales sont retournées dans `flow.remoteConfigs` :
```diff showLineNumbers
- Adapty.getPaywall("YOUR_PLACEMENT_ID", locale = "en")
- .onSuccess { paywall ->
- // use the paywall
+ Adapty.getFlow("YOUR_PLACEMENT_ID")
+ .onSuccess { flow ->
+ // use the flow
}
.onError { error ->
// handle the error
}
```
`getPaywallForDefaultAudience` est renommé de la même façon :
```diff showLineNumbers
- Adapty.getPaywallForDefaultAudience("YOUR_PLACEMENT_ID", locale = "en")
+ Adapty.getFlowForDefaultAudience("YOUR_PLACEMENT_ID")
```
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` conserve son nom mais prend désormais un `AdaptyFlow` :
```diff showLineNumbers
- Adapty.getPaywallProducts(paywall)
+ Adapty.getPaywallProducts(flow)
.onSuccess { products ->
// use the products
}
```
### Fichiers de secours \{#fallback-files\}
Le format du fichier de secours [a changé dans le SDK v4](fallback-flows). Téléchargez le nouveau fichier depuis **[Placements](https://app.adapty.io/placements)** > **Fallbacks** et intégrez-le à votre application.
## Modèle de données \{#data-model\}
`getFlow` renvoie un `AdaptyFlow` à la place d'un `AdaptyPaywall`, et la structure de l'objet a changé :
| Propriété v3 `AdaptyPaywall` | Propriété v4 `AdaptyFlow` | Action |
|---|---|---|
| `remoteConfig: AdaptyRemoteConfig?` (unique) | `remoteConfigs: List
### Lors de la connexion/inscription \{#during-loginsignup\}
Si vous identifiez les utilisateurs après le lancement de l'application (par exemple, après qu'ils se soient connectés ou inscrits), utilisez la méthode `identify` pour définir leur customer user ID.
- Si vous **n'avez jamais utilisé ce customer user ID auparavant**, Adapty le liera automatiquement au profil actuel.
- Si vous **avez déjà utilisé ce customer user ID pour identifier l'utilisateur**, Adapty basculera vers le profil associé à ce customer user ID.
:::important
Les customer user IDs doivent être uniques pour chaque utilisateur. Si vous codez la valeur du paramètre en dur, tous les utilisateurs seront considérés comme un seul.
:::
Attendez toujours la résolution de `identify` avec `await` avant d'appeler d'autres méthodes du SDK. Les appels simultanés produisent l'erreur `#3006 profileWasChanged` ou atterrissent sur le profil anonyme. Consultez [Ordre des appels dans le SDK React Native](react-native-sdk-call-order).
```typescript showLineNumbers
try {
await adapty.identify("YOUR_USER_ID"); // Unique for each user
// successfully identified
} catch (error) {
// handle the error
}
```
### Lors de l'activation du SDK \{#during-the-sdk-activation\}
Si vous connaissez déjà un customer user ID au moment d'activer le SDK, vous pouvez l'envoyer dans la méthode `activate` au lieu d'appeler `identify` séparément.
Si vous connaissez un customer user ID mais ne le définissez qu'après l'activation, cela signifie qu'au moment de l'activation, Adapty créera un nouveau profil anonyme et ne basculera vers le profil existant qu'après l'appel à `identify`.
Vous pouvez passer un customer user ID existant (que vous avez déjà utilisé) ou un nouveau. Si vous en passez un nouveau, le profil créé lors de l'activation sera automatiquement lié à ce customer user ID.
:::note
Par défaut, la création de profils anonymes n'affecte pas les tableaux de bord d'analyse, car les installations sont comptées sur la base des ID d'appareil.
Un ID d'appareil représente une seule installation de l'application depuis le store sur un appareil et n'est regénéré qu'après la réinstallation de l'application.
Il ne dépend pas du fait qu'il s'agisse d'une première ou d'une nième installation, ni de l'utilisation d'un customer user ID existant.
La création d'un profil (lors de l'activation du SDK ou de la déconnexion), la connexion ou la mise à jour de l'application sans réinstallation ne génèrent pas d'événements d'installation supplémentaires.
Si vous souhaitez compter les installations par utilisateurs uniques plutôt que par appareils, accédez à **App settings** et configurez [**Installs definition for analytics**](general#4-installs-definition-for-analytics).
:::
```typescript showLineNumbers
adapty.activate("PUBLIC_SDK_KEY", {
customerUserId: "YOUR_USER_ID" // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
});
```
### Déconnecter les utilisateurs \{#log-users-out\}
Si votre application propose un bouton de déconnexion, utilisez la méthode `logout`.
:::important
La déconnexion des utilisateurs crée un nouveau profil anonyme pour l'utilisateur.
:::
```typescript showLineNumbers
try {
await adapty.logout();
// successful logout
} catch (error) {
// handle the error
}
```
:::info
Pour reconnecter les utilisateurs à l'application, utilisez la méthode `identify`.
:::
### Autoriser les achats sans connexion \{#allow-purchases-without-login\}
Si vos utilisateurs peuvent effectuer des achats avant et après leur connexion à votre application, vous devez vous assurer qu'ils conserveront leur accès après la connexion :
1. Lorsqu'un utilisateur déconnecté effectue un achat, Adapty l'associe à son ID de profil anonyme.
2. Lorsque l'utilisateur se connecte à son compte, Adapty bascule vers son profil identifié.
- S'il s'agit d'un nouveau customer user ID (par exemple, l'achat a été effectué avant l'inscription), Adapty assigne le customer user ID au profil actuel, de sorte que tout l'historique des achats est conservé.
- S'il s'agit d'un customer user ID existant (le customer user ID est déjà lié à un profil), vous devez récupérer le niveau d'accès réel après le changement de profil. Vous pouvez soit appeler [`getProfile`](react-native-check-subscription-status) juste après l'identification, soit [écouter les mises à jour du profil](react-native-check-subscription-status) pour que les données se synchronisent automatiquement.
## Prochaines étapes \{#next-steps\}
Félicitations ! Vous avez implémenté la logique de paiement intégré dans votre application ! Nous vous souhaitons tout le succès possible pour la monétisation de votre application !
Pour tirer encore plus parti d'Adapty, vous pouvez explorer ces sujets :
- [**Tests**](troubleshooting-test-purchases) : Vérifiez que tout fonctionne comme prévu
- [**Onboardings**](react-native-onboardings) : Engagez les utilisateurs avec des onboardings et stimulez la rétention
- [**Intégrations**](configuration) : Intégrez des services d'attribution marketing et d'analyse en une seule ligne de code
- [**Définir des attributs de profil personnalisés**](react-native-setting-user-attributes) : Ajoutez des attributs personnalisés aux profils utilisateurs et créez des segments pour lancer des tests A/B ou afficher différents paywalls à différents utilisateurs
---
# File: adapty-sdk-integration-skill-react-native
---
---
title: "Intégrer Adapty dans votre application React Native avec la compétence d'intégration SDK"
description: "Utilisez la compétence adapty-sdk-integration pour intégrer le SDK Adapty dans votre application React Native de bout en bout avec votre outil de codage IA."
---
:::important
La compétence est en version bêta. Si elle se bloque ou se comporte de manière inattendue, suivez le [guide d'intégration étape par étape](adapty-cursor-react-native) à la place — il guide votre outil IA à travers chaque étape avec la bonne documentation.
:::
La [compétence adapty-sdk-integration](https://github.com/adaptyteam/adapty-sdk-integration-skill) automatise l'intégration Adapty de bout en bout : configuration du tableau de bord, installation du SDK, paywall et vérification à chaque étape. Elle détecte automatiquement votre plateforme et récupère la documentation Adapty pertinente à chaque étape.
**Outils compatibles** : Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Pour installer, choisissez le formulaire correspondant à votre outil. La liste complète se trouve dans le [README de la compétence](https://github.com/adaptyteam/adapty-sdk-integration-skill).
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex ou tout autre outil** — utilisez la [CLI skills](https://skills.sh) (notez que les compétences installées de cette façon ne se mettent pas à jour automatiquement) :
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Vous pouvez également cloner le dépôt et copier `skills/adapty-sdk-integration/` dans le répertoire des compétences de votre outil.
Après l'installation, exécutez la compétence dans votre projet :
```
/adapty-sdk-integration
```
La compétence pose quelques questions de configuration, puis guide à travers la configuration du tableau de bord, l'installation du SDK, le paywall et la vérification.
---
# File: adapty-cursor-react-native
---
---
title: "Intégrer Adapty dans votre application React Native avec l'aide de l'IA"
description: "Un guide pas à pas pour intégrer Adapty dans votre application React Native avec Cursor, Context7, ChatGPT, Claude ou d'autres outils IA."
---
Ce guide vous accompagne étape par étape dans l'intégration d'Adapty dans votre application React Native à l'aide d'un outil de codage IA — vous lui fournissez les bonnes docs Adapty dans le bon ordre.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Avant de commencer : configuration du tableau de bord \{#before-you-start-dashboard-setup\}
Adapty nécessite une configuration dans le tableau de bord avant d'écrire le moindre code SDK. Vous pouvez le faire via un skill LLM interactif, ou manuellement depuis le Dashboard.
### Approche par skill (recommandée) \{#skill-approach-recommended\}
Le skill Adapty CLI permet à votre LLM de configurer votre app, vos produits, niveaux d'accès, paywalls et placements directement — sans ouvrir le Dashboard à chaque étape. Il vous suffit de [connecter vos stores](integrate-payments) dans le Dashboard.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Une fois le skill ajouté, lancez `/adapty-cli` dans votre agent. Il vous guidera à chaque étape — y compris pour savoir quand ouvrir le Dashboard afin de connecter vos stores.
### Approche manuelle via le Dashboard \{#dashboard-approach\}
Si vous préférez tout configurer manuellement, voici ce dont vous avez besoin avant d'écrire du code. Votre LLM ne peut pas récupérer les valeurs du tableau de bord à votre place — vous devrez les lui fournir.
1. **Connectez vos stores** : Dans l'Adapty Dashboard, allez dans **App settings → General**. Connectez l'App Store et Google Play si votre app cible les deux plateformes. C'est indispensable pour que les achats fonctionnent.
[Connecter les stores](integrate-payments)
2. **Copiez votre clé SDK publique** : Dans l'Adapty Dashboard, allez dans **App settings → General**, puis trouvez la section **API keys**. Dans le code, c'est la chaîne que vous passez à `adapty.activate("YOUR_PUBLIC_SDK_KEY")`.
3. **Créez au moins un produit** : Dans l'Adapty Dashboard, rendez-vous sur la page **Products**. Vous ne référencez pas les produits directement dans le code — Adapty les livre via les paywalls.
[Ajouter des produits](quickstart-products)
4. **Créez un paywall et un placement** : Dans l'Adapty Dashboard, créez un paywall sur la page **Paywalls**, puis assignez-le à un placement sur la page **Placements**. Dans le code, l'ID du placement est la chaîne que vous passez à `adapty.getPaywall("YOUR_PLACEMENT_ID")`.
[Créer un paywall](quickstart-paywalls)
5. **Configurez les niveaux d'accès** : Dans l'Adapty Dashboard, configurez-les par produit sur la page **Products**. Dans le code, la chaîne vérifiée dans `profile.accessLevels['premium']?.isActive`. Le niveau d'accès `premium` par défaut convient à la plupart des apps. Si les utilisateurs payants accèdent à des fonctionnalités différentes selon le produit (par exemple un plan `basic` vs un plan `pro`), [créez des niveaux d'accès supplémentaires](assigning-access-level-to-a-product) avant de commencer à coder.
:::tip
Une fois que vous avez ces cinq éléments, vous êtes prêt à coder. Dites à votre LLM : "Ma clé SDK publique est X, mon ID de placement est Y" pour qu'il génère du code d'initialisation et de récupération de paywall correct.
:::
### À configurer quand vous êtes prêt \{#set-up-when-ready\}
Ces éléments ne sont pas indispensables pour démarrer, mais vous en aurez besoin à mesure que votre intégration mûrit :
- **Tests A/B** : Configurez-les sur la page **Placements**. Aucune modification de code nécessaire.
[Tests A/B](ab-tests)
- **Paywalls et placements supplémentaires** : Ajoutez d'autres appels `getPaywall` avec des IDs de placement différents.
- **Intégrations analytics** : Configurez-les sur la page **Integrations**. La configuration varie selon l'intégration. Voir [intégrations analytics](analytics-integration) et [intégrations attribution](attribution-integration).
## Fournir les docs Adapty à votre LLM \{#feed-adapty-docs-to-your-llm\}
### Utiliser Context7 (recommandé) \{#use-context7-recommended\}
[Context7](https://context7.com) est un serveur MCP qui donne à votre LLM un accès direct à la documentation Adapty à jour. Votre LLM récupère automatiquement les bonnes docs en fonction de vos questions — pas besoin de coller des URL manuellement.
Context7 fonctionne avec **Cursor**, **Claude Code**, **Windsurf** et d'autres outils compatibles MCP. Pour le configurer, lancez :
```
npx ctx7 setup
```
Cette commande détecte votre éditeur et configure le serveur Context7. Pour une configuration manuelle, consultez le [dépôt GitHub Context7](https://github.com/upstash/context7).
Une fois configuré, référencez la bibliothèque Adapty dans vos prompts :
```
Use the adaptyteam/adapty-docs library to look up how to install the React Native SDK
```
:::warning
Même si Context7 supprime le besoin de coller des liens de docs manuellement, l'ordre d'implémentation reste important. Suivez le [parcours d'implémentation](#implementation-walkthrough) ci-dessous étape par étape pour vous assurer que tout fonctionne.
:::
### Utiliser les docs en texte brut \{#use-plain-text-docs\}
Vous pouvez accéder à n'importe quelle doc Adapty en texte brut Markdown. Ajoutez `.md` à la fin de son URL, ou cliquez sur **Copy for LLM** sous le titre de l'article. Par exemple : [adapty-cursor-react-native.md](https://adapty.io/docs/fr/adapty-cursor-react-native.md).
Chaque étape du [parcours d'implémentation](#implementation-walkthrough) ci-dessous inclut un bloc "Envoyez ceci à votre LLM" avec des liens `.md` à coller.
Pour accéder à plus de documentation en une fois, consultez les [fichiers d'index et sous-ensembles par plateforme](#plain-text-doc-index-files) ci-dessous.
## Parcours d'implémentation \{#implementation-walkthrough\}
Le reste de ce guide parcourt l'intégration d'Adapty dans l'ordre d'implémentation. Chaque étape inclut les docs à envoyer à votre LLM, ce que vous devriez voir une fois terminé, et les problèmes courants.
### Planifier votre intégration \{#plan-your-integration\}
Avant de vous lancer dans le code, demandez à votre LLM d'analyser votre projet et de créer un plan d'implémentation. Si votre outil IA dispose d'un mode planification (comme Cursor ou le mode plan de Claude Code), utilisez-le pour que le LLM puisse lire à la fois la structure de votre projet et les docs Adapty avant d'écrire du code.
Indiquez à votre LLM quelle approche vous utilisez pour les achats — cela détermine les guides qu'il devra suivre :
- [**Adapty Paywall Builder**](adapty-paywall-builder) : Vous créez des paywalls dans l'éditeur no-code d'Adapty, et le SDK les affiche automatiquement.
- [**Paywalls créés manuellement**](react-native-making-purchases) : Vous construisez votre propre interface de paywall dans le code, mais utilisez quand même Adapty pour récupérer les produits et gérer les achats.
- [**Mode Observer**](observer-vs-full-mode) : Vous conservez votre infrastructure d'achat existante et utilisez Adapty uniquement pour l'analytics et les intégrations.
Vous ne savez pas lequel choisir ? Lisez le [tableau comparatif dans le guide de démarrage](react-native-quickstart-paywalls).
### Installer et configurer le SDK \{#install-and-configure-the-sdk\}
Ajoutez la dépendance Adapty SDK via npm (ou yarn) et activez-la avec votre clé SDK publique. C'est la base — rien d'autre ne fonctionne sans ça.
Nous avons des guides d'installation distincts pour Expo et les projets React Native bare — choisissez celui qui correspond à votre configuration.
**Guides :**
- [Installer avec Expo](sdk-installation-react-native-expo)
- [Installer avec React Native bare](sdk-installation-react-native-pure)
Envoyez ceci à votre LLM (choisissez celui qui correspond à votre configuration, ou envoyez les deux) :
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/fr/sdk-installation-react-native-expo.md
- https://adapty.io/docs/fr/sdk-installation-react-native-pure.md
```
:::tip[Point de contrôle]
- **Attendu :** L'app se compile et tourne sur iOS et Android. Les logs de Metro bundler affichent le log d'activation Adapty.
- **Problème fréquent :** "Public API key is missing" → vérifiez que vous avez remplacé le placeholder par votre vraie clé depuis App settings.
:::
### Afficher les paywalls et gérer les achats \{#show-paywalls-and-handle-purchases\}
Récupérez un paywall par ID de placement, affichez-le et gérez les événements d'achat. Les guides dont vous avez besoin dépendent de la façon dont vous gérez les achats.
Testez chaque achat en sandbox au fur et à mesure — n'attendez pas la fin. Consultez [Tester les achats en sandbox](test-purchases-in-sandbox) pour les instructions de configuration.
Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne recevront peut-être pas les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session afin d'éviter des requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la réinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir de toujours obtenir la dernière version de vos paywalls tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeoutMs** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre différentes requêtes en arrière-plan.
Pour Android : Vous pouvez créer un `TimeInterval` avec des fonctions d'extension (comme `5.seconds`, où `.seconds` provient de `import com.adapty.utils.seconds`), ou `TimeInterval.seconds(5)`. Pour ne pas fixer de limite, utilisez `TimeInterval.INFINITE`.
| ## Paramètres de réponse \{#response-parameters\} | Paramètre | Description | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Flow | Un objet `AdaptyFlow` contenant les identifiants du flow (`id`, `variationId`), son nom, son placement, ses variantes de paywall (`paywalls`) et les éventuels Remote Configs (`remoteConfigs`). | ## Récupérer la configuration de la vue \{#fetch-the-view-configuration\} :::important Assurez-vous d'activer le bouton **Show on device** dans le builder. Si cette option n'est pas activée, la configuration de la vue ne sera pas disponible. ::: Si le placement a été conçu dans le **Flow Builder** ou le **Paywall Builder**, Adapty génère l'interface utilisateur pour vous. Créez la vue avec `createFlowView`, puis [présentez le flow ou le paywall](react-native-present-paywalls). Si le placement est un paywall personnalisé sans interface dans le Builder, [gérez-le comme un paywall Remote Config](present-remote-config-paywalls-react-native) à la place. Dans le SDK React Native, appelez `createFlowView` directement — inutile de récupérer d'abord la configuration de la vue. :::warning Le résultat de la méthode `createFlowView` ne peut être utilisé qu'une seule fois. Si vous devez l'utiliser à nouveau, appelez de nouveau la méthode `createFlowView`. L'appeler deux fois sans recréer la vue peut entraîner l'erreur `AdaptyUIError.viewAlreadyPresented`. ::: ```typescript showLineNumbers try { const view = await createFlowView(flow); } catch (error) { // handle the error } ``` Paramètres : | Paramètre | Présence | Description | | :------------------- | :------- | :----------------------------------------------------------- | | **flow** | requis | Un objet `AdaptyFlow` permettant d'obtenir un contrôleur pour le flow/paywall souhaité. | | **locale** | optionnel | L'identifiant de la [localisation du flow](add-paywall-locale-in-adapty-paywall-builder) avec laquelle afficher la vue — par exemple, `en` ou `pt-br`. Si omis, la vue s'affiche en `en`, ou dans la localisation par défaut du flow si celui-ci ne dispose pas de `en`. Nécessite le SDK 4.0.2 ou version ultérieure. Voir [Localisations et codes de langue](react-native-localizations-and-locale-codes). | | **customTags** | optionnel | Définit un dictionnaire de tags personnalisés et leurs valeurs résolues. Les tags personnalisés servent de placeholders dans le contenu, remplacés dynamiquement par des chaînes spécifiques pour personnaliser le contenu du flow/paywall. Consultez la rubrique Tags personnalisés dans le Paywall Builder pour plus de détails. | | **prefetchProducts** | optionnel | À activer pour optimiser le moment d'affichage des produits à l'écran. Lorsque `true`, AdaptyUI récupère automatiquement les produits nécessaires. Par défaut : `false`. | | **android.enableSafeArea** | optionnel | Android uniquement (ignoré sur iOS). À passer en tant qu'objet imbriqué : `android: { enableSafeArea: true }`. Lorsque `true`, la vue du flow applique les marges de zone sécurisée. Par défaut `true` pour la présentation modale (`createFlowView` + `present()`) et `false` pour le composant `AdaptyFlowView` intégré. La valeur par défaut convient à la plupart des cas. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation de flow](add-paywall-locale-in-adapty-paywall-builder) et comment utiliser correctement les codes de langue [ici](react-native-localizations-and-locale-codes). ::: Une fois que vous avez la vue, [affichez le flow/paywall](react-native-present-paywalls). ## Récupérer un flow ou un paywall pour l'audience par défaut afin d'accélérer la récupération \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} En règle générale, les flows et les paywalls sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et placements et que vos utilisateurs disposent d'une connexion internet faible, la récupération d'un flow ou d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un flow ou un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher du tout. Pour remédier à cela, vous pouvez utiliser la méthode `getFlowForDefaultAudience`, qui récupère le flow ou le paywall du placement spécifié pour l'audience **All Users**. Il est cependant essentiel de comprendre que l'approche recommandée est de récupérer le flow ou le paywall via la méthode `getFlow`, comme indiqué dans la section [Récupérer le flow/paywall](#fetch-flowpaywall) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getFlow` La méthode `getFlowForDefaultAudience` présente quelques inconvénients majeurs : - **Problèmes potentiels de compatibilité ascendante** : Si vous devez afficher des paywalls différents selon les versions de l'application (actuelle et futures), vous pourrez rencontrer des difficultés. Vous devrez soit concevoir des paywalls compatibles avec la version actuelle (héritée), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des paywalls non affichés. - **Perte de ciblage** : Tous les utilisateurs verront le même paywall conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment par pays, attribution marketing ou attributs personnalisés). Si vous acceptez ces inconvénients pour bénéficier d'un chargement plus rapide des flows ou des paywalls, utilisez la méthode `getFlowForDefaultAudience` comme suit. Sinon, restez sur `getFlow` décrit [ci-dessus](#fetch-flowpaywall). ::: ```typescript showLineNumbers try { const id = 'YOUR_PLACEMENT_ID'; const flow = await adapty.getFlowForDefaultAudience(id); // the requested flow/paywall } catch (error) { // handle the error } ``` | Paramètre | Présence | Description | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | obligatoire | L'identifiant du [Placement](placements). Il s'agit de la valeur que vous avez spécifiée lors de la création d'un placement dans votre Adapty Dashboard. | | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs peuvent ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation ou par un nettoyage manuel.
| ## Personnaliser les ressources \{#customize-assets\} Pour personnaliser les images et vidéos dans votre flow/paywall, implémentez des ressources personnalisées. Les images et vidéos hero ont des identifiants prédéfinis : `hero_image` et `hero_video`. Dans un bundle de ressources personnalisé, vous ciblez ces éléments par leur identifiant et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un identifiant personnalisé](custom-media) dans l'Adapty Dashboard. Par exemple, vous pouvez : - Afficher une image ou vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement de l'image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. :::important Pour utiliser cette fonctionnalité, mettez à jour le SDK React Native Adapty vers la version 3.8.0 ou supérieure. ::: Voici un exemple de la façon dont vous pouvez fournir des ressources personnalisées via un simple dictionnaire : ```javascript const customAssets: Recordoptionnel
défaut : `en`
|L'identifiant de la [localisation du paywall](add-paywall-locale-in-adapty-paywall-builder). Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Cependant, si vous pensez que vos utilisateurs sont confrontés à une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la réinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeoutMs** | défaut : 5 sec |Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut être composée de différentes requêtes en coulisses.
Pour Android : vous pouvez créer un `TimeInterval` avec des fonctions d'extension (comme `5.seconds`, où `.seconds` provient de `import com.adapty.utils.seconds`), ou `TimeInterval.seconds(5)`. Pour ne pas définir de limite, utilisez `TimeInterval.INFINITE`.
| ## Paramètres de réponse \{#response-parameters\} | Paramètre | Description | | :-------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Paywall | Un objet [`AdaptyPaywall`](https://react-native.adapty.io/interfaces/adaptypaywall) contenant une liste d'identifiants de produits, l'identifiant du paywall, la Remote Config, ainsi que plusieurs autres propriétés. | ## Récupérer la configuration de vue d'un paywall conçu avec le Paywall Builder \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Assurez-vous d'activer le bouton **Show on device** dans le Paywall Builder. Si cette option n'est pas activée, la configuration de vue ne sera pas disponible à la récupération. ::: Après avoir récupéré le paywall, vérifiez s'il inclut une `ViewConfiguration`, ce qui indique qu'il a été créé avec le Paywall Builder. Cela vous guidera sur la façon d'afficher le paywall. Si la `ViewConfiguration` est présente, traitez-le comme un paywall Paywall Builder ; sinon, [gérez-le comme un paywall Remote Config](present-remote-config-paywalls-react-native). Dans le SDK React Native, appelez directement la méthode `createPaywallView` sans récupérer manuellement la configuration de la vue au préalable. :::warning Le résultat de la méthode `createPaywallView` ne peut être utilisé qu'une seule fois. Si vous devez l'utiliser à nouveau, appelez à nouveau la méthode `createPaywallView`. L'appeler deux fois sans recréer peut entraîner l'erreur `AdaptyUIError.viewAlreadyPresented`. ::: ```typescript showLineNumbers // for the Adapty SDK < 3.14 – import {createPaywallView} from 'react-native-adapty/dist/ui'; if (paywall.hasViewConfiguration) { try { const view = await createPaywallView(paywall); } catch (error) { // handle the error } } else { //use your custom logic } ``` Paramètres : | Paramètre | Présence | Description | | :------------------- | :------- | :----------------------------------------------------------- | | **paywall** | obligatoire | Un objet `AdaptyPaywall` permettant d'obtenir un contrôleur pour le paywall souhaité. | | **customTags** | optionnel | Définit un dictionnaire de tags personnalisés et leurs valeurs résolues. Les tags personnalisés servent de marqueurs de substitution dans le contenu du paywall, remplacés dynamiquement par des chaînes spécifiques pour personnaliser le contenu du paywall. Consultez la rubrique Custom tags in paywall builder pour plus de détails. | | **prefetchProducts** | optionnel | À activer pour optimiser le moment d'affichage des produits à l'écran. Lorsque la valeur est `true`, AdaptyUI récupère automatiquement les produits nécessaires. Par défaut : `false`. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation dans le Paywall Builder](add-paywall-locale-in-adapty-paywall-builder) et comment utiliser correctement les codes de langue [ici](react-native-localizations-and-locale-codes). ::: Une fois que vous avez la vue, [affichez le paywall](react-native-present-paywalls). ## Récupérer un paywall pour l'audience par défaut afin d'accélérer le chargement \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les paywalls sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'optimiser ce processus. Cependant, si vous avez de nombreuses audiences et paywalls, et que vos utilisateurs disposent d'une connexion internet faible, la récupération d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher du tout. Pour résoudre ce problème, vous pouvez utiliser la méthode `getPaywallForDefaultAudience`, qui récupère le paywall du placement spécifié pour l'audience **All Users**. Cependant, il est essentiel de comprendre que l'approche recommandée est de récupérer le paywall via la méthode `getPaywall`, comme décrit dans la section [Récupérer les informations du paywall](#fetch-paywall-designed-with-paywall-builder) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `getPaywall` La méthode `getPaywallForDefaultAudience` présente quelques inconvénients importants : - **Problèmes potentiels de compatibilité descendante** : si vous devez afficher des paywalls différents selon les versions de l'application (actuelle et futures), vous risquez de rencontrer des difficultés. Il vous faudra soit concevoir des paywalls compatibles avec la version actuelle (legacy), soit accepter que les utilisateurs de cette version puissent avoir des problèmes d'affichage. - **Perte de ciblage** : tous les utilisateurs verront le même paywall conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment par pays, attribution marketing ou attributs personnalisés). Si vous êtes prêt à accepter ces inconvénients pour bénéficier d'une récupération plus rapide des paywalls, utilisez la méthode `getPaywallForDefaultAudience` comme suit. Sinon, restez sur `getPaywall` décrit [ci-dessus](#fetch-paywall-designed-with-paywall-builder). ::: ```typescript showLineNumbers try { const id = 'YOUR_PLACEMENT_ID'; const locale = 'en'; const paywall = await adapty.getPaywallForDefaultAudience(id, locale); // the requested paywall } catch (error) { // handle the error } ``` :::note La méthode `getPaywallForDefaultAudience` est disponible à partir de la version 2.11.2 du SDK React Native. ::: | Paramètre | Présence | Description | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | requis | L'identifiant du [Placement](placements). C'est la valeur que vous avez spécifiée lors de la création d'un placement dans votre Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de locale](react-native-localizations-and-locale-codes) pour plus d'informations sur les codes de locale et notre recommandation d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne verront pas forcément les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter des requêtes réseau.
Notez que le cache est conservé après un redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
| ## Personnaliser les ressources \{#customize-assets\} Pour personnaliser les images et vidéos de votre paywall, implémentez des ressources personnalisées. Les images et vidéos hero ont des ID prédéfinis : `hero_image` et `hero_video`. Dans un bundle de ressources personnalisées, vous ciblez ces éléments par leur ID et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un ID personnalisé](custom-media) dans le tableau de bord Adapty. Par exemple, vous pouvez : - Afficher une image ou vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. :::important Pour utiliser cette fonctionnalité, mettez à jour le SDK React Native d'Adapty vers la version 3.8.0 ou supérieure. ::: Voici un exemple illustrant comment fournir des ressources personnalisées via un simple dictionnaire : ```javascript const customAssets: Record
## Le nombre de vues du paywall est trop élevé \{#the-paywall-view-number-is-too-big\}
**Problème** : Le compteur de vues du paywall affiche le double du nombre attendu.
**Cause** : Vous appelez peut-être `logShowFlow` (SDK React Native v4+) / `logShowPaywall` dans votre code, ce qui duplique le compteur de vues si vous utilisez le Paywall Builder ou le Flow Builder. Pour les flows et paywalls créés avec ces outils, les analytics sont suivies automatiquement, vous n'avez donc pas besoin d'utiliser cette méthode.
**Solution** : Vérifiez que vous n'appelez pas `logShowFlow` (SDK React Native v4+) / `logShowPaywall` dans votre code si vous utilisez le Paywall Builder ou le Flow Builder.
## Autres problèmes \{#other-issues\}
**Problème** : Vous rencontrez d'autres problèmes liés au Paywall Builder qui ne sont pas couverts ci-dessus.
**Solution** : Migrez le SDK vers la dernière version à l'aide des [guides de migration](react-native-sdk-migration-guides) si nécessaire. De nombreux problèmes sont résolus dans les versions plus récentes du SDK.
---
# File: react-native-implement-paywalls-manually
---
---
title: "Implémenter les paywalls manuellement dans le SDK React Native"
description: "Apprenez à implémenter les paywalls manuellement dans votre application React Native avec le SDK Adapty."
---
## Accepter les achats \{#accept-purchases\}
Si vous travaillez avec des paywalls que vous avez implémentés vous-même, vous pouvez déléguer la gestion des achats à Adapty en utilisant la méthode `makePurchase`. Ainsi, nous gérerons tous les scénarios utilisateur, et vous n'aurez qu'à traiter les résultats des achats.
:::important
`makePurchase` fonctionne avec les produits créés dans Adapty Dashboard. Assurez-vous de configurer les produits et les moyens de les récupérer dans le tableau de bord en suivant le [guide de démarrage rapide](quickstart).
:::
Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs risquent de ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé qu'en cas de réinstallation ou de nettoyage manuel.
Le SDK Adapty stocke les flows et les paywalls sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](react-native-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les flows et les paywalls plus rapidement, ainsi qu'un serveur de secours autonome en cas d'indisponibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos flows tout en assurant la fiabilité, même lorsque la connexion internet est limitée.
| | **loadTimeoutMs** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai indiqué dans `loadTimeout`, car l'opération peut être composée de différentes requêtes en coulisses.
| :::note Dans la v4, `getFlow` ne prend plus de paramètre `locale`. Pour les paywalls personnalisés, toutes les locales disponibles sont retournées dans le Remote Config du flow (`flow.remoteConfigs`) — choisissez celle qui correspond à la langue de l'appareil ou au paramètre de l'application. ::: Ne codez pas les identifiants de produit en dur ! Les flows étant configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent évoluer dans le temps. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit les afficher. Mais si vous en récupérez 3 plus tard, votre application doit tous les afficher sans aucune modification du code. La seule chose à coder en dur est l'identifiant du placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Un objet `AdaptyFlow` contenant le placement, les identifiants (`id`, `variationId`), le nom, ses variations de paywall (`paywalls`), et un tableau `remoteConfigs` (une entrée par locale configurée). Pour récupérer les produits du flow, appelez `getPaywallProducts(flow)`. | ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le flow, vous pouvez récupérer le tableau de produits qui lui correspond : ```typescript showLineNumbers try { // ...flow const products = await adapty.getPaywallProducts(flow); // the requested products list } catch (error) { // handle the error } ``` Paramètres de la réponse : | Paramètre | Description | | :-------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Liste d'objets [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) avec : identifiant du produit, nom du produit, prix, devise, durée de l'abonnement et plusieurs autres propriétés. | Lors de la mise en œuvre de votre propre design de paywall, vous aurez probablement besoin d'accéder aux propriétés de l'objet [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct). Les propriétés les plus couramment utilisées sont illustrées ci-dessous, mais consultez le document lié pour obtenir des détails complets sur toutes les propriétés disponibles. | Propriété | Description | |-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Pour afficher le titre du produit, utilisez `product.localizedTitle`. La localisation est basée sur le pays du store sélectionné par l'utilisateur, et non sur la langue de l'appareil. | | **Price** | Pour afficher le prix dans une version localisée, utilisez `product.price?.localizedString`. Cette localisation est basée sur les informations de langue de l'appareil. Vous pouvez également accéder au prix sous forme de nombre via `product.price?.amount`. La valeur sera fournie dans la devise locale. Pour obtenir le symbole de devise associé, utilisez `product.price?.currencySymbol`. | | **Subscription Period** | Pour afficher la période (par ex. semaine, mois, année, etc.), utilisez `product.subscription?.localizedSubscriptionPeriod`. Cette localisation est basée sur la langue de l'appareil. Pour récupérer la période d'abonnement par programmation, utilisez `product.subscription?.subscriptionPeriod`. Vous pouvez ensuite accéder à la propriété `unit` pour obtenir la durée (c'est-à-dire `'day'`, `'week'`, `'month'`, `'year'` ou `'unknown'`). La valeur `numberOfUnits` vous donne le nombre d'unités de période. Par exemple, pour un abonnement trimestriel, vous verrez `'month'` dans la propriété unit et `3` dans la propriété numberOfUnits. | | **Introductory Offer** | Pour afficher un badge ou tout autre indicateur signalant qu'un abonnement contient une offre de lancement, consultez la propriété `product.subscription?.offer?.phases`. Il s'agit d'une liste pouvant contenir jusqu'à deux phases de remise : la phase d'essai gratuit et la phase de prix d'introduction. Chaque objet de phase contient les propriétés utiles suivantes :Par défaut, le SDK tentera de charger les données depuis le serveur et retournera les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais le chargement sera plus rapide, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
|optionnel
défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](react-native-localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si votre application est utilisée dans des conditions de connectivité instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache lorsqu'elles existent. Dans ce cas, les utilisateurs n'auront pas forcément les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc fiable de l'utiliser en cours de session pour éviter les requêtes réseau.
Notez que le cache reste intact après un redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](react-native-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour vous garantir la dernière version de vos paywalls tout en assurant une fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeoutMs** | défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut reposer sur plusieurs requêtes en arrière-plan.
| N'intégrez pas les identifiants de produit en dur dans votre code ! Comme les paywalls sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent changer au fil du temps. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez 3 par la suite, votre application doit tous les afficher sans nécessiter de modification du code. La seule chose à intégrer en dur est l'identifiant du placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Un objet [`AdaptyPaywall`](https://react-native.adapty.io/interfaces/adaptypaywall) contenant : une liste d'identifiants de produits, l'identifiant du paywall, la Remote Config, et plusieurs autres propriétés. | ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le paywall, vous pouvez interroger le tableau de produits qui lui correspond : ```typescript showLineNumbers try { // ...paywall const products = await adapty.getPaywallProducts(paywall); // the requested products list } catch (error) { // handle the error } ``` Paramètres de réponse : | Paramètre | Description | | :-------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Products | Liste d'objets [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct) avec : identifiant du produit, nom du produit, prix, devise, durée d'abonnement et plusieurs autres propriétés. | Lors de la mise en œuvre de votre propre design de paywall, vous aurez probablement besoin d'accéder à ces propriétés depuis l'objet [`AdaptyPaywallProduct`](https://react-native.adapty.io/interfaces/adaptypaywallproduct). Les propriétés les plus couramment utilisées sont illustrées ci-dessous, mais consultez le document lié pour obtenir tous les détails sur l'ensemble des propriétés disponibles. | Propriété | Description | |--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Pour afficher le titre du produit, utilisez `product.localizedTitle`. La localisation est basée sur le pays du store sélectionné par l'utilisateur, et non sur la langue du terminal. | | **Price** | Pour afficher le prix localisé, utilisez `product.price?.localizedString`. Cette localisation est basée sur les paramètres régionaux du terminal. Vous pouvez également accéder au prix sous forme numérique via `product.price?.amount`. La valeur sera fournie dans la devise locale. Pour obtenir le symbole de devise associé, utilisez `product.price?.currencySymbol`. | | **Subscription Period** | Pour afficher la période (ex. semaine, mois, année, etc.), utilisez `product.subscription?.localizedSubscriptionPeriod`. Cette localisation est basée sur les paramètres régionaux du terminal. Pour récupérer la période d'abonnement de façon programmatique, utilisez `product.subscription?.subscriptionPeriod`. Vous pouvez accéder à la propriété `unit` pour obtenir la durée (c'est-à-dire `'day'`, `'week'`, `'month'`, `'year'` ou `'unknown'`). La valeur `numberOfUnits` vous donnera le nombre d'unités de période. Par exemple, pour un abonnement trimestriel, vous verrez `'month'` dans la propriété unit et `3` dans la propriété numberOfUnits. | | **Introductory Offer** | Pour afficher un badge ou un indicateur signalant qu'un abonnement inclut une offre de lancement, consultez la propriété `product.subscription?.offer?.phases`. Il s'agit d'une liste pouvant contenir jusqu'à deux phases de remise : la phase d'essai gratuit et la phase de prix d'introduction. Chaque objet de phase contient les propriétés suivantes :optionnel
défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag indique la langue, le second la région.
Exemple : `en` désigne l'anglais, `pt-br` le portugais brésilien.
Consultez [Localisations et codes de langue](react-native-localizations-and-locale-codes) pour plus d'informations sur les codes de langue et notre façon de les utiliser.
| | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache lorsqu'elles existent. Dans ce cas, les utilisateurs n'auront pas forcément les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé après le redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
|Si la requête a réussi, la réponse contient cet objet. Un objet [AdaptyProfile](https://react-native.adapty.io/interfaces/adaptyprofile) fournit des informations complètes sur les niveaux d'accès, les abonnements et les achats uniques d'un utilisateur dans l'application.
Vérifiez le statut du niveau d'accès pour déterminer si l'utilisateur dispose de l'accès requis à l'application.
| :::warning **Remarque :** si vous utilisez encore la version StoreKit d'Apple inférieure à v2.0 et une version du SDK Adapty inférieure à v2.9.0, vous devez fournir le [secret partagé de l'App Store Apple](app-store-connection-configuration#step-5-enter-app-store-shared-secret) à la place. Cette méthode est actuellement dépréciée par Apple. ::: ## Changer d'abonnement lors d'un achat \{#change-subscription-when-making-a-purchase\} Lorsqu'un utilisateur choisit un nouvel abonnement plutôt que de renouveler l'abonnement actuel, le comportement dépend du store : - Pour l'App Store, l'abonnement est automatiquement mis à jour au sein du groupe d'abonnements. Si un utilisateur achète un abonnement d'un groupe alors qu'il a déjà un abonnement d'un autre groupe, les deux abonnements seront actifs simultanément. - Pour Google Play, l'abonnement n'est pas automatiquement mis à jour. Vous devrez gérer le changement dans le code de votre application mobile comme décrit ci-dessous. Pour remplacer l'abonnement par un autre sur Android, appelez la méthode `.makePurchase()` avec le paramètre supplémentaire : ```typescript showLineNumbers try { const purchaseResult = await adapty.makePurchase(product, params); switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; } } catch (error) { // Handle the error } ``` Paramètre de requête supplémentaire : | Paramètre | Présence | Description | | :--------- | :------- | :----------------------------------------------------------- | | **params** | requis | un objet de type [`MakePurchaseParamsInput`](https://react-native.adapty.io/types/makepurchaseparamsinput). | :::info **Version 3.8.2+** : La structure `MakePurchaseParamsInput` a été mise à jour. `oldSubVendorProductId` et `prorationMode` sont désormais imbriqués sous `subscriptionUpdateParams`, et `isOfferPersonalized` est déplacé au niveau supérieur. Exemple : ```javascript makePurchase(product, { android: { subscriptionUpdateParams: { oldSubVendorProductId: 'old_product_id', prorationMode: 'charge_prorated_price' }, isOfferPersonalized: true } }); ``` ::: Vous pouvez en savoir plus sur les abonnements et les modes de remplacement dans la documentation Google Developer : - [À propos des modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Recommandations de Google pour les modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - Mode de remplacement [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Remarque : cette méthode est disponible uniquement pour les mises à niveau d'abonnement. Les rétrogradations ne sont pas prises en charge. - Mode de remplacement [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Remarque : le changement d'abonnement réel n'aura lieu qu'à la fin de la période de facturation de l'abonnement actuel. ## Utiliser des codes promotionnels sur iOS \{#redeem-offer-codes-in-ios\}Un objet [`AdaptyProfile`](https://react-native.adapty.io/interfaces/adaptyprofile). Ce modèle contient des informations sur les niveaux d'accès, les abonnements et les achats uniques.
Vérifiez le **statut du niveau d'accès** pour déterminer si l'utilisateur a accès à l'application.
| :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: --- # File: implement-observer-mode-react-native --- --- title: "Implémenter le mode Observateur dans le SDK React Native" description: "Implémentez le mode Observateur dans Adapty pour suivre les événements d'abonnement des utilisateurs dans le SDK React Native." --- Si vous disposez déjà de votre propre infrastructure d'achat et que vous n'êtes pas prêt à basculer entièrement vers Adapty, vous pouvez explorer le [mode Observateur](observer-vs-full-mode). Dans sa forme de base, le mode Observateur offre des analyses avancées et une intégration transparente avec les systèmes d'attribution et d'analytique. Si cela correspond à vos besoins, il vous suffit de : 1. L'activer lors de la configuration du SDK Adapty en définissant le paramètre `observerMode` sur `true`. Suivez les instructions de configuration pour [React Native](sdk-installation-reactnative). 2. [Signaler les transactions](report-transactions-observer-mode-react-native) depuis votre infrastructure d'achat existante vers Adapty. ### Configuration du mode Observateur \{#observer-mode-setup\} Activez le mode Observateur si vous gérez les achats et le statut des abonnements vous-même et que vous utilisez Adapty uniquement pour envoyer des événements d'abonnement et des données analytiques. :::important En mode Observateur, le SDK Adapty ne clôturera aucune transaction ; assurez-vous donc de les gérer vous-même. ::: ```typescript showLineNumbers title="App.tsx" adapty.activate('YOUR_PUBLIC_SDK_KEY', { observerMode: true, // Enable observer mode }); ``` Paramètres : | Paramètre | Description | | --------------------------- | ------------------------------------------------------------ | | observerMode | Une valeur booléenne qui contrôle le [mode Observateur](observer-vs-full-mode). La valeur par défaut est `false`. | ## Utiliser les paywalls Adapty en mode Observateur \{#using-adapty-paywalls-in-observer-mode\} Si vous souhaitez également utiliser les paywalls et les fonctionnalités de test A/B d'Adapty, c'est possible — mais cela nécessite une configuration supplémentaire en mode Observateur. Voici ce que vous devrez faire en plus des étapes ci-dessus : 1. Affichez les paywalls normalement pour les [paywalls Remote Config](present-remote-config-paywalls-react-native). 3. [Associez les paywalls](report-transactions-observer-mode-react-native) aux transactions d'achat. --- # File: report-transactions-observer-mode-react-native --- --- title: "Signaler des transactions en mode Observer dans le SDK React Native" description: "Signalez les transactions d'achat en mode Observer Adapty pour les informations utilisateur et le suivi des revenus dans le SDK React Native." ---Pour iOS, StoreKit 1 : un objet [SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction).
Pour iOS, StoreKit 2 : un objet [Transaction](https://developer.apple.com/documentation/storekit/transaction).
Pour Android : identifiant de type chaîne (purchase.getOrderId de l'achat, où l'achat est une instance de la classe [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) de la bibliothèque de facturation.
| | variationId | requis | L'identifiant de type chaîne de la variante. Vous pouvez l'obtenir via la propriété `variationId` de l'objet [AdaptyPaywall](https://react-native.adapty.io/interfaces/adaptypaywall). |phoneNumber
firstName
lastName
| String | | gender | Enum, valeurs autorisées : `female`, `male`, `other` | | birthday | Date | ### Attributs utilisateur personnalisés \{#custom-user-attributes\} Vous pouvez définir vos propres attributs personnalisés, généralement liés à l'utilisation de votre app. Par exemple, pour une application de fitness, il peut s'agir du nombre d'exercices par semaine ; pour une application d'apprentissage des langues, du niveau de connaissance de l'utilisateur, etc. Vous pouvez les utiliser dans des segments pour créer des paywalls et des offres ciblées, ainsi que dans les analyses pour déterminer quelles métriques produit influencent le plus les revenus. ```typescript showLineNumbers try { await adapty.updateProfile({ codableCustomAttributes: { key_1: 'value_1', key_2: 2, }, }); } catch (error) { // handle `AdaptyError` } ``` Pour supprimer une clé existante, utilisez la méthode `.withRemoved(customAttributeForKey:)` : ```typescript showLineNumbers try { // to remove a key, pass null as its value await adapty.updateProfile({ codableCustomAttributes: { key_1: null, key_2: null, }, }); } catch (error) { // handle `AdaptyError` } ``` Il peut parfois être utile de connaître les attributs personnalisés déjà définis. Pour cela, utilisez le champ `customAttributes` de l'objet `AdaptyProfile`. :::warning Gardez à l'esprit que la valeur de `customAttributes` peut être obsolète, car les attributs utilisateur peuvent être envoyés depuis différents appareils à tout moment — les attributs sur le serveur ont donc pu être modifiés depuis la dernière synchronisation. ::: ### Limites \{#limits\} - Jusqu'à 30 attributs personnalisés par utilisateur - Les noms de clés peuvent contenir jusqu'à 30 caractères. Ils peuvent inclure des caractères alphanumériques et l'un des symboles suivants : `_` `-` `.` - La valeur peut être une chaîne de caractères ou un nombre flottant, avec 50 caractères maximum. --- # File: react-native-listen-subscription-changes --- --- title: "Vérifier le statut d'abonnement dans le SDK React Native" description: "Suivez et gérez le statut d'abonnement des utilisateurs dans Adapty pour améliorer la rétention client dans votre application React Native." --- Avec Adapty, le suivi du statut d'abonnement est simplifié. Inutile d'insérer manuellement des identifiants de produits dans votre code. Il vous suffit de vérifier la présence d'un [niveau d'accès](access-level) actif pour confirmer l'état d'abonnement d'un utilisateur.Un objet [AdaptyProfile](https://react-native.adapty.io/interfaces/adaptyprofile). En général, il suffit de vérifier le statut du niveau d'accès du profil pour déterminer si l'utilisateur bénéficie d'un accès premium à l'application.
La méthode `.getProfile` fournit le résultat le plus récent, car elle interroge toujours l'API. Si, pour une raison quelconque (par exemple, absence de connexion internet), le SDK Adapty ne parvient pas à récupérer les informations depuis le serveur, les données du cache sont retournées. Il est également important de noter que le SDK Adapty met à jour le cache `AdaptyProfile` régulièrement afin de maintenir ces informations aussi à jour que possible.
| La méthode `.getProfile()` vous fournit le profil utilisateur à partir duquel vous pouvez obtenir le statut du niveau d'accès. Vous pouvez avoir plusieurs niveaux d'accès par application. Par exemple, si vous avez une application de presse et vendez des abonnements à différentes thématiques indépendamment, vous pouvez créer des niveaux d'accès « sports » et « science ». Mais la plupart du temps, vous n'aurez besoin que d'un seul niveau d'accès ; dans ce cas, vous pouvez simplement utiliser le niveau d'accès par défaut « premium ». Voici un exemple de vérification du niveau d'accès « premium » par défaut : ```typescript showLineNumbers try { const profile = await adapty.getProfile(); const isActive = profile.accessLevels?.["premium"]?.isActive; if (isActive) { // grant access to premium features } } catch (error) { // handle the error } ``` ### Écouter les mises à jour du statut d'abonnement \{#listening-for-subscription-status-updates\} Chaque fois que l'abonnement d'un utilisateur change, Adapty déclenche un événement. Pour recevoir les messages d'Adapty, vous devez effectuer quelques configurations supplémentaires : ```typescript showLineNumbers // Create an "onLatestProfileLoad" event listener adapty.addEventListener('onLatestProfileLoad', profile => { // handle any changes to subscription state }); ``` Adapty déclenche également un événement au démarrage de l'application. Dans ce cas, le statut d'abonnement mis en cache est transmis. ### Cache du statut d'abonnement \{#subscription-status-cache\} Le cache intégré au SDK Adapty stocke le statut d'abonnement du profil. Cela signifie que même si le serveur est indisponible, les données mises en cache restent accessibles pour fournir des informations sur le statut d'abonnement du profil. Il est toutefois important de noter qu'il n'est pas possible d'interroger directement le cache. Le SDK interroge périodiquement le serveur toutes les minutes pour vérifier s'il y a des mises à jour ou des changements liés au profil. S'il y a des modifications, comme de nouvelles transactions ou d'autres mises à jour, elles sont envoyées dans les données mises en cache afin de les maintenir synchronisées avec le serveur. --- # File: react-native-deal-with-att --- --- title: "Gérer l'ATT dans le SDK React Native" description: "Démarrez avec Adapty sur React Native pour simplifier la configuration et la gestion des abonnements." --- Si votre application utilise le framework AppTrackingTransparency et présente une demande d'autorisation de suivi à l'utilisateur, vous devez envoyer le [statut d'autorisation](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) à Adapty. ```typescript showLineNumbers try { await adapty.updateProfile({ // you can also pass a string value (validated via tsc) if you prefer appTrackingTransparencyStatus: AppTrackingTransparencyStatus.Authorized, }); } catch (error) { // handle `AdaptyError` } ``` :::warning Nous vous recommandons vivement d'envoyer cette valeur le plus tôt possible dès qu'elle change — c'est la seule façon de transmettre les données en temps voulu aux intégrations que vous avez configurées. ::: --- # File: kids-mode-react-native --- --- title: "Mode Enfants dans le SDK React Native" description: "Activez facilement le Mode Enfants pour respecter les politiques d'Apple et Google. Aucune collecte d'IDFA, GAID ou données publicitaires dans le SDK React Native." --- Si votre application React Native est destinée aux enfants, vous devez respecter les politiques d'[Apple](https://developer.apple.com/kids/) et de [Google](https://support.google.com/googleplay/android-developer/answer/9893335). Si vous utilisez le SDK Adapty, quelques étapes simples vous permettront de le configurer pour répondre à ces politiques et passer les revues des stores. :::important Sur iOS, le Mode Enfants est activé via le trait du package Swift `KidsMode`, qui exclut à la compilation tout le code lié à l'IDFA, AdSupport et AppTrackingTransparency. Il nécessite le SDK v4 (qui installe le SDK iOS natif via Swift Package Manager) et **Xcode 26** ou une version ultérieure. Voir [Modifications dans votre Podfile iOS](#updates-in-your-ios-podfile) ci-dessous. ::: ## Ce qui est requis \{#whats-required\} Vous devez configurer le SDK Adapty pour désactiver la collecte de : - [IDFA (Identifier for Advertisers)](https://en.wikipedia.org/wiki/Identifier_for_Advertisers) (iOS) - [Android Advertising ID (AAID/GAID)](https://support.google.com/googleplay/android-developer/answer/6048248) (Android) - [Adresse IP](https://www.ftc.gov/system/files/ftc_gov/pdf/p235402_coppa_application.pdf) De plus, nous recommandons d'utiliser l'identifiant utilisateur avec précaution. Un identifiant au format `optionnel
par défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos onboardings tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeoutMs** | par défaut : 5 sec |Cette valeur limite le délai d'attente pour cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut comprendre plusieurs requêtes en arrière-plan.
| Paramètres de réponse : | Paramètre | Description | |:----------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Un objet [`AdaptyOnboarding`](https://react-native.adapty.io/interfaces/adaptyonboarding) contenant : l'identifiant et la configuration de l'onboarding, le Remote Config, et plusieurs autres propriétés. | ## Accélérer la récupération de l'onboarding avec l'onboarding de l'audience par défaut \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} En général, les onboardings sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, lorsque vous avez de nombreuses audiences et onboardings et que vos utilisateurs ont une connexion internet faible, la récupération d'un onboarding peut prendre plus de temps que souhaité. Dans ce cas, vous pourriez vouloir afficher un onboarding par défaut pour garantir une expérience utilisateur fluide plutôt que de n'afficher aucun onboarding. Pour répondre à ce besoin, vous pouvez utiliser la méthode `getOnboardingForDefaultAudience`, qui récupère l'onboarding du placement spécifié pour l'audience **All Users**. Cependant, il est essentiel de comprendre que l'approche recommandée est de récupérer l'onboarding via la méthode `getOnboarding`, comme détaillé dans la section [Récupérer un onboarding](#fetch-onboarding) ci-dessus. :::warning Préférez `getOnboarding` à `getOnboardingForDefaultAudience`, car cette dernière présente des limitations importantes : - **Problèmes de compatibilité** : peut créer des difficultés lors de la prise en charge de plusieurs versions de l'application, nécessitant soit des designs rétrocompatibles, soit d'accepter que les versions plus anciennes puissent s'afficher incorrectement. - **Aucune personnalisation** : affiche uniquement le contenu pour l'audience "All Users", sans ciblage basé sur le pays, l'attribution ou les attributs personnalisés. Si une récupération plus rapide l'emporte sur ces inconvénients pour votre cas d'usage, utilisez `getOnboardingForDefaultAudience` comme indiqué ci-dessous. Sinon, utilisez `getOnboarding` comme décrit [ci-dessus](#fetch-onboarding). ::: ```typescript showLineNumbers try { const placementId = 'YOUR_PLACEMENT_ID'; const locale = 'en'; const onboarding = await adapty.getOnboardingForDefaultAudience(placementId, locale); // the requested onboarding } catch (error) { // handle the error } ``` Paramètres : | Paramètre | Présence | Description | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | requis | L'identifiant du [Placement](placements) souhaité. Il s'agit de la valeur que vous avez spécifiée lors de la création d'un placement dans l'Adapty Dashboard. | | **locale** |optionnel
par défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la désinstallation de l'application ou via un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement et un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos onboardings tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| --- # File: react-native-present-onboardings --- --- title: "Présenter les onboardings dans React Native SDK" description: "Découvrez comment présenter des onboardings dans React Native pour booster les conversions et les revenus." --- :::warning **Les onboardings sont dépréciés dans le SDK v4 et seront supprimés dans une prochaine version.** Ils ne reçoivent plus de correctifs ni d'améliorations. Utilisez plutôt les [flows](react-native-get-pb-paywalls) : contrairement aux onboardings qui s'exécutent dans une WebView, les flows s'affichent nativement sur l'appareil — offrant des animations plus fluides, un rendu natif cohérent, des temps de chargement plus rapides et aucune dépendance au runtime WebView. Consultez [Récupérer les flows & paywalls](react-native-get-pb-paywalls) et [Afficher les flows & paywalls](react-native-present-paywalls) pour démarrer. ::: Si vous avez personnalisé un onboarding via le builder, vous n'avez pas à vous soucier de son rendu dans le code de votre application mobile pour l'afficher à l'utilisateur. Un tel onboarding contient à la fois ce qui doit être affiché et la façon dont cela doit l'être. Avant de commencer, assurez-vous que : 1. Vous avez installé [Adapty React Native SDK](sdk-installation-reactnative) 3.8.0 ou ultérieur. 2. Vous avez [créé un onboarding](create-onboarding). 3. Vous avez ajouté l'onboarding à un [placement](placements). Adapty React Native SDK propose deux façons de présenter les onboardings : - **Composant React** : un composant embarqué qui vous permet de l'intégrer à l'architecture et au système de navigation de votre application. - **Présentation modale** ## Composant React \{#react-component\} Pour intégrer un onboarding dans votre arbre de composants existant, utilisez le composant `AdaptyOnboardingView` directement dans la hiérarchie de vos composants React Native. Ce composant embarqué vous permet de l'intégrer à l'architecture et au système de navigation de votre application. :::note Sur Android, nous recommandons une configuration supplémentaire pour `AdaptyOnboardingView` afin d'éviter un artefact de rendu visuel. Consultez [L'interface système chevauche le contenu de l'onboarding sur Android](#system-ui-overlaps-onboarding-content-on-android). :::
Vous pouvez ensuite utiliser cet ID dans votre code et le gérer comme une action personnalisée. Par exemple, si un utilisateur appuie sur un bouton personnalisé, comme **Login** ou **Allow notifications**, le gestionnaire d'événements sera déclenché avec le paramètre `actionId` correspondant à l'**Action ID** défini dans le builder. Vous pouvez créer vos propres IDs, comme "allowNotifications".
:::important
Notez que vous devez gérer ce qui se passe lorsqu'un utilisateur ferme l'onboarding. Par exemple, vous devez arrêter d'afficher l'onboarding lui-même.
:::
Ce code d'erreur indique que l'utilisateur a annulé une demande de paiement.
Aucune action n'est requise, mais en termes de logique métier, vous pouvez proposer une réduction à votre utilisateur ou lui rappeler plus tard.
| | [paymentInvalid](https://developer.apple.com/documentation/storekit/skerror/code/paymentinvalid) | 3 | Cette erreur indique que l'un des paramètres de paiement n'a pas été reconnu par l'App Store. | | [paymentNotAllowed](https://developer.apple.com/documentation/storekit/skerror/code/paymentnotallowed) | 4 | Ce code d'erreur indique que l'utilisateur n'est pas autorisé à valider des paiements. | | [storeProductNotAvailable](https://developer.apple.com/documentation/storekit/skerror/code/storeproductnotavailable) | 5 | Ce code d'erreur indique que le produit demandé n'est pas disponible dans le store.L'[`identifiant`](https://developer.apple.com/documentation/storekit/skpaymentdiscount/identifier) de l'offre n'est pas valide. Par exemple, vous n'avez pas configuré d'offre avec cet identifiant dans l'App Store, ou vous avez révoqué l'offre.
Assurez-vous de configurer les offres souhaitées dans AppStore Connect et de transmettre un identifiant d'offre valide.
| | [invalidSignature](https://developer.apple.com/documentation/storekit/skerror/code/invalidsignature) | 12 | Ce code d'erreur indique que la signature dans une réduction de paiement n'est pas valide. | | [missingOfferParams](https://developer.apple.com/documentation/storekit/skerror/code/missingofferparams) | 13 | Ce code d'erreur indique que des paramètres sont manquants dans une réduction de paiement. | | [invalidOfferPrice](https://developer.apple.com/documentation/storekit/skerror/code/invalidofferprice/) | 14 | Ce code d'erreur indique que le prix que vous avez spécifié dans App Store Connect n'est plus valide. Les offres doivent toujours représenter un prix réduit. | ## Codes Android personnalisés \{#custom-android-codes\} | Erreur | Code | Solution | |-----|----|-----------| | adaptyNotInitialized | 20 | Vous devez configurer correctement le SDK Adapty via la méthode `Adapty.activate`. Découvrez comment procéder [pour React Native](sdk-installation-reactnative). | | productNotFound | 22 | Cette erreur indique que le produit demandé pour l'achat n'est pas disponible dans le store. | | invalidJson | 23 | Le JSON du paywall n'est pas valide. Corrigez-le dans l'Adapty Dashboard. Consultez la rubrique [Personnaliser le paywall avec Remote Config](customize-paywall-with-remote-config) pour plus de détails. | | currentSubscriptionToUpdateNotFoundInHistory | 24 | L'abonnement d'origine à renouveler est introuvable. | | pendingPurchase | 25 | Cette erreur indique que l'état de l'achat est en attente plutôt qu'acheté. Consultez la page [Gestion des transactions en attente](https://developer.android.com/google/play/billing/integrate#pending) dans la documentation Android Developer pour plus de détails. | | billingServiceTimeout | 97 | Cette erreur indique que la requête a atteint le délai d'attente maximal avant que Google Play puisse répondre. Cela peut être causé, par exemple, par un retard dans l'exécution de l'action demandée par l'appel à la bibliothèque Play Billing. | | featureNotSupported | 98 | La fonctionnalité demandée n'est pas prise en charge par le Play Store sur l'appareil actuel. | | billingServiceDisconnected | 99 | Cette erreur fatale indique que la connexion de l'application cliente au service Google Play Store via le `BillingClient` a été interrompue. | | billingServiceUnavailable | 102 | Cette erreur transitoire indique que le service Google Play Billing est actuellement indisponible. Dans la plupart des cas, cela signifie qu'il y a un problème de connexion réseau entre l'appareil client et les services Google Play Billing. | | billingUnavailable | 103 |Cette erreur indique qu'une erreur de facturation utilisateur s'est produite pendant le processus d'achat. Voici des exemples de situations pouvant provoquer cette erreur :
1\. L'application Play Store sur l'appareil de l'utilisateur est obsolète.
2. L'utilisateur se trouve dans un pays non pris en charge.
3. L'utilisateur est un utilisateur d'entreprise, et son administrateur a désactivé les achats pour les utilisateurs.
4. Google Play n'est pas en mesure de débiter le moyen de paiement de l'utilisateur. Par exemple, la carte de crédit de l'utilisateur a peut-être expiré.
5. L'utilisateur n'est pas connecté à l'application Play Store.
| | developerError | 105 | Il s'agit d'une erreur fatale indiquant que vous utilisez incorrectement une API. | | billingError | 106 | Il s'agit d'une erreur fatale indiquant un problème interne avec Google Play lui-même. | | itemAlreadyOwned | 107 | Le produit consommable a déjà été acheté. | | itemNotOwned | 108 | Cette erreur indique que l'action demandée sur l'article a échoué sin | ## Codes StoreKit personnalisés \{#custom-storekit-codes\} | Erreur | Code | Solution | |-----|----|-----------| | noProductIDsFound | 1000 |Cette erreur indique qu'aucun des produits que vous avez demandés sur le paywall n'est disponible à l'achat dans l'App Store, même s'ils y sont répertoriés. Cette erreur peut parfois s'accompagner d'un avertissement `InvalidProductIdentifiers`. Si l'avertissement apparaît sans erreur, ignorez-le.
Si vous rencontrez cette erreur, suivez les étapes de la section [Correction de l'erreur Code-1000 `noProductIDsFound`](InvalidProductIdentifiers-react-native).
| | productRequestFailed | 1002 |Impossible de récupérer les produits disponibles pour le moment. Cause possible :
- Aucun cache n'a encore été créé et il n'y a pas de connexion Internet en même temps.
| | cantMakePayments | 1003 | Les achats intégrés ne sont pas autorisés sur cet appareil. Consultez le [guide](cantMakePayments-react-native) de dépannage. | | noPurchasesToRestore | 1004 | Cette erreur indique que Google Play n'a pas trouvé l'achat à restaurer. | | cantReadReceipt | 1005 |Aucun reçu valide n'est disponible sur l'appareil. Cela peut poser problème lors des tests en sandbox.
Aucune action n'est requise, mais en termes de logique métier, vous pouvez proposer une réduction à votre utilisateur ou lui rappeler plus tard.
| | productPurchaseFailed | 1006 | L'achat du produit a échoué. Cela encapsule une erreur StoreKit sous-jacente — lisez l'erreur encapsulée (ou activez les logs verbeux pour la voir dans la console) pour connaître la raison réelle. L'erreur encapsulée est généralement l'un des codes StoreKit 0 à 14 du tableau ci-dessus — le plus souvent `paymentCancelled`, `paymentInvalid`, `paymentNotAllowed` ou `invalidOfferPrice`. Si vous ne pouvez pas identifier une raison précise, essayez un nouveau [profil sandbox](test-purchases-in-sandbox) ; si le problème persiste, contactez le support Apple. | | refreshReceiptFailed | 1010 | Cette erreur indique que le reçu n'a pas été reçu. Applicable uniquement à StoreKit 1. | | receiveRestoredTransactionsFailed | 1011 | La restauration des achats a échoué. | ## Codes réseau personnalisés \{#custom-network-codes\} | Erreur | Code | Solution | | :------------------- | :--- |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | notActivated | 2002 | Le SDK Adapty n'est pas activé.
2. Cliquez sur le nom du groupe d'abonnements. Vos produits apparaissent dans la section **Subscriptions**.
3. Assurez-vous que le produit que vous testez est marqué **Ready to Submit**.
4. Comparez l'identifiant du produit dans le tableau avec celui de l'onglet [**Products**](https://app.adapty.io/products) dans l'Adapty Dashboard. Si les identifiants ne correspondent pas, copiez l'identifiant du produit depuis le tableau et [créez un produit](create-product) avec cet identifiant dans l'Adapty Dashboard.
## Étape 3. Vérifier la disponibilité du produit \{#step-4-check-product-availability\}
1. Retournez dans **App Store Connect** et ouvrez la même section **Subscriptions**.
2. Cliquez sur le nom du groupe d'abonnements pour afficher vos produits.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à la section **Availability** et vérifiez que tous les pays et régions requis sont bien listés.
## Étape 4. Vérifier les prix du produit \{#step-5-check-product-prices\}
1. Retournez dans la section **Monetization** → **Subscriptions** d'**App Store Connect**.
2. Cliquez sur le nom du groupe d'abonnements.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à **Subscription Pricing** et développez la section **Current Pricing for New Subscribers**.
5. Vérifiez que tous les prix requis sont bien listés.
## Étape 5. Vérifier le statut des applications payantes, le compte bancaire et les formulaires fiscaux \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. Sur la page d'accueil d'[**App Store Connect**](https://appstoreconnect.apple.com/), cliquez sur **Business**.
2. Sélectionnez le nom de votre entreprise.
3. Faites défiler vers le bas et vérifiez que votre **Paid Apps Agreement**, votre **Bank Account** et vos **Tax forms** affichent tous le statut **Active**.
En suivant ces étapes, vous devriez pouvoir résoudre l'avertissement `InvalidProductIdentifiers` et rendre vos produits disponibles dans le store.
## Étape 6. Recréer le produit s'il est bloqué \{#step-6-recreate-the-product-if-its-stuck\}
Les étapes 1 à 5 peuvent toutes être validées — statut `Approved`, Bundle ID correspondant, clé API valide — et pourtant le SDK retourne toujours `1000 noProductIDsFound`. Dans ce cas, le produit est peut-être bloqué dans le registre d'Apple. Il arrive que le registre de produits d'Apple entre dans un état où un produit existe dans l'interface d'App Store Connect mais n'est pas exposé au chemin de recherche StoreKit.
Supprimez le produit dans App Store Connect et recréez-le avec le même identifiant de produit. Attendez jusqu'à 24 heures après la recréation pour que la propagation s'effectue.
---
# File: cantMakePayments-react-native
---
---
title: "Correction de l'erreur Code-1003 cantMakePayment dans le SDK React Native"
description: "Résoudre l'erreur de paiement lors de la gestion des abonnements dans Adapty."
---
L'erreur 1003, `cantMakePayments`, indique que les achats intégrés ne peuvent pas être effectués sur cet appareil.
Si vous rencontrez l'erreur `cantMakePayments`, cela est généralement dû à l'une des raisons suivantes :
- Restrictions de l'appareil : L'erreur n'est pas liée à Adapty. Consultez les solutions ci-dessous.
- Configuration du mode Observateur : La méthode `makePurchase` et le mode Observateur ne peuvent pas être utilisés simultanément. Consultez la section ci-dessous.
## Problème : Restrictions de l'appareil \{#issue-device-restrictions\}
| Problème | Solution |
|--------------------------------|-------------------------------------------------------------------------------------------------------------|
| Restrictions Screen Time | Désactivez les restrictions d'achat intégré dans [Screen Time](https://support.apple.com/en-us/102470) |
| Compte suspendu | Contactez le support Apple pour résoudre les problèmes de compte |
| Restrictions régionales | Utilisez un compte App Store d'une région prise en charge |
## Problème : Utilisation simultanée du mode Observateur et de makePurchase \{#issue-using-both-observer-mode-and-makepurchase\}
Si vous utilisez `makePurchases` pour gérer les achats, vous n'avez pas besoin d'utiliser le mode Observateur. Le [mode Observateur](observer-vs-full-mode) n'est nécessaire que si vous implémentez vous-même la logique d'achat.
Ainsi, si vous utilisez `makePurchase`, vous pouvez supprimer en toute sécurité l'activation du mode Observateur dans le code d'initialisation du SDK.
---
# File: react-native-sdk-migration-guides
---
---
title: "Guides de migration du SDK React Native"
description: "Guides de migration pour les versions du SDK Adapty React Native."
---
Cette page regroupe tous les guides de migration pour le SDK Adapty React Native. Choisissez la version vers laquelle vous souhaitez migrer pour obtenir les instructions détaillées :
- **[Migrer vers v4.0](migration-to-react-native-sdk-v4)**
- **[Migrer vers v3.14](migration-react-native-314)**
- **[Migrer vers v3.8](react-native-migration-guide-380)**
- **[Migrer vers v3.4](migration-to-react-native-sdk-34)**
- **[Migrer vers v3.3](migration-to-react-native330)**
- **[Migrer vers v3.0](migration-to-react-native-sdk-v3)**
---
# File: migration-to-react-native-sdk-v4
---
---
title: "Migrer le SDK Adapty React Native vers la v. 4.0"
description: "Migrez vers le SDK Adapty React Native v4.0 en remplaçant les API paywall par des API flow, compatibles avec le Flow Builder et le Paywall Builder."
---
Le SDK Adapty React Native 4.0 introduit les flows et renomme les API paywall en conséquence. Les nouvelles API fonctionnent aussi bien avec le nouveau Flow Builder qu'avec le Paywall Builder existant — aucune modification de configuration n'est nécessaire côté Adapty Dashboard.
## Référence rapide \{#quick-reference\}
| v3 | v4 |
|---|---|
| `adapty.getPaywall(placementId, locale?, params?)` | `adapty.getFlow(placementId, params?)` |
| `adapty.getPaywallForDefaultAudience(placementId, locale?, params?)` | `adapty.getFlowForDefaultAudience(placementId, params?)` |
| `adapty.getPaywallProducts(paywall)` | `adapty.getPaywallProducts(flow)` |
| `adapty.logShowPaywall(paywall)` | `adapty.logShowFlow(flow)` |
| `AdaptyPaywall` (type) | `AdaptyFlow` |
| `createPaywallView(paywall)` | `createFlowView(flow)` |
| `AdaptyPaywallView` (composant) | `AdaptyFlowView` |
| `EventHandlers` (type) | `FlowEventHandlers` |
| `onPaywallShown` | `onAppeared` |
| `onPaywallClosed` | `onDisappeared` |
| `onRenderingFailed` | `onError` |
`AdaptyPaywallProduct` garde son nom — les produits appartiennent toujours à un flow, et `getPaywallProducts` prend désormais un `AdaptyFlow`. Les méthodes `getFlow` et `getFlowForDefaultAudience` n'acceptent plus de paramètre `locale` — passez-le à `createFlowView` à la place. Les méthodes de vue `present`, `dismiss`, `setEventHandlers` et `showDialog`, ainsi que les gestionnaires d'événements `onCloseButtonPress`, `onUrlPress`, `onCustomAction`, `onProductSelected`, `onPurchaseStarted`, `onPurchaseCompleted`, `onPurchaseFailed`, `onRestoreStarted`, `onRestoreCompleted`, `onRestoreFailed`, `onLoadingProductsFailed`, `onWebPaymentNavigationFinished` et `onAndroidSystemBack` conservent les mêmes noms qu'en v3. Certains comportements par défaut ont changé — voir [Changements de comportement par défaut](#default-behavior-changes).
## Version iOS minimale \{#minimum-ios-version\}
Le SDK React Native Adapty 4.0 fait passer la version minimale de déploiement iOS de iOS 13.0 à **iOS 15.0**. Définissez votre cible de déploiement iOS à 15.0 ou supérieure avant de procéder à la mise à jour.
## Installation \{#installation\}
### Mettre à jour le package
Mettez à jour le package `react-native-adapty` vers la v4.0 :
```bash showLineNumbers
npm install react-native-adapty@4.0.0
# or
yarn add react-native-adapty@4.0.0
```
### iOS : les SDK natifs passent désormais par Swift Package Manager
[Le dépôt de specs CocoaPods passe en lecture seule en décembre 2026](https://blog.cocoapods.org/CocoaPods-Specs-Repo/), aussi à partir de la v4, les SDK natifs `Adapty`, `AdaptyUI` et `AdaptyPlugin` **ne sont plus inclus en tant que sous-dépendances CocoaPods** — le podspec les récupère via **Swift Package Manager** (grâce au helper `spm_dependency`). Deux points à respecter :
- **React Native 0.75 ou version ultérieure** — nécessaire pour le helper de podspec `spm_dependency`. Sur une version plus ancienne, `pod install` échoue avec une erreur explicite ; mettez d'abord à jour React Native, ou restez sur `react-native-adapty` 3.x.
- **Frameworks dynamiques** — les dépendances SPM nécessitent un linkage dynamique. La façon de l'activer diffère entre Expo et bare React Native.
#### Expo
Ajoutez le plugin de configuration [`expo-build-properties`](https://docs.expo.dev/versions/latest/sdk/build-properties/) et définissez les frameworks iOS en dynamique dans `app.json` (ou `app.config.js`) :
```json showLineNumbers title="app.json"
{
"expo": {
"plugins": [
[
"expo-build-properties",
{
"ios": {
"useFrameworks": "dynamic",
"buildReactNativeFromSource": true
}
}
]
]
}
}
```
`buildReactNativeFromSource` est requis sur **Expo SDK 57 et versions ultérieures**. Expo SDK 57 embarque un framework React Native précompilé dont les en-têtes sont inaccessibles aux autres packages lorsque les frameworks sont dynamiques, ce qui provoque des erreurs de build iOS comme `'React/RCTBridge.h' file not found` dans `expo-updates` ou `@expo/ui`. Compiler React Native depuis les sources permet d'éviter ce conflit, au prix de builds iOS plus longs. Sur Expo SDK 56 et versions antérieures, vous pouvez omettre cette option.
Installez ensuite le plugin et régénérez le projet natif :
```bash showLineNumbers
npx expo install expo-build-properties
npx expo prebuild --clean
```
#### Bare React Native
Ajoutez les frameworks dynamiques à votre cible iOS, puis réinstallez les pods :
```ruby showLineNumbers title="ios/Podfile"
use_frameworks! :linkage => :dynamic
```
```bash showLineNumbers
cd ios && pod install --repo-update
```
Si vous avez précédemment ajouté `Adapty`, `AdaptyUI` ou `AdaptyPlugin` en tant que sous-dépendances CocoaPods, supprimez d'abord toute ligne explicite `pod 'Adapty'`, `pod 'AdaptyUI'` ou `pod 'AdaptyPlugin'` de votre `Podfile`.
:::warning
Passer de la liaison statique par défaut aux frameworks dynamiques peut entrer en conflit avec des bibliothèques qui ne prennent pas encore en charge les en-têtes modulaires, et est incompatible avec Flipper. Si vous rencontrez des problèmes de compilation, consultez cet [article sur l'intégration de Swift Package Manager avec les bibliothèques React Native](https://www.callstack.com/blog/integrating-swift-package-manager-with-react-native-libraries).
:::
Consultez [Installer le SDK Adapty](sdk-installation-reactnative) pour la configuration complète.
## Récupérer des flows \{#fetching-flows\}
### getPaywall → getFlow
Le type retourné passe de `AdaptyPaywall` à `AdaptyFlow`, et le paramètre `locale` se déplace de l'appel de récupération vers `createFlowView` ; pour les paywalls personnalisés, toutes les locales sont retournées dans `flow.remoteConfigs` :
```diff showLineNumbers
- const paywall = await adapty.getPaywall('YOUR_PLACEMENT_ID', 'en');
+ const flow = await adapty.getFlow('YOUR_PLACEMENT_ID');
+ const view = await createFlowView(flow, { locale: 'en' });
```
`locale` reste optionnel dans `createFlowView` : si vous l'omettez, la vue s'affiche en `en`, ou dans la localisation par défaut du flow si celui-ci ne possède pas de version `en`. Cette fonctionnalité nécessite le SDK 4.0.2 ou une version ultérieure — voir [Localisations et codes de langue](react-native-localizations-and-locale-codes).
`getPaywallForDefaultAudience` est renommé de la même façon :
```diff showLineNumbers
- const paywall = await adapty.getPaywallForDefaultAudience('YOUR_PLACEMENT_ID', 'en');
+ const flow = await adapty.getFlowForDefaultAudience('YOUR_PLACEMENT_ID');
```
### getPaywallProducts(paywall) → getPaywallProducts(flow)
`getPaywallProducts` conserve son nom mais prend désormais un `AdaptyFlow` :
```diff showLineNumbers
- const products = await adapty.getPaywallProducts(paywall);
+ const products = await adapty.getPaywallProducts(flow);
```
### Fichiers de secours \{#fallback-files\}
Le format des fichiers de secours [a changé avec le SDK v4](fallback-flows). Téléchargez le nouveau fichier depuis **[Placements](https://app.adapty.io/placements)** > **Fallbacks** et intégrez-le à votre application.
## Modèle de données \{#data-model\}
`getFlow` renvoie un `AdaptyFlow` au lieu d'un `AdaptyPaywall`, et la structure de l'objet a changé :
| Champ v3 `AdaptyPaywall` | Champ v4 `AdaptyFlow` | Action |
|---|---|---|
| `remoteConfig?` (unique) | `remoteConfigs?: AdaptyRemoteConfig[]` (tableau) | Un flow contient un Remote Config par langue configurée. Lisez celui qui correspond à l'utilisateur : `flow.remoteConfigs?.find((c) => c.lang === 'en')`. |
| `products` | `flow.paywalls[i].productIdentifiers` | Les identifiants de produits se trouvent désormais sur chaque variante du flow, pas sur le flow lui-même. |
| `webPurchaseUrl?` | `flow.paywalls[i].webPurchaseUrl` | Déplacé du flow vers chaque variante de paywall. |
| `version?: number` | `flowVersionId?: string` | Renommé, et le type a changé de `number` à `string`. |
| `hasViewConfiguration` | supprimé | Supprimez tout contrôle `hasViewConfiguration` de votre code. |
| `requestLocale` | supprimé | La locale ne fait plus partie du modèle. |
| _(nouveau)_ | `paywalls: AdaptyFlowPaywall[]` | Chaque entrée correspond à une variante de paywall dans le flow. |
| _(nouveau)_ | `responseCreatedAt: number` | Horodatage de la réponse serveur, en millisecondes. |
Product identifiers moved from the flow to each variation:
```diff showLineNumbers
- const ids = paywall.products;
+ const ids = flow.paywalls[0].productIdentifiers;
```
## Méthodes de paywall web \{#web-paywall-methods\}
`openWebPaywall` et `createWebPaywallUrl` conservent leurs noms, mais le premier argument est désormais un `AdaptyFlowPaywall` (une variante de flow) au lieu d'un `AdaptyPaywall`. Vous pouvez toujours passer un `AdaptyPaywallProduct`.
```diff showLineNumbers
const flow = await adapty.getFlow('YOUR_PLACEMENT_ID');
- await adapty.openWebPaywall(paywall);
+ await adapty.openWebPaywall(flow.paywalls[0]);
```
## Suivi des vues de flow \{#tracking-flow-views\}
### logShowPaywall → logShowFlow
`logShowPaywall` est renommé en `logShowFlow` et prend désormais un `AdaptyFlow`. L'événement est toujours enregistré pour la même variation, donc les métriques de funnel et de test A/B existantes continuent de fonctionner sans modification du tableau de bord.
```diff showLineNumbers
- await adapty.logShowPaywall(paywall);
+ await adapty.logShowFlow(flow);
```
Comme dans la v3, vous n'avez pas besoin d'appeler cette méthode lors de l'affichage de flows ou de paywalls rendus par le [Flow Builder](adapty-flow-builder) ou le [Paywall Builder](adapty-paywall-builder) — Adapty suit automatiquement ces vues.
## Afficher des flows \{#displaying-flows\}
### createPaywallView → createFlowView
Renommez la fonction factory et passez l'`AdaptyFlow`. Les méthodes du contrôleur retourné (`present`, `dismiss`, `setEventHandlers`, `showDialog`) restent inchangées :
```diff showLineNumbers
- import { createPaywallView } from 'react-native-adapty';
+ import { createFlowView } from 'react-native-adapty';
- const view = await createPaywallView(paywall);
+ const view = await createFlowView(flow);
await view.present();
```
### AdaptyPaywallView → AdaptyFlowView
Si vous effectuez le rendu avec le composant React, renommez-le et passez la prop `flow` :
```diff showLineNumbers
- import { AdaptyPaywallView } from 'react-native-adapty';
+ import { AdaptyFlowView } from 'react-native-adapty';
- ```diff showLineNumbers - subscriptionDetails?: AdaptySubscriptionDetails; + subscription?: AdaptySubscriptionDetails; ``` 2. [AdaptySubscriptionDetails](https://react-native.adapty.io/interfaces/adaptysubscriptiondetails) : - `promotionalOffer` est supprimé. L'offre promotionnelle est désormais transmise via la propriété `offer` uniquement si elle est disponible. Dans ce cas, `offer?.identifier?.type` sera `'promotional'`. - `introductoryOfferEligibility` est supprimé (les offres ne sont retournées que si l'utilisateur est éligible). - `offerId` est supprimé. L'identifiant de l'offre est désormais stocké dans `AdaptySubscriptionOffer.identifier`. - `offerTags` est déplacé vers `AdaptySubscriptionOffer.android`.
```diff showLineNumbers - introductoryOffers?: AdaptyDiscountPhase[]; + offer?: AdaptySubscriptionOffer; ios?: { - promotionalOffer?: AdaptyDiscountPhase; subscriptionGroupIdentifier?: string; }; android?: { - offerId?: string; basePlanId: string; - introductoryOfferEligibility: OfferEligibility; - offerTags?: string[]; renewalType?: 'prepaid' | 'autorenewable'; }; } ``` 3. [AdaptyDiscountPhase](https://react-native.adapty.io/interfaces/adaptydiscountphase) : - Le champ `identifier` est supprimé du modèle `AdaptyDiscountPhase`. L'identifiant de l'offre est désormais stocké dans `AdaptySubscriptionOffer.identifier`.
```diff showLineNumbers - ios?: { - readonly identifier?: string; - }; ``` ### Modèles supprimés \{#remove-models\} 1. `AttributionSource` : - Une chaîne de caractères est désormais utilisée aux endroits où `AttributionSource` était précédemment utilisé. 2. `OfferEligibility` : - Ce modèle a été supprimé car il n'est plus nécessaire. Désormais, une offre n'est retournée que si l'utilisateur est éligible. ## Supprimer la méthode `getProductsIntroductoryOfferEligibility` \{#remove-getproductsintroductoryoffereligibility-method\} Avant le SDK Adapty 3.3.1, les objets produit incluaient toujours les offres, même si l'utilisateur n'était pas éligible. Vous deviez donc vérifier manuellement l'éligibilité avant d'utiliser l'offre. À partir de la version 3.3.1, l'objet produit n'inclut les offres que si l'utilisateur est éligible. Cela simplifie le processus, car vous pouvez supposer que l'utilisateur est éligible si une offre est présente. ## Mettre à jour la création d'achat \{#update-making-purchase\} Dans les versions précédentes, les achats annulés et en attente étaient traités comme des erreurs et retournaient les codes `2: 'paymentCancelled'` et `25: 'pendingPurchase'` respectivement. À partir de la version 3.3.1, les achats annulés et en attente sont désormais considérés comme des résultats réussis et doivent être gérés en conséquence : ```typescript showLineNumbers try { const purchaseResult = await adapty.makePurchase(product); switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; } } catch (error) { // Handle the error } ``` ## Mettre à jour la présentation des paywalls du Paywall Builder \{#update-paywall-builder-paywall-presentation\} Pour des exemples mis à jour, consultez la documentation [Présenter les nouveaux paywalls du Paywall Builder dans React Native](react-native-present-paywalls). ```diff showLineNumbers - import { createPaywallView } from '@adapty/react-native-ui'; + import { createPaywallView } from 'react-native-adapty/dist/ui'; const view = await createPaywallView(paywall); view.registerEventHandlers(); // handle close press, etc try { await view.present(); } catch (error) { // handle the error } ``` ## Mettre à jour l'implémentation des timers définis par le développeur \{#update-developer-defined-timer-implementation\} Renommez le paramètre `timerInfo` en `customTimers` : ```diff showLineNumbers - let timerInfo = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) } + let customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) } //and then you can pass it to createPaywallView as follows: - view = await createPaywallView(paywall, { timerInfo }) + view = await createPaywallView(paywall, { customTimers }) ``` ## Modifier les événements d'achat du Paywall Builder \{#modify-paywall-builder-purchase-events\} Précédemment : - Les achats annulés déclenchaient le callback `onPurchaseCancelled`. - Les achats en attente retournaient le code d'erreur `25: 'pendingPurchase'`. Maintenant : - Les deux sont gérés par le callback `onPurchaseCompleted`. #### Étapes de migration : \{#steps-to-migrate\} 1. Supprimez le callback `onPurchaseCancelled`. 2. Supprimez la gestion du code d'erreur `25: 'pendingPurchase'`. 3. Mettez à jour le callback `onPurchaseCompleted` : ```typescript showLineNumbers const view = await createPaywallView(paywall); const unsubscribe = view.registerEventHandlers({ // ... other optional callbacks onPurchaseCompleted(purchaseResult, product) { switch (purchaseResult.type) { case 'success': const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive; if (isSubscribed) { // Grant access to the paid features } break; // highlight-start case 'user_cancelled': // Handle the case where the user canceled the purchase break; case 'pending': // Handle deferred purchases (e.g., the user will pay offline with cash) break; // highlight-end } // highlight-start return purchaseResult.type !== 'user_cancelled'; // highlight-end }, }); ``` ## Modifier les événements d'action personnalisée du Paywall Builder \{#modify-paywall-builder-custom-action-events\} Callbacks supprimés : - `onAction` - `onCustomEvent` Callback ajouté : - Nouveau callback `onCustomAction(actionId)`. Utilisez-le pour les actions personnalisées. ## Modifier le callback `onProductSelected` \{#modify-onproductselected-callback\} Précédemment, `onProductSelected` nécessitait l'objet `product`. Il requiert maintenant `productId` sous forme de chaîne de caractères. ## Supprimer les paramètres d'intégration tiers de la méthode `updateProfile` \{#remove-third-party-integration-parameters-from-updateprofile-method\} Les identifiants d'intégration tiers sont désormais définis via la méthode `setIntegrationIdentifier`. La méthode `updateProfile` ne les accepte plus. ## Mettre à jour la configuration des SDK d'intégration tiers \{#update-third-party-integration-sdk-configuration\} Pour garantir le bon fonctionnement des intégrations avec le SDK Adapty React Native 3.3.1 et versions ultérieures, mettez à jour vos configurations SDK pour les intégrations suivantes comme décrit dans les sections ci-dessous. De plus, si vous utilisiez `AttributionSource` pour obtenir l'identifiant d'attribution, modifiez votre code pour fournir l'identifiant requis sous forme de chaîne de caractères. ### Adjust \{#adjust\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration Adjust](adjust#connect-your-app-to-adjust). ```diff showLineNumbers import { Adjust, AdjustConfig } from "react-native-adjust"; import { adapty } from "react-native-adapty"; var adjustConfig = new AdjustConfig(appToken, environment); // Before submiting Adjust config... adjustConfig.setAttributionCallbackListener(attribution => { // Make sure Adapty SDK is activated at this point // You may want to lock this thread awaiting of `activate` adapty.updateAttribution(attribution, "adjust"); }); // ... Adjust.create(adjustConfig); + Adjust.getAdid((adid) => { + if (adid) + adapty.setIntegrationIdentifier("adjust_device_id", adid); + }); ``` ### AirBridge \{#airbridge\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration AirBridge](airbridge#connect-your-app-to-airbridge). ```diff showLineNumbers import Airbridge from 'airbridge-react-native-sdk'; import { adapty } from 'react-native-adapty'; try { const deviceId = await Airbridge.state.deviceUUID(); - await adapty.updateProfile({ - airbridgeDeviceId: deviceId, - }); + await adapty.setIntegrationIdentifier("airbridge_device_id", deviceId); } catch (error) { // handle `AdaptyError` } ``` ### Amplitude \{#amplitude\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration Amplitude](amplitude#sdk-configuration). ```diff showLineNumbers import { adapty } from 'react-native-adapty'; try { - await adapty.updateProfile({ - amplitudeDeviceId: deviceId, - amplitudeUserId: userId, - }); + await adapty.setIntegrationIdentifier("amplitude_device_id", deviceId); + await adapty.setIntegrationIdentifier("amplitude_user_id", userId); } catch (error) { // handle `AdaptyError` } ``` ### AppMetrica \{#appmetrica\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration AppMetrica](appmetrica#sdk-configuration). ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import AppMetrica, { DEVICE_ID_KEY, StartupParams, StartupParamsReason } from '@appmetrica/react-native-analytics'; // ... const startupParamsCallback = async ( params?: StartupParams, reason?: StartupParamsReason ) => { const deviceId = params?.deviceId if (deviceId) { try { - await adapty.updateProfile({ - appmetricaProfileId: 'YOUR_ADAPTY_CUSTOMER_USER_ID', - appmetricaDeviceId: deviceId, - }); + await adapty.setIntegrationIdentifier("appmetrica_profile_id", 'YOUR_ADAPTY_CUSTOMER_USER_ID'); + await adapty.setIntegrationIdentifier("appmetrica_device_id", deviceId); } catch (error) { // handle `AdaptyError` } } } AppMetrica.requestStartupParams(startupParamsCallback, [DEVICE_ID_KEY]) ``` ### AppsFlyer \{#appsflyer\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration AppsFlyer](appsflyer#connect-your-app-to-appsflyer). ```diff showLineNumbers import { adapty, AttributionSource } from 'react-native-adapty'; import appsFlyer from 'react-native-appsflyer'; appsFlyer.onInstallConversionData(installData => { try { - const networkUserId = appsFlyer.getAppsFlyerUID(); - adapty.updateAttribution(installData, AttributionSource.AppsFlyer, networkUserId); + const uid = appsFlyer.getAppsFlyerUID(); + adapty.setIntegrationIdentifier("appsflyer_id", uid); + adapty.updateAttribution(installData, "appsflyer"); } catch (error) { // handle the error } }); // ... appsFlyer.initSdk(/*...*/); ``` ### Branch \{#branch\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration Branch](branch#connect-your-app-to-branch). ```diff showLineNumbers import { adapty, AttributionSource } from 'react-native-adapty'; import branch from 'react-native-branch'; branch.subscribe({ enComplete: ({ params, }) => { - adapty.updateAttribution(params, AttributionSource.Branch); + adapty.updateAttribution(params, "branch"); }, }); ``` ### Facebook Ads \{#facebook-ads\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration Facebook Ads](facebook-ads#connect-your-app-to-facebook-ads). ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import { AppEventsLogger } from 'react-native-fbsdk-next'; try { const anonymousId = await AppEventsLogger.getAnonymousID(); - await adapty.updateProfile({ - facebookAnonymousId: anonymousId, - }); + await adapty.setIntegrationIdentifier("facebook_anonymous_id", anonymousId); } catch (error) { // handle `AdaptyError` } ``` ### Firebase et Google Analytics \{#firebase-and-google-analytics\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration Firebase et Google Analytics](firebase-and-google-analytics). ```diff showLineNumbers import analytics from '@react-native-firebase/analytics'; import { adapty } from 'react-native-adapty'; try { const appInstanceId = await analytics().getAppInstanceId(); - await adapty.updateProfile({ - firebaseAppInstanceId: appInstanceId, - }); + await adapty.setIntegrationIdentifier("firebase_app_instance_id", appInstanceId); } catch (error) { // handle `AdaptyError` } ``` ### Mixpanel \{#mixpanel\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration Mixpanel](mixpanel#sdk-configuration). ```diff showLineNumbers import { adapty } from 'react-native-adapty'; import { Mixpanel } from 'mixpanel-react-native'; // ... try { - await adapty.updateProfile({ - mixpanelUserId: mixpanelUserId, - }); + await adapty.setIntegrationIdentifier("mixpanel_user_id", mixpanelUserId); } catch (error) { // handle `AdaptyError` } ``` ### OneSignal \{#onesignal\} Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour l'exemple de code complet, consultez la [configuration SDK pour l'intégration OneSignal](onesignal#sdk-configuration).
:::important
**Les étapes suivantes dépendent de si vous avez déjà des produits sur l'App Store et/ou Google Play :**
:::
5. Cliquez sur **Save & Continue** et passez à l'onglet **App Store** ou **Google Play** pour renseigner les détails du produit pour le store.
Vous afficherez ce paywall dans le code de votre app.
Dans le code de votre app, vous n'écrivez en dur que les IDs de placement. Tout le reste — quel paywall s'exécute, quels produits il vend, le Remote Config — est configuré dans l'Adapty Dashboard et peut être modifié à tout moment sans mise à jour de l'app.
:::tip
Adapty vous permet d'afficher différents paywalls à différents groupes d'utilisateurs et d'analyser les performances. En savoir plus sur les [audiences](audience) et les [tests A/B](ab-tests).
:::
## Prochaines étapes \{#next-steps\}
Félicitations pour votre intégration réussie d'Adapty ! Vous êtes maintenant prêt à développer vos achats intégrés.
Préparez votre mise en production :
Ou continuez avec ce qui suit :
- **[Tests A/B](ab-tests)** : Expérimentez avec différents prix, durées d'abonnement, périodes d'essai et éléments visuels pour identifier les combinaisons les plus efficaces.
- **[Analytics](how-adapty-analytics-works)** : Plongez dans des métriques de monétisation détaillées pour comprendre le comportement des utilisateurs et optimiser les performances de revenus.
- **Intégrations** : Adapty envoie des [événements d'abonnement](events) à des outils d'analytics et d'attribution tiers, tels que [Amplitude](amplitude), [AppsFlyer](appsflyer), [Adjust](adjust), [Branch](branch), [Mixpanel](mixpanel), [Facebook Ads](facebook-ads), [AppMetrica](appmetrica), et un [Webhook](webhook) personnalisé.
:::tip
Des questions ou des problèmes ? Consultez notre [forum d'assistance](https://adapty.featurebase.app/) où vous trouverez des réponses aux questions fréquentes ou pourrez poser les vôtres. Notre équipe et notre communauté sont là pour vous aider !
:::
---
# File: release-checklist
---
---
title: "Release checklist"
description: "Suivez la checklist de publication d'Adapty pour garantir une mise à jour fluide de votre application."
---
Nous sommes ravis que vous ayez choisi d'utiliser Adapty ! Nous espérons que l'intégration s'est bien passée. Ce guide vous accompagne étape par étape pour vous assurer que votre application est prête à être publiée sur les stores et que le flux de monétisation fonctionne correctement.
## Prérequis avant de commencer \{#pre-flight-essentials\}
Ce dont vous avez besoin avant de démarrer la validation :
- Un vrai appareil avec un compte sandbox
- Accès à l'Adapty Dashboard
- Accès à App Store Connect / Google Play Console
:::note
Bien que les achats sandbox puissent fonctionner sur des simulateurs, les vrais appareils sont nécessaires pour tester tous les flux, notamment les fenêtres de paiement et les invites biométriques.
:::
## Validations universelles \{#universal-validations\}
- [ ] **Connexion au store** : Assurez-vous d'avoir connecté Adapty à l'App Store et/ou Google Play :
- [ ] [App Store](initial_ios)
- [ ] [Google Play](initial-android)
- [ ] **Livraison des événements d'abonnement** : Confirmez que les notifications serveur sont configurées :
- [ ] [Notifications serveur App Store](enable-app-store-server-notifications)
- [ ] [Notifications développeur en temps réel (RTDN)](enable-real-time-developer-notifications-rtdn)
- [ ] **Identification du profil** : Validez la logique d'identification des utilisateurs et assurez-vous que les achats sont associés au bon profil :
- [ ] [Vérifiez que la logique d'identification dans le code de votre application correspond à votre cas d'usage](ios-quickstart-identify)
- [ ] [Assurez-vous de comprendre la logique parent/héritier pour le partage d'accès payant entre les profils utilisateurs](sharing-paid-access-between-user-accounts)
- [ ] **Offres** : Si vous avez des offres promotionnelles App Store dans l'application, assurez-vous d'avoir [ajouté votre clé d'achat intégré](app-store-connection-configuration#step-4-for-trials-and-special-offers--set-up-promotional-offers) à la fois dans le champ principal et dans la section **App Store promotional offers**.
- [ ] **Collecte de données** : Assurez-vous de respecter la confidentialité :
- [ ] Si vous devez vous conformer à des réglementations sur la vie privée comme le RGPD ou le CCPA, ou si votre application est destinée aux enfants, contrôlez si vous [activez la collecte et le partage de l'IDFA et de l'IP](sdk-installation-ios#data-policies).
- [ ] Si votre application utilise AppTrackingTransparency, assurez-vous d'[envoyer le statut d'autorisation à Adapty](ios-deal-with-att).
- [ ] **Labels de confidentialité** : [En savoir plus](apple-app-privacy) sur les données collectées par Adapty et les indicateurs à définir pour la revue.
## Validations des achats \{#purchase-validations\}
:::tip
Des questions ou des problèmes ? Consultez notre [forum d'assistance](https://adapty.featurebase.app/) où vous trouverez des réponses aux questions fréquentes ou pourrez poser les vôtres. Notre équipe et notre communauté sont là pour vous aider !
:::
Avant le lancement, assurez-vous que les achats intégrés fonctionnent correctement dans votre application et que votre paywall est prêt pour la revue du store.
La façon dont vous validez les achats intégrés dépend de la manière dont vous les implémentez :
- Vous affichez un paywall créé avec le Paywall Builder d'Adapty
- Vous avez implémenté votre propre paywall et utilisez la méthode `makePurchase` pour gérer les achats
- Vous utilisez Adapty en mode observateur (avec le Paywall Builder d'Adapty ou votre propre paywall)
### Transférer les données historiques vers Adapty \{#move-historical-data-to-adapty\}
Le transfert des données historiques est optionnel et n'affectera pas l'état de vos abonnés. Cependant, il y a plusieurs bonnes raisons de le faire :
1. **Les analyses fonctionneront correctement immédiatement**. Adapty identifie les abonnés par leur identifiant de transaction d'origine, et nous ne comptabilisons pas les événements provenant du webhook Apple sans les avoir exposés au SDK Adapty (ce n'est techniquement pas possible).
2. **Les données utilisées seront disponibles**. Vous aurez tous les profils Adapty avec les propriétés utilisateur et pourrez les utiliser dans les [Segments](segments) et [Profils/CRM](profiles-crm).
Suivez notre [tutoriel](importing-historical-data-to-adapty) pour nous envoyer vos données historiques.
---
# File: observer-vs-full-mode
---
---
title: "Mode Observateur"
description: "Comparez le Mode Observateur et le Mode Complet dans Adapty pour les abonnements."
---
Adapty est une plateforme d'achats intégrés puissante et flexible, conçue pour booster vos revenus et votre base d'abonnés. Grâce à des paywalls personnalisables ciblant des segments d'utilisateurs spécifiques, des tests A/B sur les prix, les durées, les périodes d'essai et les éléments visuels, ainsi que des outils analytiques complets pour la monétisation et les intégrations tierces, Adapty renforce votre stratégie de croissance.
Cependant, si vous disposez déjà de votre propre infrastructure d'achat et que vous n'êtes pas prêt à passer au système d'Adapty, vous pouvez explorer le mode Observateur d'Adapty. Ce mode limité n'utilise pas les paywalls Adapty, ne les cible pas vers des audiences d'utilisateurs, ne gère pas les abonnements (y compris les renouvellements et les relances de facturation) et se concentre uniquement sur l'analyse. Malgré ses limitations, le mode Observateur offre tout de même de solides capacités analytiques, notamment l'intégration avec les systèmes d'attribution, l'analyse avancée, la messagerie et les profils CRM.
Les deux modes sont proposés au même prix et nécessitent une mise à jour de votre application mobile. Le choix se résume donc à soit basculer vers l'infrastructure d'Adapty pour bénéficier de toutes les fonctionnalités, soit conserver votre infrastructure actuelle tout en accédant uniquement aux intégrations tierces et aux capacités analytiques.
| Fonctionnalité | Mode Observateur | Mode Complet |
|-------------|-------------|---------|
| **Analyse complète** | ✅ | ✅ |
| **Intégrations tierces** | ✅ | ✅ |
| **Réponse aux événements d'achat pour accorder/restreindre l'accès payant à vos utilisateurs** | ❌ | ✅ |
| **Gestionnaire de l'infrastructure d'achats** | Vous | Adapty |
| **Tests A/B** | Réalisable, mais nécessite beaucoup de code et de configuration supplémentaires, plus qu'en Mode Complet.
| ✅ | | **Temps de mise en œuvre** |Pour l'analyse et les intégrations : moins d'une heure
Avec des tests A/B : jusqu'à une semaine avec des tests approfondis
| Quelques heures | ## Fonctionnement du mode Observateur \{#how-observer-mode-works\} En mode Observateur, vous signalez les nouvelles transactions Apple/Google au SDK Adapty, qui les transmet ensuite au backend Adapty. Vous êtes responsable de la gestion de l'accès au contenu payant dans votre application, de la finalisation des transactions, du traitement des renouvellements, de la résolution des problèmes de facturation, etc. ## Comment configurer le mode Observateur \{#how-to-set-up-observer-mode\} 1. Configurez l'intégration initiale d'Adapty [avec Google Play](initial-android) et [avec l'App Store](initial_ios). 2. Activez-le lors de la configuration du SDK Adapty en définissant le paramètre `observerMode` sur `true`. Suivez les instructions de configuration pour [iOS](sdk-installation-ios#activate-adapty-module-of-adapty-sdk), [Android](sdk-installation-android#activate-adapty-module-of-adapty-sdk), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter#activate-adapty-module-of-adapty-sdk), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform#activate-adapty-sdk) et [Unity](sdk-installation-unity#activate-adapty-module-of-adapty-sdk). 3. [Signalez les transactions](report-transactions-observer-mode) depuis votre infrastructure d'achat existante vers Adapty pour iOS et les frameworks multiplateformes basés sur iOS. 4. (optionnel) Si vous souhaitez utiliser des intégrations tierces, configurez-les comme décrit dans la rubrique [Configurer une intégration tierce](configuration). :::warning En mode Observateur, le SDK Adapty ne finalise pas les transactions : assurez-vous de gérer cet aspect vous-même. ::: ## Comment utiliser les paywalls et les tests A/B en mode Observateur \{#how-to-use-paywalls-and-ab-tests-in-observer-mode\} En mode Observateur, le SDK Adapty ne peut pas déterminer la source des achats, car vous les effectuez dans votre propre infrastructure. Par conséquent, si vous souhaitez utiliser des paywalls et/ou des tests A/B en mode Observateur, vous devez associer dans le code de votre application mobile la transaction provenant de votre store à la paywall correspondante lorsque vous signalez une transaction. De plus, les paywalls conçues avec le Paywall Builder doivent être affichées d'une manière spéciale lorsque vous utilisez le mode Observateur : - Affichez les paywalls en mode Observateur pour [iOS](implement-observer-mode) ou [Android](android-present-paywall-builder-paywalls-in-observer-mode). - [Associez les paywalls aux transactions d'achat](report-transactions-observer-mode) lors du signalement des transactions en mode Observateur. --- # File: migration-from-revenuecat --- --- title: "Migration depuis RevenueCat" description: "Migrez de RevenueCat vers Adapty grâce à notre guide étape par étape." --- Votre plan de migration comporte 5 étapes logiques et prend en moyenne 2 heures. 90 % des migrations prennent moins d'une journée de travail. 1. Découvrez les différences essentielles ; créez et configurez un compte Adapty _(5 minutes)_ ; 2. Installez le SDK Adapty pour votre plateforme ([iOS](sdk-installation-ios), [Android](sdk-installation-android), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform), [Unity](sdk-installation-unity)) à la place du SDK RevenueCat _(1 heure)_ ; 3. Configurez les [notifications serveur de l'Apple App Store](enable-app-store-server-notifications) vers Adapty et (optionnellement) le [transfert des événements bruts](enable-app-store-server-notifications#raw-events-forwarding) _(5 minutes)_ ; 4. Testez et publiez les mises à jour de votre application _(30 minutes)_ ; 5. (Optionnel) Demandez à l'assistance RevenueCat les données historiques au format CSV _(5 minutes)_ ; 6. (Optionnel) Importez les données historiques via l'assistance Adapty _(30 minutes)_. :::info Vos abonnés migrent automatiquement Tous les utilisateurs ayant déjà activé un abonnement passeront instantanément sur Adapty dès qu'ils ouvriront la nouvelle version de votre application avec le SDK Adapty. La validation du statut d'abonnement et l'accès premium seront restaurés automatiquement. ::: Avant de publier une nouvelle version de votre application avec le SDK Adapty, consultez notre [checklist de publication](release-checklist). ## Découvrez les différences essentielles ; créez et configurez un compte Adapty \{#learn-the-core-differences-create-and-prepare-an-adapty-account\} Les SDK Adapty et RevenueCat sont conçus de façon similaire. La principale différence porte sur l'utilisation du réseau et la vitesse : le SDK Adapty est conçu pour vous fournir les informations à la demande aussi rapidement que possible. Par exemple, lors d'une requête de paywall, vous obtenez d'abord le [Remote Config](customize-paywall-with-remote-config) pour pré-construire votre onboarding ou votre paywall, puis vous demandez les produits dans une requête dédiée. La terminologie diffère légèrement : | RevenueCat | Adapty | | :---------- | :-------------- | | Package | Produit | | Offering | Paywall | | Paywall | Paywall Builder | | Entitlement | Niveau d'accès | Adapty repose sur la notion de [placement](placements). Il s'agit d'un endroit logique dans votre application où l'utilisateur peut effectuer un achat. Dans la plupart des cas, vous avez un ou deux placements : - Onboarding (car 80 % de tous les achats y ont lieu) ; - Général (affiché dans les paramètres ou dans l'application après l'onboarding).
## Installez le SDK Adapty et remplacez le SDK RevenueCat \{#install-adapty-sdk-and-replace-revenuecat-sdk\}
Installez le SDK Adapty pour votre plateforme ([iOS](sdk-installation-ios), [Android](sdk-installation-android), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform), [Unity](sdk-installation-unity)) dans votre application.
Vous devez remplacer quelques méthodes SDK côté application. Voici les fonctions les plus courantes et comment les remplacer par celles du SDK Adapty.
### Activation du SDK \{#sdk-activation\}
Remplacez `Purchases.configure` par `Adapty.activate`.
### Récupération des paywalls (offerings) \{#getting-paywalls-offerings\}
Remplacez `Purchases.shared.getOfferings` par [`Adapty.getPaywall`](fetch-paywalls-and-products#fetch-paywall-information).
Dans Adapty, vous demandez toujours le paywall via un [identifiant de placement](placements). En pratique, vous ne récupérez jamais plus d'un ou deux paywalls, ce choix délibéré vise à accélérer le SDK et à réduire l'utilisation du réseau.
### Récupération d'un utilisateur (profil client) \{#getting-a-user-customer-profile\}
Remplacez `Purchases.shared.getCustomerInfo` par `Adapty.getProfile`.
### Récupération des produits \{#getting-products\}
Dans RevenueCat, vous utilisez la structure suivante : `Purchases.shared.getOfferings` puis `self.offering?.availablePackages`.
Dans Adapty, vous demandez d'abord un paywall (voir ci-dessus) pour accéder immédiatement au [Remote Config](customize-paywall-with-remote-config) d'Adapty, puis vous appelez les produits avec [`Adapty.getPaywallProducts`](fetch-paywalls-and-products#fetch-products).
### Effectuer un achat \{#making-a-purchase\}
Remplacez `Purchases.shared.purchase` par [`Adapty.makePurchase`](making-purchases#make-purchase).
### Vérifier le niveau d'accès (entitlement) \{#checking-access-level-entitlement\}
Récupérez un profil client (voir ci-dessus) puis remplacez
`customerInfo?.entitlements["premium"]?.isActive == true`
par
[`profile.accessLevels["premium"]?.isActive == true`](subscription-status#retrieving-the-access-level-from-the-server).
### Restaurer un achat \{#restore-purchase\}
Remplacez `Purchases.shared.restorePurchases` par [`Adapty.restorePurchases`](restore-purchase).
### Vérifier si l'utilisateur est connecté \{#check-if-the-user-is-logged-in\}
Remplacez `Purchases.shared.isAnonymous` par `if profile.customerUserId == nil`.
### Connecter un utilisateur \{#log-in-user\}
Remplacez `Purchases.shared.logIn` par [`Adapty.identify`](identifying-users#set-customer-user-id-after-configuration).
### Déconnecter un utilisateur \{#log-out-user\}
Remplacez `Purchases.shared.logOut` par [`Adapty.logout`](identifying-users#logging-out-and-logging-in).
## Redirigez les notifications serveur de l'App Store vers Adapty \{#switch-app-store-server-side-notifications-to-adapty\}
Découvrez comment procéder [ici](migrate-to-adapty-from-another-solutions#changing-apple-server-notifications).
## Testez et publiez une nouvelle version de votre application \{#test-and-release-a-new-version-of-your-app\}
Si vous lisez ceci, vous avez déjà :
- [x] Configuré l'Adapty Dashboard
- [x] Installé le SDK Adapty
- [x] Remplacé la logique SDK par les fonctions Adapty
- [x] Redirigé les notifications serveur de l'App Store vers Adapty et, optionnellement, activé le transfert des événements bruts vers RevenueCat
- [ ] Effectué un achat sandbox
- [ ] Publié une nouvelle version de l'application
Si vous avez coché les points ci-dessus, effectuez simplement un achat test en Sandbox, puis publiez l'application.
:::info
Parcourez la [checklist de publication](release-checklist).
Effectuez la vérification finale à l'aide de notre liste pour valider l'intégration existante ou ajouter des fonctionnalités supplémentaires telles que les intégrations [attribution](attribution-integration) ou [analytics](analytics-integration).
:::
## (Optionnel) Exportez vos données historiques RevenueCat au format CSV \{#optional-export-your-revenuecat-historical-data--in-csv-format\}
:::warning
Ne vous précipitez pas pour importer les données historiques
Attendez au moins une semaine après la publication avec le SDK avant d'importer les données historiques. Durant cette période, nous récupérerons toutes les informations sur les prix d'achat via le SDK, ce qui rendra les données importées plus pertinentes.
:::
Exportez vos données historiques depuis RevenueCat au format CSV en suivant les instructions de la [documentation officielle de RevenueCat](https://www.revenuecat.com/docs/integrations/scheduled-data-exports).
## (Optionnel) Demandez à l'assistance RevenueCat les Google Purchase Tokens \{#optional-ask-revenuecat-support-for-google-purchase-tokens\}
Si vous devez importer des transactions Google Play, contactez l'assistance RevenueCat pour obtenir un fichier CSV contenant les Google Purchase Tokens via leur [page d'assistance](https://app.revenuecat.com/settings/support). Le Google Purchase Token est un identifiant unique fourni par Google Play pour chaque transaction, indispensable pour suivre et vérifier avec précision les achats dans Adapty. Cette information n'est pas incluse dans le fichier d'export standard. Le fichier contient les trois colonnes suivantes :
- `user_id`
- `google_purchase_token`
- `google_product_id`
## Contactez-nous pour importer vos données historiques \{#write-us-to-import-your-historical-data\}
Contactez-nous via le chat du site ou par e-mail à [support@adapty.io](mailto:support@adapty.io) avec vos fichiers CSV.
1. Envoyez directement le fichier CSV exporté depuis RevenueCat à notre équipe d'assistance.
2. Si vous importez des transactions Google Play, joignez le fichier CSV contenant les Google Purchase Tokens reçu de l'assistance RevenueCat.
3. Indiquez-nous quel identifiant utilisateur doit être utilisé comme Customer User ID (identifiant principal de l'utilisateur dans Adapty) : `rc_original_app_user_id` ou `rc_last_seen_app_user_id_alias`.
Notre équipe d'assistance importera vos transactions dans Adapty. Les données suivantes seront importées pour chaque transaction :
| Paramètre | Description |
| ----------------------------- | ------------------------------------------------------------ |
| user_id | Customer User ID, l'identifiant principal de votre utilisateur dans Adapty et votre système. |
| apple_original_transaction_id | Pour les chaînes d'abonnements, il s'agit de la date d'achat de la transaction d'origine, liée par `store_original_transaction_id`. |
| google_product_id | L'identifiant du produit dans le Google Play Store. |
| google_purchase_token | Un identifiant unique fourni par Google Play pour chaque transaction, requis pour la validation. |
| country | Le pays de l'utilisateur. |
| created_at | La date et l'heure de création de l'utilisateur. |
| subscription_expiration_date | La date et l'heure d'expiration de l'abonnement. |
| email | L'adresse e-mail de l'utilisateur final. |
| phone_number | Le numéro de téléphone de l'utilisateur final. |
| idfa | L'Identifier for Advertisers (IDFA), attribué par Apple à l'appareil d'un utilisateur. |
| idfv | L'Identifier for Vendors (IDFV), un code attribué à toutes les applications d'un même développeur et partagé entre ces applications sur un appareil. |
| advertising_id | Un identifiant unique fourni par l'OS Android que les annonceurs peuvent utiliser pour le suivi. |
| attribution_channel | Le nom du canal marketing. |
| attribution_campaign | Le nom de la campagne marketing. |
| attribution_ad_group | Le groupe d'annonces d'attribution. |
| attribution_ad_set | L'ensemble d'annonces d'attribution. |
| attribution_creative | Le mot-clé créatif d'attribution. |
En outre, les identifiants d'intégration pour les intégrations suivantes seront importés : Amplitude, Mixpanel, AppsFlyer, Adjust et FacebookAds.
## FAQ \{#faq\}
### J'ai installé le SDK Adapty avec succès et publié une nouvelle version de l'application. Que se passera-t-il pour mes abonnés existants qui n'ont pas mis à jour vers la version avec le SDK Adapty ? \{#i-successfully-installed-adapty-sdk-and-released-a-new-app-version-with-it-what-will-happen-to-my-legacy-subscribers-who-did-not-update-to-a-version-with-adapty-sdk\}
La plupart des utilisateurs chargent leur téléphone la nuit, c'est généralement à ce moment-là que l'App Store met automatiquement à jour toutes leurs applications, donc cela ne devrait pas poser de problème. Il peut subsister un petit nombre d'abonnés payants qui n'ont pas effectué la mise à jour, mais ils auront toujours accès au contenu premium. Vous n'avez pas à vous en préoccuper ni à les forcer à mettre à jour.
### Dois-je exporter mes données historiques de RevenueCat le plus vite possible, ou vais-je les perdre ? \{#do-i-need-to-export-my-historical-data-from-revenuecat-as-quickly-as-possible-or-will-i-lose-it\}
Pas besoin de vous précipiter ; publiez d'abord une version avec le SDK Adapty, puis transmettez-nous vos données historiques. Nous restaurerons l'historique des paiements de vos utilisateurs et alimenterons les [profils](profiles-crm) et les [graphiques](charts).
### J'utilise un MMP (AppsFlyer, Adjust, etc.) et des outils d'analytics (Mixpanel, Amplitude, etc.). Comment m'assurer que tout fonctionnera correctement ? \{#i-use-mmp-appsflyer-adjust-etc-and-analytics-mixpanel-amplitude-etc-how-do-i-make-sure-that-everything-will-work\}
Vous devez d'abord nous transmettre les identifiants de ces services tiers via notre SDK pour que nous puissions leur envoyer des données. Consultez le guide d'[intégration attribution](attribution-integration) et d'[intégration analytics](analytics-integration). Pour les données historiques et les utilisateurs existants, **assurez-vous de nous transmettre ces identifiants à partir des données que vous avez exportées depuis RevenueCat.**
---
# File: migration-from-superwall
---
---
title: "Migration depuis Superwall"
description: "Migrez de Superwall vers Adapty grâce à un guide étape par étape qui mappe chaque appel SDK et chaque concept."
---
La plupart des migrations de Superwall vers Adapty prennent environ deux heures. Vous remplacez le SDK, pointez vos notifications serveur du store vers Adapty, et publiez une nouvelle version de l'app. Vos abonnés payants conservent leur accès — Adapty le restaure à partir des reçus App Store et Google Play au premier lancement.
:::info
Vos abonnés migreront automatiquement
Tous les utilisateurs ayant activé un abonnement migrent vers Adapty dès qu'ils ouvrent une nouvelle version de votre app avec le SDK Adapty. La validation du statut d'abonnement et l'accès premium sont restaurés automatiquement.
:::
## Organisation de ce guide \{#how-this-guide-is-organized\}
La migration comporte six étapes :
1. [Mapper vos concepts Superwall vers Adapty](#map-your-superwall-concepts-to-adapty)
2. [Installer le SDK Adapty](#install-the-adapty-sdk)
3. [Remplacer les appels SDK](#replace-sdk-calls)
4. [Basculer les notifications serveur App Store et Google Play](#switch-app-store-and-google-play-server-notifications)
5. [Tester et publier](#test-and-release)
6. [(Optionnel) Importer les données historiques](#optional-import-historical-data)
## Mapper vos concepts Superwall vers Adapty \{#map-your-superwall-concepts-to-adapty\}
La plupart des concepts Superwall ont un équivalent direct dans Adapty :
| Superwall | Adapty | Ce qui change |
| :------------------- | :------------------------------------------------ | :--------------------------------------------------------------------------- |
| Campaign | [Placement](placements) + [Audience](audience) | La logique de campagne se divise en un placement (l'emplacement) et une audience (la règle). |
| Placement | [Placement](placements) | Même concept, même nom. |
| Audience filter | [Audience](audience) | Les ensembles de règles vivent à l'intérieur d'un placement. |
| Entitlement | [Niveau d'accès](access-level) | Identifiant nommé (par exemple, `premium`). |
| WebView paywall | [Paywall Paywall Builder](adapty-paywall-builder) | Rendu nativement par le SDK Adapty à la place d'une `WKWebView`. |
| `PurchaseController` | Intégré | Aucun protocole à implémenter — Adapty gère les achats. |
| Feature gating | Vérification du [niveau d'accès](access-level) | Vérifiez `profile.accessLevels["premium"]?.isActive`. |
Deux changements de logique méritent d'être notés avant de toucher au code :
- **Récupération et présentation sont deux étapes distinctes** : le `register` de Superwall récupère le paywall, évalue la campagne et affiche l'interface en un seul appel. Adapty sépare ces étapes — vous récupérez le paywall, obtenez sa configuration, puis le présentez. Ce découpage ajoute quelques lignes, mais vous permet de précharger les configurations, d'afficher un état de chargement personnalisé ou d'annuler la présentation selon votre propre logique.
- **Le statut d'abonnement est par niveau d'accès** : Superwall expose une propriété publiée `subscriptionStatus` unique. Adapty retourne un [`AdaptyProfile`](https://swift.adapty.io/documentation/adapty/adaptyprofile) avec des niveaux d'accès nommés, de sorte qu'un utilisateur peut détenir les niveaux d'accès `sports` et `science` indépendamment. Pour les lectures synchrones, mettez en cache le profil depuis l'`AdaptyDelegate` plutôt que d'appeler `getProfile()` à chaque chargement de vue.
## Installer le SDK Adapty \{#install-the-adapty-sdk\}
Installez le SDK Adapty pour votre plateforme — [iOS](sdk-installation-ios), [Android](sdk-installation-android), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform), [Unity](sdk-installation-unity) ou [Capacitor](sdk-installation-capacitor) — et supprimez SuperwallKit de votre projet en même temps.
## Remplacer les appels SDK \{#replace-sdk-calls\}
Parcourez chaque partie de votre intégration et remplacez l'appel Superwall par son équivalent Adapty. Les liens en fin de chaque sous-section couvrent les sept SDK de plateforme — suivez celui qui correspond à votre app.
### Initialiser le SDK \{#initialize-the-sdk\}
Remplacez `Superwall.configure` par `Adapty.activate`.
Consultez le guide d'installation pour votre plateforme — [iOS](sdk-installation-ios), [Android](sdk-installation-android), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter), [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform), [Unity](sdk-installation-unity) ou [Capacitor](sdk-installation-capacitor).
### Identifier et déconnecter les utilisateurs \{#identify-and-log-out-users\}
Remplacez `Superwall.shared.identify` par `Adapty.identify` et `Superwall.shared.reset` par `Adapty.logout`. Les deux SDK génèrent un profil anonyme au premier lancement, donc ces appels ne sont nécessaires que lorsqu'un utilisateur se connecte ou se déconnecte. Récupérez à nouveau les paywalls après identification — le nouvel utilisateur peut correspondre à une audience différente.
Consultez le guide d'identification pour votre plateforme — [iOS](identifying-users), [Android](android-identifying-users), [React Native](react-native-identifying-users), [Flutter](flutter-identifying-users), [Kotlin Multiplatform](kmp-identifying-users), [Unity](unity-identifying-users) ou [Capacitor](capacitor-identifying-users).
### Récupérer et présenter un paywall \{#fetch-and-present-a-paywall\}
Remplacez `Superwall.shared.register` par un flux en deux étapes : récupérez le paywall avec `Adapty.getPaywall`, chargez sa configuration de vue avec `AdaptyUI.getPaywallConfiguration`, puis présentez-le.
Deux différences à noter :
- **Le feature gating remplace la closure `feature:`** : une fois le paywall fermé, vérifiez le niveau d'accès actif sur le profil retourné (ou via `Adapty.getProfile`) et agissez en conséquence.
- **Les paywalls sont rendus par le SDK** : Superwall rend les paywalls dans une `WKWebView`. Adapty rend les paywalls Paywall Builder nativement — les polices, les informations produit et les boutons sont dessinés par le SDK.
Consultez le guide de démarrage rapide des paywalls pour votre plateforme — [iOS](ios-quickstart-paywalls), [Android](android-quickstart-paywalls), [React Native](react-native-quickstart-paywalls), [Flutter](flutter-quickstart-paywalls), [Kotlin Multiplatform](kmp-quickstart-paywalls), [Unity](unity-quickstart-paywalls) ou [Capacitor](capacitor-quickstart-paywalls).
### Vérifier le statut d'abonnement \{#check-subscription-status\}
Remplacez `Superwall.shared.subscriptionStatus` par une vérification sur le niveau d'accès nommé du profil : `profile.accessLevels["premium"]?.isActive`. Observez les changements via `AdaptyDelegate.didLoadLatestProfile(_:)` plutôt que le pattern `@Published`, et mettez en cache le profil de votre côté pour les lectures synchrones.
Consultez le guide du statut d'abonnement pour votre plateforme — [iOS](ios-check-subscription-status), [Android](android-check-subscription-status), [React Native](react-native-check-subscription-status), [Flutter](flutter-check-subscription-status), [Kotlin Multiplatform](kmp-check-subscription-status), [Unity](unity-check-subscription-status) ou [Capacitor](capacitor-check-subscription-status).
### Gérer les achats et les restaurations \{#handle-purchases-and-restores\}
Avec le Paywall Builder, les deux SDK traitent les achats automatiquement dans l'interface du paywall — **vous pouvez ignorer cette étape**.
Pour les paywalls personnalisés, Superwall requiert une implémentation de `PurchaseController`. Adapty non : remplacez `PurchaseController.purchase` par `Adapty.makePurchase` et `PurchaseController.restorePurchases` par `Adapty.restorePurchases`. Le SDK gère la validation lui-même.
Consultez le guide de démarrage rapide des paywalls personnalisés pour votre plateforme — [iOS](ios-quickstart-manual), [Android](android-quickstart-manual), [React Native](react-native-quickstart-manual), [Flutter](flutter-quickstart-manual), [Kotlin Multiplatform](kmp-quickstart-manual), [Unity](unity-quickstart-manual) ou [Capacitor](capacitor-quickstart-manual).
### Définir les attributs utilisateur \{#set-user-attributes\}
Remplacez `Superwall.shared.setUserAttributes` par `Adapty.updateProfile`.
Consultez le guide des attributs utilisateur pour votre plateforme — [iOS](setting-user-attributes), [Android](android-setting-user-attributes), [React Native](react-native-setting-user-attributes), [Flutter](flutter-setting-user-attributes), [Kotlin Multiplatform](kmp-setting-user-attributes), [Unity](unity-setting-user-attributes) ou [Capacitor](capacitor-setting-user-attributes).
## Basculer les notifications serveur App Store et Google Play \{#switch-app-store-and-google-play-server-notifications\}
Pointez vos notifications serveur du store vers Adapty. Adapty fonctionne sans elles, mais les analyses, les intégrations tierces et les métriques des tests A/B en dépendent :
- **App Store** : Suivez [Activer les notifications serveur App Store](enable-app-store-server-notifications).
- **Google Play** : Suivez [Activer les notifications développeur en temps réel](enable-real-time-developer-notifications-rtdn).
Si vous souhaitez faire tourner Superwall et Adapty en parallèle pendant le déploiement, utilisez le [transfert d'événements bruts](enable-app-store-server-notifications#raw-events-forwarding) — Adapty relaie les événements du store vers Superwall pendant que vous vérifiez la nouvelle intégration.
## Tester et publier \{#test-and-release\}
Avant de publier, vérifiez chaque point :
- [x] Configuré l'Adapty Dashboard (produits, paywalls, placements, niveaux d'accès)
- [x] Installé le SDK Adapty
- [x] Remplacé les appels SDK Superwall par leurs équivalents Adapty
- [x] Pointé les notifications serveur App Store et Google Play vers Adapty
- [ ] Effectué un achat en sandbox
- [ ] Soumis une nouvelle version de l'app
Parcourez la [liste de contrôle avant publication](release-checklist) pour une validation finale.
## (Optionnel) Importer les données historiques \{#optional-import-historical-data\}
Superwall ne possède pas votre état d'abonnement — l'App Store et Google Play le font. Adapty valide les reçus au premier lancement, donc les utilisateurs payants conservent leur accès sans aucune importation.
Si vous souhaitez que les transactions historiques soient importées dans les analyses Adapty, suivez [Importer les données historiques dans Adapty](importing-historical-data-to-adapty). Attendez au moins une semaine après la publication du SDK pour que celui-ci ait le temps de collecter les prix d'achat récents.
## FAQ \{#faq\}
### Que se passe-t-il pour les abonnés qui ne mettent pas à jour l'app ? \{#what-happens-to-subscribers-who-dont-update-the-app\}
La plupart des utilisateurs mettent à jour leurs apps automatiquement pendant la nuit, donc la proportion d'utilisateurs sur l'ancienne version diminue rapidement. Les abonnés sur l'ancienne version conservent leur accès directement via l'App Store ou Google Play — vous n'avez pas besoin de forcer une mise à jour.
### Les audiences de mes campagnes Superwall sont-elles transférées ? \{#do-my-superwall-campaign-audiences-carry-over\}
Non. Les filtres d'audience Superwall et les audiences Adapty sont configurés dans des tableaux de bord différents et utilisent des identifiants différents. Recréez votre ciblage sous forme d'[audiences](audience) dans les [placements](placements) Adapty. La plupart des apps utilisent un ou deux placements (onboarding et déclencheur général dans l'app), donc la reconstruction est généralement rapide.
### Adapty a-t-il un équivalent à `getPresentationResult` ? \{#does-adapty-have-an-equivalent-to-getpresentationresult\}
Pas sous la forme d'un seul appel. Pour vérifier si un placement afficherait un paywall, appelez `Adapty.getPaywall(placementId:)` et agissez selon le résultat. Si l'appel réussit, un paywall est attribué à l'audience de cet utilisateur. S'il échoue parce qu'aucun paywall n'est configuré, ignorez la présentation et exécutez votre logique de secours.
---
# File: importing-historical-data-to-adapty
---
---
title: "Importation des données historiques dans Adapty"
description: "Importez des données historiques dans Adapty pour des analyses détaillées."
---
Après avoir installé le SDK Adapty et publié votre application, vous pouvez accéder à vos utilisateurs et abonnés dans la section [Profiles](profiles-crm). Mais que faire si vous disposez d'une infrastructure existante et souhaitez migrer vers Adapty, ou si vous voulez simplement consulter vos données existantes dans Adapty ?
:::note
L'importation de données n'est pas obligatoire
Adapty accordera automatiquement des niveaux d'accès aux utilisateurs historiques et restaurera leurs événements d'achat dès qu'ils ouvriront l'application avec le SDK Adapty intégré. Pour ce cas d'usage, l'importation de données historiques n'est pas nécessaire. Cependant, l'importation de données garantit des analyses précises si vous disposez d'un volume important de transactions historiques, bien qu'elle ne soit généralement pas requise pour la migration.
:::
Pour importer des données dans Adapty :
1. Exportez vos transactions dans un fichier CSV (des fichiers séparés doivent être fournis pour iOS, Android et Stripe). Consultez la [section Format du fichier d'importation](importing-historical-data-to-adapty#import-file-format) ci-dessous pour les exigences détaillées.
2. Si un fichier dépasse 1 Go, préparez un échantillon de données d'environ 100 lignes.
3. Téléchargez tous les fichiers sur Google Drive (vous pouvez les compresser, mais gardez-les séparés).
4. Pour les transactions iOS, assurez-vous que la section **In-app purchase API** dans les [**App settings**](https://app.adapty.io/settings/ios-sdk) est renseignée avec l'**Issuer ID**, le **Key ID** et la **Private key** (fichier .P8), même si vous utilisez StoreKit 1. Consultez les sections [Provide Issuer ID and Key ID](app-store-connection-configuration#step-2-provide-issuer-id-and-key-id) et [Upload In-App Purchase Key file](app-store-connection-configuration#step-3-upload-in-app-purchase-key-file) pour des instructions détaillées.
5. Partagez les liens avec notre équipe par [e-mail](mailto:support@adapty.io) ou via le chat en ligne dans l'Adapty Dashboard.
Ne vous inquiétez pas, l'importation de données historiques ne créera pas de doublons, même si ces données chevauchent des entrées existantes dans Adapty.
## Limitations connues pour Android \{#known-limitations-for-android\}
1. Seuls les abonnements actifs seront restaurés ; les transactions expirées ne le seront pas.
2. Seuls les derniers renouvellements d'un abonnement seront restaurés ; la chaîne complète des achats ne le sera pas.
3. Si le prix du produit a changé depuis l'achat, le prix actuel sera utilisé, ce qui peut entraîner des erreurs de tarification.
:::note
Si vous avez un grand volume de transactions Android, vous devrez peut-être [demander une augmentation du quota de l'API Google Play Developer](google-play-quota-increase) avant de commencer l'importation afin d'éviter de dépasser la limite par défaut de l'API.
:::
## Format du fichier d'importation \{#import-file-format\}
:::tip
Si vous migrez depuis RevenueCat, vous pouvez envoyer directement le fichier d'export RevenueCat — aucune conversion n'est nécessaire. Consultez la [documentation de RevenueCat](https://www.revenuecat.com/docs/integrations/scheduled-data-exports) pour les instructions d'export.
:::
Préparez vos données dans un ou plusieurs fichiers respectant les règles suivantes :
- [ ] Le format du fichier est .CSV.
- [ ] Des fichiers séparés pour les importations Android, iOS et Stripe.
- [ ] Chaque fichier d'importation contient toutes les [colonnes requises](importing-historical-data-to-adapty#required-fields).
- [ ] Les colonnes des fichiers d'importation ont des en-têtes.
- [ ] Les en-têtes de colonnes sont exactement ceux indiqués dans la colonne **Column name** du tableau ci-dessous. Vérifiez les fautes de frappe.
- [ ] Les colonnes non requises peuvent être absentes du fichier. N'ajoutez pas de colonnes vides pour les données que vous n'avez pas.
- [ ] Les fichiers d'importation ne doivent pas contenir de colonnes supplémentaires non mentionnées dans le tableau. Si c'est le cas, supprimez-les.
- [ ] Les valeurs sont séparées par des virgules.
- [ ] Les valeurs ne sont pas entourées de guillemets.
- [ ] Si un utilisateur possède plusieurs **apple_original_transaction_id**, ajoutez-les tous en lignes séparées pour chaque **apple_original_transaction_id**. Sinon, nous pourrions ne pas être en mesure de restaurer les achats consommables.
Utilisez les fichiers suivants comme exemples pour [iOS](https://raw.githubusercontent.com/adaptyteam/adapty-docs/refs/heads/main/Downloads/adapty_import_ios_sample.csv) et [Android](https://raw.githubusercontent.com/adaptyteam/adapty-docs/refs/heads/main/Downloads/adapty_import_android_sample.csv).
### Colonnes disponibles dans le fichier d'importation \{#available-import-file-columns\}
| Nom de la colonne | Présence | Description |
|-----------|--------|-----------|
| **user_id** | requis | ID de votre utilisateur |
| **apple_original_transaction_id** | requis pour iOS | L'identifiant de transaction original ou OTID ([en savoir plus](https://developer.apple.com/documentation/appstoreserverapi/originaltransactionid)), utilisé dans le mécanisme d'importation StoreKit 2. Un utilisateur pouvant avoir plusieurs OTID, il suffit d'en fournir au moins un pour réussir l'importation.
**Remarque :** Nous exigeons que les identifiants de l'API d'achat intégré soient configurés dans votre Adapty Dashboard pour cette importation. Découvrez comment le faire [ici](app-store-connection-configuration#step-3-upload-in-app-purchase-key-file).
| | **google_product_id** | requis pour Google | ID du produit dans le Google Play Store. | | **google_purchase_token** | requis pour Google | Identifiant unique représentant l'utilisateur et l'ID du produit pour l'achat intégré effectué | | **google_is_subscription** | requis pour Google | Les valeurs possibles sont `1` \| `0` | | **stripe_token** | requis pour Stripe | Token d'un objet Stripe représentant un achat unique. Peut être un token d'abonnement Stripe (`sub_...`) ou d'intention de paiement (`pi_...`). | | **subscription_expiration_date** | optionnel | La date d'expiration de l'abonnement, c'est-à-dire la prochaine date de facturation, date et heure avec fuseau horaire (2020-12-31T23:59:59-06:00) | | **created_at** | optionnel | Date et heure de création du profil (2019-12-31 23:59:59-06:00) | | **birthday** | optionnel | La date de naissance de l'utilisateur au format 2000-12-31 | | **email** | optionnel | L'adresse e-mail de votre utilisateur | | **gender** | optionnel | Le genre de l'utilisateur | | **phone_number** | optionnel | Le numéro de téléphone de votre utilisateur | | **country** | optionnel | format [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) | | **first_name** | optionnel | Le prénom de votre utilisateur | | **last_name** | optionnel | Le nom de famille de votre utilisateur | | **last_seen** | optionnel | La date et l'heure avec fuseau horaire (2020-12-31T23:59:59-06:00) | | **idfa** | optionnel | L'identifiant pour les annonceurs (IDFA) est un identifiant d'appareil aléatoire attribué par Apple à l'appareil d'un utilisateur. Applicable uniquement aux applications iOS | | **idfv** | optionnel | L'identifiant pour les fournisseurs (IDFV) est un code unique attribué à toutes les applications développées par un même développeur. Applicable uniquement aux applications iOS | | **advertising_id** | optionnel | L'Advertising ID est un code unique attribué par le système d'exploitation Android que les annonceurs peuvent utiliser pour identifier de manière unique l'appareil d'un utilisateur | | **amplitude_user_id** | optionnel | L'ID utilisateur d'Amplitude | | **amplitude_device_id** | optionnel | L'ID d'appareil d'Amplitude | | **mixpanel_user_id** | optionnel | L'ID utilisateur de Mixpanel | | **appmetrica_profile_id** | optionnel | L'ID de profil utilisateur d'AppMetrica | | **appmetrica_device_id** | optionnel | L'ID d'appareil d'AppMetrica | | **appsflyer_id** | optionnel | Identifiant unique d'AppsFlyer | | **adjust_device_id** | optionnel | L'ID d'appareil d'Adjust | | **facebook_anonymous_id** | optionnel | Identifiant unique généré par Facebook pour les utilisateurs qui interagissent avec votre application ou site web de manière anonyme, c'est-à-dire sans être connectés à Facebook | | **branch_id** | optionnel | Identifiant unique de Branch | | **attribution_source** | optionnel | La source d'intégration de l'attribution, par exemple, appsflyer | | **attribution_status** | optionnel | organic | | **attribution_channel** | optionnel | Le canal d'attribution qui a amené la transaction | | **attribution_campaign** | optionnel | La campagne d'attribution qui a amené la transaction | | **attribution_ad_group** | optionnel | Le groupe d'annonces d'attribution qui a amené la transaction | | **attribution_ad_set** | optionnel | L'ensemble d'annonces d'attribution qui a amené la transaction | | **attribution_creative** | optionnel | Les éléments visuels ou textuels spécifiques utilisés dans une publicité ou une campagne marketing, suivis pour déterminer leur efficacité à générer des actions souhaitées telles que des clics, des conversions ou des installations | | **custom_attributes** | optionnel | Définissez jusqu'à 30 attributs personnalisés sous forme de dictionnaire JSON en format clé-valeur :Format : `"{'string_value': 'some_value', 'float_value': 123.0, 'int_value': 456}"`.
Notez l'utilisation des guillemets doubles et simples dans le format. Gardez à l'esprit que les booléens et les entiers seront convertis en flottants.
| ### Champs requis \{#required-fields\} Il existe 2 groupes de champs requis pour chaque plateforme : **user_id** et les données identifiant les achats spécifiques à la plateforme concernée. Consultez le tableau ci-dessous pour les champs obligatoires par plateforme. | Plateforme | Champs requis | |--------|---------------| | iOS |user_id
apple_original_transaction_id
| | Android |user_id
google_product_id
google_purchase_token
google_is_subscription
| | Stripe |user_id
stripe_token
| Sans ces champs, Adapty ne pourra pas récupérer les transactions. Pour des analyses de cohortes précises, veuillez indiquer `created_at`. Si cette valeur n'est pas fournie, nous considérerons que la date d'installation est identique à la date du premier achat. ### Importer des données dans Adapty \{#import-data-to-adapty\} Contactez-nous et partagez vos fichiers d'importation via [support@adapty.io](mailto:support@adapty.io) ou via le chat en ligne dans l'[Adapty Dashboard](https://app.adapty.io/overview). --- # File: migrate-integrations-to-adapty --- --- title: "Migrer les intégrations vers Adapty" description: "Basculez vos intégrations d'analytics et d'attribution d'une solution existante vers Adapty sans dupliquer les événements ni perturber vos campagnes." --- Migrer vers Adapty ne se limite pas à changer de SDK. Vos intégrations tierces d'analytics et d'attribution — des outils comme Amplitude et Adjust — nécessitent également un basculement coordonné. Bien mené, la transition génère peu d'événements en double ou manquants et ne perturbe pas vos campagnes. ## Mapper vos événements \{#map-your-events\} Les noms d'événements sont personnalisables dans la plupart des intégrations Adapty. Vous pouvez les configurer pour qu'ils correspondent aux noms déjà utilisés dans vos tableaux de bord et campagnes. Vos rapports d'analytics et de campagne continueront de fonctionner avec les mêmes noms d'événements après le basculement. Pour consulter la liste complète des événements disponibles dans Adapty, voir [Événements](events). Pour Adjust, l'intégration utilise des identifiants d'événements plutôt que des noms personnalisés. Transférez vos identifiants d'événements existants depuis le tableau de bord Adjust vers la configuration de l'intégration Adapty. Consultez le [guide d'intégration Adjust](adjust) pour plus de détails. ## Comment Adapty crée les événements d'intégration \{#how-adapty-creates-integration-events\} Pour envoyer un événement à une intégration, Adapty doit disposer d'un profil utilisateur. Un profil est créé de deux façons : - **Import historique** : le profil est créé lorsque vous [importez des données de transactions historiques](importing-historical-data-to-adapty) avant la mise en production du SDK. - **Interaction avec le SDK** : le profil est créé automatiquement lorsque l'utilisateur ouvre l'application avec le SDK Adapty pour la première fois. Adapty prend connaissance des achats effectués dans l'ancien système en temps réel. Mais il ne peut envoyer un événement d'intégration qu'une fois que le profil de l'acheteur existe. Ce profil est créé lorsque l'utilisateur ouvre l'application avec le SDK Adapty. Les utilisateurs qui ne mettent pas à jour vers la nouvelle version ne généreront pas d'événements d'intégration. ## Préparer avant le jour de la migration \{#prepare-before-migration-day\} ### Exclure les événements historiques \{#exclude-historical-events\} Activez **Exclude Historical Events** dans vos [paramètres d'intégration](configuration). Cela empêche l'envoi à l'intégration des événements antérieurs à la première session SDK Adapty de l'utilisateur. Ce paramètre est particulièrement important lors de l'[import historique](importing-historical-data-to-adapty), quand Adapty traite un grand volume de transactions passées en une seule fois. Sans lui, ces transactions génèreront un volume important d'événements dans votre outil d'analytics. ### Configurer l'intégration à l'avance \{#set-up-the-integration-in-advance\} Adapty vous permet de configurer et tester une intégration tout en la laissant désactivée. Vous pouvez définir les identifiants, le mapping d'événements et les filtres sans activer l'intégration jusqu'à ce que vous soyez prêt. La configuration est conservée lors de l'activation, rien n'est perdu en la laissant désactivée jusqu'au jour J. Pour trouver votre intégration, consultez [Intégrations d'attribution](attribution-integration), [Intégrations d'analytics](analytics-integration), [Intégrations de services de messagerie](messaging) ou [Intégrations Webhook et ETL](webhook-and-etl). ## Basculer le jour de la migration \{#switch-on-migration-day\} Désactivez l'intégration dans votre ancienne solution et activez-la dans Adapty simultanément. Faire tourner les deux en même temps produira des événements en double. Mettez en pause les grandes campagnes d'acquisition le jour de la migration. Cela réduit le risque d'erreurs d'optimisation de campagne causées par des événements dans la fenêtre de chevauchement. ## À quoi s'attendre \{#what-to-expect\} Quelques événements d'intégration manquants ou en double lors de la migration sont inévitables. Lorsque le basculement est effectué correctement, le nombre d'événements concernés est négligeable. La principale source de lacunes est le timing décrit ci-dessus : Adapty ne peut envoyer des événements d'intégration pour un achat qu'une fois que le profil de l'utilisateur existe. Les achats effectués dans l'ancien système ne génèrent pas d'événements d'intégration Adapty tant que l'acheteur n'ouvre pas l'application avec le SDK Adapty. ## Intégrations vs. notifications serveur à serveur \{#integrations-vs-server-to-server-notifications\} Adapty recommande d'utiliser les intégrations plutôt que de transmettre directement les notifications brutes serveur à serveur du store à vos outils d'analytics ou d'attribution. Avec les intégrations : - **Format unifié** : les événements de tous les stores — App Store, Google Play, Stripe — utilisent le même format d'événement. - **Données enrichies** : les événements incluent les données collectées par Adapty, comme l'état de l'abonnement et les attributs utilisateur. Les notifications brutes ne contiennent pas ces informations. --- # File: whats-new --- --- title: "Nouveautés" description: "Restez informé des dernières fonctionnalités et améliorations d'Adapty" --- Découvrez les dernières fonctionnalités, améliorations, mises à jour du SDK et enrichissements de la documentation pour optimiser la stratégie de monétisation de votre application. Cette page présente les sorties les plus importantes chaque mois. :::note Un avis sur les nouvelles fonctionnalités ? Nous serions ravis de vous lire ! Contactez-nous via le [tableau de retours produit](https://adapty.featurebase.app/en?b=69831ba5e82e7a3391632ec2). ::: ## Juillet 2026 \{#july-2026\} - **Monnaies virtuelles** : Définissez des monnaies intégrées comme des jetons, des pièces ou des gemmes, accordez et suivez un solde pour chaque utilisateur, et lisez ces soldes depuis votre serveur via l'API côté serveur. [En savoir plus](virtual-currencies) - **Agent IA dans Apple Ads Manager** : Interrogez un agent de chat consultatif sur vos performances Apple Ads et obtenez des réponses tirées de vos données de campagne, sans créer de rapports manuellement. [En savoir plus](ads-manager-ai-agent) - **Nouvelles automatisations dans Apple Ads Manager** : automatisez les modifications au niveau des campagnes et des groupes d'annonces avec deux nouveaux types de règles, en plus des automatisations de mots-clés et de termes de recherche existantes. [Règles de campagne](ads-manager-automations-campaign-rules) | [Règles de groupe d'annonces](ads-manager-automations-ad-group-rules) - **Profils dans Adapty Mail** : une vue par abonné qui affiche le parcours de chaque utilisateur, son état d'abonnement actuel et son statut de désabonnement au même endroit. [En savoir plus](mail-profiles) - **SDK v4 pour React Native, Flutter, Capacitor et Kotlin Multiplatform** : Les SDK v4 avec support des flows sont disponibles. React Native, Flutter et Capacitor ont atteint la disponibilité générale, et Kotlin Multiplatform v4 a été lancé — chacun avec son propre guide de migration. [React Native](migration-to-react-native-sdk-v4) | [Flutter](migration-to-flutter-sdk-v4) | [Capacitor](migration-to-capacitor-sdk-v4) | [Kotlin Multiplatform](migration-to-kmp-sdk-v4) - **Nouveaux champs webhook** : Les payloads webhook incluent désormais le prix original et la remise pour chaque transaction, ce qui vous permet de suivre les tarifs promotionnels et de lancement en aval. Ces champs sont disponibles uniquement dans les webhooks. [En savoir plus](webhook-event-types-and-fields) - **Prix barrés dans les flows** : Affichez un prix original barré à côté du prix remisé, avec un badge de remise, directement dans le Flow Builder. [En savoir plus](strikethrough-price) - **Galerie de templates de flows** : Démarrez un nouveau flow depuis un template conçu par des professionnels plutôt que d'une page blanche, puis personnalisez-le pour correspondre à votre application. [En savoir plus](paywall-builder-templates) - **Bouton d'installation des outils** : Chaque article de documentation dispose désormais d'un bouton **Install tools** dans l'en-tête. Il ouvre une fenêtre modale avec des commandes prêtes à copier pour installer le skill d'intégration du SDK Adapty dans Claude Code, Copilot CLI, Gemini CLI, Codex et d'autres assistants de développement IA. [En savoir plus](adapty-sdk-integration-skill) - **Nouvelle méthode d'installation du SDK Unity** : Vous pouvez désormais installer le SDK Unity via Swift Package Manager, avec des conseils de dépannage pour les problèmes courants. [En savoir plus](sdk-installation-unity) - **Conteneur footer dans le Flow Builder** : Un panneau bas fixe qui reste ancré pendant que le reste de l'écran défile — idéal pour les boutons CTA, les mentions légales et les liens. [En savoir plus](builder-containers#footer) - **Nouveaux tutoriels vidéo du Flow Builder** : une playlist YouTube en pleine expansion avec des guides pas à pas pour créer des flows, désormais intégrée dans les guides du Flow Builder. [En savoir plus](adapty-flow-builder) ## Juin 2026 \{#june-2026\} - **Les flows sont désormais disponibles sur Android** : Le builder visuel no-code pour les paywalls et les onboardings fonctionne maintenant sur Android SDK v4 et supérieur, ainsi que sur iOS. Les écrans s'affichent nativement, sans web views. [En savoir plus](adapty-flow-builder) - **Tests A/B CPP dans Apple Ads Manager** : Comparez des pages produit personnalisées entre elles directement dans Apple Ads. Sélectionnez 2 à 4 pages — y compris votre page par défaut actuelle — et Apple Ads répartit le trafic entre elles et indique laquelle convertit le mieux. [En savoir plus](ads-manager-cpp-ab-tests) - **Adapty Mail API** : Envoyez des profils utilisateurs et des transactions directement à Adapty Mail depuis votre serveur, sans faire transiter les données par le SDK. Utilisez-la pour alimenter une base d'abonnés, réutiliser des abonnés de vos autres applications, ou conserver votre backend comme source de vérité. [En savoir plus](mail-send-data-via-api) - **Afficher un paywall ciblé Apple Ads au premier lancement** : l'attribution Apple Ads arrive après l'activation du SDK, donc un paywall demandé trop tôt rate votre audience Apple Ads. Utilisez `AdaptyProfile.appliedAttributionSources` pour afficher le paywall ciblé Apple Ads dès que les données d'attribution sont disponibles. [iOS](ios-show-aa-targeted-paywall) | [React Native](react-native-show-aa-targeted-paywall) | [Capacitor](capacitor-show-aa-targeted-paywall) - **Sauvegarde automatique dans le Flow Builder** : Le Flow Builder enregistre maintenant votre progression automatiquement toutes les minutes, vous ne perdez plus votre travail non enregistré lorsque vous quittez la page. Vous pouvez toujours sauvegarder un brouillon manuellement avec **Cmd/Ctrl + S**. [En savoir plus](builder-save-publish) - **Nouveaux tutoriels vidéo pour le Flow Builder** : Deux nouvelles vidéos expliquent comment créer la navigation entre les écrans d'un flow et comment concevoir les états des éléments tels que sélectionné, actif et désactivé. [Navigation dans les flows](onboarding-navigation-branching) | [États des éléments](builder-element-states) - **Documentation en japonais et en vietnamien** : La documentation Adapty est désormais disponible en japonais (日本語) et en vietnamien (Tiếng Việt). Changez de langue via le sélecteur de langue dans la navigation en haut de page. ## Mai 2026 \{#may-2026\} - **Flows (Bêta)** : Créez des séquences d'écrans entières dans un éditeur visuel no-code — paywalls à écran unique, onboardings multi-étapes, et tout ce qui se trouve entre les deux, le tout dans un seul flow. Les écrans s'affichent nativement sans web views, et vous pouvez mettre à jour les textes, le design et la logique sans publier de nouvelle version de l'app. Supporte actuellement iOS, Android, React Native, Flutter et Capacitor SDK v4 et supérieur. [En savoir plus](adapty-flow-builder) - **Autopilot s'adapte désormais à vos résultats de test** : En agissant comme un gestionnaire de croissance IA, il met à jour le plan de croissance après chaque cycle terminé. La prochaine hypothèse tient compte des expériences réalisées, de celles qui ont été concluantes et des directions qui méritent encore d'être explorées — plutôt que de suivre une séquence fixe. [En savoir plus](autopilot-how-it-works#how-ai-growth-advisor-decides-what-to-recommend) - **ARPU d'activation dans Autopilot Market Insights** : Un nouveau graphique compare le revenu moyen par nouvelle installation de votre application à la moyenne de la catégorie. Combinez-le avec le tunnel de conversion — une conversion élevée associée à un faible ARPU d'activation peut indiquer des offres sous-tarifées. [En savoir plus](autopilot-analysis#activation-arpu) - **Analytics dans Adapty Mail** : Comparez les métriques de livraison et les revenus attribués aux e-mails pour chaque campagne en un seul affichage. Groupez, décomposez et filtrez par campagne, segment, variante A/B, message ou déclencheur, puis explorez n'importe quelle ligne en détail. [En savoir plus](mail-analytics) - **Profil de marque dans Adapty Mail** : Un profil centralisé qui pilote le contenu des e-mails, le ton, les visuels et le contenu des paywalls web. Adapty le construit à partir de la fiche de votre app sur les stores, de votre page de destination, de vos pages légales et de vos profils sociaux, et vous pouvez consulter ou affiner chaque section directement en ligne. [En savoir plus](mail-brand) - **Prédictions dans Adapty UA** : Revenu prédit, ROAS, profit publicitaire, ARPU et ARPPU pour chaque cohorte, afin de comparer vos campagnes avant qu'elles n'aient eu le temps de mûrir. Les prédictions sont construites à partir des données historiques de cohortes de votre application, mises à jour quotidiennement, et disponibles pour des périodes de cohorte allant de D0 à D360 ou un jour personnalisé. [En savoir plus](ua-predicted-metrics) - **Nouveaux champs dans l'export S3 personnalisé Adapty UA** : L'export S3 personnalisé inclut désormais `bundle_id`, `device_brand`, `device_model`, `os_version`, `app_version` et `sdk_version`. Segmentez et croisez les données d'attribution par appareil et version d'application en aval. [En savoir plus](ua-custom-s3) - **Audiences de placement dans la CLI** : Les commandes `adapty placements create` et `adapty placements update` acceptent désormais un flag `--audiences` — un tableau JSON d'entrées `{segment_ids, paywall_id, priority}` — afin de cibler différents paywalls vers différents segments depuis le terminal. La nouvelle commande `adapty paywalls placements` liste tous les placements qui utilisent un paywall donné, vous permettant de prévisualiser l'impact avant de le remplacer. [En savoir plus](developer-cli-reference#placements) - **Documentation en espagnol** : La documentation Adapty est désormais disponible en espagnol (Español). Changez de langue via le sélecteur de langue dans la navigation en haut de page. ## Avril 2026 \{#april-2026\} - **Adapty Mail** : campagnes e-mail générées par IA pour convertir les utilisateurs en période d'essai en abonnés payants. Créez, envoyez et attribuez des campagnes depuis votre projet Adapty — aucune plateforme e-mail tierce requise. [En savoir plus](adapty-mail) - **Diagnostic de Paywall avec Autopilot** : Découvrez ce qui doit être amélioré sur votre paywall avant de lancer un test. Importez une capture d'écran et Autopilot vous renvoie des recommandations basées sur les benchmarks des applications les plus performantes de votre catégorie, ainsi que des suggestions de mise en page et de contenu générées par l'IA. Les recommandations issues des benchmarks deviennent des rounds de test A/B dans votre plan de croissance. [En savoir plus](autopilot-analysis#paywall-analysis) - **Des indications plus claires pour chaque suggestion Autopilot** : Chaque hypothèse précise désormais pourquoi elle est importante (une explication basée sur les données montrant comment votre paywall s'écarte des tendances établies), ce qu'il faut modifier et comment configurer le test A/B, ainsi que les métriques à surveiller dans une nouvelle section « Comment interpréter vos résultats ». [En savoir plus](autopilot-execute-plan#step-1-view-the-hypothesis) - **Gardez votre plan de croissance Autopilot à jour** : actualisez l'analyse pour intégrer les dernières données du marché et les nouvelles suggestions, et consultez les suggestions précédentes dans l'historique des versions si les nouvelles ne correspondent pas. Les hypothèses sont regroupées dans les onglets Top priority, All, Pricing, Visual, Geo-pricing et Archived. [En savoir plus](autopilot-growth-plan) - **Distribution des revenus par durée dans Autopilot** : Voyez si vos revenus sont trop concentrés sur une seule durée d'abonnement. Un nouveau graphique Market Insights affiche la répartition de vos revenus par durée, aux côtés de la moyenne du secteur pour votre catégorie et votre pays. [En savoir plus](autopilot-analysis#revenue-distribution-by-duration) - **Prédictions LTV et revenus mises à jour** : Les prédictions de LTV et de revenus utilisent désormais les données de rétention de cohorte de votre propre application lorsque l'historique est suffisant, et des moyennes inter-applications sinon — ainsi, même les applications plus récentes obtiennent des prévisions exploitables dans les analyses et les tests A/B. [En savoir plus](predicted-ltv-and-revenue) - **Envoyer tous les événements dans Adapty UA** : Donnez à Meta et TikTok une image plus complète des conversions pour un modélisation d'audience plus précise. Adapty prend désormais en charge le transfert des installations et des transactions des utilisateurs organiques et non attribués vers votre pixel, pas seulement les utilisateurs associés à une campagne. [Meta](ua-facebook#send-all-events) | [TikTok](ua-tiktok#send-all-events) - **Documentation en russe et en turc** : La documentation Adapty est désormais disponible en russe (Русский) et en turc (Türkçe). Changez de langue à l'aide du sélecteur de langue dans la navigation supérieure. ## Mars 2026 \{#march-2026\} - **CLI développeur** : Gérez votre compte Adapty depuis le terminal sans ouvrir le Dashboard. Le CLI vous permet de créer des applications, de définir des niveaux d'accès, de configurer des produits, de créer des paywalls et de configurer des placements — le tout scriptable pour les environnements automatisés. Une [compétence Adapty CLI](https://github.com/adaptyteam/adapty-cli/tree/main/skills/adapty-cli) est également disponible pour aider les assistants de codage IA à utiliser le CLI. [En savoir plus](developer-cli) - **Page Aperçu dans Apple Ads Manager** : Consultez toutes les métriques clés d'Apple Ads en un seul endroit, chacune accompagnée d'un graphique de tendance. Filtrez par application via le menu déroulant de l'en-tête, personnalisez les métriques affichées et ajustez le type de graphique et l'affichage des revenus. [En savoir plus](ads-manager-overview) - **Market Intelligence dans Apple Ads Manager** : Découvrez sur quels mots-clés vos concurrents diffusent des publicités dans plus de 50 pays, et ajoutez directement les mots-clés les plus performants à vos campagnes. [En savoir plus](ads-manager-market-intelligence) - **Automations complètes de mots-clés dans Apple Ads Manager** : Ajustez automatiquement les enchères, mettez en pause ou activez des mots-clés, et déplacez-les entre des groupes d'annonces selon des règles de performance que vous définissez. [En savoir plus](ads-manager-automations-keyword-rules) - **Historique des enchères dans Apple Ads Manager** : Consultez le journal complet des modifications pour l'enchère CPT de n'importe quel mot-clé — quand chaque modification a eu lieu, les valeurs précédente et nouvelle, et quelle règle d'automatisation l'a déclenchée. [En savoir plus](ads-manager-manage-keywords#bid-history) - **Rounds visuels dans Autopilot** : Les suggestions de design de paywall sont désormais des rounds à part entière dans votre plan de croissance — listés dans la barre latérale aux côtés des rounds de monétisation. Chaque round visuel inclut une maquette de design, une description des cas où le pattern fonctionne le mieux, et les métriques clés qu'il cible. [En savoir plus](autopilot-growth-plan) - **Ajoutez votre propre hypothèse à l'Autopilot** : Complétez votre plan de croissance avec des rounds personnalisés. Ajoutez un titre, une description, un type de round (monétisation ou visuel), des métriques cibles et — pour les rounds de monétisation — les produits concernés. [En savoir plus](autopilot-growth-plan#add-your-own-hypothesis) - **Réorganisez les rounds de l'Autopilot** : Faites glisser et réorganisez les étapes de votre plan de croissance pour lancer les expériences dans l'ordre qui correspond le mieux à votre stratégie. [En savoir plus](autopilot) - **La tarification géographique dans Autopilot** : testez des changements de prix spécifiques à chaque pays sous forme d'un nouveau type de round dans votre plan de croissance. Sur la base des données de Market Insights, Autopilot recommande d'augmenter, de diminuer ou de maintenir les prix dans chaque pays. Ajoutez une recommandation comme round de tarification géographique pour la lancer en test A/B — jusqu'à 5 peuvent être exécutés simultanément. [En savoir plus](autopilot-growth-plan#geo-pricing-hypotheses) - **Automatisations des termes de recherche dans Apple Ads Manager** : Promouvez automatiquement les termes de recherche gagnants en mots-clés à correspondance exacte et négativez-les à la source — sans téléchargement manuel de rapports. Les règles peuvent être créées à partir de modèles ou construites de zéro avec des conditions et des planifications personnalisées. [En savoir plus](ads-manager-automations-search-terms) - **Enchères Maximize Conversions dans Apple Ads Manager** : lors de la création de campagnes, vous pouvez désormais sélectionner Maximize Conversions comme stratégie d'enchères. L'algorithme d'Apple maximise les téléchargements dans les limites de votre budget, guidé par un CPA cible optionnel. [En savoir plus](ads-manager-create-campaign) - **Intégration FunnelFox dans Adapty UA** : une nouvelle intégration avec FunnelFox est désormais disponible dans Adapty UA. [FunnelFox](ua-funnelfox) - **Documentation en chinois** : la documentation Adapty est désormais disponible en chinois (中文). Changez de langue via le sélecteur de langue dans la navigation supérieure. ## Février 2026 \{#february-2026\} - **Tarification des produits par pays** : Définissez des prix différents par pays directement dans l'Adapty Dashboard — Adapty synchronise automatiquement les modifications vers l'App Store Connect et Google Play. Chaque mise à jour de tarification est consignée dans le journal d'audit, afin qu'aucune modification ne passe inaperçue. [En savoir plus](edit-product) - **Tarification des concurrents par pays dans Autopilot** : Comparez vos prix d'abonnement avec ceux de vos concurrents sur vos principaux marchés. [En savoir plus](autopilot-analysis#market-and-competitor-analysis) - **Contrôle de version des onboardings** : Suivez et gérez les versions de vos onboardings avec un historique complet. Consultez les modifications et effectuez des retours en arrière si nécessaire. - **Graphiques de conversion des paywalls dans les analytics** : Deux nouveaux graphiques de conversion — Paywall view → Trial et Paywall view → Paid — montrent comment vos paywalls convertissent les visiteurs en abonnés. [En savoir plus](analytics-conversion) - **Dupliquer des segments** : Copiez un segment existant avec tous ses filtres au lieu de reconstruire un segment similaire de zéro. Utile lorsque vous gérez plusieurs campagnes ou tests A/B avec des audiences qui se recoupent. [En savoir plus](segments#duplicate-segments) - **Notifications push dans l'application mobile Adapty** : Configurez des notifications push pour 14 types d'événements directement dans l'application iOS Adapty pour suivre l'activité des abonnements sans ouvrir le tableau de bord. [En savoir plus](push-notifications) - **Kotlin Multiplatform SDK 3.15** : Ajoute la prise en charge des onboardings, des paywalls web et des améliorations d'API. [En savoir plus](migration-to-kmp-315) - **Capacitor SDK 3.16** : Ajoute la prise en charge de Capacitor 8. Les projets utilisant Capacitor 7 doivent rester sur le SDK v3.15. [En savoir plus](migration-to-capacitor-316) - **Guides d'intégration du SDK assistés par LLM** : Guides pas à pas pour intégrer Adapty avec l'aide d'assistants de code IA. Chaque guide accompagne votre LLM tout au long de l'implémentation, de la configuration du tableau de bord aux achats. [iOS](adapty-cursor) | [Android](adapty-cursor-android) | [React Native](adapty-cursor-react-native) | [Flutter](adapty-cursor-flutter) | [Unity](adapty-cursor-unity) | [Kotlin Multiplatform](adapty-cursor-kmp) | [Capacitor](adapty-cursor-capacitor). Pour un flow entièrement automatisé en une seule commande, essayez le nouveau skill **adapty-sdk-integration** (bêta) : [iOS](adapty-sdk-integration-skill) | [Android](adapty-sdk-integration-skill-android) | [React Native](adapty-sdk-integration-skill-react-native) | [Flutter](adapty-sdk-integration-skill-flutter) | [Unity](adapty-sdk-integration-skill-unity) | [Kotlin Multiplatform](adapty-sdk-integration-skill-kmp) | [Capacitor](adapty-sdk-integration-skill-capacitor) ## Janvier 2026 \{#january-2026\} - **SDK Capacitor officiellement disponible** : Le SDK Capacitor est désormais prêt pour la production après des tests approfondis. Créez des applications d'abonnement pour iOS et Android avec Capacitor et une intégration Adapty complète. [En savoir plus](capacitor-sdk-overview) - **Autopilot pour les nouvelles applications** : L'analyse Autopilot est maintenant disponible même si votre application ne dispose pas encore d'un historique de transactions conséquent. Obtenez des recommandations d'optimisation des prix basées sur les données et élaborez votre plan de croissance dès le premier jour. [En savoir plus](autopilot) - **Opportunités de tarification mondiale dans Autopilot** : Identifiez le potentiel de revenus sur vos marchés les plus performants grâce à des recommandations de prix par pays. Autopilot analyse les taux de conversion et le pouvoir d'achat pour vos 5 prochains pays les plus importants, en fournissant des insights basés sur les données pour savoir s'il faut augmenter, diminuer ou maintenir les prix en fonction de l'Adapty Pricing Index. [En savoir plus](autopilot) - **Métriques de conversion pour la récupération de facturation** : De nouveaux graphiques analytiques permettent de suivre les revenus récupérés suite à des problèmes de facturation et des délais de grâce. Surveillez « Billing issue converted », « Billing issue converted revenue », « Grace period converted » et « Grace period converted revenue » pour mesurer vos efforts de rétention. - **Gestion directe des publicités dans Apple Ads Manager** : Créez et gérez vos campagnes Apple Ads directement dans Adapty, sans passer d'une plateforme à l'autre. [En savoir plus](ads-manager-manage-ads) - **Analyse avec Apple Ads Manager** : Accédez à des métriques de performance détaillées au niveau des annonces et à des données d'attribution dans Adapty. Consultez les performances des campagnes, les analyses de groupes d'annonces et les informations d'attribution dans un tableau de bord unifié. [En savoir plus](adapty-ads-manager-analytics) - **Graphiques d'attribution Apple Ads** : Combinez plusieurs métriques d'attribution dans des graphiques personnalisables pour analyser vos performances Apple Ads avec vos données d'abonnement. [En savoir plus](adapty-ads-manager-analytics#charts) - **Segments d'attribution Apple Ads** : Créez des segments d'utilisateurs basés sur les données d'attribution Apple Ads grâce à un processus simplifié en deux clics. Ciblez les utilisateurs par campagne, groupe d'annonces ou mot-clé pour des analyses et des expériences plus précises. [En savoir plus](ads-manager-create-segments) - **Nouvelle plateforme de documentation** : Le site de documentation a été migré vers une nouvelle plateforme, permettant des mises à jour de fonctionnalités plus rapides et une meilleure expérience utilisateur avec une recherche, une navigation et une organisation du contenu améliorées. ## Décembre 2025 \{#december-2025\} - **Documentation Apple Ads Manager** : Combinez les données de vos campagnes Apple Search Ads avec vos métriques de revenus dans un seul tableau de bord d'analyse. La nouvelle documentation couvre la création de campagnes, la gestion des groupes d'annonces et les moyens de suivre le retour sur investissement de vos dépenses publicitaires en parallèle des performances de vos abonnements. [En savoir plus](ads-manager) - **Paywalls web intégrés** : Affichez des paywalls web directement dans votre application via un navigateur intégré, pour une expérience fluide sans redirection externe. [iOS](ios-web-paywall#open-web-paywalls-in-an-in-app-browser) | [Android](android-web-paywall#open-web-paywalls-in-an-in-app-browser) | [React Native](react-native-web-paywall#open-web-paywalls-in-an-in-app-browser) | [Flutter](flutter-web-paywall#open-web-paywalls-in-an-in-app-browser) - **Segments dynamiques** : Créez des segments d'audience dynamiques qui se mettent à jour automatiquement en fonction de fenêtres temporelles glissantes. Par exemple, créez un segment pour « les utilisateurs qui ont installé l'application au cours des 7 derniers jours » qui se rafraîchit en continu pour toujours afficher vos nouveaux clients. [En savoir plus](segments#available-attributes) - **Guides de configuration des campagnes Meta et TikTok** : Documentation pas à pas pour créer et suivre des campagnes sur Meta (Facebook & Instagram) et TikTok, avec le suivi des conversions et l'intégration analytique. [Meta](meta-create-campaign) | [TikTok](tiktok-create-campaign) - **Guides de démarrage rapide pour l'implémentation manuelle des paywalls** : Intégrez les achats intégrés plus rapidement grâce à des guides pas à pas qui vous montrent comment intégrer le SDK Adapty dans votre UI de paywall personnalisée. [iOS](ios-implement-paywalls-manually) | [Android](android-implement-paywalls-manually) | [React Native](react-native-implement-paywalls-manually) | [Flutter](flutter-implement-paywalls-manually) | [Unity](unity-implement-paywalls-manually) | [Kotlin Multiplatform](kmp-quickstart-manual) | [Capacitor](capacitor-quickstart-manual) - **Navigateur intégré pour les liens d'onboarding** : Les liens externes dans les onboardings s'ouvrent désormais dans un navigateur intégré par défaut, ce qui maintient les utilisateurs dans votre application. Vous pouvez personnaliser ce comportement pour utiliser des navigateurs externes si nécessaire. [iOS](ios-present-onboardings#customize-how-links-open-in-onboardings) | [Android](android-present-onboardings#customize-how-links-open-in-onboardings) | [React Native](react-native-present-onboardings#customize-how-links-open-in-onboardings) - **Suggestions Autopilot améliorées** : Autopilot fournit désormais de meilleures recommandations d'optimisation des prix grâce à une analyse plus poussée de vos données d'abonnement. [Essayer Autopilot](autopilot) - **Mode sombre pour la documentation** : La documentation prend désormais en charge le mode sombre, avec détection automatique des préférences système ou bascule manuelle en haut à droite. --- # File: adapty-ecosystem --- --- title: "L'écosystème Adapty" description: "Adapty est une plateforme d'achats intégrés pour les applications mobiles. Découvrez ce que fait chaque produit et comment ils s'articulent." --- Adapty est une plateforme d'achats intégrés pour les applications mobiles, construite autour d'une seule mission : rendre les applications rentables. Elle vous donne tout ce qu'il faut pour développer vos revenus : acquérir des utilisateurs, les convertir, les fidéliser, et récupérer ceux qui partent. Une seule inscription vous donne accès à l'ensemble de l'écosystème Adapty dès le premier jour. Cliquez simplement sur le logo Adapty pour passer d'un produit à l'autre : - **Core** — traitez les achats sans toucher à StoreKit ou Google Play Billing, concevez des paywalls sans code, et suivez vos revenus en temps réel. Les autres produits s'appuient sur cette base. - **Adapty Ads Manager** — lancez et optimisez Apple Ads, mesurés par rapport aux revenus d'abonnement réels. - **Adapty Attribution** — identifiez quels canaux publicitaires génèrent vraiment des revenus, sans MMP. - **Adapty Mail** — convertissez les essais et récupérez les utilisateurs perdus grâce à des emails automatisés. Deux autres produits complètent ces quatre principaux : **FunnelFox** (funnels web-to-app et paiement hébergé) et **Adapty Finance** (avances sur vos futurs revenus d'abonnement). ## Comment les produits s'articulent \{#how-the-products-fit-together\} Chaque produit intervient à un moment différent du cycle de vie du client. Survolez n'importe quelle fonctionnalité liée pour une définition rapide, ou cliquez pour accéder à sa documentation.
3. Dans la fenêtre **Generate In-App Purchase Key** qui s'ouvre, saisissez le nom de la clé pour votre référence future. Il ne sera pas utilisé dans Adapty.
4. Cliquez sur le bouton **Generate**. Une fois la fenêtre **Generate in-App Purchase Key** fermée, la clé créée apparaîtra dans la liste **Active**.
5. Une fois votre clé API générée, cliquez sur le bouton **Download In-App Purchase Key** pour obtenir la clé sous forme de fichier.
6. Dans la fenêtre **Download in-App Purchase Key**, cliquez sur le bouton **Download**. Le fichier est enregistré sur votre ordinateur.
Il est essentiel de conserver ce fichier en lieu sûr pour le téléverser ultérieurement sur l'Adapty Dashboard. Notez que le fichier généré ne peut être téléchargé qu'une seule fois ; veillez donc à le stocker en sécurité jusqu'au moment du téléversement. La clé .p8 générée depuis la section **In-App Purchase** sera utilisée lors de la [configuration de l'intégration initiale d'Adapty avec l'App Store](app-store-connection-configuration#step-3-upload-in-app-purchase-key-file).
**Étapes suivantes :**
- [Configurer l'intégration App Store](app-store-connection-configuration)
---
# File: app-store-connection-configuration
---
---
title: "Configurer l'intégration App Store"
description: "Configurez votre connexion App Store pour un suivi fluide des abonnements."
---
3. Copiez l'**Issuer ID** et collez-le dans le champ **In-app purchase Issuer ID** de l'Adapty Dashboard.
4. Copiez le **Key ID** et collez-le dans le champ **In-app purchase Key ID** de l'Adapty Dashboard.
## Étape 3. Téléverser le fichier de clé d'achat intégré \{#step-3-upload-in-app-purchase-key-file\}
Téléversez le fichier **In-App Purchase Key** que vous avez téléchargé dans la section [Générer une clé d'achat intégré dans App Store Connect](generate-in-app-purchase-key)
dans le champ **Private key (.p8 file)** de l'Adapty Dashboard.
## Étape 4. Pour les essais et offres spéciales – configurer les offres promotionnelles \{#step-4-for-trials-and-special-offers--set-up-promotional-offers\}
:::important
Cette étape est obligatoire si votre application propose des [essais ou d'autres offres promotionnelles](offers).
:::
1. Copiez le même Key ID que celui utilisé à l'[Étape 2](#step-2-provide-issuer-id-and-key-id) dans le champ **Subscription key ID** de la section **App Store promotional offers**.
2. Téléversez le même fichier **In-App Purchase Key** que celui utilisé à l'[Étape 3](#step-3-upload-in-app-purchase-key-file) dans la zone **Subscription key (.p8 file)** de la section **App Store promotional offers**.
## Étape 5. Saisir le secret partagé App Store \{#step-5-enter-app-store-shared-secret\}
Le **secret partagé App Store**, aussi appelé App Store Connect Shared Secret, est une chaîne hexadécimale de 32 caractères utilisée pour la validation des reçus d'achats intégrés et d'abonnements.
1. Ouvrez [App Store Connect](https://appstoreconnect.apple.com/apps). Sélectionnez votre application et accédez à la section **General** → **App Information**.
2. Faites défiler jusqu'à la sous-section **App-Specific Shared Secret**.
:::info
Si la sous-section **App-Specific Shared Secret** est absente, assurez-vous d'avoir le rôle Account Holder ou Admin. Si vous avez le rôle Admin mais ne voyez toujours pas la sous-section **App-Specific Shared Secret**, demandez à l'Account Holder de l'application (la personne qui a créé l'application dans App Store Connect) de générer le secret partagé App Store pour l'application. Après cela, la sous-section sera également visible par les Admins.
:::
3. Cliquez sur le bouton **Manage**.
4. Dans la fenêtre **App-Specific Shared Secret** qui s'ouvre, copiez le **Shared Secret**. Si aucun secret partagé n'est visible, cliquez d'abord sur le bouton **Manage** ou **Generate** (selon celui qui est disponible), puis copiez le **Shared Secret**.
5. Collez le **Shared Secret** copié dans le champ **App Store shared secret** de l'Adapty Dashboard.
6. Cliquez sur le bouton **Save** dans l'Adapty Dashboard pour confirmer les modifications.
## Étape 6. Ajouter une clé API App Store Connect \{#step-6-add-app-store-connect-api-key\}
Générez une clé API App Store Connect et ajoutez-la à Adapty pour pouvoir [gérer vos produits dans l'App Store depuis le tableau de bord Adapty](create-product#create-product-and-push-to-store) :
1. Dans App Store Connect, accédez à [**Users and Access > Integrations > Team keys**](https://appstoreconnect.apple.com/access/integrations/api) et cliquez sur **+**.
2. Dans la fenêtre **Generate API key**, saisissez un nom pour la clé et accordez-lui l'accès **Admin**.
3. Cliquez sur **Download** à côté de votre clé. Notez que vous ne pouvez la télécharger qu'une seule fois.
4. Dans le tableau de bord Adapty, accédez à [**App settings > iOS SDK**](https://app.adapty.io/settings/ios-sdk) et cliquez sur **Connect API key**.
5. Remplissez les champs dans la fenêtre :
- **Issuer ID** : copiez depuis [**Users and Access > Integrations > Team keys**](https://appstoreconnect.apple.com/access/integrations/api). Il se trouve au-dessus du tableau **API keys**.
- **Key ID** : copiez depuis [**Users and Access > Integrations > Team keys**](https://appstoreconnect.apple.com/access/integrations/api). Il se trouve dans le tableau **API keys**, à côté de votre clé.
- **API key** : téléversez le fichier de clé API que vous avez téléchargé depuis App Store Connect.
6. Cliquez sur **Connect**.
**Étape suivante**
- [Activer les notifications serveur App Store](enable-app-store-server-notifications)
---
# File: enable-app-store-server-notifications
---
---
title: "Activer les notifications serveur de l'App Store"
description: "Activez les notifications serveur de l'App Store pour suivre les événements d'abonnement en temps réel."
---
La configuration des notifications serveur de l'App Store est essentielle pour garantir la précision des données : elle vous permet de recevoir instantanément les mises à jour de l'App Store, notamment les informations sur les remboursements et d'autres événements.
:::important
Adapty iOS SDK 2.10.0 ou version ultérieure est requis pour la prise en charge complète des notifications serveur App Store V2.
:::
1. Copiez l'**URL pour les notifications serveur App Store** dans l'Adapty Dashboard.
2. Ouvrez [App Store Connect](https://appstoreconnect.apple.com/apps). Sélectionnez votre application et accédez à la section **General** → **App Information**, sous-section **App Store Server Notifications**.
3. Collez l'**URL pour les notifications serveur App Store** copiée dans les champs **Production Server URL** et **Sandbox Server URL**.
## Transfert des événements bruts \{#raw-events-forwarding\}
Il peut arriver que vous souhaitiez tout de même recevoir les événements S2S bruts d'Apple. Pour continuer à les recevoir tout en utilisant Adapty, ajoutez simplement votre point de terminaison dans le champ **URL for forwarding raw Apple events** et nous vous transmettrons les événements bruts tels quels depuis Apple.
**Étapes suivantes**
Configurez le SDK Adapty pour :
- [iOS](sdk-installation-ios)
- [React Native](sdk-installation-reactnative)
- [Flutter](sdk-installation-flutter)
- [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)
- [Unity](sdk-installation-unity)
---
# File: troubleshoot-app-store-integration
---
---
title: "Résoudre les problèmes d'intégration App Store"
description: "Résolvez les problèmes courants de configuration Apple App Store — accords en attente, délais de notifications serveur et incohérences de prix."
---
Cet article couvre les problèmes courants d'intégration App Store. Chaque section liste les symptômes, la cause racine et la résolution.
## Les produits n'apparaissent pas \{#products-dont-appear\}
Deux symptômes différents pointent vers la même cause racine :
- La clé API App Store Connect est correctement configurée, mais Adapty ne parvient pas à récupérer les produits.
- Les produits existent dans App Store Connect mais n'apparaissent pas dans Adapty, ou moins de produits que prévu s'affichent. Le SDK signale « Product Id not found » lors d'une tentative d'achat.
La cause racine la plus fréquente est **des accords Apple non signés** — l'accord payant, les formulaires fiscaux ou bancaires en attente ou non signés. Lorsque des accords sont en attente, l'API App Store Connect renvoie silencieusement une erreur 403 sur les endpoints liés aux produits. Aucune erreur claire ne remonte à Adapty ; les produits sont silencieusement filtrés.
Rendez-vous dans **App Store Connect → Agreements, Tax, and Banking** et signez tous les accords en attente. Ensuite, effectuez une nouvelle synchronisation dans **App settings → iOS SDK** d'Adapty.
## Les notifications serveur App Store affichent « Delayed » \{#app-store-server-notifications-show-delayed\}
Dans App Store Connect, le statut des App Store Server Notifications peut afficher **Delayed**. Cela signifie qu'Apple prend du retard dans l'envoi des notifications d'événements d'abonnement — les renouvellements, annulations et problèmes de facturation sont mis en file d'attente et arrivent en retard.
Les statistiques d'installation ne sont pas affectées. Adapty comptabilise les installations à partir du premier lancement de l'application, pas à partir des notifications côté serveur.
Si les données de renouvellement ou d'annulation accusent un retard, le statut Delayed en est très probablement la cause. Ce statut se résorbe généralement automatiquement lorsqu'Apple traite la file d'attente.
## Les prix dans Adapty ne correspondent pas à l'App Store \{#prices-in-adapty-dont-match-app-store\}
Le champ **price** sur la page d'édition du produit dans Adapty se comporte différemment selon la façon dont le produit a été ajouté.
Si vous créez un produit dans Adapty et que vous le publiez sur le store depuis le tableau de bord, ce prix est utilisé comme prix initial sur le store.
Si vous ajoutez un produit qui existe déjà sur le store, ce prix est un espace réservé. Les analyses, intégrations et SDK d'Adapty utilisent les prix réels récupérés depuis l'App Store, quoi qu'il en soit. Les modifications de prix sur l'App Store ne se synchronisent pas pour mettre à jour cet espace réservé, et il n'est pas possible de le modifier depuis le tableau de bord pour l'instant.
## L'export CSV des prix est vide \{#csv-price-export-is-empty\}
Si votre export CSV des prix ne contient que les en-têtes de colonnes, c'est que votre clé API App Store Connect n'est pas entièrement configurée. Consultez [Étape 6 — Ajouter la clé API App Store Connect](app-store-connection-configuration#step-6-add-app-store-connect-api-key).
## Impossible de publier de nouveaux produits sur l'App Store \{#cant-push-new-products-to-app-store\}
Adapty peut publier de nouveaux produits sur App Store Connect lorsque vous les créez dans le tableau de bord. L'option de publication est bloquée si votre intégration App Store n'est pas entièrement configurée. Deux paramètres sont requis :
- **Apple app ID** : configurez-le à l'[Étape 1 — Renseigner le Bundle ID et l'Apple app ID](app-store-connection-configuration#step-1-provide-bundle-id-and-apple-app-id).
- **App Store Connect API key** : configurez-la à l'[Étape 6 — Ajouter la clé API App Store Connect](app-store-connection-configuration#step-6-add-app-store-connect-api-key).
---
# File: initial-android
---
---
title: "Intégration initiale avec Google Play"
description: "Démarrez avec Adapty sur Android et configurez votre application pour une gestion efficace des abonnements."
---
Nous sommes ravis de vous accueillir chez Adapty ! Notre priorité est de vous aider à démarrer rapidement et à obtenir les meilleurs résultats possibles. Ce guide est conçu pour vous aider à démarrer avec Adapty si votre application est disponible dans le Google Play Store.
L'intégration d'Adapty dans votre application mobile implique d'établir des connexions entre votre application et Adapty, aussi bien au niveau de Google Play qu'au niveau du SDK. Si le processus peut paraître long, suivre le guide intégré dans l'Adapty Dashboard ou les instructions ci-dessous le simplifiera grandement — cela prend en général moins d'une heure.
3. Ouvrez la page [**Google Play Android Developer API**](https://console.cloud.google.com/apis/library/androidpublisher.googleapis.com).
4. Cliquez sur le bouton **Enable** et attendez que le statut **Enabled** s'affiche. Cela signifie que l'API Google Android Developer est activée.
5. Ouvrez la page [**Google Play Developer Reporting API**](https://console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com).
6. Cliquez sur le bouton **Enable** et attendez que le statut **Enabled** s'affiche.
7. Ouvrez la page [**Cloud Pub/Sub API**](https://console.cloud.google.com/marketplace/product/google/pubsub.googleapis.com).
8. Cliquez sur le bouton **Enable** et attendez que le statut **Enabled** s'affiche.
Les API Développeur sont activées.
Vous pouvez le vérifier sur la page [**APIs & Services**](https://console.cloud.google.com/apis/dashboard) de la Google Cloud Console. Faites défiler la page vers le bas et vérifiez que le tableau en bas de page contient bien les 3 API :
- Google Play Android Developer API
- Google Play Developer Reporting API
- Cloud Pub/Sub API
**Étape suivante**
- [Créer un compte de service dans la Google Cloud Console](create-service-account)
---
# File: create-service-account
---
---
title: "Créer un compte de service dans la Google Cloud Console"
description: "Apprenez à créer un compte de service pour un accès API sécurisé dans Adapty."
---
Pour qu'Adapty puisse automatiser l'accès aux données, un compte de service est nécessaire dans la Google Play Console.
1. Ouvrez la section [**IAM & Admin** - > **Service accounts**](https://console.cloud.google.com/iam-admin/serviceaccounts) de la Google Cloud Console. Assurez-vous d'utiliser le bon projet.
2. Dans la fenêtre **Service accounts**, cliquez sur le bouton **Create service account**.
3. Dans la sous-section **Service account details** de la fenêtre **Create service account**, saisissez le **Service Account Name** de votre choix. Nous recommandons d'inclure « Adapty » dans le nom pour indiquer l'objectif de ce compte. Le **Service account ID** sera créé automatiquement.
4. Copiez l'adresse e-mail du compte de service et conservez-la pour une utilisation ultérieure.
5. Cliquez sur le bouton **Create and continue**.
6. Dans la liste déroulante **Select a role** de la sous-section **Grant this service account access to project**, sélectionnez **Pub/Sub -> Pub/Sub Admin**. Ce rôle est requis pour activer les notifications en temps réel destinées aux développeurs.
7. Cliquez sur le bouton **Add another role**.
8. Dans la nouvelle liste déroulante **Role**, sélectionnez **Monitoring -> Monitoring Viewer**. Ce rôle est requis pour permettre la surveillance de la file d'attente des notifications.
9. Cliquez sur le bouton **Continue**.
10. Cliquez sur le bouton **Done** sans apporter de modifications. La fenêtre **Service accounts** s'ouvre.
**Étape suivante**
- [Accorder des permissions au compte de service dans la Google Play Console](grant-permissions-to-service-account)
---
# File: grant-permissions-to-service-account
---
---
title: "Accorder des permissions au compte de service dans la Google Play Console"
description: "Accordez des permissions aux comptes de service pour un accès API sécurisé et efficace."
---
Accordez les permissions requises au compte de service qu'Adapty utilisera pour gérer les abonnements et valider les achats.
1. Ouvrez la page [**Users and permissions**](https://play.google.com/console/u/0/developers/8970033217728091060/users-and-permissions) dans la Google Play Console et cliquez sur le bouton **Invite new users**.
2. Sur la page **Invite user**, saisissez l'adresse e-mail des utilisateurs de service que vous avez créés.
3. Passez à l'onglet **Account permissions**.
4. Sélectionnez les permissions suivantes :
- View app information and download bulk reports (read-only)
- View financial data, orders, and cancellation survey responses
- Manage orders and subscriptions
- Manage store presence
5. Cliquez sur le bouton **Invite user**.
6. Dans la fenêtre **Send invite?**, cliquez sur le bouton **Send invite**. Le compte de service apparaîtra dans la liste des utilisateurs.
**Prochaines étapes**
- [Générer le fichier de clé du compte de service dans la Google Play Console](create-service-account-key-file)
---
# File: create-service-account-key-file
---
---
title: "Générer un fichier de clé de compte de service dans la Google Play Console"
description: "Découvrez comment créer un fichier de clé de compte de service pour une intégration fluide avec Adapty."
---
Pour relier votre application mobile sur le Play Store à Adapty, vous devez générer des fichiers de clé de compte de service spéciaux dans la Google Play Console et les téléverser dans Adapty. Ces fichiers sécurisent votre application et empêchent les accès non autorisés.
:::warning
Il faut généralement au moins 24 heures pour que votre nouveau compte de service devienne actif. Il existe cependant une [astuce](https://stackoverflow.com/a/60691844). Après avoir créé le compte de service dans la [Google Play Console](https://play.google.com/apps/publish/), ouvrez n'importe quelle application et accédez à **Monetize** -> **Products** -> **Subscriptions/In-app products**. Modifiez la description d'un produit et enregistrez les modifications. Le compte de service devrait s'activer immédiatement, et vous pourrez annuler les modifications ensuite.
:::
1. Ouvrez la section [**Service accounts**](https://console.cloud.google.com/iam-admin/serviceaccounts) dans la Google Play Console. Assurez-vous d'avoir sélectionné le bon projet.
2. Dans la fenêtre qui s'ouvre, cliquez sur **Add key** et choisissez **Create new key** dans le menu déroulant.
3. Dans la fenêtre **Create private key for [Your_project_name]**, cliquez sur **Create**. Votre clé privée sera enregistrée sur votre ordinateur sous forme de fichier JSON. Vous pouvez la retrouver grâce au nom de fichier indiqué dans la fenêtre **Private key saved to your computer**.
4. Dans la fenêtre **Create private key for Your_project_name**, cliquez sur le bouton **Create**. Cette action enregistre votre clé privée sur votre ordinateur sous forme de fichier JSON. Vous pouvez utiliser le nom de fichier indiqué dans la fenêtre **Private key saved to your computer** pour le retrouver si besoin.
Vous aurez besoin de ce fichier lors de la [configuration de l'intégration Google Play Store](google-play-store-connection-configuration).
:::warning
Il faut généralement au moins 24 heures pour que votre nouveau compte de service devienne actif. Il existe cependant une [astuce](https://stackoverflow.com/a/60691844). Après avoir créé le compte de service dans la [Google Play Console](https://play.google.com/apps/publish/), ouvrez n'importe quelle application et accédez à **Monetize** -> **Products** -> **Subscriptions/In-app products**. Modifiez la description d'un produit et enregistrez les modifications. Le compte de service devrait s'activer immédiatement, et vous pourrez annuler les modifications ensuite.
:::
**Étape suivante**
- [Configurer l'intégration Google Play Store](google-play-store-connection-configuration)
---
# File: google-play-store-connection-configuration
---
---
title: "Configurer l'intégration Google Play Store"
description: "Configurez la connexion Google Play Store dans Adapty pour une gestion fluide des achats intégrés."
---
Cette section décrit le processus d'intégration de votre application mobile distribuée via Google Play avec Adapty. Vous devrez saisir les données de configuration de votre application depuis le Play Store dans l'Adapty Dashboard. Cette étape est indispensable pour valider les achats et recevoir les mises à jour d'abonnement depuis le Play Store dans Adapty.
Vous pouvez effectuer cette démarche lors de l'onboarding initial ou apporter des modifications ultérieurement dans les **App Settings** de l'Adapty Dashboard.
:::danger
La modification de la configuration n'est acceptable qu'avant la publication de votre application mobile intégrant les paywalls Adapty. Toute modification après la publication cassera l'intégration et les paywalls cesseront de s'afficher dans votre application.
:::
## Étape 1. Renseigner le nom de package \{#step-1-provide-package-name\}
Le nom de package est l'identifiant unique de votre application dans le Google Play Store. Il est nécessaire au fonctionnement de base d'Adapty, notamment pour le traitement des abonnements.
1. Ouvrez la [Google Play Developer Console](https://play.google.com/console/u/0/developers).
2. Sélectionnez l'application dont vous avez besoin de l'identifiant. La fenêtre **Dashboard** s'ouvre.
3. Trouvez l'identifiant produit sous le nom de l'application et copiez-le.
4. Ouvrez les [**App settings**](https://app.adapty.io/settings/android-sdk) depuis le menu supérieur d'Adapty.
5. Dans l'onglet **Android SDK** de la fenêtre **App settings**, collez le **Package name** copié.
## Étape 2. Importer le fichier de clé de compte \{#step-2-upload-the-account-key-file\}
1. Importez le fichier de clé privée du compte de service au format JSON, que vous avez créé à l'étape [Créer un fichier de clé de compte de service](create-service-account), dans la zone **Service account key file**.
N'oubliez pas de cliquer sur le bouton **Save** pour confirmer les modifications.
**Étape suivante**
- [Activer les notifications en temps réel pour les développeurs (RTDN) dans la Google Play Console](enable-real-time-developer-notifications-rtdn)
---
# File: enable-real-time-developer-notifications-rtdn
---
---
title: "Activer les notifications développeur en temps réel (RTDN) dans Google Play Console"
description: "Restez informé des événements critiques et maintenez la précision des données en activant les Real-time Developer Notifications (RTDN) dans la Google Play Console pour Adapty. Découvrez comment configurer les RTDN pour recevoir des mises à jour instantanées sur les remboursements et d'autres événements importants depuis le Play Store"
---
La configuration des notifications développeur en temps réel (RTDN) est essentielle pour garantir la précision des données : elle vous permet de recevoir instantanément les mises à jour du Play Store, notamment les informations sur les remboursements et d'autres événements.
## Activer les notifications \{#enable-notifications\}
1. Assurez-vous que **Google Cloud Pub/Sub** est activé. Ouvrez [ce lien](https://console.cloud.google.com/flows/enableapi?apiid=pubsub) et sélectionnez votre projet d'application. Si vous n'avez pas encore activé **Google Cloud Pub/Sub**, vous devez le faire ici.
2. Accédez à [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) depuis le menu supérieur d'Adapty et copiez le contenu du champ **Enable Pub/Sub API** situé à côté du titre **Google Play RTDN topic name**.
:::note Si le contenu du champ **Enable Pub/Sub API** est dans un format incorrect (le format correct commence par `projects/...`), consultez la section [Corriger le format incorrect du champ Enable Pub/Sub API](enable-real-time-developer-notifications-rtdn#fixing-incorrect-format-in-enable-pubsub-api-field) pour obtenir de l'aide. ::: 3. Ouvrez la [Google Play Console](https://play.google.com/console/), choisissez votre application et accédez à **Monetize with Play** -> **Monetization setup**. Dans la section **Google Play Billing**, cochez la case **Enable real-time notifications**. 4. Collez le contenu du champ **Enable Pub/Sub API** que vous avez copié dans les **App Settings** d'Adapty dans le champ **Topic name**. 5. Cliquez sur **Save changes** dans la Google Play Console.
## Tester les notifications \{#test-notifications\}
Pour vérifier que vous êtes bien abonné aux notifications développeur en temps réel :
1. Enregistrez les modifications dans les paramètres de la Google Play Console.
2. Sous **Topic name** dans la Google Play Console, cliquez sur **Send test notification**.
3. Accédez à [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) dans Adapty. Si une notification de test a été envoyée, vous verrez son statut au-dessus du nom du sujet.
## Corriger le format incorrect du champ Enable Pub/Sub API \{#fixing-incorrect-format-in-enable-pubsub-api-field\}
Si le contenu du champ **Enable Pub/Sub API** est dans un format incorrect (le format correct commence par `projects/...`), suivez ces étapes pour diagnostiquer et résoudre le problème :
### 1. Vérifier l'activation de l'API et les autorisations \{#1-verify-api-enablement-and-permissions\}
Assurez-vous soigneusement que toutes les API requises sont activées et que les autorisations sont correctement accordées au compte de service. Même si vous avez déjà effectué ces étapes, il est important de les refaire pour vous assurer qu'aucune sous-étape n'a été manquée. Répétez les étapes des sections suivantes :
1. [Activer les API développeur dans la Google Play Console](enabling-of-devepoler-api)
2. [Créer un compte de service dans la Google Cloud Console](create-service-account)
3. [Accorder des autorisations au compte de service dans la Google Play Console](grant-permissions-to-service-account)
4. [Générer le fichier de clé du compte de service dans la Google Play Console](create-service-account-key-file)
5. [Configurer l'intégration Google Play Store](google-play-store-connection-configuration)
### 2. Ajuster les politiques de domaine \{#2-adjust-domain-policies\}
Modifiez les politiques **Domain restricted contacts** et **Domain restricted sharing** :
1. Ouvrez la [Google Cloud Console](https://console.cloud.google.com/) et sélectionnez le projet dans lequel vous avez créé le compte de service pour gérer votre application.
2. Dans la section **Quick Access**, choisissez **IAM & Admin**.
3. Dans le panneau de gauche, choisissez **Organization Policies**.
4. Recherchez la politique **Domain restricted contacts**.
5. Cliquez sur le bouton représentant des points de suspension dans la colonne **Actions** et choisissez **Edit policy**.
6. Dans la fenêtre de modification de la politique :
1. Sous **Policy source**, sélectionnez le bouton radio **Override parent's policy**.
2. Sous **Policy enforcement**, sélectionnez le bouton radio **Replace**.
3. Sous **Rules**, cliquez sur le bouton **ADD A RULE**.
4. Sous **New rule** -> **Policy values**, choisissez **Allow All**.
5. Cliquez sur **SET POLICY**.
7. Répétez les étapes 4 à 6 pour la politique **Domain restricted sharing**.
Ensuite, recréez le contenu du champ **Enable Pub/Sub API** situé à côté du titre **Google Play RTDN topic name**. Le champ aura désormais le format correct.
Veillez à remettre **Policy source** sur **Inherit parent's policy** pour les politiques modifiées une fois que vous avez activé avec succès les Real-time Developer Notifications (RTDN).
## Transfert des événements bruts \{#raw-events-forwarding\}
Il peut arriver que vous souhaitiez tout de même recevoir les événements S2S bruts de Google. Pour continuer à les recevoir tout en utilisant Adapty, ajoutez simplement votre endpoint dans le champ **URL for forwarding raw Google events** et nous vous transmettrons les événements bruts tels quels depuis Google.
---
**Prochaine étape**
Configurez le SDK Adapty pour :
- [Android](sdk-installation-android)
- [React Native](sdk-installation-reactnative)
- [Flutter](sdk-installation-flutter)
- [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)
- [Unity](sdk-installation-unity)
---
# File: payment-integrations
---
---
title: "Web"
description: "Intégrez les systèmes de paiement web avec Adapty pour une gestion fluide des abonnements sur toutes les plateformes."
---
Adapty prend en charge l'intégration avec les systèmes de paiement web pour vous aider à gérer les abonnements et les achats depuis votre application mobile et votre site web en un seul endroit. Cela vous permet de :
- Centraliser les données d'abonnement des achats intégrés et des achats effectués sur votre site web dans un seul système
- Accorder l'accès aux fonctionnalités payantes de votre application mobile aux utilisateurs ayant acheté sur votre site web
- Consulter les analyses et les données d'abonnement de tous les canaux de vente dans un seul tableau de bord
Intégrations disponibles :
- [Stripe](stripe)
- [Paddle](paddle)
---
# File: stripe
---
---
title: "Intégration initiale avec Stripe"
description: "Intégrez Stripe avec Adapty pour un traitement fluide des paiements d'abonnements."
---
Adapty prend en charge les flows web2app en suivant les paiements et abonnements web effectués via [Stripe](https://stripe.com/).
Cette intégration couvre les achats initiés depuis le web (Stripe Checkout, pages de paiement hébergées ou flows web personnalisés) et les synchronise avec l'accès aux applications mobiles et les analyses.
Elle est utile dans les cas suivants :
- Accorder automatiquement l'accès aux fonctionnalités payantes aux utilisateurs qui ont acheté sur le web mais ont ensuite installé l'application et s'y sont connectés
- Centraliser toutes les analyses d'abonnements dans un seul Adapty Dashboard (cohortes, prédictions et le reste de notre boîte à outils d'analyses)
Même si les achats sur le web gagnent en popularité pour les applications, l'Apple App Store n'autorise un système différent des achats intégrés pour les biens numériques qu'aux États-Unis. Assurez-vous de ne pas promouvoir vos abonnements web dans votre application pour les autres pays, sous peine de voir votre application rejetée ou bannie.
Les étapes ci-dessous expliquent comment configurer l'intégration Stripe.
:::important
Cette intégration est axée sur le suivi et la synchronisation des achats Stripe sur le web. Si vous souhaitez envoyer des utilisateurs depuis l'application vers un paiement web, consultez [Web paywalls](web-paywall).
:::
## 1\. Connecter Stripe à Adapty \{#1-connect-stripe-to-adapty\}
Cette intégration repose principalement sur la récupération par Adapty des données d'abonnement depuis Stripe via le webhook. Vous devez donc connecter votre compte Adapty à votre compte Stripe en fournissant des clés API et en utilisant l'URL webhook d'Adapty dans Stripe. Pour automatiser la configuration de votre webhook, installez l'application Adapty dans Stripe :
:::note
Les étapes ci-dessous sont identiques pour les modes Production et Test de Stripe, mais vous devrez utiliser des clés API différentes pour chacun.
:::
0. Déterminez si vous connectez Stripe en mode test ou en mode live. Si vous commencez en mode test, vous devrez répéter les étapes ci-dessous pour le mode live.
1. Rendez-vous sur le [Stripe App Marketplace](https://marketplace.stripe.com/apps/adapty) et installez l'application Adapty. Notez que le mode sandbox ne prend pas en charge l'installation d'applications. Vous ne pouvez le faire qu'en mode production ou test.
2. Accordez les autorisations requises à l'application. Cela permettra à Adapty d'accéder aux données et à l'historique des abonnements. Cliquez ensuite sur **Continue to app settings** pour continuer.
En bas de la fenêtre contextuelle des autorisations, vous pouvez choisir d'installer l'application en mode live ou test.
3. Dans la fenêtre contextuelle, générez une nouvelle clé restreinte. Vous devrez vérifier votre identité par e-mail, Touch ID ou clé de sécurité. Une fois la clé générée, vous ne pourrez plus la consulter ; conservez-la donc en sécurité dans un gestionnaire de mots de passe ou un coffre-fort.
4. Copiez la clé générée depuis la fenêtre contextuelle et rendez-vous dans **App Settings → Stripe** d'Adapty [App Settings → Stripe](https://app.adapty.io/settings/stripe). Collez la clé dans la section **Stripe App Restricted API Key** selon votre mode. Notez que vous devez générer des clés différentes pour les modes test et live.
C'est tout ! Créez maintenant vos produits sur Stripe et ajoutez-les à Adapty.
2. Cliquez sur le bouton **Reveal live (test) key button** à côté du titre **Secret key**, copiez-la et rendez-vous dans [App Settings → Stripe](https://app.adapty.io/settings/stripe) d'Adapty. Collez la clé ici :
3. Copiez ensuite l'URL du webhook en bas de la même page dans Adapty. Rendez-vous dans [**Developers** → **Webhooks**](https://dashboard.stripe.com/webhooks) dans Stripe et cliquez sur le bouton **Add endpoint** :
4. Collez l'URL du webhook d'Adapty dans le champ **Endpoint URL**. Choisissez ensuite **Latest API version** dans le champ **Version** du webhook. Puis sélectionnez les événements suivants :
- charge.refunded
- customer.subscription.created
- customer.subscription.deleted
- customer.subscription.paused
- customer.subscription.resumed
- customer.subscription.updated
- invoice.created
- invoice.updated
- payment_intent.succeeded
5. Cliquez sur « Add endpoint », puis sur « Reveal » sous « Signing secret ». C'est la clé utilisée pour décoder les données du webhook côté Adapty ; copiez-la après l'avoir affichée :
6. Enfin, collez cette clé dans App Settings → Stripe d'Adapty, sous « Stripe Webhook Secret » :
:::warning
Adapty ne prend en charge que les tarifications **Flat rate** (9,99 $/mois) ou **Package pricing** (9,99 $/10 unités), car elles fonctionnent de manière similaire aux stores d'applications. Les options **Tiered pricing**, **Usage-based fee** et **Customer chooses price** ne sont pas prises en charge.
:::
## 3\. Ajouter des produits Stripe à Adapty \{#3-add-stripe-products-to-adapty\}
:::warning
Les produits sont obligatoires ! Assurez-vous de créer vos produits Stripe dans l'Adapty Dashboard. Adapty ne suit les événements que pour les transactions liées à ces produits, alors ne sautez pas cette étape — sinon, aucun événement de transaction ne sera créé.
:::
Nous traitons Stripe de la même façon que l'App Store et Google Play : c'est simplement un autre store où vous vendez vos produits numériques. La configuration est donc similaire : ajoutez simplement les produits Stripe (à savoir leur `product_id` et `price_id`) dans la section Produits d'Adapty :
Les ID de produits dans Stripe ressemblent à `prod_...` et les ID de prix à `price_...`. Ils sont faciles à trouver pour chaque produit dans le [catalogue de produits](https://dashboard.stripe.com/products?active=true) Stripe, en ouvrant n'importe quel produit :
Une fois tous les produits nécessaires ajoutés, l'étape suivante consiste à indiquer à Stripe quel utilisateur effectue l'achat, afin qu'Adapty puisse l'identifier !
## 4\. Enrichir les achats web avec votre ID utilisateur \{#4-enrich-purchases-made-on-the-web-with-your-user-id\}
Adapty s'appuie sur les webhooks de Stripe comme seule source d'information pour fournir et mettre à jour les niveaux d'accès des utilisateurs. Vous devez donc fournir des informations supplémentaires de votre côté lors de l'utilisation de Stripe pour que cette intégration fonctionne correctement.
Pour que les niveaux d'accès soient cohérents sur toutes les plateformes (web ou mobile), vous devez vous assurer qu'il existe un ID utilisateur unique sur lequel Adapty peut s'appuyer depuis les webhooks. Il peut s'agir de l'adresse e-mail, du numéro de téléphone ou de tout autre ID issu du système d'authentification que vous utilisez.
Déterminez l'ID que vous souhaitez utiliser pour identifier vos utilisateurs. Ensuite, accédez à la partie de votre code qui initialise le paiement via Stripe — et ajoutez cet ID utilisateur à l'objet `metadata` de l'objet [Stripe Subscription](https://docs.stripe.com/api/subscriptions/object#subscription_object-metadata) (`sub_...`) ou [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-metadata) (`ses_...`) en tant que `customer_user_id` comme suit :
```json showLineNumbers title="Stripe Metadata contents"
{'customer_user_id': "YOUR_USER_ID"}
```
Cette simple addition est la seule chose que vous devez faire dans votre code. Ensuite, Adapty analysera tous les webhooks reçus de Stripe, en extraira ce `metadata` et associera correctement les abonnements à vos clients.
:::warning
L'ID utilisateur est obligatoire
Sans lui, nous n'avons aucun moyen d'identifier cet utilisateur et de lui accorder le niveau d'accès sur mobile.
Si vous ne fournissez pas `customer_user_id` dans le `metadata`, vous aurez la possibilité de demander à Adapty de chercher `customer_user_id` ailleurs : soit dans le champ `email` de l'objet Customer de Stripe, soit dans `client_reference_id` de la Session Stripe.
Pour en savoir plus sur la configuration du comportement de création de profil, consultez la section [ci-dessous](stripe#profile-creation-behavior).
:::
:::note
Un Customer Stripe est également obligatoire
Si vous utilisez des Checkout Sessions, [assurez-vous de créer un Customer Stripe](https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-customer_creation) en définissant `customer_creation` sur `always`.
:::
## 5\. Donner accès aux utilisateurs sur mobile \{#5-provide-access-to-users-on-the-mobile\}
Pour vous assurer que vos utilisateurs mobiles venant du web peuvent accéder aux fonctionnalités payantes, appelez simplement `Adapty.activate()` ou `Adapty.identify()` avec le même `customer_user_id` que celui fourni à l'étape précédente (voir
2. Donnez un nom à la clé et définissez sa date d'expiration. Pour que la clé API fonctionne avec Adapty, vous devez lui accorder la permission **Read** pour toutes les entités. Cliquez sur **Save**.
3. Cliquez sur **Copy key**.
4. Dans Adapty, allez dans [App Settings → Paddle](https://app.adapty.io/settings/paddle) et collez la clé dans la section **Paddle API key**.
:::warning
Si vous avez défini une date d'expiration pour votre clé API Paddle, vous devez générer manuellement une nouvelle clé et la mettre à jour dans Adapty avant son expiration. L'intégration cessera de fonctionner sans avertissement à l'expiration de la clé, et les utilisateurs ne pourront plus effectuer d'achats.
:::
### 1.2. Ajouter les événements à envoyer à Adapty \{#12-add-events-that-will-be-sent-to-adapty\}
1. Copiez l'**URL Webhook** depuis la même page **Paddle** dans Adapty.
2. Dans Paddle, allez dans [**Developer Tools → Notifications**](https://vendors.paddle.com/notifications-v2) et cliquez sur **New destination** pour ajouter un webhook.
3. Saisissez un nom descriptif pour le webhook. Nous recommandons d'y inclure « Adapty » afin de le retrouver facilement si nécessaire.
4. Collez l'**URL Webhook** d'Adapty dans le champ **URL**. Veillez à utiliser le webhook correspondant au bon environnement.
5. Définissez le **Notification type** sur **Webhook**.
6. Sélectionnez les événements suivants :
- `subscription.created`
- `subscription.updated`
- `transaction.created`
- `transaction.updated`
- `adjustment.created`
- `adjustment.updated`
7. Cliquez sur **Save destination** pour finaliser la configuration du webhook.
### 1.3. Récupérer et ajouter la clé secrète du webhook \{#13-retrieve-and-add-the-webhook-secret-key\}
1. Dans la fenêtre **Notifications**, cliquez sur les trois points à côté du webhook que vous venez de créer et sélectionnez **Edit destination**.
2. Un nouveau champ appelé **Secret key** apparaîtra dans le panneau **Edit destination**. Copiez-le.
3. Dans Adapty, allez dans [App Settings → Paddle](https://app.adapty.io/settings/paddle) et collez la clé dans le champ **Notification secret key**. Cette clé est utilisée pour vérifier les données webhook dans Adapty.
### 1.4. Associer les clients Paddle aux profils Adapty \{#14-match-paddle-customers-with-adapty-profiles\}
Adapty doit lier chaque achat à un [profil client](profiles-crm) pour pouvoir l'utiliser dans votre application. Par défaut, les profils sont créés automatiquement lorsqu'Adapty reçoit des webhooks de Paddle. Vous pouvez choisir quelle valeur utiliser comme `customer_user_id` dans Adapty :
1. **Par défaut et recommandé :** Le `customer_user_id` que vous transmettez dans le champ `custom_data` (voir la [documentation Paddle](https://developer.paddle.com/build/transactions/custom-data))
2. L'`email` de l'objet Paddle Customer (voir la [documentation Paddle](https://developer.paddle.com/paddle-js/methods/paddle-checkout-open/#parameters))
3. L'identifiant Paddle Customer au format `ctm-...` (voir la [documentation Paddle](https://developer.paddle.com/paddle-js/methods/paddle-checkout-open/#parameters))
4. Ne pas créer de profils. Choisissez cette option si vous souhaitez avoir plus de contrôle sur vos profils clients et les gérer vous-même.
Vous pouvez configurer la valeur à utiliser dans le champ **Profile creation behavior** dans [App Settings → Paddle](https://app.adapty.io/settings/paddle).
## 2. Ajouter les produits Paddle à Adapty \{#2-add-paddle-products-to-adapty\}
:::warning
Assurez-vous d'ajouter vos produits Paddle à l'Adapty Dashboard ou d'ajouter un identifiant de produit Paddle à vos produits existants. Adapty ne suit que les événements pour les transactions liées à ces produits. Si vous sautez cette étape, aucun événement de transaction ne sera créé.
:::
Paddle fonctionne dans Adapty comme l'App Store et Google Play — c'est une autre plateforme sur laquelle vous vendez des produits numériques. Pour le configurer, ajoutez les valeurs `product_id` et `price_id` correspondantes depuis Paddle dans la section [Products](https://app.adapty.io/products) d'Adapty.
Dans Paddle, les identifiants de produit ressemblent à `pro_...` et les identifiants de prix à `pri_...`. Vous les trouverez dans votre [catalogue de produits Paddle](https://vendors.paddle.com/products-v2) en ouvrant un produit spécifique :
Une fois vos produits ajoutés, l'étape suivante consiste à s'assurer qu'Adapty peut associer l'achat au bon utilisateur.
## 3\. Accorder l'accès aux utilisateurs sur mobile \{#3-provide-access-to-users-on-the-mobile\}
Pour que les utilisateurs qui achètent sur le web bénéficient de l'accès sur mobile, appelez `Adapty.activate()` ou `Adapty.identify()` avec le même `customer_user_id` que celui utilisé lors de l'achat. Consultez [Identification des utilisateurs](identifying-users) pour plus de détails.
## 4\. Tester votre intégration \{#4-test-your-integration\}
Une fois tout configuré, vous pouvez tester votre intégration. Les transactions effectuées dans l'environnement de Test de Paddle apparaîtront comme **Test** dans Adapty. Les transactions de l'environnement de Production apparaîtront comme **Production**.
Votre intégration est maintenant terminée. Les utilisateurs peuvent souscrire des abonnements sur votre site web et accéder automatiquement aux fonctionnalités premium dans votre application mobile, pendant que vous suivez toutes les analytics d'abonnement depuis votre Adapty Dashboard unifié.
## Considérations importantes \{#important-considerations\}
- Dans les analytics d'Adapty, les montants des transactions incluent les taxes et les frais Paddle, ce qui diffère du tableau de bord Paddle où les montants sont affichés après taxes et frais. Les chiffres que vous verrez dans Adapty seront donc plus élevés que ceux de votre tableau de bord Paddle.
- Contrairement aux autres stores, les remboursements dans Paddle n'affectent que la transaction spécifique remboursée et n'annulent pas automatiquement l'abonnement. L'abonnement restera actif à moins d'être explicitement annulé.
- Vous pouvez également inclure `variation_id` dans le champ `custom_data` pour attribuer les achats à des instances de paywall spécifiques. Adapty traitera ces données depuis les webhooks et les inclura dans les analytics.
### Essais payants \{#paid-trials\}
Lorsque vous travaillez avec des essais payants dans Paddle, vous devez créer deux produits dans Adapty :
1. Créez un produit non-abonnement et associez-le au prix Paddle qui facture la période d'essai.
2. Créez ensuite un produit d'abonnement (Mensuel/Hebdomadaire/etc.) et associez-le au prix Paddle qui comporte la composante d'essai gratuit.
Du point de vue de Paddle, il s'agit d'un seul produit avec deux prix dans une seule transaction — un prix pour la facturation de l'essai (par exemple, 0,99 $) et un autre pour l'essai gratuit (0,00 $).
Du point de vue d'Adapty, cela crée deux événements distincts : un achat unique pour le paiement de l'essai et un événement de démarrage d'essai pour le produit d'abonnement.
Par exemple, lorsqu'un utilisateur commence un essai payant à 0,99 $ pour un abonnement à 9,99 $/mois, Paddle crée une transaction avec les deux prix, tandis qu'Adapty traite cela comme un achat unique de 0,99 $ (paiement immédiat) et un événement de démarrage d'essai à 0,00 $ (futur abonnement à 9,99 $/mois).
:::note
Lorsque des utilisateurs annulent un essai payant, vous recevez les événements **Trial expired** et **Trial renewal canceled**.
:::
## Exploitez davantage vos données Paddle \{#get-more-from-your-paddle-data\}
:::important
Pour que vos événements Paddle fonctionnent avec les intégrations, vos utilisateurs doivent s'être connectés à l'application avec leur compte App Store/Google Play au moins une fois.
:::
Une fois intégré à Paddle, Adapty est prêt à fournir des insights immédiatement. Pour tirer le meilleur parti de vos données Paddle, vous pouvez configurer des intégrations Adapty supplémentaires pour transférer les événements Paddle — en centralisant toutes vos analytics d'abonnement dans un seul Adapty Dashboard.
Intégrations disponibles pour transférer et analyser vos événements Paddle :
- [AppsFlyer](appsflyer)
- [Webhook](webhook)
- [Posthog](posthog)
## Limitations actuelles \{#current-limitations\}
- **Annulations** : Paddle propose deux options d'annulation d'abonnement :
1. Annulation immédiate : l'abonnement est annulé immédiatement.
2. Annulation en fin de période : l'abonnement est annulé à la fin de la période de facturation en cours (similaire aux abonnements intégrés sur les stores).
- **Remboursements** : Adapty suit les remboursements complets et partiels.
- **Délai de grâce** : Par défaut, Paddle applique un délai de grâce fixe de 30 jours pour les problèmes de facturation, pendant lequel l'abonnement reste actif. Vous pouvez [personnaliser la durée du délai de grâce et l'action après son expiration (suspension ou annulation de l'abonnement)](https://developer.paddle.com/build/retain/configure-payment-recovery-dunning#prerequisites).
**Essais** : Si le prélèvement échoue après la fin d'un essai, le statut de l'abonnement passe à `past_due`. En production, Paddle Retain applique une fenêtre de relance pour tenter de récupérer le paiement avant d'annuler ou de suspendre l'abonnement. En sandbox, Retain n'est pas disponible, donc aucune nouvelle tentative de paiement n'est effectuée et l'abonnement reste `past_due` indéfiniment.
---
**Voir aussi :**
- [Valider un achat dans Paddle, obtenir un niveau d'accès et importer l'historique des transactions depuis Paddle via l'API server-side](api-adapty/operations/validatePaddlePurchase)
---
# File: custom-store
---
---
title: "Intégration initiale avec d'autres stores"
description: "Intégration initiale d'Adapty avec l'App Store : guide rapide"
---
Bienvenue chez Adapty ! Notre priorité est de vous aider à démarrer rapidement et à obtenir les meilleurs résultats possibles pour votre application.
L'intégration initiale n'est requise que pour [l'App Store](initial_ios), [Google Play](initial-android), [Stripe](stripe) et [Paddle](paddle), car Adapty vérifie vos applications, produits et offres auprès de ces stores.
Adapty ne valide pas les données avec les autres app stores et ne traite pas les achats effectués via ceux-ci. Cependant, vous pouvez tout de même marquer les produits vendus via d'autres stores pour qu'Adapty accorde l'accès au contenu payant après un achat réussi, reflète les transactions dans vos analytiques et les partage via des intégrations.
:::important Assurez-vous que votre backend traite l'achat et envoie la transaction à Adapty via l'[API server-side d'Adapty](getting-started-with-server-side-api). Adapty n'accordera l'accès, ne déclenchera un événement de transaction, ne l'enverra aux intégrations et ne le reflétera dans les analytiques qu'après réception de la transaction. ::: Pour marquer un produit comme vendu via un app store personnalisé, sélectionnez l'app store lors de la création du produit. Si le store dont vous avez besoin n'est pas répertorié, voici comment en créer un : 1. Sur la page **Products**, ouvrez le produit que vous souhaitez vendre via un app store personnalisé. 2. Choisissez l'app store par lequel vous souhaitez vendre. S'il n'est pas répertorié, cliquez sur le bouton **Create Custom Store**.
3. Saisissez le **Title** et le **Store ID** du store.
4. Cliquez sur le bouton **Create store**.
Si votre backend est correctement configuré, Adapty recevra les transactions de produits de ce store personnalisé, les reflétera dans les analytiques, le [**Event Feed**](event-feed) et les [intégrations](https://app.adapty.io/integrations), et accordera l'accès en conséquence.
## Tirer le meilleur parti des données de votre store personnalisé \{#get-more-from-your-custom-store-data\}
:::important
Pour que les événements de votre store personnalisé fonctionnent avec les intégrations, vos utilisateurs doivent s'être connectés à l'application avec leur compte App Store/Google Play au moins une fois.
:::
Une fois votre intégration de store personnalisé configurée, Adapty est prêt à fournir des informations immédiatement. Pour tirer le meilleur parti de vos données, vous pouvez configurer des intégrations Adapty supplémentaires afin de transférer les événements du store personnalisé — centralisant ainsi toutes vos analytiques d'abonnement dans un seul Adapty Dashboard.
Intégrations disponibles pour transférer et analyser vos événements de store personnalisé :
- [AppsFlyer](appsflyer)
- [Webhook](webhook)
- [Posthog](posthog)
---
# File: transfer-apps
---
---
title: "Transférer votre application vers un autre compte"
description: "Changer le propriétaire d'une application dans Adapty"
---
Transférez votre application vers un autre propriétaire lorsque votre entreprise est rachetée, que vous vendez votre application ou que vous réorganisez vos entités commerciales. Le processus de transfert implique de coordonner les changements dans Adapty, App Store Connect et Google Play Console pour assurer la continuité du service.
## Transférer la propriété de l'application \{#transfer-app-ownership\}
Effectuez d'abord le transfert dans le store, puis transférez l'application dans Adapty. Cet ordre garantit que les achats continuent de fonctionner tout au long de la transition.
:::note
Ne supprimez pas et ne recréez pas de produits pendant le processus de transfert. Ne modifiez pas les identifiants de produits avant d'avoir vérifié que le transfert s'est terminé avec succès.
:::
### Transfert App Store (iOS) \{#app-store-ios-transfer\}
:::important
Les clés API App Store Connect (Issuer ID, Key ID, fichier .p8) sont liées au compte, pas à l'application. Après le transfert, vous devez générer de nouvelles clés API depuis le compte du nouveau propriétaire et les mettre à jour dans Adapty.
Le secret partagé spécifique à l'application continue de valider les reçus pendant la fenêtre de transfert, mais le nouveau propriétaire doit également le régénérer et le mettre à jour dans Adapty une fois le transfert terminé.
:::
1. **Nouveau propriétaire :** Créez un compte Adapty sur [app.adapty.io](https://app.adapty.io) si vous n'en avez pas encore.
2. **Ancien propriétaire :** Initiez le transfert de l'application dans App Store Connect en suivant le [guide de transfert](https://developer.apple.com/help/app-store-connect/transfer-an-app/overview-of-app-transfer) d'Apple.
3. **Nouveau propriétaire :** Acceptez le transfert dans App Store Connect.
4. **Ancien propriétaire :** Envoyez un e-mail à [support@adapty.io](mailto:support@adapty.io) pour transférer l'application dans Adapty. Indiquez le nom de l'application et l'adresse e-mail du nouveau propriétaire.
5. **Nouveau propriétaire :** Après avoir reçu l'application dans Adapty, suivez le [guide d'intégration App Store](initial_ios) pour générer et configurer toutes les informations d'identification sous votre compte.
### Transfert Google Play (Android) \{#google-play-android-transfer\}
1. **Nouveau propriétaire :** Créez un compte Adapty sur [app.adapty.io](https://app.adapty.io) si vous n'en avez pas encore.
2. **Les deux propriétaires :** Assurez-vous que les deux comptes Google Play Developer sont entièrement enregistrés.
3. **Ancien propriétaire :** Soumettez une demande de transfert via Google Play Console ou le support Google Play Developer. Google peut demander des documents supplémentaires tels que des numéros DUNS, des contrats ou des preuves de vente.
4. **Nouveau propriétaire :** Examinez et approuvez la demande de transfert.
5. **Google :** L'équipe de support Google traite le transfert, généralement en quelques jours ouvrables, mais cela peut prendre plus de temps selon la vérification du compte, la complexité des abonnements et la configuration des paiements.
6. **Ancien propriétaire :** Une fois que Google a effectué le transfert, envoyez un e-mail à [support@adapty.io](mailto:support@adapty.io) pour transférer l'application dans Adapty. Indiquez le nom de l'application et l'adresse e-mail du nouveau propriétaire.
7. **Nouveau propriétaire :** Après avoir reçu l'application dans Adapty, suivez le [guide d'intégration Google Play](initial-android) pour générer et configurer toutes les informations d'identification sous votre compte.
Le transfert inclut les utilisateurs, les abonnements, les statistiques, les évaluations et la fiche du store. La continuité de facturation est maintenue pour les abonnés existants, mais les versements basculent vers le compte marchand du nouveau propriétaire uniquement une fois le transfert terminé. Les rapports de paiement et les commandes antérieurs au transfert restent dans le compte d'origine. Suivez le [guide de transfert](https://support.google.com/googleplay/android-developer/answer/6230247) de Google pour les exigences détaillées.
## Atténuation des risques et calendrier \{#risk-mitigation-and-timing\}
**Ce qui continue de fonctionner pendant le transfert :**
- Les achats et renouvellements (le secret partagé spécifique à l'application continue de valider les reçus pendant la fenêtre de transfert)
- L'accès des abonnés existants
- Le SDK continue de fonctionner
**Ce qui s'arrête temporairement :**
- Les appels API App Store Connect (jusqu'à la configuration des nouvelles clés)
- Les notifications serveur (jusqu'à la reconfiguration du point de terminaison)
- Les analyses peuvent présenter des lacunes pendant la transition des informations d'identification
**Calendrier recommandé :**
- Effectuez les transferts pendant les périodes de faible trafic (3h-6h dans le fuseau horaire principal de vos utilisateurs)
- Préparez le nouveau propriétaire à configurer les informations d'identification immédiatement après avoir accepté le transfert dans le store
- Prévoyez 15 à 30 minutes entre l'acceptation du transfert et la finalisation de l'intégration Adapty
**Après avoir terminé le transfert :**
- Testez immédiatement la validation des reçus
- Surveillez les taux de succès des renouvellements automatiques pendant 48 heures
- Vérifiez que les notifications serveur parviennent bien à vos systèmes
- Assurez-vous que les nouveaux achats sont correctement suivis
## Vérifier que le transfert s'est terminé avec succès \{#verify-transfer-completed-successfully\}
Après avoir effectué les transferts dans Adapty et dans le store :
1. **Vérifier l'accès au tableau de bord** : Le nouveau propriétaire doit voir l'application dans son Adapty Dashboard.
2. **Vérifier la connexion de la clé API** : Vérifiez que la nouvelle clé API App Store Connect ou le compte de service Google Play se connecte avec succès dans Adapty.
3. **Tester la connexion SDK** : Lancez votre application et vérifiez que le SDK Adapty s'initialise sans erreur.
---
# File: installation-of-adapty-sdks
---
---
title: "Installation du SDK Adapty"
description: "Installez les SDK Adapty pour iOS, Android et les applications multiplateformes."
---
Trois options s'offrent à vous pour démarrer selon vos préférences :
- **Suivre les guides de démarrage rapide par plateforme** : Ces guides contiennent des extraits de code prêts pour la production, ce qui permet une intégration rapide.
- [iOS](ios-sdk-overview)
- [Android](android-sdk-overview)
- [React Native](react-native-sdk-overview)
- [Flutter](flutter-sdk-overview)
- [Unity](unity-sdk-overview)
- [Kotlin Multiplatform](kmp-sdk-overview)
- [Capacitor](capacitor-sdk-overview)
- **Utiliser des LLMs** : Notre documentation est compatible avec les LLMs. Consultez notre [guide](adapty-cursor) pour tirer le meilleur parti des LLMs avec la documentation Adapty.
- **Explorer les exemples d'applications** :
- [iOS (Swift)](https://github.com/adaptyteam/AdaptySDK-iOS/tree/master/Examples)
- [Android (Kotlin)](https://github.com/adaptyteam/AdaptySDK-Android/tree/master/app)
- [React Native (Exemple basique en RN pur)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/BasicExample)
- [React Native (Exemple avancé – utile pour le développement, car il permet de traiter des cas plus complexes)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/AdaptyDevtools)
- [React Native (Build de développement Expo)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/FocusJournalExpo)
- [React Native (Expo Go & Web)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/ExpoGoWebMock)
- [Flutter (Dart)](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example)
- [Unity (C#)](https://github.com/adaptyteam/AdaptySDK-Unity/tree/main/Assets)
- [Kotlin Multiplatform](https://github.com/adaptyteam/AdaptySDK-KMP/tree/main/example)
- [Capacitor](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples)
---
# File: sample-apps
---
---
title: "Applications exemples"
description: ""
---
Pour vous aider à démarrer avec le SDK Adapty, nous avons préparé des applications exemples qui illustrent comment intégrer et utiliser ses principales fonctionnalités. Ces applications proposent des implémentations prêtes à l'emploi de paywalls, d'achats et du suivi des analytics.
## Pourquoi utiliser les applications exemples ? \{#why-use-sample-apps\}
- **Intégration rapide :** Découvrez comment le SDK Adapty fonctionne dans une vraie application.
- **Bonnes pratiques :** Suivez les patterns d'implémentation recommandés.
- **Débogage & tests :** Utilisez les applications exemples pour diagnostiquer et expérimenter avant d'intégrer Adapty dans votre propre projet.
## Applications exemples disponibles \{#available-sample-apps\}
- [iOS (Swift)](https://github.com/adaptyteam/AdaptySDK-iOS/tree/master/Examples)
- [Android (Kotlin)](https://github.com/adaptyteam/AdaptySDK-Android/tree/master/app)
- [React Native (Exemple de base en RN pur)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/BasicExample)
- [React Native (Exemple avancé – utile pour le développement, car il permet de travailler sur des cas plus complexes)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/AdaptyDevtools)
- [React Native (Build dev Expo)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/FocusJournalExpo)
- [React Native (Expo Go & Web)](https://github.com/adaptyteam/AdaptySDK-React-Native/tree/master/examples/ExpoGoWebMock)
- [Flutter (Dart)](https://github.com/adaptyteam/AdaptySDK-Flutter/tree/master/example)
- [Unity (C#)](https://github.com/adaptyteam/AdaptySDK-Unity/tree/main/Assets)
- [Kotlin Multiplatform](https://github.com/adaptyteam/AdaptySDK-KMP/tree/main/example)
- [Capacitor (React)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/basic-react-example)
- [Capacitor (Vue.js)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/basic-vue-example)
- [Capacitor (Angular)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/basic-angular-example)
- [Capacitor (Outils de développement avancés)](https://github.com/adaptyteam/AdaptySDK-Capacitor/tree/master/examples/adapty-devtools)
---
# File: adapty-flow-builder
---
---
title: "Flows (Beta)"
description: "Éditeur visuel no-code pour créer des flows interactifs. Mettez à jour les textes, le design et les prix sans publier de nouvelle version."
---
:::important
Les flows sont actuellement pris en charge sur iOS, Android, React Native, Flutter et Capacitor SDK v4 et supérieur. La prise en charge d'autres plateformes et frameworks arrive prochainement.
:::
3. Les boutons d'achat, les liens et les boutons de fermeture sont fournis avec des actions préconfigurées. Pour les liens, [configurez les URL de navigation des utilisateurs](#links). Pour les autres types de boutons, accédez au panneau **Interactions**. Là, dans la section **Button triggers**, configurez les [actions](onboarding-actions) que le bouton doit effectuer.
4. Configurez le [design du bouton](builder-styling) dans le panneau **Design**.
## Types de boutons \{#button-types\}
### Boutons d'achat \{#purchase-buttons\}
:::link
Pour que les boutons d'achat fonctionnent, associez des produits aux écrans et ajoutez l'élément **Products**. Consultez le [guide](paywall-product-block).
:::
Un bouton d'achat lance l'achat intégré pour le produit que l'utilisateur a sélectionné sur l'écran. Le SDK traite la transaction automatiquement, vous n'avez donc pas besoin de gérer les achats dans le code de l'application.
Pour ajouter un bouton d'achat :
1. Cliquez sur **+** et sélectionnez **Button**, puis choisissez un preset de bouton.
2. Avec le bouton sélectionné, ouvrez l'onglet **Interactions** dans le panneau de droite.
3. Cliquez sur **Add trigger** > **On tap**, puis cliquez sur **Add action**.
4. Définissez **Action** sur **Purchase** et **Product** sur `products.selectedProduct`. La variable `products.selectedProduct` correspond toujours au produit actuellement sélectionné sur l'écran.
:::tip
Vous pouvez attirer davantage l'attention sur les boutons d'achat en les animant. Le Paywall Builder prend actuellement en charge le type d'animation **Pulse**.
Configurez le style d'animation dans le panneau **Design**.
:::
### Liens \{#links\}
:::important
Les boutons **Terms of Use** et **Privacy Policy** disposent d'une action **Open URL** intégrée. Définissez l'URL de destination à cet endroit. Les URL vides dans Open URL et les [liens en ligne](onboarding-text#inline-link) bloquent la prévisualisation et la publication.
:::
Pour respecter certaines exigences des stores, vous pouvez ajouter des liens vers :
- Les conditions d'utilisation
- La politique de confidentialité
- La restauration des achats
Pour ajouter des liens :
1. Cliquez sur **+** et sélectionnez **Button > Links**. Cela ajoutera une rangée de boutons en ligne avec des actions prédéfinies : restaurer les achats ou ouvrir une URL. Si vous n'avez pas besoin de tous les boutons inclus, supprimez ceux dont vous n'avez pas besoin dans le panneau des calques.
2. Configurez maintenant les actions des boutons :
- Le bouton **Restore purchases** gère déjà la restauration des achats.
- Pour chaque lien restant :
1. Cliquez sur le bouton pour le sélectionner et passez à l'onglet **Interactions** à droite.
2. Collez l'URL dans le champ.
3. Par défaut, l'URL s'ouvre dans un navigateur intégré à l'application pour une expérience utilisateur fluide. Si vous souhaitez rediriger les utilisateurs vers un navigateur externe, cochez la case **Open in external browser**.
### Fermer le flow \{#close-flow\}
Le bouton **Close** ferme le flow automatiquement.
Pour ajouter un bouton de fermeture, cliquez sur **+** et sélectionnez **Button > Close flow**.
:::tip
Utilisez la position **Absolute** pour placer votre bouton de fermeture dans le coin de l'écran.
:::
Vous pouvez également configurer n'importe quel autre bouton pour fermer le flow à l'aide des [actions](onboarding-actions).
### Boutons personnalisés \{#custom-buttons\}
Tout bouton que vous ajoutez peut être configuré pour effectuer n'importe quelle action lors d'un appui :
- Naviguer vers l'écran suivant
- Afficher une alerte
- Définir une [variable](onboarding-variables)
- [Afficher ou masquer des éléments de l'écran](onboarding-element-visibility)
- Ouvrir des URL
- Restaurer les achats
- Effectuer des actions conditionnelles
---
# File: builder-tabs
---
---
title: "Tabs"
description: "Ajoutez une navigation par onglets qui change les panneaux de contenu dans un flow."
---
**Tabs** divise une section d'écran en panneaux de contenu commutables — l'utilisateur appuie sur un en-tête d'onglet et le panneau en dessous se met à jour en conséquence.
{/* TODO: on-device GIF */}
## Ajouter, supprimer et sélectionner des onglets \{#add-remove-and-select-tabs\}
Chaque onglet est composé de deux parties
- **En-tête d'onglet** — le libellé cliquable (Tab 1, Tab 2, etc.).
- **Contenu de l'onglet** — un conteneur par onglet. Tout ce que vous placez dans un conteneur de contenu s'affiche lorsque son onglet est sélectionné.
Cliquez sur **Add tab** pour ajouter un nouvel onglet. Chaque nouvel onglet obtient un conteneur de contenu correspondant.
Pour qu'un onglet spécifique soit actif à l'affichage initial de l'écran, activez **Selected by default**.
## Styliser les onglets \{#style-the-tabs\}
### Templates \{#templates\}
Le Flow Builder propose trois templates d'onglets prêts à l'emploi :
- **Segment control** — un sélecteur en forme de pilule avec des coins arrondis autour de l'onglet sélectionné.
- **Button Tabs** — onglets distincts avec un style de bouton.
- **Underline** — libellés textuels avec un soulignement indiquant l'onglet sélectionné.
### États des onglets \{#tab-states\}
Chaque onglet individuel dispose d'un sélecteur d'état (**Default / Selected**) pour styliser séparément les états actif et inactif — typographie, couleurs, remplissage et bordure par état.
## Groupe sélectionnable \{#selectable-group\}
Les onglets forment un **groupe sélectionnable à choix unique** — exactement un onglet est actif à la fois. Gérez le groupe depuis le panneau **Screen settings**, dans la section [Selectable groups](paywall-layout-and-products#selectable-groups).
Le groupe expose deux variables :
- `tabs.selectedOptionId` — l'ID de l'onglet sélectionné. Utilisez-la dans les conditions.
- `tabs.selectedOptionTitle` — le libellé de l'onglet sélectionné. Utilisez-la dans le texte dynamique.
Remplacez `tabs` par votre **Group ID** personnalisé si vous avez renommé le groupe.
Consultez [Éléments et groupes sélectionnables](flow-selectable-elements) pour une vue d'ensemble complète.
---
# File: builder-toggles
---
---
title: "Toggles"
description: "Ajoutez des interrupteurs à vos flows de paiement."
---
:::warning
Apple peut rejeter les applications qui utilisent un toggle d'essai présélectionné. Un toggle activé par défaut peut être signalé comme un dark pattern manipulateur selon les directives de révision de l'App Store — cela implique le consentement de l'utilisateur à un essai gratuit sans choix explicite.
Pour éviter un rejet, réglez le toggle sur **off** par défaut et laissez les utilisateurs activer l'essai eux-mêmes.
:::
Un toggle d'essai est un interrupteur binaire qui permet aux utilisateurs de choisir entre des produits standard et des produits avec essai sur un paywall. Lorsque l'utilisateur change son état, cela peut déclencher une action — comme permuter des groupes de produits, mettre à jour des variables, ou afficher et masquer des éléments — instantanément.
Pour ajouter un toggle d'essai, cliquez sur **+** sur l'écran cible et sélectionnez **Trial toggle**.
Chaque toggle d'essai est un élément sélectionnable de type **Toggle**. Chaque élément sélectionnable a une variable assignée pour refléter son état — par exemple, un toggle nommé `trial` obtient une variable `trial.is_selected` avec une valeur `True` ou `False`.
Pour que d'autres éléments dépendent de l'état du toggle, définissez une [action](onboarding-actions) conditionnelle ou une [visibilité conditionnelle](onboarding-element-visibility) basée sur cette variable.
---
# File: builder-reviews-and-testimonials
---
---
title: "Avis et témoignages"
description: "Ajoutez des avis, des notes et des preuves sociales à un paywall."
---
La catégorie d'éléments **User Engagement** propose quatre templates pour mettre en avant des avis, des notes et des preuves sociales sur un paywall. Chaque template est une composition entièrement modifiable — remplacez le texte de substitution et appliquez vos [styles de couleur](builder-styling) et votre [typographie](onboarding-text) pour harmoniser l'ensemble du flow.
## Review \{#review\}
Une carte avec une note unique, une citation et la signature de l'auteur. Utilisez-la pour mettre en avant une citation mémorable d'un utilisateur.
## Rating \{#rating\}
Un compteur et une rangée d'étoiles, par exemple « 17 000+ ratings ». Utilisez-le pour souligner le volume de notes.
## App Rating \{#app-rating\}
Un score mis en avant avec le nombre d'évaluations, par exemple « 4,9 / Basé sur 1 000+ avis ». Utilisez-le pour mettre en valeur un score global élevé.
## Social Proof \{#social-proof\}
Un groupe d'avatars avec un nombre de membres, par exemple « Rejoignez 50 000+ utilisateurs ». Utilisez-le pour souligner la taille de la communauté.
---
# File: flow-timer
---
---
title: "Compte à rebours"
description: "Ajoutez un compte à rebours à un paywall."
---
Le **Countdown timer** décompte d'une durée fixe jusqu'à zéro — une fois arrivé à zéro, l'affichage se fige.
## Templates \{#templates\}
La catégorie propose quatre variantes visuelles :
- **Blocks** — Jours, heures, minutes et secondes dans des cellules séparées avec libellés.
- **Inline Units** — Texte sur une seule ligne avec suffixes d'unités.
- **Inline** — Chiffres seuls.
- **Badge** — Affichage des chiffres en forme de pastille.
## Paramètres \{#settings\}
### Définir la durée \{#set-the-duration\}
Dans la section **Countdown** du panneau droit, saisissez la durée de départ en jours, heures, minutes et secondes.
### Configurer le comportement \{#configure-the-behavior\}
Le menu déroulant **Behavior** contrôle le moment où le minuteur démarre :
- **Every appear** — Redémarre à chaque fois que l'utilisateur ouvre l'écran. Comportement par défaut.
- **First appear** — Démarre à la première vue de l'écran par l'utilisateur dans la session d'application en cours. Continue de décompter si l'utilisateur revient pendant la même session ; se réinitialise à un nouveau lancement de l'application.
- **First appear (persisted)** — Démarre à la première ouverture de l'écran et continue de décompter même après relancement de l'application.
### Déclencher une action à la fin du minuteur \{#trigger-an-action-when-the-timer-ends\}
:::link
Article principal : [Actions](onboarding-actions)
:::
Ajoutez un déclencheur **On timer end** pour exécuter une action lorsque le compte à rebours atteint zéro — par exemple, naviguer vers un autre écran ou masquer un badge de réduction.
---
# File: onboarding-quizzes
---
---
title: "Quiz dans les flows"
description: "Ajoutez des quiz interactifs à vos flows Adapty pour recueillir les préférences des utilisateurs et créer des flows personnalisés, sans écrire de code."
---
Utilisez les quiz pour proposer aux utilisateurs des choix prédéfinis. Contrairement aux champs de saisie, les quiz n'ont pas de champs texte libres — les utilisateurs choisissent parmi les options que vous définissez. Servez-vous-en pour recueillir des préférences, segmenter les utilisateurs ou orienter le flow en fonction de leurs réponses.
---
# File: create-product
---
---
title: "Créer un produit"
description: "Guide étape par étape pour créer de nouveaux produits d'abonnement dans Adapty pour une meilleure gestion des revenus."
---
La façon de créer des produits dans Adapty dépend de si vous les avez déjà dans les stores :
- **[Si les produits n'existent pas encore dans l'App Store et/ou Google Play, créez-les dans Adapty et publiez-les directement dans les stores](#create-product-and-push-to-store)**.
- **[Si les produits existent déjà dans l'App Store et/ou Google Play, créez-les dans Adapty et connectez les produits existants des stores.](#create-product-and-connect-existing-store-products)**
:::tip
Vous pouvez également créer des produits de façon programmatique via la [CLI développeur](developer-cli-reference#adapty-products-create).
:::
## Créer un produit et le publier dans le store \{#create-product-and-push-to-store\}
:::warning
Avant de commencer, assurez-vous d'avoir configuré l'intégration avec les stores dont vous avez besoin :
- [App Store](initial_ios)
- [Google Play](initial-android)
Si vous avez configuré l'intégration App Store il y a un certain temps, vérifiez également que vous avez [ajouté la clé API App Store Connect](app-store-connection-configuration#step-6-add-app-store-connect-api-key).
:::
2. Cliquez sur **Create product** en haut à droite. Adapty prend en charge tous les types de produits : abonnements, non-consommables \(y compris à vie\) et consommables.
3. Sélectionnez **Create a new product and push to stores**.
4. Renseignez les informations suivantes :
- **Product name** : saisissez le nom du produit tel qu'il apparaîtra dans le tableau de bord Adapty. Ce nom est avant tout une référence pour vous, choisissez donc celui qui vous convient le mieux dans l'Adapty Dashboard.
- **Access Level** : sélectionnez le [niveau d'accès](access-level) auquel appartient le produit. Le niveau d'accès détermine les fonctionnalités débloquées après l'achat. Cette liste ne contient que les niveaux d'accès déjà créés. Le niveau d'accès `premium` est créé par défaut dans Adapty, mais vous pouvez également [en ajouter d'autres](access-level).
- **Subscription duration** : sélectionnez la durée de l'abonnement dans la liste.
- **Weekly/Monthly/2 Months/3 Months/6 Months/Annual** : la durée de l'abonnement.
- **Lifetime** : utilisez la durée à vie pour les produits qui débloquent les fonctionnalités premium de l'application de façon permanente.
- **Non-Subscriptions** : pour les produits qui ne sont pas des abonnements et n'ont donc pas de durée, utilisez les non-abonnements. Ils peuvent débloquer des fonctionnalités supplémentaires, des produits consommables, etc.
- **Consumables** : les articles consommables peuvent être achetés plusieurs fois et s'épuisent au fil de l'utilisation de l'application. Les exemples typiques sont la monnaie virtuelle et les bonus en jeu. Notez que les produits consommables n'affectent pas les niveaux d'accès. Pour accorder un niveau d'accès à partir d'un achat unique, utilisez **Non-Subscriptions** à la place.
- **Price (USD)** : le prix du produit en USD. Ce prix servira de base pour calculer et définir automatiquement les prix dans tous les pays. Vous pourrez [personnaliser le prix pour différents pays et régions](edit-product#set-country-specific-prices) ultérieurement.
5. Cliquez sur **Save & Continue**.
6. Configurez les informations du produit pour l'App Store si vous prévoyez d'y publier :
- **Product ID** : créez un identifiant unique et permanent pour le produit.
- **Product group** : sélectionnez un groupe de produits existant que vous avez créé dans App Store Connect, ou cliquez sur **Create new Product Group** et définissez son nom. Une fois qu'Adapty l'a créé, vous pouvez le sélectionner dans la liste déroulante.
- **Screenshot** : téléchargez une capture d'écran de l'achat intégré montrant clairement l'article ou le service proposé. Cette capture d'écran est utilisée uniquement pour la révision App Store et n'est pas affichée sur l'App Store. Consultez les exigences de taille et de format [ici](https://developer.apple.com/help/app-store-connect/reference/app-information/screenshot-specifications/).
7. Cliquez sur **Push data to App Store**.
:::warning
S'il s'agit de votre premier produit pour cette application, vous devez le soumettre manuellement pour révision dans App Store Connect. Cela ne sera plus nécessaire par la suite. Une fois la révision terminée, le statut du produit dans Adapty se mettra à jour automatiquement.
:::
8. Configurez les informations du produit pour Google Play si vous prévoyez d'y publier :
- **Base Product ID** : créez un identifiant unique et permanent pour le produit.
- **Subscription** : sélectionnez un groupe d'abonnements existant que vous avez créé dans Google Play Console, ou cliquez sur **Create new Product Group** et définissez son nom et son identifiant. Une fois qu'Adapty l'a créé, vous pouvez le sélectionner dans la liste déroulante.
:::note
Le délai de grâce et la période de suspension de compte seront automatiquement définis selon les valeurs par défaut du Play Store. Vous pourrez les modifier ultérieurement dans Google Play Console.
:::
9. Cliquez sur **Push data to Play Store**.
10. Pour iOS, configurez l'offre de lancement – essai gratuit – en sélectionnant sa **Free duration** dans la liste déroulante. Pour cette configuration initiale, vous pouvez ajouter un essai gratuit d'introduction. Une fois le produit principal approuvé par les stores, vous pourrez [ajouter d'autres offres](offers) (par exemple, promotionnelles, de reconquête) en liant leurs identifiants existants depuis votre console de store.
:::important
Les offres de lancement ne se synchronisent pas automatiquement avec Google Play. Contrairement à l'App Store, Google Play ne dispose pas d'un type d'« offre de lancement » distinct — les essais gratuits et les offres à tarif réduit sont tous configurés en tant qu'**offres** sur un plan de base. [Créez l'offre dans Google Play Console et liez-la à votre produit Adapty](google-play-offers).
:::
11. Enfin, cliquez sur **Save** pour confirmer la création du produit.
## Créer un produit et connecter des produits existants des stores \{#create-product-and-connect-existing-store-products\}
:::warning
Avant de commencer, assurez-vous d'avoir :
- Configuré l'intégration avec les stores dont vous avez besoin :
- [App Store](initial_ios)
- [Google Play](initial-android)
- Créé des produits dans les stores dont vous avez besoin :
- [App Store](app-store-products)
- [Google Play](android-products)
**Si vous n'avez aucun produit créé**, suivez le guide [Publier dans les stores](#create-product-and-push-to-store) pour les créer simultanément dans Adapty et dans les stores.
:::
2. Cliquez sur **Create product** en haut à droite. Adapty prend en charge tous les types de produits : abonnements, non-consommables \(y compris à vie\) et consommables.
3. Sélectionnez **Connect an existing store product**.
4. Renseignez les informations suivantes :
- **Product name** : saisissez le nom du produit tel qu'il apparaîtra dans le tableau de bord Adapty. Ce nom est avant tout une référence pour vous, choisissez donc celui qui vous convient le mieux dans l'Adapty Dashboard.
- **Access Level ID** : sélectionnez le [niveau d'accès](access-level) auquel appartient le produit. Le niveau d'accès détermine les fonctionnalités débloquées après l'achat. Cette liste ne contient que les niveaux d'accès déjà créés. Le niveau d'accès `premium` est créé par défaut dans Adapty, mais vous pouvez également [en ajouter d'autres](access-level).
- **Subscription duration** : sélectionnez la durée de l'abonnement dans la liste.
- **Weekly/Monthly/2 Months/3 Months/6 Months/Annual** : la durée de l'abonnement.
- **Lifetime** : utilisez la durée à vie pour les produits qui débloquent les fonctionnalités premium de l'application de façon permanente.
- **Non-Subscriptions** : pour les produits qui ne sont pas des abonnements et n'ont donc pas de durée, utilisez les non-abonnements. Ils peuvent débloquer des fonctionnalités supplémentaires, des produits consommables, etc.
- **Consumables** : les articles consommables peuvent être achetés plusieurs fois et s'épuisent au fil de l'utilisation de l'application. Les exemples typiques sont la monnaie virtuelle et les bonus en jeu. Notez que les produits consommables n'affectent pas les niveaux d'accès. Pour accorder un niveau d'accès à partir d'un achat unique, utilisez **Non-Subscriptions** à la place.
- **Price (USD)** : le prix du produit en USD. Si votre produit est déjà dans le store, cette valeur n'affectera pas son prix réel ; vous pouvez sélectionner n'importe quelle valeur dans la liste. Vous pourrez ensuite [personnaliser les prix pour différentes régions](edit-product#set-country-specific-prices) directement depuis le tableau de bord Adapty.
5. Cliquez sur **Continue**.
6. Configurez les informations du produit pour chaque store :
- **App Store :**
- **App Store Product ID :** cet identifiant unique permet d'accéder à votre produit sur les appareils. Sélectionnez-le dans la liste. Si vous ne le voyez pas, vérifiez sa configuration dans App Store Connect et assurez-vous qu'il est correct et qu'il appartient à cette application.
- **Play Store :**
- **Google Play Product ID :** il s'agit de l'identifiant du produit dans le Play Store. Sélectionnez-le dans la liste. Si vous ne le voyez pas, vérifiez sa configuration dans Google Play Console et assurez-vous qu'il est correct et qu'il appartient à cette application.
- **Base Plan ID :** cet identifiant définit le plan de base du produit dans le Play Store. Lorsque vous ajoutez l'identifiant d'un produit d'abonnement sur le Play Store, vous devez fournir un identifiant de plan de base. Un plan de base définit les détails essentiels d'un abonnement : la période de facturation, le type de renouvellement (automatique ou prépayé) et le prix associé. Notez que dans Adapty, chaque combinaison d'un même abonnement avec différents plans de base est traitée comme un produit distinct.
- **Legacy fallback product** : un produit de secours utilisé exclusivement pour les applications utilisant d'anciennes versions du SDK Adapty (version 2.5 et antérieures). En marquant un produit comme rétrocompatible dans Google Play Console, Adapty peut déterminer s'il peut être acheté par d'anciennes versions du SDK. Pour ce champ, indiquez la valeur au format suivant : `
## Définir des prix par pays \{#set-country-specific-prices\}
Vous pouvez définir des prix différents selon les régions directement dans le tableau de bord Adapty, et ces prix par pays seront appliqués automatiquement à vos produits dans App Store Connect et/ou Google Play Console.
Pour définir des prix par pays :
1. [Ouvrez le produit pour le modifier](#edit-product).
2. Cliquez sur **Download** pour exporter vos prix actuels depuis les stores dans le bon format, ou créez un nouveau fichier CSV.
3. Mettez à jour les prix dans le fichier CSV. Respectez le [format](#csv-file-format). Si vous laissez le prix d'un pays inchangé ou ne l'incluez pas du tout dans le fichier, rien ne se passera. Lors du téléversement du CSV, Adapty compare les prix et ne met à jour que ceux qui diffèrent.
4. Dans la fenêtre **Edit**, cliquez sur **Upload** et sélectionnez le fichier CSV.
5. Si vous souhaitez que les modifications s'appliquent également aux abonnés existants, cochez **Apply to existing subscribers**.
6. Vérifiez les modifications qui seront appliquées et cliquez sur **Save changes**.
### Format du fichier CSV \{#csv-file-format\}
:::tip
Vous pouvez réutiliser le même fichier CSV si vous avez des produits similaires dans une application ou si vous souhaitez appliquer les mêmes prix dans différentes applications.
:::
La façon la plus simple de modifier les prix dans un CSV est de [télécharger un fichier avec les prix actuels et de le modifier directement](#set-country-specific-prices).
Cependant, si vous le faites vous-même, votre fichier doit contenir les colonnes suivantes :
- `region_name`
- `region_code`
- `app_store_currency`
- `app_store_requested_price`
- `play_store_currency`
- `play_store_requested_price`
Exemple :
```
region_name,region_code,app_store_currency,app_store_requested_price,play_store_currency,play_store_requested_price
United States,US,,8.99,,8.99
United Arab Emirates,AE,USD,8.99,AED,39.99
Germany,DE,USD,8.99,USD,8.99
```
## Consulter le journal d'audit \{#view-audit-log\}
Adapty enregistre toutes les modifications de prix pour chaque produit, ce qui vous permet de suivre qui a effectué des modifications et à quel moment. Pour consulter le journal d'audit :
1. Accédez à **[Products](https://app.adapty.io/products)** depuis le menu principal d'Adapty.
2. Cliquez sur les trois points à côté du produit et sélectionnez **Audit log**.
Le tableau du journal d'audit affiche chaque modification de prix avec la date, le nom et le rôle du membre de l'équipe, ainsi que le nombre de modifications.
Pour télécharger un détail CSV complet d'un événement, cliquez sur l'icône de téléchargement dans la ligne correspondante.
---
# File: delete-product
---
---
title: "Supprimer un produit"
description: "Découvrez comment supprimer un produit d'abonnement dans Adapty sans perturber les revenus de votre application."
---
Vous ne pouvez supprimer que les produits qui ne sont pas utilisés dans des paywalls.
Pour supprimer le produit :
1. Accédez à **[Products](https://app.adapty.io/products)** depuis le menu principal d'Adapty.
2. Cliquez sur le bouton **3-dot** à côté du produit et sélectionnez **Delete**.
2. Saisissez le nom du produit que vous êtes sur le point de supprimer.
3. Cliquez sur **Delete forever**.
---
# File: add-product-to-paywall
---
---
title: "Ajouter un produit à un paywall"
description: "Apprenez à ajouter et gérer des produits sur les paywalls dans Adapty."
---
Pour rendre un produit visible et sélectionnable dans un [paywall](paywalls) par les utilisateurs de votre application, suivez ces étapes :
1. Lors de la [configuration d'un paywall](create-paywall), cliquez sur **Add product** sous le titre **Products**.
2. Dans la liste déroulante qui s'affiche, sélectionnez les produits qui seront présentés à vos clients. La liste ne contient que les produits déjà créés. L'ordre des produits est conservé côté SDK, il est donc important de définir l'ordre souhaité lors de la configuration du paywall. Vous pouvez également spécifier une offre pour un produit si vous le souhaitez.
3. Cliquez sur **Create as draft** ou **Save and publish** selon le statut du paywall.
Gardez à l'esprit qu'après la création, il n'est pas recommandé de modifier, d'ajouter ou de supprimer des produits d'un paywall, car cela peut affecter les métriques du paywall.
---
# File: virtual-currencies
---
---
title: "Monnaies virtuelles"
description: "Définissez des monnaies intégrées dans Adapty, liez-les à des produits pour créditer automatiquement des points, et suivez le solde de chaque utilisateur."
---
Pour créer une offre dans Google Play Console :
1. Cliquez sur **Add offer** et choisissez le plan de base dans la liste.
2. Saisissez l'ID de l'offre. Il sera utilisé ultérieurement dans les analyses et sur l'Adapty Dashboard, alors donnez-lui un nom explicite.
3. Choisissez les critères d'éligibilité :
1. **New customer acquisition** : l'offre sera disponible uniquement pour les nouveaux abonnés n'ayant pas déjà utilisé cette offre. C'est l'option la plus courante et celle à utiliser par défaut.
2. **Upgrade** : cette offre sera disponible pour les clients qui passent d'un autre abonnement. Utilisez-la quand vous souhaitez promouvoir des plans plus chers auprès de vos abonnés existants, par exemple des clients passant du niveau bronze au niveau gold de votre abonnement.
3. **Developer determined** : vous pouvez contrôler depuis le code de l'application qui peut utiliser cette offre. Soyez prudent en production pour éviter toute fraude potentielle : les clients pourraient activer un abonnement gratuit ou réduit à répétition. Un bon cas d'usage pour ce type d'offre est la reconquête des abonnés résiliés.
4. Ajoutez jusqu'à deux phases tarifaires à votre offre. Il existe trois types de phases disponibles :
1. **Free trial** : l'abonnement peut être utilisé gratuitement pendant une durée configurée (minimum 3 jours). C'est l'offre la plus courante.
2. **Single payment** : l'abonnement est moins cher si les clients paient à l'avance. Par exemple, un plan mensuel coûte normalement 9,99 $, mais avec ce type d'offre, les trois premiers mois coûtent 19,99 $, soit une réduction de 30 %.
3. **Discounted recurring payment** : l'abonnement est moins cher pendant les `n` premières périodes. Par exemple, un plan mensuel coûte normalement 9,99 $, mais avec ce type d'offre, chacun des trois premiers mois coûte 4,99 $, soit une réduction de 50 %.
Une offre peut comporter deux phases. Dans ce cas, la première phase doit être un Free trial, et la seconde est soit un Single payment, soit un Discounted recurring payment. Elles sont appliquées dans cet ordre.
:::important
Veuillez noter que les paywalls créés avec le Paywall Builder d'Adapty n'afficheront que la première phase d'une offre d'abonnement Google à plusieurs phases. Cependant, rassurez-vous : lorsqu'un utilisateur achète le produit, toutes les phases de l'offre seront appliquées telles que configurées dans Google Play.
:::
5. Activez l'offre pour l'utiliser dans l'application.
6. Passez à l'[ajout de l'offre dans Adapty](create-offer).
:::note
Les IDs d'offre peuvent être identiques pour différents plans de base.
:::
## Étapes suivantes \{#next-steps\}
Une fois les offres ajoutées, poursuivez la configuration :
- Si vous avez **des applications sur l'App Store également**, consultez le [guide App Store](app-store-offers).
- Si vous avez **des applications uniquement sur Google Play**, suivez [ce guide](create-offer) pour ajouter des offres dans Adapty.
---
# File: create-offer
---
---
title: "Ajouter des offres à Adapty"
description: "Créez et gérez des offres d'abonnement spéciales avec les outils d'Adapty."
---
Adapty vous permet de proposer des essais ou des réductions aux nouveaux abonnés, aux abonnés existants ou aux abonnés perdus.
Une fois que vous les avez configurées dans App Store Connect ou Google Play Console, vous devez les ajouter à Adapty en deux étapes :
1. [Ajoutez des offres aux produits dans Adapty en utilisant les identifiants d'offre issus des stores.](#1-add-offer-to-product-in-adapty)
2. [Affichez l'offre dans un flow ou un paywall.](#2-display-offer)
:::warning
Les offres de lancement (App Store) sont appliquées automatiquement si l'utilisateur est éligible. Ne les ajoutez pas aux produits dans Adapty.
Ce guide explique comment configurer les offres promotionnelles (App Store), les offres de reconquête (App Store) et toutes les offres Google Play.
:::
## 0. Avant de commencer \{#before-you-start\}
Avant de configurer des offres dans Adapty, assurez-vous que :
1. Vous avez créé toutes les offres dont vous avez besoin dans le store :
- [App Store](app-store-offers)
- [Google Play](google-play-offers)
2. Vous avez créé les [produits](create-product) dans Adapty et ajouté leurs identifiants.
3. Pour l'App Store : Vous avez importé [la clé d'achat intégré pour les offres promotionnelles](app-store-connection-configuration#step-4-for-trials-and-special-offers--set-up-promotional-offers).
## 1. Ajouter une offre à un produit dans Adapty \{#1-add-offer-to-product-in-adapty\}
Une fois votre offre promotionnelle (pour le Play Store et l'App Store) ou votre offre de reconquête (pour l'App Store) configurée dans les stores, l'ajouter à Adapty est simple :
1. Ouvrez [**Products**](https://app.adapty.io/products) depuis le menu principal d'Adapty. Trouvez le produit auquel vous souhaitez ajouter une offre.
2. Trouvez le produit auquel vous souhaitez ajouter une offre. Dans la colonne **Actions**, cliquez sur le bouton **3-dot** à côté du produit et sélectionnez **Edit**.
3. Dans la fenêtre **Edit product**, cliquez sur **+** et sélectionnez **Add offers**.
4. Cliquez sur **Add offer**.
5. Renseignez ensuite les détails de l'offre pour le produit.
Voici les champs disponibles pour l'offre :
- **Offer name** : Donnez un nom à l'offre pour l'identifier facilement dans Adapty. Utilisez le nom qui vous convient.
- **App Store Offer type** : Sélectionnez le type d'offre App Store que vous ajoutez : Promotional ou Win-back. (Les offres de lancement n'ont pas besoin d'être ajoutées — elles s'appliquent automatiquement si elles sont disponibles.)
- **App Store Offer ID** : C'est l'identifiant unique de l'offre [que vous avez défini dans l'App Store](app-store-products).
- **Play Store Offer ID** : De même, c'est l'identifiant unique de l'offre [que vous avez défini dans le Play Store](android-products).
:::tip
Si le champ **App Store Offer ID** ou **Play Store Offer ID** n'est pas actif, passez à l'onglet **Products** et sélectionnez un ID de produit.
:::
6. (optionnel) Ajoutez d'autres offres si nécessaire en cliquant sur **Add offer**.
7. Cliquez sur **Save** pour ajouter les offres au produit.
## 2. Afficher l'offre \{#2-display-offer\}
Une fois une offre associée à un produit, présentez-la là où les utilisateurs voient ce produit — dans un flow ou dans un paywall.
### Ajouter une offre à un flow \{#add-offer-to-flow\}
Dans le [Flow Builder](adapty-flow-builder), une offre est associée à un produit dans un élément Produits. Commencez par ajouter l'élément produit et assignez-lui des produits — voir [Configurer les achats](paywall-product-block).
Pour associer une offre :
1. Sur le canvas, sélectionnez la carte produit qui doit afficher l'offre.
2. Dans le panneau de droite, sous **Product**, sélectionnez le produit, puis choisissez l'offre dans le menu déroulant **Select offer (optional)**.
### Ajouter une offre à un paywall \{#add-offer-to-paywall\}
:::info
Vous ne pouvez pas ajouter d'offres à des paywalls en statut **live**. Si vous souhaitez ajouter une offre à un paywall existant, [dupliquez-le](duplicate-paywalls) et configurez les produits dans un nouveau paywall.
:::
Pour rendre une offre visible et sélectionnable dans un [paywall](paywalls) pour les utilisateurs de votre application, suivez ces étapes :
1. Lors de la création ou de la modification d'un paywall, dans l'onglet **General**, ajoutez un produit auquel vous venez d'ajouter l'offre.
2. Choisissez une offre que vous avez créée précédemment pour ce produit dans la liste **Offer**. La liste n'est disponible que pour les produits qui ont des offres.
3. Si nécessaire, ajoutez d'autres produits et offres, mais vous ne pouvez ajouter qu'une seule offre par produit.
## Fonctionnement d'Adapty avec les offres \{#how-adapty-works-with-offers\}
Voici comment les offres fonctionnent dans Adapty :
- Lorsqu'un utilisateur est éligible à une offre, Adapty applique automatiquement l'offre que vous avez configurée au moment de l'achat.
- Si un produit dispose à la fois d'une offre de lancement et d'offres promotionnelles configurées dans l'App Store, les utilisateurs éligibles recevront d'abord l'offre de lancement. Une fois sa période terminée, si l'utilisateur est toujours éligible à l'offre promotionnelle et que vous avez configuré cette offre dans Adapty, elle sera appliquée lorsqu'il tentera d'acheter à nouveau le produit.
- Si vous souhaitez contrôler davantage la façon dont les offres sont appliquées, ou si vous devez vendre votre produit sans offres dans certains cas, vous disposez de plusieurs options :
- Configurer les critères d'éligibilité dans l'App Store ou la Google Play Console
- Créer un produit séparé sans offres dans l'App Store ou la Google Play Console
- Créer un produit séparé sans offres dans Adapty, ajouter des paywalls contenant les deux variantes du produit à un [placement](placements), et utiliser des [segments](segments) d'audience pour contrôler quel paywall est affiché à chaque utilisateur. Par exemple, vous pouvez créer des segments basés sur le **Subscription product** ou le **Paid access level**, ou utiliser des [attributs personnalisés](profiles-crm) pour implémenter votre propre logique.
---
# File: access-level
---
---
title: "Niveaux d'accès"
description: "Découvrez les niveaux d'accès dans Adapty et comment les configurer pour la gestion des utilisateurs."
---
Les niveaux d'accès vous permettent de contrôler ce que les utilisateurs peuvent faire dans votre application mobile sans avoir à coder en dur des identifiants de produits spécifiques. Chaque produit définit la durée pendant laquelle l'utilisateur bénéficie d'un certain niveau d'accès. Ainsi, chaque fois qu'un utilisateur effectue un achat, Adapty accorde l'accès à l'application pour une période spécifique (pour les abonnements) ou de façon permanente (pour les achats à vie).
Lorsque vous créez une application dans l'Adapty Dashboard, le niveau d'accès `premium` est automatiquement généré. Il s'agit du niveau d'accès par défaut, qui ne peut pas être supprimé.
Vous pouvez avoir plusieurs niveaux d'accès par application. Voici quelques exemples illustrant leur utilité :
- Dans une application de presse où vous vendez des abonnements à différents sujets indépendamment, vous pouvez créer des niveaux d'accès tels que `sports` et `science`.
- Dans une application de fitness proposant des vidéos d'entraînement enregistrées via un abonnement classique (utilisant le niveau d'accès `premium` par défaut), les utilisateurs peuvent opter pour une formule plus coûteuse donnant accès à des séances en direct avec un coach. Dans ce cas, vous pouvez créer un niveau `live_coach_access`.
- Dans une application d'apprentissage des langues, vous pouvez choisir de créer un niveau d'accès pour chaque langue disponible.
:::note
Les niveaux d'accès peuvent être partagés ou transférés entre les profils d'un utilisateur ; le solde d'une monnaie virtuelle ne le peut pas — il reste lié à un seul profil. Voir [Soldes, profils et appareils](virtual-currency-balance#balances-profiles-and-devices).
:::
Pour commencer à travailler avec les niveaux d'accès dans Adapty, accédez à **[Products](https://app.adapty.io/access-levels)** depuis le menu principal d'Adapty, puis sélectionnez l'onglet **Access levels**.
La liste **Access levels** affiche tous les niveaux d'accès, y compris celui `premium` ajouté automatiquement et ceux que vous avez ajoutés dans Adapty.
---
# File: create-access-level
---
---
title: "Créer un niveau d'accès"
description: "Créez et assignez des niveaux d'accès dans Adapty pour une meilleure segmentation des utilisateurs."
---
Les niveaux d'accès vous permettent de contrôler ce que les utilisateurs de votre application peuvent faire sans coder en dur des identifiants de produits spécifiques. Chaque produit définit la durée pendant laquelle l'utilisateur bénéficie d'un certain niveau d'accès. Ainsi, chaque fois qu'un utilisateur effectue un achat, Adapty lui accorde l'accès à l'application pour une période spécifique (pour les abonnements) ou indéfiniment (pour les achats à vie).
Lorsque vous créez une application dans l'Adapty Dashboard, le niveau d'accès `premium` est automatiquement généré. Il s'agit du niveau d'accès par défaut, qui ne peut pas être supprimé.
:::tip
Vous pouvez également créer des niveaux d'accès par programmation via le [Developer CLI](developer-cli-reference#adapty-access-levels-create).
:::
Pour créer un nouveau niveau d'accès :
1. Accédez à **[Products](https://app.adapty.io/access-levels)** depuis le menu principal d'Adapty, puis sélectionnez l'onglet **Access levels**.
2. Cliquez sur **Create access level**.
3. Dans la fenêtre **Create access level**, attribuez-lui un identifiant. Cet identifiant servira de référence dans votre application mobile, permettant l'accès aux fonctionnalités supplémentaires lors d'un achat. Il permet également de distinguer un niveau d'accès des autres au sein de l'application. Assurez-vous qu'il est clair et facile à comprendre.
4. Cliquez sur **Create access level** pour confirmer la création du niveau d'accès.
---
# File: assigning-access-level-to-a-product
---
---
title: "Associer un niveau d'accès à un produit"
description: "Associez des niveaux d'accès aux produits pour optimiser la gestion des abonnements."
---
Chaque [produit](product) doit être associé à un niveau d'accès pour que les utilisateurs reçoivent le contenu correspondant après leur achat. Adapty détermine automatiquement la durée de l'abonnement, qui sert ensuite de date d'expiration pour le niveau d'accès. Dans le cas d'un produit à accès à vie, si un client l'achète, le niveau d'accès reste actif indéfiniment, sans date d'expiration.
Pour associer un niveau d'accès à un produit :
1. Lors de la [configuration d'un produit](create-product), sélectionnez le niveau d'accès dans la liste **Access Level ID**.
2. Cliquez sur **Save**.
---
# File: give-access-level-to-specific-customer
---
---
title: "Accorder un niveau d'accès à un client spécifique"
description: "Attribuez des niveaux d'accès spécifiques aux clients grâce aux outils avancés d'Adapty."
---
Vous pouvez ajuster manuellement le niveau d'accès d'un client directement depuis l'Adapty Dashboard. C'est particulièrement utile dans les scénarios de support. Par exemple, si vous souhaitez prolonger l'utilisation premium d'un utilisateur d'une semaine supplémentaire pour le remercier d'avoir laissé un avis fantastique.
## Accorder un niveau d'accès à un client spécifique depuis l'Adapty Dashboard \{#give-access-level-to-a-specific-customer-in-the-adapty-dashboard\}
1. Accédez à **[Profiles and Segments](https://app.adapty.io/placements)** depuis le menu principal d'Adapty.
2. Cliquez sur le client auquel vous souhaitez accorder l'accès.
3. Cliquez sur **Add access level**.
4. Sélectionnez le niveau d'accès à accorder et la date à laquelle il doit expirer pour ce client.
5. Cliquez sur **Apply**.
## Accorder un niveau d'accès à un client spécifique via l'API \{#give-access-level-to-a-specific-customer-via-api\}
Vous avez également la possibilité d'accorder un niveau d'accès à un client depuis votre serveur via l'API Adapty. C'est pratique si vous proposez des bonus pour les parrainages ou d'autres événements liés à vos produits. Retrouvez plus de détails sur la page [Accorder un niveau d'accès via l'API côté serveur](api-adapty/operations/grantAccessLevel).
---
# File: local-access-levels
---
---
title: "Niveaux d'accès locaux"
description: "Gérez les niveaux d'accès en cas de pannes temporaires."
---
:::important
Notez les points suivants :
- Les niveaux d'accès locaux sont pris en charge dans le SDK Adapty à partir de la version 3.12.
- Par défaut, les niveaux d'accès locaux sont désactivés sur Android pour des raisons de sécurité supplémentaire. Si vous en avez besoin, activez-les lors de l'activation du SDK : [Android](sdk-installation-android#enable-local-access-levels), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter#enable-local-access-levels-android).
:::
Chaque produit que vous configurez est associé à un [**niveau d'accès**](access-level). Lorsque vos utilisateurs effectuent un achat, le SDK Adapty attribue le niveau d'accès au [profil](profiles-crm) de l'utilisateur. Vous devez donc utiliser ce niveau d'accès pour déterminer si les utilisateurs peuvent accéder au contenu payant dans l'application.
Le SDK Adapty est très fiable, et il est très rare que ses serveurs soient indisponibles. Cependant, même dans ce cas exceptionnel, vos utilisateurs ne s'en apercevront pas.
Si un utilisateur effectue un achat mais qu'Adapty ne peut pas recevoir de réponse, le SDK bascule vers la vérification des achats directement dans le store. Le niveau d'accès est donc accordé localement dans l'application, sans aucune configuration supplémentaire. Le SDK gère cela automatiquement en arrière-plan, et les utilisateurs accèdent à ce pour quoi ils ont payé, exactement comme d'habitude.
Voici comment fonctionnent les niveaux d'accès locaux :
- Lorsque les utilisateurs sont à nouveau en ligne, les informations de transaction sont automatiquement transmises aux serveurs Adapty, qui appliquent alors les transactions au profil utilisateur et renvoient le profil mis à jour au SDK.
- Les données mises à jour n'apparaissent pas dans les analyses Adapty tant qu'elles n'ont pas été transmises.
- Les niveaux d'accès locaux ne fonctionnent que lorsque les serveurs Adapty sont hors service. Sinon, le SDK utilise les données en cache disponibles.
- Les niveaux d'accès locaux ne fonctionnent pas pour les produits consommables, sauf lorsqu'un produit consommable se voit attribuer un type d'abonnement (mensuel, annuel, hebdomadaire, etc.) dans le tableau de bord Adapty.
---
# File: placements
---
---
title: "Placements"
description: "Gérez les placements dans Adapty pour optimiser la visibilité des flows et paywalls et augmenter les revenus."
---
Avec le système de placements d'Adapty, vous pouvez créer et exécuter des [flows](adapty-flow-builder), des [paywalls](paywalls), des [onboardings](onboardings) et des [tests A/B](ab-tests) à différents moments du parcours utilisateur dans votre application, comme le flow d'onboarding, les paramètres de l'application, etc. Ces points sont appelés **Placements**.
Un placement dans votre application peut gérer plusieurs flows, paywalls, onboardings ou tests A/B simultanément, chacun destiné à un groupe d'utilisateurs spécifique, que nous appelons [Audiences](audience). Vous pouvez également expérimenter avec des flows, des paywalls et des onboardings en les remplaçant les uns par les autres au fil du temps, sans publier de nouvelle version de l'application.
La seule chose que vous codez en dur dans l'application mobile est l'identifiant du placement.
## Liste des placements \{#placements-list\}
Il existe trois types de placements :
- **Placements de flows**
- **Placements de paywalls**
- **Placements d'onboardings**
Pour afficher tous vos placements, accédez à **Placements** depuis le menu principal d'Adapty. Vous les verrez classés dans les onglets **Paywalls**, **Onboardings** et **Flows**.
Chaque onglet offre une vue d'ensemble des différents emplacements du parcours utilisateur où des flows, paywalls, onboardings ou tests A/B peuvent apparaître. Chaque élément de la liste correspond à un placement spécifique, ce qui facilite la gestion et la modification.
Vous pouvez modifier les détails d'un placement, l'associer au flow, paywall, onboarding ou test A/B souhaité pour une audience donnée, ou supprimer les placements inutiles. Les chiffres dans le tableau reflètent les analyses des placements depuis leur activation.
Depuis cette page, vous pouvez :
- [Créer un nouveau placement](create-placement)
- [Modifier un placement existant](edit-placement)
- [Supprimer un placement existant](delete-placement)
- Télécharger les [flows](fallback-flows), [paywalls](fallback-paywalls) ou onboardings de secours locaux. Ces fichiers sont utilisés lorsqu'un utilisateur ouvre l'application sans connexion au backend Adapty (pas de connexion internet, ou dans le cas rare où le backend est indisponible) et qu'il n'y a pas de cache sur l'appareil. Le même téléchargement **Fallbacks** couvre à la fois les flows et les paywalls — la version du SDK que vous sélectionnez dans la boîte de dialogue de téléchargement détermine si le bundle inclut des flows (SDK 4.0+) ou uniquement des paywalls.
---
# File: choose-meaningful-placements
---
---
title: "Choisir des placements pertinents"
description: "Optimisez les placements de flows et de paywalls avec Adapty pour améliorer l'engagement des utilisateurs et les revenus."
---
Lorsque vous [créez des placements](create-placement), il est essentiel de réfléchir au parcours logique de votre application et à l'expérience utilisateur que vous souhaitez offrir. La plupart des applications devraient avoir au maximum 5 [placements](placements) sans pour autant sacrifier la capacité à mener des expériences. Voici un exemple de structure possible pour vos placements :
1. **Flow d'onboarding :** Cette étape représente la première interaction de vos utilisateurs avec votre application. C'est une excellente occasion de leur présenter la proposition de valeur de votre app en combinant ici des placements de flow, d'onboarding et de paywall. Plus de 80 % des abonnements sont activés pendant le parcours d'onboarding, il est donc primordial de mettre en avant les abonnements les plus rentables à cette étape. Avec Adapty, vous pouvez facilement proposer différents [flows](adapty-flow-builder), [onboardings](onboardings) et [paywalls](paywalls) selon les audiences, et lancer des tests A/B pour trouver la meilleure option pour votre application. Par exemple, vous pouvez lancer un test A/B pour les utilisateurs américains en leur affichant des abonnements plus coûteux 50 % du temps.
2. **Paramètres de l'application :** Si l'utilisateur ne s'est pas abonné pendant l'onboarding, vous pouvez créer un placement de flow ou de paywall au sein de l'application. Cela peut se faire dans les paramètres de l'app ou après qu'un utilisateur a accompli une action cible spécifique. Les utilisateurs déjà dans l'app ayant tendance à réfléchir davantage avant de s'abonner, les produits proposés ici peuvent être légèrement moins chers qu'à l'étape d'onboarding.
3. **Promo :** Si l'utilisateur ne s'est toujours pas abonné après avoir vu le flow ou le paywall à plusieurs reprises, cela peut indiquer que les prix sont trop élevés pour lui ou qu'il hésite à s'engager. Dans ce cas, vous pouvez lui proposer une offre spéciale avec l'abonnement le plus abordable, voire un produit à accès à vie. Cela peut convaincre les utilisateurs sensibles aux prix ou sceptiques vis-à-vis des abonnements de passer à l'achat.
La plupart des applications suivront une logique et des placements similaires, en accompagnant le parcours utilisateur aux étapes clés où des flows, paywalls, onboardings ou tests A/B peuvent être affichés pour stimuler les conversions et les revenus. Vous pouvez les configurer dans chaque placement afin d'expérimenter et d'optimiser vos stratégies de monétisation.
---
# File: create-placement
---
---
title: "Créer un placement"
description: "Créez et gérez des placements dans Adapty pour améliorer les performances des flows et des paywalls."
---
Un [placement](placements) est un endroit précis dans votre application mobile où vous pouvez afficher un flow, un paywall, un onboarding ou un test A/B. Par exemple, un choix d'abonnement peut apparaître dans un flow de démarrage, tandis qu'un produit consommable (comme des pièces d'or) pourrait s'afficher quand un utilisateur manque de pièces dans un jeu.
Vous pouvez afficher les mêmes flows, paywalls, onboardings ou tests A/B — ou des versions différentes — dans divers placements ou pour différents segments d'utilisateurs, appelés « audiences » dans Adapty.
Consultez la section [Choisir des placements pertinents](choose-meaningful-placements) pour des conseils sur le choix du bon placement.
:::tip
Vous pouvez également créer des placements par programmation via le [Developer CLI](developer-cli-reference#adapty-placements-create).
:::
:::info
Bien que la création d'un placement soit similaire pour les flows, les paywalls et les onboardings, il n'est pas possible de créer un seul placement qui serve plusieurs types à la fois — chaque type de placement traite des métriques différentes.
:::
## Créer et configurer un placement \{#create-and-configure-a-placement\}
1. Accédez à **[Placements](https://app.adapty.io/placements)** depuis le menu principal d'Adapty. Passez à l'onglet **Flows**, **Paywalls** ou **Onboardings** selon le type de placement que vous souhaitez créer.
2. Cliquez sur **Create placement**.
3. Saisissez un **Placement name**. Il s'agit d'un identifiant interne dans l'Adapty Dashboard. Vous pouvez le modifier ultérieurement si nécessaire.
4. Saisissez un **Placement ID**. Vous utiliserez cet identifiant dans le SDK Adapty pour appeler les [flows](adapty-flow-builder), [paywalls](paywalls), [onboardings](onboardings) et [tests A/B](ab-tests) du placement. Vous ne pourrez pas le modifier par la suite, car il est unique pour chaque placement.
Assignez ensuite un flow, un paywall, un onboarding ou un test A/B au placement. Adapty prend en charge les [audiences](audience) — des segments d'utilisateurs basés sur des [segments](segments) — afin d'afficher des contenus différents à différents groupes d'utilisateurs. Si vous n'avez pas besoin de ciblage, l'audience par défaut *All users* couvre tout le monde.
:::note
Pour continuer, assurez-vous d'avoir créé un flow, un paywall, un onboarding ou un test A/B à exécuter, ainsi qu'une audience à spécifier.
:::
1. Dans la fenêtre **Placements/ Your placement**, ajoutez un flow, un paywall, un onboarding ou un test A/B à afficher pour l'audience par défaut *All users*. Pour ce faire, cliquez sur le bouton **Run flow**, **Run paywall** ou **Run A/B test** (l'intitulé dépend du type de placement), puis sélectionnez le flow, le paywall, l'onboarding ou le test A/B souhaité dans la liste déroulante.
2. Si vous souhaitez utiliser plusieurs audiences dans le placement pour créer un contenu personnalisé adapté à différents groupes d'utilisateurs, cliquez sur le bouton **Add audience** et choisissez le segment d'utilisateurs souhaité dans la liste.
Le fichier CSV exporté contient les informations suivantes sur vos placements :
- ID du placement
- Nom du placement
- Nom de l'audience
- Nom du segment
- Nom du test A/B cross-placement
- Nom du test A/B
- Nom du flow, nom du paywall ou nom de l'onboarding (selon l'onglet depuis lequel vous avez exporté)
:::note
Les tests A/B cross-placement ne sont pas pris en charge pour les placements de flows, donc cette colonne sera vide dans les exports de flows.
:::
---
# File: delete-placement
---
---
title: "Supprimer un placement"
description: "Découvrez comment supprimer un placement dans Adapty sans affecter les performances de votre flow ou de votre paywall."
---
Un [placement](placements) désigne un emplacement précis dans votre application mobile où un flow, un paywall, un onboarding ou un test A/B peut être affiché.
:::danger
Même si vous pouvez supprimer n'importe quel placement, il est essentiel de vous assurer que vous ne supprimez pas un placement activement utilisé dans votre application mobile. Supprimer un placement de flow ou de paywall actif entraînera l'affichage permanent d'un paywall de secours local si vous en avez [configuré un](fallback-paywalls), et vous ne pourrez plus jamais le remplacer par un flow ou un paywall dynamique dans les versions déjà publiées de l'application.
:::
Pour supprimer un placement existant :
1. Accédez à **[Placements](https://app.adapty.io/placements)** depuis le menu principal d'Adapty. Basculez vers l'onglet **Flows**, **Paywalls** ou **Onboardings** selon le type de placement que vous souhaitez supprimer.
2. Cliquez sur le bouton **3 points** à côté du placement et sélectionnez l'option **Delete**.
3. Dans la fenêtre **Delete placement** qui s'ouvre, saisissez le nom du produit que vous êtes sur le point de supprimer.
4. Cliquez sur le bouton **Delete forever** pour confirmer la suppression.
---
# File: audience
---
---
title: "Audiences"
description: "Apprenez à segmenter et gérer les audiences dans Adapty pour des offres d'abonnement ciblées."
---
Les **audiences** dans Adapty sont des groupes d'utilisateurs basés sur des [segments](segments), vous permettant de personnaliser les flows, paywalls, onboardings ou tests A/B pour des groupes d'utilisateurs spécifiques. Vous pouvez définir ces segments à l'aide de filtres pour vous assurer que les bons utilisateurs voient le bon flow, paywall ou onboarding dans votre application.
Dans Adapty, un **placement** est l'endroit où vous pouvez afficher des flows, paywalls, onboardings ou tests A/B. Lorsque vous ajoutez une audience à un placement, vous ciblez des groupes d'utilisateurs spécifiques avec du contenu personnalisé. Par exemple, vous pouvez afficher différents flows ou paywalls selon l'âge, l'appareil ou le statut d'abonnement d'un utilisateur. Si un utilisateur appartient à plusieurs groupes, vous pouvez choisir quel groupe est prioritaire et décider ainsi quel contenu il verra.
Dans l'exemple ci-dessous, nous avons un flow d'onboarding à afficher dans votre placement avec l'identifiant `Onboarding`. Dans le code de votre application, vous accéderez au placement en utilisant cet identifiant. Si l'utilisateur appartient à l'audience « Yoga beginners », il verra le premier paywall. Ceux qui n'appartiennent pas à l'audience « Yoga beginners » verront le second paywall.
Pour afficher un flow, un paywall, un onboarding ou un test A/B à une audience spécifique, procédez comme suit :
1. [Créez un segment d'utilisateurs](segments#creation). Vous pouvez ignorer cette étape si vous souhaitez afficher le flow, le paywall ou le test A/B à tous les utilisateurs. Dans ce cas, utilisez l'audience « All users » créée par défaut.
2. [Ajoutez ce segment comme audience à un placement et définissez quel flow, paywall ou test A/B doit lui être affiché](add-audience-paywall-ab-test). L'audience « All users » est automatiquement ajoutée à chaque placement ; vous n'avez qu'à préciser quel flow, paywall ou test A/B doit être affiché.
3. [Définissez les bonnes priorités](change-audience-priority) si vous avez plus d'une audience dans un placement. Cela garantit que les utilisateurs appartenant à plusieurs audiences verront le contenu le plus pertinent. Lorsqu'un utilisateur fait partie de plusieurs audiences, le contenu de l'audience ayant la priorité la plus haute sera affiché.
4.
Dans ce cas, on s'appuie sur la priorité des audiences. La priorité des audiences est un ordre numérique où #1 est la plus haute. Elle définit l'ordre dans lequel les audiences sont évaluées. En termes simples, la priorité des audiences aide Adapty à décider quelle audience appliquer en premier pour sélectionner le paywall, l'onboarding ou le test A/B à afficher. Si la priorité d'une audience est faible, les utilisateurs qui y sont éligibles pourraient être ignorés et redirigés vers une autre audience de priorité plus élevée.
Les audiences interplacements, c'est-à-dire celles créées pour les [tests A/B interplacements](ab-tests#ab-test-types), ont toujours la priorité sur les audiences classiques.
L'audience « Tous les utilisateurs » a toujours la priorité la plus basse, car c'est une audience de secours qui inclut tous ceux qui ne correspondent à aucune autre audience.
Pour ajuster les priorités des audiences d'un placement :
1. Lors de la création ou de la modification d'un placement, cliquez sur **Edit priority**. Ce bouton n'est visible que si au moins trois audiences sont ajoutées au placement (« Tous les utilisateurs » et deux autres). Si vous en avez moins, l'ordre est évident — l'audience « Tous les utilisateurs » vient en dernier.
2. Dans la fenêtre **Edit audience priorities** qui s'ouvre, faites glisser-déposer les audiences pour les réorganiser dans le bon ordre.
3. Cliquez sur le bouton **Save**.
---
# File: placement-metrics
---
---
title: "Métriques de placement"
description: "Analysez les métriques de placement dans Adapty pour améliorer les performances de vos paywalls."
---
Avec Adapty, vous pouvez créer et gérer plusieurs placements dans votre application, chacun associé à des paywalls ou des tests A/B distincts. Cette flexibilité vous permet de cibler des segments d'utilisateurs spécifiques, d'expérimenter différentes offres ou modèles de tarification, et d'optimiser la stratégie de monétisation de votre application.
Pour recueillir des informations précieuses sur les performances de vos placements et l'engagement des utilisateurs avec vos offres, Adapty suit diverses interactions utilisateur et transactions liées aux paywalls affichés. Ce système d'analyse robuste capture des métriques telles que les vues, les vues uniques, les achats, les essais, les remboursements, les taux de conversion et les revenus.
Les métriques collectées sont mises à jour en temps réel et sont accessibles et analysables via le tableau de bord convivial d'Adapty. Vous pouvez personnaliser la plage de temps pour l'analyse, appliquer des filtres selon différents paramètres et comparer les métriques entre différents placements, segments d'utilisateurs ou produits.
Les métriques de placement sont disponibles dans la liste des placements, où vous pouvez obtenir une vue d'ensemble des performances de tous vos placements. Cette vue de haut niveau fournit des métriques agrégées pour chaque placement, vous permettant de comparer leurs performances et d'identifier des tendances.
Pour une analyse plus détaillée de chaque placement, vous pouvez accéder aux métriques de détail du placement. Sur cette page, vous trouverez des métriques complètes spécifiques au placement sélectionné. Ces métriques offrent des informations plus approfondies sur les performances d'un placement particulier, vous permettant d'évaluer son efficacité et de prendre des décisions basées sur les données.
### Filtrer les métriques par date d'installation \{#filter-metrics-by-install-date\}
Les métriques de paywall, d'essai et d'achat peuvent être regroupées selon deux dates différentes :
- **La date de l'événement** — quand le paywall a été consulté, l'essai commencé ou l'achat effectué.
- **La date d'installation** — quand l'utilisateur a ouvert l'application pour la première fois.
Les deux vues peuvent afficher des chiffres très différents pour la même plage de dates. La case **Filter metrics by install date** contrôle laquelle le tableau de bord utilise :
- **Décochée (par défaut)** : les métriques sont regroupées par date d'événement.
- **Cochée** : les métriques sont regroupées par date d'installation.
**Exemple.** Vous définissez la plage de dates du 1er au 30 avril et vous regardez les essais.
- **Décochée** : affiche les essais qui ont *démarré* en avril, quelle que soit la date d'installation de ces utilisateurs.
- **Cochée** : affiche les essais des utilisateurs qui se sont *installés* en avril, quelle que soit la date de début de leur essai.
Utilisez la vue par date d'installation pour mesurer les performances d'acquisition d'utilisateurs pour une cohorte spécifique. Utilisez la vue par date d'événement pour mesurer l'activité d'un paywall ou d'un onboarding sur une période donnée.
### Contrôles des métriques \{#metrics-controls\}
Le système affiche les métriques en fonction de la période sélectionnée et les organise selon le paramètre de la colonne de gauche avec quatre niveaux d'indentation.
#### Options d'affichage pour les données de métriques \{#view-options-for-metrics-data\}
La page des métriques de placement propose deux options d'affichage : par paywall et par audience.
Dans la vue par paywall, les métriques sont regroupées par placements associés au paywall. Cela permet aux utilisateurs d'analyser les métriques selon différents placements.
Dans la vue par audience, les métriques sont regroupées par audience cible du paywall. Les utilisateurs peuvent évaluer les métriques spécifiques à différents segments d'audience.
#### Plages de temps \{#time-ranges\}
Vous pouvez choisir parmi plusieurs périodes pour analyser les données de métriques, ce qui vous permet de vous concentrer sur des durées spécifiques comme des jours, des semaines, des mois ou des plages de dates personnalisées.
#### Filtres et regroupements disponibles \{#available-filters-and-grouping\}
:::link
Article principal : [Contrôles analytiques](controls-filters-grouping-compare-proceeds)
:::
Adapty propose des outils puissants pour filtrer et personnaliser l'analyse des métriques selon vos besoins. La page des métriques vous donne accès à différentes plages de temps, options de regroupement et possibilités de filtrage.
- ✅ Filtrer par : audience, paywall, groupe de paywalls, placement, pays, store.
- ✅ Regrouper par : segment, store et produit
#### Graphique de métrique unique \{#single-metrics-chart\}
L'un des éléments clés de la page des métriques de placement est la section graphique, qui représente visuellement les métriques sélectionnées et facilite l'analyse.
La section graphique de la page des métriques de placement comprend un graphique à barres horizontales qui représente visuellement les valeurs des métriques choisies. Chaque barre correspond à une valeur de métrique et est proportionnelle en taille, ce qui facilite la compréhension des données d'un coup d'œil. La ligne horizontale indique la période analysée, et la colonne verticale affiche les valeurs numériques des métriques. La valeur totale de toutes les métriques est affichée à côté du graphique.
De plus, cliquer sur l'icône de flèche dans le coin supérieur droit de la section graphique développe la vue et affiche les métriques sélectionnées sur toute la ligne du graphique.
#### Récapitulatif total des métriques \{#total-metrics-summary\}
À côté du graphique de métrique unique, le récapitulatif total des métriques affiche les valeurs cumulées pour les métriques sélectionnées à un moment précis, avec la possibilité de changer la métrique affichée via un menu déroulant.
### Définitions des métriques \{#metrics-definitions\}
Exploitez toute la puissance des métriques de placement grâce à ces définitions complètes. Des revenus aux taux de conversion, obtenez des informations précieuses qui boosteront vos stratégies de monétisation et contribueront au succès de votre application.
:::note
Adapty convertit les autres devises en USD au taux de change de [currencylayer.com](https://currencylayer.com/) (actualisé toutes les 8 heures). Le taux est **fixé au moment de la transaction** — les variations ultérieures n'affectent pas le résultat de la conversion.
:::
#### Revenus \{#revenue\}
Cette métrique représente le montant total d'argent généré en USD à partir des achats et des renouvellements au sein de placements spécifiques. Notez que le calcul des revenus n'inclut pas la commission de l'App Store Apple ou du Google Play Store et est calculé avant déduction des frais.
#### Produits nets \{#proceeds\}
Cette métrique représente le montant réel reçu par le propriétaire de l'application en USD à partir des achats et des renouvellements au sein de placements spécifiques, après déduction de la commission applicable de l'App Store Apple ou du Google Play Store. Elle reflète le revenu net qui contribue directement aux gains de l'application. Pour plus d'informations sur le calcul des produits nets, consultez la [documentation](analytics-cohorts#revenue-vs-proceeds) Adapty.
#### ARPPU \{#arppu\}
ARPPU signifie « revenu moyen par utilisateur payant » et mesure le revenu moyen généré par utilisateur payant au sein de placements spécifiques. Il est calculé en divisant le revenu total par le nombre d'utilisateurs payants uniques. Par exemple, si le revenu total est de 15 000 $ et qu'il y a 1 000 utilisateurs payants, l'ARPPU est de 15 $.
#### ARPAS \{#arpas\}
L'ARPAS, ou revenu moyen par abonné actif, mesure le revenu moyen généré par abonné actif au sein de placements spécifiques. Il est calculé en divisant le revenu total par le nombre d'abonnés ayant activé un essai ou un abonnement. Par exemple, si le revenu total est de 5 000 $ et qu'il y a 1 000 abonnés, l'ARPAS est de 5 $. Cette métrique permet d'évaluer le potentiel de monétisation moyen par abonné.
#### ARPU \{#arpu\}
Pour les placements d'onboarding uniquement. L'ARPU est le revenu moyen par utilisateur ayant visionné l'onboarding. Il est calculé en divisant le revenu total par le nombre de spectateurs uniques.
#### Taux de conversion unique vers les achats \{#unique-cr-to-purchases\}
Le taux de conversion unique vers les achats est calculé en divisant le nombre d'achats au sein de placements spécifiques par le nombre de vues uniques. Il se concentre sur le ratio achats/vues uniques, fournissant des informations sur l'efficacité à convertir les visiteurs uniques en clients payants au sein de placements spécifiques.
#### Taux de conversion vers les achats \{#cr-to-purchases\}
Le taux de conversion vers les achats est calculé en divisant le nombre d'achats au sein de placements spécifiques par le nombre total de vues des paywalls. Il indique le pourcentage de vues au sein de placements spécifiques qui se traduisent par des achats, fournissant des informations sur l'efficacité de votre paywall à convertir les utilisateurs en clients payants.
#### Taux de conversion unique vers les essais \{#unique-cr-to-trials\}
Le taux de conversion unique vers les essais est calculé en divisant le nombre d'essais démarrés au sein de placements spécifiques par le nombre de vues uniques. Il mesure le pourcentage de vues uniques au sein de placements spécifiques qui se traduisent par des activations d'essai, fournissant des informations sur l'efficacité de votre paywall à convertir les visiteurs uniques en utilisateurs d'essai.
#### Achats \{#purchases\}
Les achats représentent le total cumulé de diverses transactions effectuées sur le paywall au sein de placements spécifiques. Les transactions suivantes sont incluses dans cette métrique (les renouvellements ne sont pas inclus) :
- Les nouveaux achats effectués directement au sein de placements spécifiques.
- Les conversions d'essais initialement activés au sein de placements spécifiques.
- Les déclassements, mises à niveau et changements de niveau d'abonnements effectués au sein de placements spécifiques.
- Les restaurations d'abonnements au sein de placements spécifiques, par exemple lorsqu'un abonnement est réactivé après expiration sans renouvellement automatique.
En tenant compte de ces différents types de transactions, la métrique des achats offre une vue complète de l'activité globale d'acquisition et de monétisation au sein de placements spécifiques.
#### Essais \{#trials\}
La métrique des essais représente le nombre total d'essais activés au sein de placements spécifiques. Elle reflète le nombre d'utilisateurs ayant lancé des périodes d'essai via votre paywall dans ces placements. Cette métrique permet de suivre l'efficacité de votre offre d'essai et peut fournir des informations sur l'engagement des utilisateurs et la conversion des essais en abonnements payants.
#### Essais annulés \{#trials-canceled\}
La métrique des essais annulés représente le nombre d'essais au sein de placements spécifiques pour lesquels le renouvellement automatique a été désactivé. Cela se produit lorsque les utilisateurs se désinscrivent manuellement de l'essai, indiquant leur décision de ne pas poursuivre l'abonnement après la période d'essai. Le suivi des essais annulés fournit des informations précieuses sur le comportement des utilisateurs et vous permet de comprendre le taux auquel les utilisateurs optent pour quitter l'essai au sein de placements spécifiques.
#### Remboursements \{#refunds\}
La métrique des remboursements représente le nombre d'achats et d'abonnements remboursés au sein de placements spécifiques. Cela inclut les transactions qui ont été annulées ou remboursées pour diverses raisons, telles que les demandes des clients, les problèmes de paiement ou toute autre politique de remboursement applicable.
#### Taux de remboursement \{#refund-rate\}
Le taux de remboursement est calculé en divisant le nombre de remboursements au sein de placements spécifiques par le nombre de premiers achats (les renouvellements ne sont pas inclus). Par exemple, s'il y a 5 remboursements et 1 000 premiers achats, le taux de remboursement est de 0,5 %.
#### Vues \{#views\}
La métrique des vues représente le nombre total de fois que le paywall au sein de placements spécifiques a été consulté par des utilisateurs. Chaque fois qu'un utilisateur visite le paywall dans ces placements, cela est compté comme une vue distincte. Le suivi des vues vous aide à comprendre le niveau d'engagement et l'interaction des utilisateurs avec votre paywall, fournissant des informations sur le comportement des utilisateurs et l'efficacité du positionnement et de la conception de votre paywall dans des zones spécifiques de votre application.
#### Vues uniques \{#unique-views\}
La métrique des vues uniques représente le nombre d'instances uniques dans lesquelles le paywall au sein de placements spécifiques a été consulté par des utilisateurs. Contrairement aux vues totales, qui comptent chaque visite comme une vue distincte, les vues uniques ne comptent qu'une seule fois la visite de chaque utilisateur au paywall dans ces placements, quel que soit le nombre de fois où il y accède. Le suivi des vues uniques fournit une mesure plus précise de l'engagement des utilisateurs et de la portée de votre paywall au sein de placements spécifiques, car il se concentre sur les utilisateurs individuels plutôt que sur le nombre total de visites.
#### Complétions et complétions uniques \{#completions--unique-completions\}
Pour les placements d'onboarding uniquement. Les complétions comptabilisent le nombre de fois où les utilisateurs terminent votre placement d'onboarding, c'est-à-dire qu'ils passent du premier au dernier écran. Si quelqu'un le termine deux fois, cela compte comme deux **complétions** mais une seule **complétion unique**.
#### Taux de complétions uniques \{#unique-completions-rate\}
Pour les placements d'onboarding uniquement. Le nombre de complétions uniques divisé par le nombre de vues uniques. Cette métrique vous aide à comprendre comment les utilisateurs interagissent avec le placement d'onboarding et à apporter des modifications si vous constatez qu'ils l'ignorent.
---
# File: paywalls
---
---
title: "Paywalls"
description: "Explorez le système de paywalls d'Adapty et les bonnes pratiques pour augmenter vos revenus."
---
## Étapes suivantes \{#next-steps\}
Après avoir créé votre premier paywall :
1. Ajoutez-le à un [placement](placements). Les identifiants de placement seront les seules entités codées en dur. Vous les utiliserez pour récupérer les produits à vendre.
2. La façon dont vous travaillez ensuite avec le paywall dépend de votre implémentation :
- Si vous souhaitez utiliser le [Adapty Paywall Builder](adapty-paywall-builder), concevez le paywall dans l'éditeur no-code. Adapty affichera le paywall et gérera la logique d'achat, tandis que vous n'aurez qu'à afficher le paywall dans le code de l'application.
- Si vous avez un paywall personnalisé que vous souhaitez utiliser, consultez nos guides pour implémenter des achats intégrés avec Adapty pour votre plateforme :
- [iOS](ios-implement-paywalls-manually)
- [Android](android-implement-paywalls-manually)
- [React Native](react-native-implement-paywalls-manually)
- [Flutter](flutter-implement-paywalls-manually)
- [Unity](unity-implement-paywalls-manually)
- [Kotlin Multiplatform](kmp-implement-paywalls-manually)
---
# File: customize-paywall-with-remote-config
---
---
title: "Concevoir un paywall avec Remote Config"
description: "Personnalisez votre paywall avec Remote Config dans Adapty pour un meilleur ciblage."
---
:::important
Ce guide porte sur Remote Config pour les paywalls classiques. Pour le Flow Builder, consultez [Personnaliser un flow avec Remote Config](customize-flow-with-remote-config).
:::
Le Remote Config de paywall est un outil puissant qui offre des options de configuration flexibles. Il permet d'utiliser des charges JSON personnalisées pour adapter vos paywalls avec précision. Vous pouvez y définir divers paramètres tels que les titres, les images, les polices, les couleurs, et bien plus encore.
3. Passez à l'onglet **Remote config**.
Remote Config propose 2 vues :
- [Table](customize-paywall-with-remote-config#table-view-of-the-remote-config)
- [JSON](customize-paywall-with-remote-config#json-view-of-the-remote-config)
Les vues **Table** et **JSON** contiennent les mêmes éléments de configuration. La seule différence est une question de préférence, à ceci près que la vue Table propose un menu contextuel, ce qui peut s'avérer utile pour corriger des erreurs de localisation.
Vous pouvez basculer entre les vues en cliquant sur l'onglet **Table** ou **JSON** à tout moment.
Quelle que soit la vue choisie pour personnaliser votre paywall, vous pouvez ensuite accéder à ces données depuis le SDK via les propriétés `remoteConfig` ou `remoteConfigString` de `AdaptyPaywall`, et apporter des ajustements à votre paywall. Vous pouvez également mettre à jour les valeurs du Remote Config par programmation via l'[API côté serveur](api-adapty/operations/updatePaywall) afin de modifier dynamiquement les configurations de paywall sans intervention manuelle dans le tableau de bord. Voici quelques exemples d'utilisation d'un Remote Config.
### Vue Table du Remote Config \{#table-view-of-the-remote-config\}
Si vous n'avez pas l'habitude de travailler avec du code et que vous devez corriger certaines valeurs du JSON, Adapty propose la vue **Table**.
Il s'agit d'une copie de votre JSON sous forme de tableau, facile à lire et à comprendre. Un code couleur permet de distinguer les différents types de données.
Pour ajouter une clé, cliquez sur le bouton **Add row**. Nous vérifions automatiquement la correspondance des valeurs et des types, et affichons une alerte si vos corrections risquent de produire un JSON invalide.
Les options supplémentaires de ligne sont surtout utiles pour les [localisations de paywall](add-remote-config-locale) :
Il est maintenant temps de [créer un placement](create-placement) et d'y ajouter le paywall. Ensuite, vous pourrez
4. Cliquez sur **Locales** et sélectionnez les langues que vous souhaitez prendre en charge. Enregistrez vos modifications pour ajouter ces paramètres régionaux au paywall.
Vous pouvez désormais traduire le contenu manuellement, utiliser l'IA, ou exporter le fichier de localisation pour des traducteurs externes.
## Traduire les paywalls avec l'IA \{#translate-paywalls-with-ai\}
La traduction par IA est un moyen rapide et efficace de localiser votre paywall.
Vous pouvez traduire les valeurs de type **String** et **List**. Par défaut, toutes les lignes sont sélectionnées (surlignées en violet). Les lignes déjà traduites sont marquées en vert et ne seront pas incluses dans la nouvelle traduction par défaut. Les lignes non sélectionnées ou non traduites apparaissent en gris.
1. Sélectionnez les lignes à traduire. Il est conseillé de décocher les lignes contenant des identifiants, des URLs et des variables pour éviter que l'IA ne les traduise.
2. Sélectionnez les langues pour la traduction.
3. Cliquez sur **AI Translate** pour appliquer les traductions. Les lignes sélectionnées seront traduites et ajoutées au paywall, avec les lignes traduites marquées en vert.
## Exporter les fichiers de localisation pour traduction externe \{#exporting-localization-files-for-external-translation\}
Bien que la localisation par IA soit une tendance de plus en plus répandue, vous préférerez peut-être une méthode plus fiable, comme faire appel à des traducteurs professionnels ou à une agence de traduction reconnue. Dans ce cas, vous pouvez exporter les fichiers de localisation pour les partager avec vos traducteurs, puis importer les résultats traduits dans Adapty.
L'export via le bouton **Export** crée des fichiers `.json` individuels pour chaque langue, regroupés dans une seule archive. Si vous n'avez besoin que d'un seul fichier, vous pouvez l'exporter directement depuis le menu propre à la langue.
Une fois les fichiers traduits reçus, utilisez le bouton **Import** pour les télécharger tous en même temps ou individuellement. Adapty validera automatiquement les fichiers pour s'assurer qu'ils correspondent au bon format.
### Format du fichier d'import \{#import-file-format\}
Pour garantir un import réussi, le fichier d'import doit respecter les exigences suivantes :
- **Nom et extension du fichier :**
Le nom du fichier doit correspondre au paramètre régional qu'il représente et avoir une extension `.json`. Vous pouvez vérifier et copier le nom du paramètre régional dans Adapty Dashboard. Si le nom n'est pas reconnu, l'import échouera.
- **JSON valide :**
Le fichier doit être un JSON valide. Dans le cas contraire, l'import échouera.
## Localisation manuelle \{#manual-localization\}
Parfois, vous souhaiterez peut-être ajuster des traductions, ajouter des images différentes pour des paramètres régionaux spécifiques, ou encore modifier directement des configurations Remote Config.
1. Choisissez l'élément à traduire et saisissez une nouvelle valeur. Vous pouvez mettre à jour les valeurs de type **String** et **List** ou remplacer des images par d'autres mieux adaptées au paramètre régional.
2. Utilisez le menu contextuel du paramètre régional anglais pour résoudre efficacement les problèmes de localisation :
- **Copy this value to all locales** : Écrase toutes les modifications effectuées dans les paramètres régionaux non-anglais pour la ligne sélectionnée, en les remplaçant par la valeur du paramètre régional anglais.
- **Revert all row changes to original values** : Abandonne toutes les modifications effectuées au cours de la session en cours et restaure les valeurs à leur dernier état enregistré.
Après avoir ajouté des paramètres régionaux à un paywall, veillez à implémenter correctement les codes de paramètres régionaux dans le code de votre application. Consultez
3. ⚠️ Si vous choisissez Stripe, assurez-vous d'utiliser les clés de l'environnement **Test Mode** même si l'interface indique **Sandbox**. Sinon, votre web paywall ne fonctionnera pas. Les **Sandboxes** dans Stripe ne sont pas encore prises en charge.
### Configurer la vérification de domaine Apple Pay \{#set-up-apple-pay-domain-verification\}
Dans **Settings > Domains**, sélectionnez votre prestataire de paiement principal pour la vérification de domaine. Vérifiez ensuite vos domaines de paywall auprès du prestataire concerné :
**Stripe** :
1. Rendez-vous dans les [paramètres des domaines de méthode de paiement](https://dashboard.stripe.com/settings/payment_method_domains) et cliquez sur **Add a new domain**.
2. Ajoutez `app.funnelfox.com` et votre sous-domaine de paywall personnel (il ressemblera à `paywalls-....fnlfx.com`). Pour trouver votre sous-domaine, allez dans **Settings > Domains** et copiez la valeur **Hosted subdomain**.
**Paddle** :
1. Dans la console Paddle, allez dans **Checkout > Website approval** et cliquez sur **Add a new domain**.
2. Ajoutez `app.funnelfox.com` et votre sous-domaine de paywall personnel (il ressemblera à `paywalls-....fnlfx.com`). Pour trouver votre sous-domaine, allez dans **Settings > Domains** et copiez la valeur **Hosted subdomain**.
Le processus d'approbation chez Paddle est manuel, vous devrez donc patienter jusqu'à ce que les domaines passent de `Pending` à `Approved`.
**FunnelFox Billing** :
Suivez les [instructions d'intégration FunnelFox Billing](https://funnelfox.com/docs/billing/integration-billing-funnelfox).
**SolidGate** :
1. Dans votre Solidgate Dashboard, allez dans **Developers > Apple Pay Domains**.
2. Cliquez sur **+ Add new domain** et collez le domaine de votre projet (depuis **Settings > Domains** dans FunnelFox). Ajoutez également votre domaine personnalisé, le cas échéant.
3. Pour utiliser Apple Pay en mode aperçu, ajoutez aussi `http://app.funnelfox.com/`.
## Créer et configurer un web paywall \{#create-and-configure-a-web-paywall\}
1. Sur la page de liste des web paywalls, cliquez sur **Create a paywall**.
2. Saisissez un nom de paywall et cliquez sur **Create**.
3. Vous serez redirigé vers un modèle de base avec deux options d'abonnement et le bouton d'achat Apple Pay.
Le premier écran liste les formules d'abonnement. Les deuxième et troisième écrans sont des écrans de paiement. Chaque écran correspond à une formule proposée. Si vous n'avez qu'une seule formule, supprimez l'écran en trop. Si vous en avez davantage, dupliquez les écrans de paiement.
Le dernier écran que les utilisateurs voient après un achat réussi est celui où vous devez indiquer clairement qu'ils peuvent retourner dans votre application.
4. Configurez la liste des formules : ajoutez ou supprimez des formules et des prix. Tous les prix et formules affichés à l'écran ne sont pas ajoutés dynamiquement, vous devez donc les configurer manuellement.
5. Ajoutez ou configurez un écran de paiement pour chaque formule. Nous recommandons d'ajouter le montant total sur chaque écran de paiement afin que les utilisateurs sachent combien ils devront payer avant de cliquer sur le bouton d'achat.
6. Sur les écrans de paiement, le bouton Apple Pay est déjà présent. Pour qu'il fonctionne, configurez sur chaque écran :
1. **Product type** : choisissez si vous souhaitez ajouter une période d'essai ou une réduction.
2. **Trial period** : saisissez la durée de la période d'essai.
3. **Product** : sélectionnez votre produit depuis votre prestataire de paiement.
:::important
Assurez-vous que le produit est bien ajouté dans Adapty. Sinon, le résultat de l'achat sera défini par défaut.
:::
4. **Subscription discount** : optionnellement, sélectionnez un coupon depuis votre prestataire de paiement.
7. Vous devez maintenant associer les formules aux écrans de paiement. Sur l'écran de sélection des formules, cliquez sur le bouton **Continue** et sélectionnez un écran de destination pour chaque formule.
Lorsque votre paywall est prêt, vous devez récupérer son lien pour l'activer dans Adapty. La façon de l'obtenir dépend de si vous le testez ou le lancez en production :
1. **Pour les tests en sandbox** : cliquez sur **Preview** en haut à droite et copiez le lien.
2. **Pour la production** : cliquez sur **Publish** en haut à droite. Cliquez sur **Home** et copiez le lien depuis la colonne **URL**.
C'est tout ! Utilisez ce lien pour [poursuivre la configuration](web-paywall#step-2-trigger-the-paywall).
---
# File: fallback-paywalls
---
---
title: "Paywalls de secours"
description: "Utilisez les paywalls de secours pour garantir une expérience utilisateur fluide dans Adapty."
---
:::important
Cet article couvre les paywalls de secours pour le SDK Adapty v3 et les versions antérieures. Avec le SDK v4, un seul fichier de secours inclut les données de flow et de paywall — consultez [Flows de secours](fallback-flows). L'ancien format de fichier de secours est incompatible avec le SDK v4, alors téléchargez la version correcte après la mise à niveau.
:::
Pour garantir une expérience utilisateur fluide, il est important de configurer des **versions de secours** pour vos [paywalls](paywalls) et [onboardings](onboardings).
Lorsque votre application charge un paywall, le SDK demande les données de configuration du paywall à nos serveurs. Mais que se passe-t-il si l'appareil ne peut pas se connecter à Adapty en raison de problèmes réseau ou d'une indisponibilité des serveurs ?
* Si l'utilisateur a déjà accédé au paywall et que l'appareil a mis ses données en cache, l'application charge les données du paywall **depuis le cache**.
* Si l'appareil n'a pas mis le paywall en cache, l'application recherche un fichier de configuration stocké localement. Cela permet à l'application d'afficher le paywall sans erreur.
Adapty génère automatiquement des fichiers de configuration de secours à télécharger et à utiliser. Chaque fichier contient les configurations spécifiques à la plateforme pour *tous* vos placements.
## Commencer \{#get-started\}
1. [Téléchargez le fichier de configuration de secours](/local-fallback-paywalls) depuis Adapty.
2. Utilisez le SDK Adapty pour configurer vos paywalls de secours :
* [iOS](ios-use-fallback-paywalls)
* [Android](android-use-fallback-paywalls)
* [React Native](react-native-use-fallback-paywalls)
* [Flutter](flutter-use-fallback-paywalls)
* [Unity](unity-use-fallback-paywalls)
* [Kotlin Multiplatform](kmp-use-fallback-paywalls)
* [Capacitor](capacitor-use-fallback-paywalls)
## Limitations \{#limitations\}
Les paywalls de secours sont codés en dur et stockés localement, ils n'ont donc pas les capacités dynamiques des paywalls Adapty ordinaires.
* Les paywalls de secours ne prennent pas en charge [l'internationalisation](paywall-localization). Le fichier utilise toujours la locale `en`, donc les utilisateurs hors ligne ne voient que l'anglais. [Passez au SDK v4](migration-to-ios-sdk-v4) pour lever cette limite — son fichier de secours inclut toutes les locales.
* Chaque placement ne peut avoir qu'un seul paywall de secours. Si votre configuration inclut différentes configurations de paywall pour différentes [audiences](audience), Adapty utilise la configuration destinée à « All users ».
* Les paywalls de secours ne prennent pas en charge les [tests A/B](ab-tests). Si un paywall participe à un test A/B, son fichier de configuration de secours inclura la variante avec le poids le plus élevé.
* Les paywalls de secours ne peuvent pas être [gérés à distance](customize-paywall-with-remote-config). Si vous souhaitez mettre à jour le fichier de configuration, vous devez publier une nouvelle version de l'application sur l'App Store / Google Play.
---
# File: local-fallback-paywalls
---
---
title: "Télécharger les paywalls de secours"
description: "Utilisez les paywalls de secours locaux dans Adapty pour garantir des flows d'abonnement fluides."
---
Adapty génère automatiquement des fichiers de configuration JSON pour vos [paywalls de secours](/fallback-paywalls), un par plateforme. Ces fichiers contiennent également les données de secours pour vos onboardings.
Si un placement comporte plusieurs paywalls ou onboardings, la version de secours inclura la variante ayant le poids le plus élevé ou l'audience la plus large. Adapty met à jour ces fichiers chaque fois que vous modifiez vos paywalls ou onboardings.
Suivez les étapes ci-dessous pour télécharger vos configurations de secours :
1. Ouvrez la page **[Placements](https://app.adapty.io/placements)**.
2. Cliquez sur le bouton **Fallbacks**.
3. Sélectionnez votre plateforme cible (*iOS* ou *Android*) dans le menu déroulant.
4. Sélectionnez votre version du SDK pour lancer le téléchargement.
## Après le téléchargement \{#after-the-download\}
Suivez le guide de configuration correspondant à votre plateforme :
* [iOS](ios-use-fallback-paywalls)
* [Android](android-use-fallback-paywalls)
* [React Native](react-native-use-fallback-paywalls)
* [Flutter](flutter-use-fallback-paywalls)
* [Unity](unity-use-fallback-paywalls)
* [Kotlin Multiplatform](kmp-use-fallback-paywalls)
* [Capacitor](capacitor-use-fallback-paywalls)
---
# File: paywall-metrics
---
---
title: "Métriques de paywall"
description: "Suivez et analysez les métriques de performance des paywalls pour améliorer vos revenus d'abonnements."
---
Adapty collecte une série de métriques pour vous aider à mieux mesurer la performance de vos paywalls. Toutes les métriques sont mises à jour en temps réel, sauf les vues, qui sont actualisées toutes les quelques minutes. Toutes les métriques, à l'exception des vues, sont attribuées au produit au sein du paywall. Ce document présente les métriques disponibles, leurs définitions et leur mode de calcul.
Les métriques de paywall sont disponibles dans la liste des paywalls, vous offrant une vue d'ensemble de la performance de tous vos paywalls. Cette vue consolidée présente des métriques agrégées pour chaque paywall, ce qui vous permet d'évaluer leur efficacité et d'identifier les axes d'amélioration.
Pour une analyse plus détaillée de chaque paywall, vous pouvez accéder aux métriques détaillées du paywall. Dans cette section, vous trouverez des métriques complètes spécifiques au paywall sélectionné, offrant une vision plus approfondie de ses performances.
### Filtrer les métriques par date d'installation \{#filter-metrics-by-install-date\}
Les métriques de paywall, d'essai et d'achat peuvent être regroupées selon deux dates différentes :
- **La date de l'événement** — quand le paywall a été consulté, l'essai commencé ou l'achat effectué.
- **La date d'installation** — quand l'utilisateur a ouvert l'application pour la première fois.
Les deux vues peuvent afficher des chiffres très différents pour la même plage de dates. La case **Filter metrics by install date** contrôle laquelle le tableau de bord utilise :
- **Décochée (par défaut)** : les métriques sont regroupées par date d'événement.
- **Cochée** : les métriques sont regroupées par date d'installation.
**Exemple.** Vous définissez la plage de dates du 1er au 30 avril et vous regardez les essais.
- **Décochée** : affiche les essais qui ont *démarré* en avril, quelle que soit la date d'installation de ces utilisateurs.
- **Cochée** : affiche les essais des utilisateurs qui se sont *installés* en avril, quelle que soit la date de début de leur essai.
Utilisez la vue par date d'installation pour mesurer les performances d'acquisition d'utilisateurs pour une cohorte spécifique. Utilisez la vue par date d'événement pour mesurer l'activité d'un paywall ou d'un onboarding sur une période donnée.
### Contrôles des métriques \{#metrics-controls\}
Le système affiche les métriques en fonction de la période sélectionnée et les organise selon le paramètre de la colonne de gauche avec trois niveaux d'indentation.
Pour un paywall actif, les métriques couvrent la période allant de la date de démarrage du paywall jusqu'à la date actuelle. Pour les paywalls inactifs, les métriques englobent la totalité de la période allant de la date de démarrage jusqu'à la fin de la période sélectionnée. Les paywalls en brouillon et archivés sont inclus dans le tableau des métriques, mais s'il n'y a pas de données disponibles pour ces paywalls, ils apparaîtront sans aucune métrique affichée.
#### Options d'affichage des données de métriques \{#view-options-for-metrics-data\}
La page de paywall propose deux options d'affichage des données de métriques : par placement et par audience.
Dans la vue par placement, les métriques sont regroupées par placements associés au paywall. Cela permet aux utilisateurs d'analyser les métriques selon les différents placements.
Dans la vue par audience, les métriques sont regroupées par audience cible du paywall. Les utilisateurs peuvent évaluer les métriques spécifiques aux différents segments d'audience. Vous pouvez sélectionner la vue souhaitée via le menu déroulant en haut de la page de détail du paywall.
#### Plages de temps \{#time-ranges\}
Vous pouvez choisir parmi différentes périodes pour analyser les données de métriques, ce qui vous permet de vous concentrer sur des durées spécifiques telles que des jours, des semaines, des mois ou des plages de dates personnalisées.
#### Filtres et regroupements disponibles \{#available-filters-and-grouping\}
:::link
Article principal : [Contrôles Analytics](controls-filters-grouping-compare-proceeds)
:::
Adapty propose des outils puissants pour filtrer et personnaliser l'analyse des métriques selon vos besoins. La page des métriques d'Adapty vous donne accès à différentes plages de temps, options de regroupement et possibilités de filtrage.
- Filtrer par : Audience, pays, paywall, état du paywall, groupe de paywalls, placement, pays, store, produit et store du produit.
- Regrouper par : Produit et store.
#### Graphique d'une métrique unique \{#single-metrics-chart\}
L'un des éléments clés de la page des métriques de paywall est la section graphique, qui représente visuellement les métriques sélectionnées et facilite l'analyse.
La section graphique de la page des métriques de paywall comprend un graphique à barres horizontales qui représente visuellement les valeurs des métriques choisies. Chaque barre du graphique correspond à une valeur de métrique et est proportionnelle en taille, ce qui facilite la compréhension des données en un coup d'œil. La ligne horizontale indique la période analysée, et la colonne verticale affiche les valeurs numériques des métriques. La valeur totale de l'ensemble des métriques est affichée à côté du graphique.
De plus, cliquer sur l'icône de flèche dans le coin supérieur droit de la section graphique élargit la vue, affichant les métriques sélectionnées sur la ligne complète du graphique.
#### Récapitulatif total des métriques \{#total-metrics-summary\}
À côté du graphique d'une métrique unique, la section récapitulatif total des métriques affiche les valeurs cumulées des métriques sélectionnées à un moment précis, avec la possibilité de changer la métrique affichée via un menu déroulant.
### Définitions des métriques \{#metrics-definitions\}
:::note
Adapty convertit les autres devises en USD au taux de change de [currencylayer.com](https://currencylayer.com/) (actualisé toutes les 8 heures). Le taux est **fixé au moment de la transaction** — les variations ultérieures n'affectent pas le résultat de la conversion.
:::
#### Revenu \{#revenue\}
Cette métrique représente le montant total d'argent généré en USD par les achats et les renouvellements. Veuillez noter que le calcul du revenu n'inclut pas la commission de l'App Store / Play Store et est calculé avant déduction des frais éventuels.
#### Recettes \{#proceeds\}
Cette métrique représente le montant réel reçu par le propriétaire de l'application en USD, provenant des achats et des renouvellements, après déduction de la commission applicable de l'App Store / Play Store.
:::important
Informez Adapty si votre application est inscrite à un programme de commission réduite. Pour garantir des calculs corrects, précisez votre statut dans le [Small Business Program](app-store-small-business-program) et le [programme de frais de service réduits](google-reduced-service-fee) dans vos [paramètres d'application](general).
:::
Cela reflète le revenu net qui contribue directement aux gains de l'application. Pour plus d'informations sur le calcul des recettes, vous pouvez consulter la [documentation](analytics-cohorts#revenue-vs-proceeds) Adapty.
#### ARPPU \{#arppu\}
L'ARPPU est le revenu moyen par utilisateur payant. Il se calcule en divisant le revenu total par le nombre d'utilisateurs payants uniques. Par exemple : 15 000 $ de revenu / 1 000 utilisateurs payants = 15 $ d'ARPPU.
#### ARPAS \{#arpas\}
Le revenu moyen par abonné actif vous permet de mesurer le revenu moyen généré par abonné actif. Il se calcule en divisant le revenu total par le nombre d'abonnés ayant activé un essai ou un abonnement. Par exemple, si le revenu total est de 5 000 $ et qu'il y a 1 000 abonnés, l'ARPAS sera de 5 $. Cette métrique aide à évaluer le potentiel de monétisation moyen par abonné.
#### Taux de conversion (CR) unique vers les achats \{#unique-conversion-rate-cr-to-purchases\}
Le taux de conversion unique vers les achats se calcule en divisant le nombre d'achats par le nombre de vues uniques. Par exemple, si 10 achats ont été réalisés pour 100 vues uniques, le taux de conversion unique vers les achats sera de 10 %. Cette métrique se concentre sur le ratio entre les achats et le nombre de vues uniques, offrant des informations sur l'efficacité de conversion des visiteurs uniques en clients payants.
#### CR vers les achats \{#cr-to-purchases\}
Le taux de conversion vers les achats se calcule en divisant le nombre d'achats par le nombre total de vues. Par exemple, si 10 achats ont été réalisés pour 100 vues, le taux de conversion vers les achats sera de 10 %. Cette métrique indique le pourcentage de vues qui aboutissent à des achats, offrant des informations sur l'efficacité de votre paywall à convertir les utilisateurs en clients payants.
#### CR unique vers les essais \{#unique-cr-to-trials\}
Le taux de conversion unique vers les essais se calcule en divisant le nombre d'essais démarrés par le nombre de vues uniques. Par exemple, si 30 essais ont été démarrés pour 100 vues uniques, le taux de conversion unique vers les essais sera de 30 %. Cette métrique mesure le pourcentage de vues uniques qui aboutissent à des activations d'essai, offrant des informations sur l'efficacité de votre paywall à convertir les visiteurs uniques en utilisateurs en période d'essai.
#### Achats \{#purchases\}
Les achats représentent le total cumulé des différentes transactions effectuées sur le paywall. Les transactions suivantes sont incluses dans cette métrique (les renouvellements ne sont pas inclus) :
- Les nouveaux achats effectués directement sur le paywall.
- Les conversions d'essais initialement activés sur le paywall.
- Les rétrogradations, mises à niveau et changements transversaux d'abonnements effectués sur le paywall.
- Les restaurations d'abonnements sur le paywall, par exemple lorsqu'un abonnement est rétabli après expiration sans renouvellement automatique.
En tenant compte de ces différents types de transactions, la métrique des achats offre une vue complète de l'activité globale d'acquisition et de monétisation sur votre paywall.
#### Essais \{#trials\}
La métrique des essais représente le nombre total d'essais qui ont été activés. Elle reflète le nombre d'utilisateurs ayant initié des périodes d'essai via votre paywall. Cette métrique aide à suivre l'efficacité de votre offre d'essai et peut fournir des informations sur l'engagement des utilisateurs et la conversion des essais en abonnements payants.
#### Essais annulés \{#trials-canceled\}
La métrique des essais annulés représente le nombre d'essais pour lesquels la fonctionnalité de renouvellement automatique a été désactivée. Cela se produit lorsque les utilisateurs se désinscrivent manuellement de l'essai, indiquant leur décision de ne pas poursuivre l'abonnement après la fin de la période d'essai. Le suivi des essais annulés fournit des informations précieuses sur le comportement des utilisateurs et vous permet de comprendre le taux auquel les utilisateurs renoncent à l'essai.
#### Remboursements \{#refunds\}
La métrique des remboursements représente le nombre d'achats et d'abonnements remboursés. Cela inclut les transactions qui ont été annulées ou remboursées pour diverses raisons, telles que les demandes des clients, les problèmes de paiement ou toute autre politique de remboursement applicable.
#### Taux de remboursement \{#refund-rate\}
Le taux de remboursement se calcule en divisant le nombre de remboursements par le nombre de premiers achats (les renouvellements ne sont pas inclus). Par exemple, si 5 remboursements ont été effectués pour 1 000 premiers achats, le taux de remboursement sera de 0,5 %.
#### Vues \{#views\}
La métrique des vues représente le nombre total de fois que le paywall a été consulté par les utilisateurs. Chaque fois qu'un utilisateur visite le paywall, cela compte comme une vue distincte. Par exemple, si un utilisateur visite le paywall deux fois, cela sera enregistré comme deux vues. Le suivi des vues vous aide à comprendre le niveau d'engagement et les interactions des utilisateurs avec votre paywall, offrant des informations sur le comportement des utilisateurs et l'efficacité du placement et du design de votre paywall.
#### Vues uniques \{#unique-views\}
La métrique des vues uniques représente le nombre d'instances uniques dans lesquelles le paywall a été consulté par les utilisateurs. Contrairement aux vues totales, qui comptent chaque visite comme une vue distincte, les vues uniques ne comptent la visite d'un utilisateur sur le paywall qu'une seule fois, quel que soit le nombre de fois où il y accède. Par exemple, si un utilisateur visite le paywall deux fois, cela sera enregistré comme une vue unique. Le suivi des vues uniques fournit une mesure plus précise de l'engagement des utilisateurs et de la portée de votre paywall, car il se concentre sur les utilisateurs individuels plutôt que sur le nombre total de visites.
:::warning
Assurez-vous d'envoyer les vues du paywall à Adapty en utilisant la méthode `.logShowFlow()` (iOS SDK v4+) / `.logShowPaywall()`. Sinon, les vues du paywall ne seront pas prises en compte dans les métriques et les conversions ne seront pas pertinentes.
:::
---
# File: migrate-paywalls
---
---
title: "Migrer des paywalls entre applications"
description: "Découvrez comment migrer des paywalls d'autres applications dans Adapty."
---
Avec Adapty, vous n'avez pas besoin de créer un nouveau paywall de zéro pour chaque application. Si vous gérez plusieurs applications, vous pouvez migrer la configuration du Paywall Builder de n'importe quel paywall créé avec le builder d'une application à une autre.
La migration vous permet de copier toutes les configurations visuelles :
- Les paramètres de mise en page du paywall et de tous ses éléments
- Les médias
- La localisation
La migration s'applique uniquement à la configuration du builder et ne copie pas les produits ni le Remote Config.
:::note
Si vous migrez une configuration de Paywall Builder avec des polices personnalisées, testez-les sur un appareil car elles peuvent s'afficher incorrectement.
:::
## Migrer un paywall \{#migrate-paywall\}
:::important
Vous pouvez uniquement migrer des paywalls créés dans le **nouveau** Paywall Builder d'Adapty. Pour migrer des paywalls du builder **legacy**, vous devez d'abord les migrer vers le nouveau Paywall Builder.
:::
Pour migrer une configuration de Paywall Builder :
1. **Pour un nouveau paywall** : Commencez la [création d'un paywall](create-paywall) et ajoutez des produits. Ensuite, cliquez sur **Build no-code paywall** pour ouvrir la bibliothèque de templates.
**Pour un paywall existant** : Accédez à la section **Layout settings** de l'onglet **Builder & Generator** et cliquez sur **Change template**.
2. Cliquez sur **Choose paywall** dans le bloc **Copy a design from your apps** lors de la modification du template de paywall.
3. Sélectionnez l'application et le paywall dont vous souhaitez copier la configuration.
4. Cliquez sur **Copy Selected Paywall**.
Après la migration, vous pouvez effectuer toutes les modifications nécessaires sans affecter le paywall d'origine.
---
# File: duplicate-paywalls
---
---
title: "Dupliquer un paywall"
description: "Découvrez comment gérer les paywalls dupliqués et optimiser leurs performances dans Adapty."
---
Si vous devez apporter de petites modifications à un paywall existant dans Adapty, notamment lorsqu'il est déjà utilisé dans votre application mobile et que vous ne voulez pas fausser vos analytics, vous pouvez simplement le dupliquer. Vous pouvez ensuite utiliser ces doublons pour remplacer les paywalls d'origine dans certains ou tous les placements selon vos besoins.
Cette opération crée une copie du paywall avec tous ses détails : son nom, ses produits et ses éventuelles promotions. Le nom du nouveau paywall sera suivi de « Copy » pour le distinguer facilement de l'original.
Pour dupliquer un paywall depuis l'Adapty Dashboard :
1. Ouvrez la section [**Paywalls**](https://app.adapty.io/paywalls) dans le menu principal d'Adapty. La page de liste des paywalls dans l'Adapty Dashboard offre une vue d'ensemble de tous les paywalls présents dans votre compte.
2. Cliquez sur le bouton **3-dot** à côté du paywall et sélectionnez l'option **Duplicate**.
3. Ajustez le nouveau paywall et cliquez sur le bouton **Save**.
4. Adapty vous proposera de remplacer les paywalls d'origine par leurs doublons dans les placements si le paywall d'origine est actuellement utilisé dans un placement. Si vous choisissez **Create and replace original**, les nouveaux paywalls passeront immédiatement en état **Live**. Sinon, vous pouvez les créer comme nouveaux paywalls à l'état **Draft** et les ajouter aux placements ultérieurement.
---
# File: archive-paywalls
---
---
title: "Archiver un paywall"
description: "Découvrez comment archiver les paywalls obsolètes dans Adapty sans perdre de données."
---
Au fil de votre utilisation d'Adapty et de la configuration de vos paywalls, vous pouvez accumuler des paywalls qui ne correspondent plus à votre stratégie ou à vos campagnes actuelles. Ces paywalls inutilisés, laissés à l'état `Inactive`, peuvent encombrer votre espace de travail et rendre plus difficile la recherche de ceux qui comptent vraiment. Pour y remédier, Adapty vous offre la possibilité d'archiver ces paywalls superflus.
L'archivage garantit qu'ils sont stockés en toute sécurité sans suppression définitive, prêts à être consultés si besoin à l'avenir. De plus, les paywalls archivés peuvent être filtrés depuis la vue par défaut, ce qui désencombre votre espace de travail et simplifie votre interface. Dans ce guide, nous vous expliquons comment archiver efficacement des paywalls dans Adapty, pour une meilleure maîtrise de votre gestion des paywalls.
Petit rappel : les paywalls actifs, utilisés dans au moins un placement, ne peuvent pas être archivés. Si vous souhaitez archiver un tel paywall, commencez par le retirer de tous les placements.
:::note
Vous ne pouvez pas archiver un paywall s'il est utilisé dans un test A/B non archivé. Ainsi, l'utilisateur peut consulter les métriques détaillées d'un test A/B terminé, et le paywall associé fait partie de ces données.
:::
**Pour archiver un paywall :**
1. Ouvrez la section [**Paywalls**](https://app.adapty.io/paywalls) dans le menu principal d'Adapty.
2. Cliquez sur le bouton **3 points** à côté du paywall et sélectionnez l'option **Archive**.
3. Dans la fenêtre **Archive paywall**, saisissez simplement le nom du paywall à archiver, puis cliquez sur le bouton **Archive**.
---
# File: restore-paywall
---
---
title: "Restaurer un paywall depuis l'archive"
description: "Restaurez des paywalls dans Adapty pour assurer des services d'abonnement ininterrompus pour les utilisateurs."
---
La possibilité d'archiver des paywalls est une fonctionnalité très utile pour simplifier la gestion de vos paywalls. Elle vous permet de masquer les paywalls dont vous n'avez plus besoin, réduisant ainsi l'encombrement de votre espace de travail. De plus, l'option de restauration des paywalls archivés offre une grande flexibilité, vous permettant de les réintégrer dans votre stratégie s'ils s'avèrent à nouveau utiles.
Les paywalls archivés peuvent être exclus de la vue par défaut. Pour les afficher, sélectionnez **Archived** dans le filtre **State**.
**Pour restaurer un paywall depuis l'archive**
1. Ouvrez la section [**Paywalls**](https://app.adapty.io/paywalls) dans le menu principal d'Adapty.
2. Assurez-vous que les paywalls archivés sont affichés dans la liste. Sinon, mettez à jour le filtre à droite.
3. Cliquez sur le bouton **3-dot** à côté du paywall archivé et sélectionnez **Back to active**.
---
# File: profiles-crm
---
---
title: "Profils/CRM"
description: "Gérez les profils utilisateurs et les données CRM dans Adapty pour améliorer la segmentation d'audience."
---
Profils est un CRM pour vos utilisateurs. Avec Profils, vous pouvez :
1. Trouvez des utilisateurs spécifiques par ID de profil, ID utilisateur client, e-mail ou ID de transaction.
2. Consultez la chronologie des événements de l'utilisateur, y compris les problèmes de facturation, les délais de grâce et autres [événements](events).
3. Analysez les propriétés de l'utilisateur telles que l'état de l'abonnement, le revenu/produit total, et plus encore.
4. Accordez à l'utilisateur un abonnement.
:::note
Les événements du flux d'événements arrivent sur le tableau de bord avec un léger délai. Les nouveaux profils et les modifications d'attributs peuvent ne pas être visibles immédiatement.
:::
:::link
Pour comprendre comment Adapty crée et associe les profils utilisateurs, consultez [Comment fonctionnent les profils](how-profiles-work).
:::
## Trouver des utilisateurs \{#finding-users\}
Dans la liste des profils, vous pouvez rechercher un utilisateur spécifique par :
- **Profile ID** : l'identifiant interne d'Adapty pour l'utilisateur (également appelé Adapty ID).
- **Customer user ID** : l'identifiant de votre application pour l'utilisateur, si vous en avez défini un.
- **Email** : l'adresse e-mail de l'utilisateur, si elle a été envoyée comme attribut personnalisé.
- **Transaction ID** : l'identifiant de transaction du store issu d'un achat.
Cliquez sur n'importe quelle ligne pour ouvrir le profil complet de l'utilisateur.
## État de l'abonnement \{#subscription-state\}
Dans la liste des profils, vous pouvez filtrer et trier les utilisateurs par état de l'abonnement. Les valeurs d'état sont :
| **État** de l'utilisateur | Description |
| :--------------------- | :----------------------------------------------------------- |
| Subscribed | L'utilisateur dispose d'un abonnement actif avec le renouvellement automatique activé. |
| Auto-renew off | L'utilisateur a désactivé le renouvellement automatique mais conserve l'accès aux fonctionnalités premium jusqu'à la fin de la période d'abonnement. |
| Subscription cancelled | L'utilisateur a annulé son abonnement, qui a entièrement pris fin. |
| Billing issue | L'utilisateur n'a pas pu être débité en raison d'un problème de paiement, après l'expiration de son abonnement ou de sa période d'essai. |
| Grace period | L'utilisateur est actuellement en délai de grâce en raison d'un problème de paiement survenu lors de la tentative de débit après l'expiration de son abonnement ou de sa période d'essai. |
| Active trial | L'utilisateur dispose d'un abonnement actif actuellement en période d'essai. |
| Trial cancelled | L'utilisateur a annulé la période d'essai et ne dispose pas d'un abonnement actif. |
| Never subscribed | L'utilisateur ne s'est jamais abonné ni n'a démarré de période d'essai et reste un utilisateur freemium. |
## Attributs utilisateur \{#user-attributes\}
Vous pouvez envoyer des propriétés utilisateur supplémentaires à Adapty via le SDK.
Par défaut, Adapty définit :
| Propriété | Description |
| ---------------- | ------------------------------------------------------------ |
| Customer user ID | Un identifiant de votre utilisateur final dans votre système. |
| Adapty ID | Identifiant interne Adapty de votre utilisateur final, appelé Profile ID. |
| IDFA | L'Identifier for Advertisers, attribué par Apple à l'appareil d'un utilisateur. Nécessite l'autorisation App Tracking Transparency (ATT) sur iOS 14+. Non disponible sur Android. |
| IP country | Pays de votre utilisateur final, déterminé par son adresse IP la plus récente. |
| Store country | Pays du compte App Store ou Google Play de votre utilisateur final, tel que communiqué par le store. Adapty le reçoit avec les transactions du store, donc il est vide pour les utilisateurs sans achats. |
| OS | Le système d'exploitation utilisé par l'utilisateur final. |
| Device | Le nom du modèle d'appareil visible par l'utilisateur final. |
| Install date | La date à laquelle l'utilisateur a été enregistré pour la première fois dans Adapty :
Pour modifier ou supprimer un attribut, cliquez sur les trois points à côté de lui et sélectionnez **Edit** ou **Delete**. La suppression d'un attribut n'affecte que ce profil — les autres profils qui possèdent le même attribut le conservent.
## Accorder un abonnement \{#granting-a-subscription\}
Dans un profil, vous pouvez prolonger un abonnement actif ou accorder à un utilisateur un accès à vie à un niveau d'accès — sans lui demander d'effectuer un achat.
C'est particulièrement utile pour :
- Dédommager un utilisateur après un problème de facturation ou de support.
- Lancer des promotions manuelles ou des programmes bêta.
- Tester des flows d'abonnement sans effectuer de vrai achat.
Pour accorder un accès, ouvrez le profil de l'utilisateur, allez dans la section **Access levels** et cliquez sur **Edit**. Définissez la date d'expiration et enregistrez. La date d'expiration doit être dans le futur et ne peut pas être réduite une fois définie. La modifier pour des abonnements actifs n'affecte pas les paiements en cours.
:::note
Accorder un accès ne crée pas d'événements d'achat sur l'App Store ou Google Play. Le fil d'événements et les analyses de l'utilisateur différeront d'un vrai flux d'achat.
:::
Vous pouvez également accorder un accès de manière programmatique en utilisant la méthode API [Grant access level](api-adapty/operations/grantAccessLevel).
## Partager l'accès payant entre les comptes utilisateurs \{#sharing-paid-access-between-user-accounts\}
:::link
Article principal : [Partager l'accès payant entre les comptes utilisateurs](sharing-paid-access-between-user-accounts)
:::
### Historique du partage d'accès \{#access-sharing-history\}
Lorsque des niveaux d'accès sont partagés ou transférés, le profil de l'utilisateur affiche un lien vers le profil connecté — le profil qui a partagé l'accès, ou celui qui l'a reçu. Pour consulter le profil connecté, dans le **Profile** de l'utilisateur, cliquez sur le lien situé à côté du niveau d'accès.
:::note
Les soldes en monnaie virtuelle ne sont pas partagés ni transférés entre les profils comme le sont les niveaux d'accès. Chaque solde reste attaché à un seul profil — voir [Soldes, profils et appareils](virtual-currency-balance#balances-profiles-and-devices).
:::
## Étapes suivantes \{#next-steps\}
- Pour comprendre comment Adapty crée et lie les profils, voir [Comment fonctionnent les profils](how-profiles-work).
- Pour configurer la politique de partage des accès, voir [Partage des accès payants entre comptes utilisateurs](sharing-paid-access-between-user-accounts).
- Pour accorder un accès par programmation, voir la méthode API [Accorder un niveau d'accès](api-adapty/operations/grantAccessLevel).
---
# File: how-profiles-work
---
---
title: "Comment fonctionnent les profils"
description: "Comprenez comment Adapty crée, suit et associe les profils utilisateurs — notamment les profils anonymes, les utilisateurs identifiés et les relations parent/héritier."
---
Chaque utilisateur de votre application dispose d'un profil Adapty qui suit ses achats, événements et état d'abonnement. Comprendre comment les profils sont créés et liés vous aide à éviter les bugs d'intégration, la fragmentation des données et à interpréter les informations dans la section [Profils](profiles-crm).
## Création de profil \{#profile-creation\}
Adapty crée automatiquement un profil la première fois qu'un utilisateur ouvre votre application.
**Sans Customer User ID**, le profil est anonyme. Un nouveau profil anonyme est créé à chaque fois que :
- Un utilisateur réinstalle l'application
- Un utilisateur se déconnecte de votre application (lorsque votre application appelle `Adapty.logout()`)
Les achats sont liés à l'installation de l'application, et non à une identité utilisateur persistante.
**Avec un Customer User ID**, le profil persiste entre les réinstallations et sur plusieurs appareils. Utiliser un Customer User ID vous permet de :
1. Suivre un utilisateur entre les réinstallations de l'application et sur plusieurs appareils.
2. Retrouver des utilisateurs via leur Customer User ID dans la section [**Profiles**](profiles-crm).
3. Utiliser le Customer User ID dans l'[API côté serveur](getting-started-with-server-side-api).
4. Adapty envoie le Customer User ID à toutes les intégrations.
Le comportement du profil avec un Customer User ID dépend du moment où vous le définissez :
- **Lors de l'activation du SDK** : Adapty utilise le profil existant associé à ce Customer User ID (pour les utilisateurs de retour) ou crée un nouveau profil (pour les nouveaux utilisateurs).
- **Après l'activation du SDK** : Adapty crée un profil anonyme lors de l'activation. Lorsque vous identifiez l'utilisateur par la suite, Adapty associe le Customer User ID au profil anonyme (pour les nouveaux utilisateurs) ou bascule vers le profil existant avec cet ID (pour les utilisateurs de retour).
**Quelle approche utiliser :**
- **Customer User ID disponible au lancement de l'application** (par exemple, stocké depuis une session précédente) — transmettez-le à `activate()` lors de l'initialisation du SDK.
- **Les utilisateurs se connectent après le lancement de l'application** — appelez `identify()` après l'authentification. Adapty associe l'ID au profil actuel (si l'ID est nouveau) ou bascule vers le profil existant (si l'ID existe déjà).
- **Les utilisateurs peuvent acheter avant de se connecter** — appelez `identify()` après la connexion. Si le Customer User ID existe déjà dans Adapty, récupérez le profil ensuite pour synchroniser le niveau d'accès actuel.
Pour les détails d'implémentation, consultez le guide SDK [identification des utilisateurs](identifying-users).
:::note
Si un utilisateur de retour a précédemment utilisé votre application sans Customer User ID, ces profils anonymes ne sont pas automatiquement fusionnés lorsque vous commencez à identifier lors de l'activation du SDK. Pour conserver l'historique complet de ces utilisateurs, utilisez `identify()` après la connexion à la place.
:::
## Profils parent et héritier \{#parent-and-inheritor-profiles\}
Lorsqu'un même abonnement côté store est associé à plusieurs profils Adapty, Adapty traite ces profils comme une chaîne : un profil **parent** et un ou plusieurs profils **héritiers** qui partagent l'accès issu du même achat.
Cela se produit lorsque :
- Le [partage d'accès payant entre comptes utilisateurs](sharing-paid-access-between-user-accounts) est activé et qu'un utilisateur se connecte sur un appareil où un profil différent avait précédemment effectué l'achat.
- Un utilisateur réinstalle l'application sans `customer_user_id`, et le nouveau profil récupère l'achat de l'installation précédente.
- Des utilisateurs identifiés différents restaurent des achats sur le même appareil.
- Une application est transférée entre des Team IDs Apple et la nouvelle application récupère les achats effectués sous l'ancien Team ID.
**Comment le parent est sélectionné.**
Le parent est le **premier profil à enregistrer l'achat** — déterminé par l'ordre des reçus d'achat dans Adapty, et non par l'ordre de création des profils. Par exemple : vous installez l'application sans effectuer d'achat, puis vous réinstallez et achetez un abonnement. Le second profil devient le parent car c'est lui qui a effectué l'achat. Le premier profil devient l'héritier et obtient l'accès via le partage.
**Comment les événements sont distribués :**
- **Événements transactionnels** (achats, renouvellements, annulations, problèmes de facturation, délais de grâce, remboursements) : Apparaissent uniquement sur le profil **parent** qui a effectué l'achat. Tous les renouvellements et mises à jour d'abonnements continuent d'apparaître sur ce profil.
- **Événements `access_level_updated`** : Apparaissent sur les profils **parent et héritier** à chaque changement d'état du niveau d'accès. Cela permet de maintenir tous les profils connectés informés de leur statut d'accès actuel.
Le profil parent affiche l'historique complet des transactions. Les profils héritiers affichent uniquement leurs mises à jour de niveau d'accès et un lien vers le profil parent dans la section **Access level**.
**Suivi du même abonnement sur plusieurs profils.**
Chaque profil héritier possède son propre `profile_id`, donc `profile_id` n'est pas stable au sein d'une chaîne. Pour identifier le même abonnement sur plusieurs profils — par exemple lors du rapprochement d'événements webhook ou de la correspondance entre profils du tableau de bord et un utilisateur sous-jacent — utilisez plutôt l'identifiant côté store.
| Champ | Utilisation |
| --- | --- |
| `store_original_transaction_id` | Identifier une chaîne d'abonnement sur plusieurs profils. Unique par abonnement Apple. |
| `profiles_sharing_access_level` (champ webhook) | Tous les profils actuellement autorisés par l'abonnement, lorsque le partage est activé. |
| `profile_id` | **Non** adapté au suivi cross-profil — chaque héritier possède le sien. |
## Transactions sans profil \{#transactions-without-profiles\}
Certaines transactions dans Adapty ne sont rattachées à aucun profil — elles apparaissent dans les analyses et les exports mais pas dans la liste des Profils. Cela se produit pour les **notifications store serveur à serveur (S2S)** envoyées pour des utilisateurs dont les comptes ne se sont jamais connectés à votre application via le SDK Adapty. Les sources connues sont :
- Notifications S2S de l'App Store (y compris les événements de remboursement)
- Notifications S2S de Google Play
- Événements webhook Stripe et Paddle
Ces transactions :
- **Apparaissent dans les graphiques analytiques** (elles sont comptabilisées dans les métriques globales)
- **Apparaissent dans les exports** (S3, GCS, BigQuery) avec `profile_id` défini à `null`
- **N'apparaissent pas dans la liste des Profils** — il n'y a aucun profil auquel les rattacher
Si vous constatez plus d'événements dans les analyses ou les exports que vous n'en trouvez dans l'interface Profils, la différence correspond probablement à ces transactions sans profil. Pour les trouver dans un export, filtrez les lignes où `profile_id IS NULL`.
## Partage de l'accès payant entre comptes utilisateurs \{#sharing-paid-access-between-user-accounts\}
:::link
Article principal : [Partage de l'accès payant entre comptes utilisateurs](sharing-paid-access-between-user-accounts)
:::
Pour définir votre politique de partage de niveau d'accès, sur la page des paramètres [**General**](general), sélectionnez une option de partage. Vous pouvez définir une politique distincte pour l'[environnement sandbox](test-purchases-in-sandbox).
**Activé (par défaut)**
Les utilisateurs identifiés (ceux qui ont un [Customer User ID](identifying-users#set-customer-user-id-on-configuration)) peuvent partager le même [niveau d'accès](access-level) fourni par Adapty si leur appareil est connecté au même identifiant Apple/Google. C'est utile quand un utilisateur réinstalle l'application et se connecte avec un autre e-mail — il conserve tout de même l'accès à son achat précédent. Avec cette option, plusieurs utilisateurs identifiés peuvent partager le même niveau d'accès.
Même si le niveau d'accès est partagé, toutes les transactions passées et futures sont enregistrées comme événements dans le Customer User ID d'origine afin de maintenir des analyses cohérentes et conserver un historique de transactions complet — y compris les périodes d'essai, les achats d'abonnement, les renouvellements, etc., liés au même profil.
**Transférer l'accès au nouvel utilisateur**
Les utilisateurs identifiés peuvent continuer à accéder au [niveau d'accès](access-level) fourni par Adapty, même s'ils se connectent avec un [Customer User ID](identifying-users#set-customer-user-id-on-configuration) différent ou réinstallent l'application, tant que l'appareil est connecté au même identifiant Apple/Google.
Contrairement à l'option précédente, Adapty transfère l'achat entre les utilisateurs identifiés. Cela garantit que le contenu acheté est disponible, mais un seul utilisateur peut y avoir accès à la fois. Par exemple, si UserA achète un abonnement et que UserB se connecte sur le même appareil et restaure les transactions, UserB obtient l'accès à l'abonnement, et celui-ci est révoqué pour UserA.
Si l'un des utilisateurs (le nouveau ou l'ancien) n'est pas identifié, le niveau d'accès sera tout de même partagé entre ces profils dans Adapty.
Bien que le niveau d'accès soit transféré, toutes les transactions passées et futures sont enregistrées comme événements dans le Customer User ID d'origine afin de maintenir des analyses cohérentes et conserver un historique de transactions complet — y compris les périodes d'essai, les achats d'abonnement, les renouvellements, etc., liés au même profil.
Après être passé à **Transférer l'accès au nouvel utilisateur**, les niveaux d'accès ne seront pas transférés entre les profils immédiatement. Le processus de transfert pour chaque niveau d'accès spécifique est déclenché uniquement lorsqu'Adapty reçoit un événement du store, comme un renouvellement d'abonnement, une restauration ou lors de la validation d'une transaction.
**Désactivé**
Le premier profil d'utilisateur identifié à obtenir un niveau d'accès le conservera indéfiniment. C'est la meilleure option si votre logique métier exige que les achats soient liés à un seul Customer User ID.
Notez que les niveaux d'accès sont tout de même partagés entre les utilisateurs anonymes.
Vous pouvez « délier » un achat en [supprimant le profil de l'utilisateur propriétaire](https://adapty.io/docs/fr/api-adapty/operations/deleteProfile). Après la suppression, le niveau d'accès devient disponible pour le premier profil utilisateur qui le réclame, qu'il soit anonyme ou identifié.
La désactivation du partage ne concerne que les nouveaux utilisateurs. Les abonnements déjà partagés entre utilisateurs continueront de l'être même après la désactivation de cette option.
:::warning
Apple et Google exigent que les achats intégrés soient partagés ou transférés entre utilisateurs car ils s'appuient sur l'identifiant Apple/Google pour y associer l'achat. Sans partage, la restauration des achats risque de ne pas fonctionner lors des réinstallations ultérieures.
La désactivation du partage peut empêcher les utilisateurs de retrouver l'accès après connexion.
Nous recommandons de désactiver le partage uniquement si vos utilisateurs **sont tenus de se connecter** avant d'effectuer un achat. Dans le cas contraire, un utilisateur identifié pourrait acheter un abonnement, se connecter à un autre compte et perdre définitivement l'accès.
:::
### Quel paramètre choisir ? \{#which-setting-should-i-choose\}
| Mon application... | Option à choisir |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| N'a pas de système de connexion et utilise uniquement les identifiants de profil anonymes d'Adapty. | Utilisez l'option par défaut, car les niveaux d'accès sont toujours partagés entre les identifiants de profil anonymes pour les trois options. |
| Dispose d'un système de connexion optionnel et permet aux clients d'effectuer des achats avant de créer un compte. | Choisissez **Transférer l'accès au nouvel utilisateur** pour garantir que les clients qui achètent sans compte pourront toujours restaurer leurs transactions ultérieurement. |
| Exige que les clients créent un compte avant d'acheter, mais permet de lier les achats à plusieurs Customer User ID. | Choisissez **Transférer l'accès au nouvel utilisateur** pour garantir qu'un seul Customer User ID a accès à la fois, tout en permettant aux utilisateurs de se connecter avec un autre Customer User ID sans perdre leur accès payant. |
| Exige que les clients créent un compte avant d'acheter, avec des règles strictes liant les achats à un seul Customer User ID. | Choisissez **Désactivé** pour garantir que les transactions ne sont jamais transférées entre comptes. |
## Horodatages d'événements avec des dates futures (Apple/iOS) \{#event-timestamps-with-future-dates-appleios\}
Ce comportement est spécifique à l'App Store d'Apple. Le système de notifications de Google Play n'envoie pas d'événements à l'avance.
Les horodatages d'événements dans les profils et les intégrations peuvent afficher des dates futures car Apple envoie les événements de renouvellement à l'avance.
- **Pourquoi cela se produit** : Apple fait cela pour s'assurer que les abonnements se renouvellent automatiquement avant leur expiration, évitant ainsi toute interruption de service pour les utilisateurs. Pour plus de détails, consultez le Forum des développeurs Apple : [Server Notifications for Subscriptions](https://developer.apple.com/forums/tags/app-store-server-notifications).
- **Types d'événements concernés** : En général, cela s'applique aux renouvellements d'abonnements et aux conversions d'essai vers payant. Ces événements peuvent avoir des horodatages futurs car Apple en notifie les systèmes à l'avance.
- **Autres types d'événements** : Les achats intégrés supplémentaires et les changements de plan d'abonnement sont enregistrés avec leurs horodatages réels car ces événements ne peuvent pas être prédits à l'avance.
- **Impact sur les analyses et le flux d'événements** : Ces événements n'apparaîtront dans **Analytics** et dans le **Event Feed** qu'une fois leurs horodatages dépassés. Les événements avec des horodatages futurs ne sont affichés dans aucune de ces sections.
- **Impact sur les intégrations** : Adapty envoie les événements aux intégrations dès leur réception. Si un événement a un horodatage futur, Adapty l'envoie à votre intégration avec l'horodatage futur inchangé.
## Étapes suivantes \{#next-steps\}
- Pour utiliser le tableau de bord Profils afin de trouver et gérer les utilisateurs, consultez [Profils](profiles-crm).
- Pour configurer l'identification des utilisateurs dans votre application, consultez le guide SDK [identification des utilisateurs](identifying-users).
- Pour configurer la politique de partage d'accès, consultez [Partage de l'accès payant entre comptes utilisateurs](sharing-paid-access-between-user-accounts).
---
# File: sharing-paid-access-between-user-accounts
---
---
title: "Partage de l'accès payant entre comptes utilisateurs"
description: "Partage de l'accès payant entre différents comptes utilisateurs pour les utilisateurs disposant de plusieurs appareils ou de plusieurs profils dans l'application"
---
Lorsqu'un utilisateur effectue un achat, Adapty attribue un nouveau [niveau d'accès](access-level) à son [profil](identifying-users) actif. Ce niveau d'accès autorise l'acheteur à accéder au contenu payant.
Le profil de l'acheteur peut changer par inadvertance s'il réinstalle votre application ou se connecte à un nouveau compte dans l'application. Pour garantir un accès ininterrompu, Adapty partage automatiquement le niveau d'accès de l'utilisateur entre le profil d'origine et les profils suivants.
Cette approche convient à la plupart des applications. Mais si votre logique métier l'exige, vous pouvez choisir une politique de partage d'accès payant plus restrictive.
Ouvrez la page [General Settings](https://app.adapty.io/settings/general) pour définir une politique de partage de niveau d'accès. Pour faciliter les tests, vous pouvez modifier ce paramètre uniquement pour [l'environnement sandbox](#sharing-paid-access-on-sandbox).
## Enabled (default) \{#enabled-default\}
Ce paramètre convient le mieux aux applications **sans authentification intégrée**. Après l'achat, tous les profils associés au même compte store *héritent* automatiquement du niveau d'accès.
* Si un utilisateur se connecte à votre application avec de nouveaux identifiants, il conserve l'accès au contenu payant.
* Si un utilisateur réinstalle votre application après une réinitialisation d'usine, il conserve l'accès au contenu payant.
* Si un utilisateur installe l'application sur d'autres appareils avec le même compte store, l'achat est disponible sur tous les appareils, même si chaque instance de l'application possède son propre profil client.
## Transfer access to new user \{#transfer-access-to-new-user\}
Ce paramètre convient le mieux aux applications qui autorisent les achats **avec ou sans authentification**, ou qui souhaitent appliquer une politique **un appareil par utilisateur**.
Adapty limite l'accès à un achat à 1 identifiant client à la fois. Le propriétaire de l'appareil peut réinstaller l'application, se connecter et se déconnecter, mais ne peut pas accéder au même produit depuis plus d'un identifiant client simultanément.
Lorsque ce paramètre est activé, les profils anonymes (par exemple, un profil qui devient actif après la déconnexion de l'utilisateur) héritent toujours du niveau d'accès du dernier identifiant client actif. Cela est nécessaire pour éviter toute perte d'accès ultérieure.
:::warning
Lorsque vous désactivez le paramètre par défaut et activez **Transfer access to new user**, Adapty ne met pas immédiatement à jour les niveaux d'accès des profils clients existants.
Le basculement se produit lorsqu'un utilisateur déclenche un nouvel événement store : par exemple, lors du renouvellement de l'abonnement ou de la restauration de ses achats.
:::
:::important
Adapty révoque l'ancien profil uniquement lorsque le nouveau profil possède un [Customer User ID](identifying-users#set-customer-user-id-on-configuration) au moment où le SDK propage la transaction. Si `restorePurchases` s'exécute sur un profil anonyme, l'ancien Customer User ID et le nouveau profil anonyme se retrouvent tous deux avec le niveau d'accès. L'ancien profil est révoqué plus tard, lorsque vous identifiez le profil anonyme.
Pour éviter cela, appelez les méthodes du SDK dans l'ordre : `activate` → `identify` → `restorePurchases`.
:::
## Désactiver le partage d'accès payant \{#disable-paid-access-sharing\}
Ce paramètre est **uniquement adapté** aux applications avec une **authentification obligatoire** ou une implémentation indépendante de la gestion des accès. Dans les autres cas, les utilisateurs pourraient ne pas pouvoir accéder à leurs achats, et votre application risque **d'échouer à la vérification obligatoire du store**.
Si vous désactivez le partage d'accès payant, Adapty lie le produit à l'[identifiant client](identifying-users#set-customer-user-id-on-configuration) actif au moment de l'achat et ne partage pas le niveau d'accès avec d'autres profils clients. Cette politique permet une distribution stricte du produit en 1 pour 1.
:::warning
Lorsque vous désactivez le partage d'accès payant, vous empêchez les identifiants clients d'hériter de l'accès payant. Si un identifiant client a hérité d'un accès payant par le passé, cela ne peut pas être révoqué automatiquement.
:::
:::important
En cas d'urgence, vous devrez peut-être [supprimer un profil utilisateur](api-adapty/operations/deleteProfile) pour que le prochain profil disponible (identifié ou anonyme) puisse revendiquer son niveau d'accès.
:::
## Référence pratique \{#practical-reference\}
Une fois le mode choisi, les contrats ci-dessous décrivent ce à quoi s'attendre : quels profils voient l'accès, quand l'ancien profil le perd, et quels événements webhook se déclenchent.
| Mode | Plusieurs profils partagent un même achat ? | Ancien profil révoqué lors du transfert ? | Quand l'ancien profil est révoqué | Événements webhook lorsqu'un second profil revendique l'abonnement |
| --- | --- | --- | --- | --- |
| **Enabled (default)** | Oui — chaque profil qui restaure ou se connecte hérite de l'accès | Jamais | N/A | `access_level_updated` (`is_active=true`) pour chaque nouveau profil qui hérite |
| **Transfer access to new user** | Non — exclusif, mais transférable entre profils | Oui | Immédiatement lorsque le nouvel appareil identifié propage la transaction (`restorePurchases`, identify ou le prochain événement côté store) | Nouveau profil : `access_level_updated` (`is_active=true`). Ancien profil : `access_level_updated` (`is_active=false`) |
| **Disabled** | Non — un Customer User ID par achat, de façon permanente | N/A — l'accès n'est jamais transféré | N/A | Aucun pour le second profil. Le SDK n'affiche aucun accès pour celui-ci |
## Partage de l'accès payant en sandbox \{#sharing-paid-access-on-sandbox\}
Vous pouvez définir une politique de partage d'accès payant spécifiquement pour l'environnement sandbox. Lorsque vous testez des achats dans l'environnement sandbox, attendez-vous au comportement suivant :
* Apple stocke les informations sur vos achats passés dans l'historique d'achats du compte. Le SDK Adapty peut également y accéder.
* Si vous réinstallez l'application et qu'Adapty détecte que le produit a déjà été acheté, le profil actif héritera du niveau d'accès.
* Si Apple détecte un achat existant pour le produit, il ne vous permettra pas d'effectuer le même achat deux fois, même si le profil actif ne possède pas le niveau d'accès nécessaire.
Ce comportement se produit **indépendamment de votre paramètre de partage d'accès payant**. Votre application n'affiche pas le paywall, vous ne pouvez pas acheter le produit. La seule solution est de **vider l'historique d'achats de votre compte**. Suivez le [guide de test sandbox](test-purchases-in-sandbox) pour des instructions détaillées.
:::warning
Les abonnements sandbox sur Apple se renouvellent automatiquement toutes les quelques minutes. Ces renouvellements rapides peuvent modifier quel profil Adapty considère comme [parent](how-profiles-work#parent-and-inheritor-profiles) — un comportement en chaîne que la production reproduit rarement. Testez le mode que vous utilisez en production et confirmez le comportement avec un vrai Apple ID avant de tirer des conclusions à partir du sandbox.
:::
## Partage de l'accès payant dans les analyses \{#paid-access-sharing-in-analytics\}
* Adapty enregistre les transactions au fur et à mesure qu'elles se produisent. Une seule transaction peut être associée à plusieurs profils, mais n'est comptabilisée qu'une seule fois.
* Si deux profils ou plus partagent le même niveau d'accès, l'achat est attribué au [profil parent](how-profiles-work#parent-and-inheritor-profiles).
* L'héritage du niveau d'accès n'a pas d'impact sur les statistiques d'installation. Pour déterminer comment Adapty comptabilise les installations, vous pouvez sélectionner l'une des deux [définitions d'installation](installs#counting-modes) disponibles sur la page des paramètres.
---
# File: segments
---
---
title: "Segments"
description: "Créez et gérez des segments d'utilisateurs pour un meilleur ciblage dans Adapty."
---
Un **segment** est un ensemble de filtres qui regroupe les utilisateurs ayant des propriétés communes. Utilisez les segments pour cibler les paywalls et les tests A/B de façon plus précise.
:::note
Les événements du flux d'événements arrivent sur le tableau de bord avec un léger délai. Les nouveaux profils et les modifications d'attributs peuvent ne pas être visibles immédiatement.
:::
Une fois un segment créé, vous pouvez [l'utiliser comme **audience** dans les placements et les tests A/B](audience) pour contrôler quel paywall est affiché aux utilisateurs (simple ou multiple). Exemples :
- Afficher un paywall standard aux non-abonnés et proposer une réduction aux utilisateurs qui ont déjà annulé un abonnement ou un essai.
- Afficher des paywalls différents aux utilisateurs selon leur pays.
- Cibler les utilisateurs en fonction des données d'attribution Apple Search Ads.
- S'assurer que les utilisateurs sur des versions plus anciennes de l'app continuent de voir le paywall existant, tandis que les versions plus récentes affichent la version mise à jour.
- [Dans Analytics](controls-filters-grouping-compare-proceeds#filter-and-group-data), filtrer par segments pour consulter les performances de groupes d'utilisateurs spécifiques. Groupez par segment pour comparer les performances ou la contribution au sein de **All users**.
## Création \{#creation\}
Pour créer un segment, saisissez un nom et sélectionnez les attributs qui définissent ses filtres. Lorsque vous sélectionnez plusieurs attributs, les utilisateurs doivent correspondre à toutes les conditions. Adapty applique une logique ET entre les attributs.
## Attributs disponibles \{#available-attributes\}
:::note
Si de nombreux attributs utilisateur sont définis automatiquement (comme **Country** ou **Calculated total revenue USD**), **Age**, **App user ID**, les données **Attribution**, **Gender** et les **Custom attributes** ne le sont pas. Vous devez [définir les attributs utilisateur](setting-user-attributes) ou [transmettre les données d'attribution](attribution-integration) si vous souhaitez les utiliser pour la segmentation.
:::
:::tip
Pour les attributs de type date, vous pouvez filtrer avec :
- **Date fixe** : sélectionnez des dates précises dans un calendrier (par exemple, afficher une offre spéciale aux utilisateurs ayant installé l'app entre le Black Friday et le Cyber Monday).
- **Plage relative** : définissez des fenêtres temporelles dynamiques comme « 7 derniers jours » ou « 3 derniers mois » (par exemple, réengager les utilisateurs dont la dernière connexion remonte à plus de 30 jours, ou cibler les installations récentes).
Les plages relatives se mettent à jour automatiquement, ce qui les rend idéales pour les campagnes en continu. Les dates fixes conviennent mieux aux promotions à durée limitée.
:::
| Attribut | Filtrer par |
|---------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Age** | L'âge de l'utilisateur. Notez que l'âge est calculé lors de la première réception par Adapty et n'est pas mis à jour par la suite. |
| **App User ID** | L'identifiant de l'utilisateur dans votre app ([customer_user_id](profiles-crm#user-attributes)). Vous pouvez filtrer selon sa présence ou son absence, par exemple pour afficher un paywall uniquement aux utilisateurs qui ne se sont pas connectés. |
| **App version (current)** | La version actuelle de l'app installée sur l'appareil de l'utilisateur où Adapty a reçu les dernières données d'événement — **mise à jour à chaque montée de version**, elle reflète donc toujours ce que l'utilisateur utilise en ce moment. Utilisez-la lors d'un déploiement vers tous les utilisateurs d'une version spécifique, y compris ceux qui l'ont obtenue par mise à jour. Pour créer un segment, cliquez sur l'icône crayon à côté de **App version** et ajoutez une nouvelle version pour pouvoir l'utiliser immédiatement.
| Champ | Description |
| ------ |--------------------------------------------------------------------------------------------------------------------------------------|
| **Name** | Un libellé pour l'attribut personnalisé, utilisé uniquement dans l'Adapty Dashboard. |
| **Key** | Un identifiant unique pour l'attribut. Il doit correspondre à la clé utilisée dans le SDK. |
| **Type** | Choisissez entre :
## Dupliquer des segments \{#duplicate-segments\}
Si vous avez besoin d'un segment similaire à un segment existant, dupliquez-le plutôt que de le recréer de zéro. Cela fait gagner du temps aux équipes qui gèrent plusieurs campagnes ou tests A/B avec des groupes d'utilisateurs similaires.
La duplication d'un segment crée une copie avec tous ses filtres et sa description. Le nouveau segment aura « (copy) » ajouté à son nom pour le distinguer de l'original. Le nouveau segment est indépendant de l'original. Les modifications apportées à l'un n'affectent pas l'autre.
Pour dupliquer un segment dans l'Adapty Dashboard :
1. Ouvrez la section **Profiles & Segments** dans le menu principal d'Adapty et basculez vers l'onglet [**Segments**](https://app.adapty.io/segments).
2. Cliquez sur le bouton **3 points** à côté du segment et sélectionnez **Duplicate**.
3. Ouvrez le nouveau segment et ajustez ses filtres selon vos besoins.
## Supprimer des segments \{#delete-segments\}
Lorsque vous n'avez plus besoin d'un segment, vous pouvez le supprimer définitivement.
Adapty bloque la suppression si le segment est actuellement utilisé comme audience par l'un des éléments suivants :
- **Un placement** : au moins un placement non supprimé utilise le segment comme audience.
- **Un test A/B (En cours ou Terminé)** : au moins un test A/B non supprimé utilise le segment comme audience.
Pour la suppression d'un segment, Adapty considère les tests A/B **En cours** et **Terminés** comme actifs. Un test terminé utilise toujours l'audience pour afficher le paywall ou l'onboarding post-test aux utilisateurs correspondants, et les métriques historiques du test sont limitées à ce segment. Le segment n'est libéré que lorsque le test A/B lui-même est supprimé.
:::warning
La suppression d'un segment est définitive. Le segment ne peut pas être restauré.
:::
Pour supprimer un segment dans l'Adapty Dashboard :
1. Accédez à **Profiles & Segments** dans le menu principal d'Adapty et basculez vers l'onglet [**Segments**](https://app.adapty.io/segments).
2. Cliquez sur le bouton **3 points** à côté du segment et sélectionnez **Delete**.
3. Saisissez le nom du segment dans le champ de confirmation, puis cliquez sur **Delete forever**.
:::info
Si le segment est en cours d'utilisation, la boîte de dialogue liste les placements et les tests A/B qui y font référence.
Pour débloquer la suppression, ouvrez chaque placement ou test A/B de la liste et supprimez le segment de son audience, ou supprimez le placement ou le test A/B entièrement. Une fois qu'aucun élément ne référence le segment, vous pouvez le supprimer.
:::
---
# File: event-feed
---
---
title: "Fil d'événements"
description: "Surveillez et analysez l'activité des utilisateurs avec le fil d'événements d'Adapty."
---
Le fil d'événements vous permet de suivre visuellement les [événements](events) générés par Adapty et de vérifier le statut de leur export vers des intégrations tierces, y compris le webhook.
:::warning
Le fil d'événements n'affiche pas :
- **Les transactions de l'API server-side v1** : créées via l'[API server-side (version 1)](server-side-api-specs-legacy#requests). Utilisez l'[API server-side (version 2)](api-adapty/operations/setTransaction) pour qu'elles apparaissent.
- **Les événements sans profil** : les transactions arrivées avant que le SDK n'ait identifié un utilisateur — par exemple, les notifications server du store. Pour les inclure dans les exports, activez **Include events without profile** dans l'intégration [S3](s3-exports) ou [Google Cloud Storage](google-cloud-storage).
:::
:::note Le statut d'envoi vers AppsFlyer, Facebook Ads et Branch peut être inexact, car ces services ne renvoient pas toujours d'erreur lorsqu'il s'en produit une. ::: Pour consulter le profil de l'utilisateur qui a initié la transaction, cliquez sur le bouton **View Profile** dans les détails de l'événement. --- # File: retention-messaging --- --- title: "Messages de rétention" description: "Affichez un message personnalisé aux abonnés sur l'écran d'annulation d'abonnement d'Apple. Créez et localisez des messages de rétention dans Adapty — sans backend, sans mise à jour de l'application." --- [Retention Messaging](https://developer.apple.com/documentation/retentionmessaging) est une fonctionnalité Apple qui affiche un message personnalisé aux abonnés sur l'écran iOS **Cancel Subscription**, juste avant qu'ils confirment leur annulation. Utilisez-la pour réduire le churn en leur donnant une raison — ou une offre — de rester. Adapty se connecte à l'API Retention Messaging d'Apple, afin qu'Apple demande le bon message en temps réel dès qu'un abonné appuie sur **Cancel Subscription**. Adapty gère cet endpoint pour vous : vous rédigez, localisez et testez vos messages dans l'Adapty Dashboard, et Adapty répond automatiquement à Apple. Aucun backend à construire, aucune mise à jour de l'app nécessaire. Il existe deux types de messages. Un message *par défaut* est un texte générique qui s'applique à tous les abonnés d'un produit. Un message *promo* ajoute une incitation concrète : une réduction, un essai gratuit ou un passage à un plan plus adapté. Apple affiche à chaque abonné le message correspondant à son produit et à sa langue.
## Principales différences \{#key-differences\}
| Fonctionnalité | Test A/B classique | Test A/B crossplacement |
| ------------------------------- |--------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------|
| **Ce qui est testé** | Un flow/paywall/onboarding | Ensemble de paywalls appartenant à une variante |
| **Cohérence des variantes** | La variante est déterminée séparément pour chaque placement | La même variante est utilisée sur tous les placements de paywalls |
| **Ciblage d'audience** | Défini par placement de flow/paywall/onboarding | Partagé sur tous les placements de paywalls |
| **Analytique** | Vous analysez un placement de flow/paywall/onboarding | Vous analysez l'ensemble de l'application sur les placements faisant partie du test |
| **Répartition du poids des variantes** | Par flow/paywall/onboarding | Par ensemble de paywalls |
| **Utilisateurs** | Pour tous les utilisateurs | Uniquement les nouveaux utilisateurs (ceux qui n'ont pas vu de paywall Adapty) |
| **Version du SDK Adapty** | Pour les flows : v4.0.0+. Toute version pour les paywalls. Pour les onboardings : v3.8.0+ (iOS, Android, React Native, Flutter), v3.14.0+ (Unity), v3.15.0+ (KMP, Capacitor) | 3.5.0+ |
| **Idéal pour** | Tester des modifications indépendantes dans un seul placement de flow/paywall/onboarding sans tenir compte de l'économie globale de l'application | Évaluer les stratégies de monétisation globales à l'échelle de l'application |
## Logique de sélection du test A/B \{#ab-test-selection-logic\}
**Les tests A/B crossplacement ont la priorité sur les tests A/B classiques.** Cependant, les tests crossplacement ne sont affichés qu'aux **nouveaux utilisateurs** — ceux qui n'ont encore vu aucun paywall Adapty (la méthode SDK `getPaywall` n'a jamais été appelée pour eux). Cela garantit la cohérence des résultats sur l'ensemble des placements.
Le diagramme suivant illustre la logique qu'Adapty utilise pour sélectionner un test A/B pour un placement :
Sur la page **A/B Tests**, les tests de paywall, d'onboarding, de flow et les tests crossplacement apparaissent dans des onglets séparés.
## Limitations des tests A/B crossplacement \{#crossplacement-ab-test-limitations\}
:::warning
Les tests A/B crossplacement ne peuvent pas inclure de placements de flow ou d'onboarding.
:::
Les tests A/B crossplacement garantissent que chaque utilisateur voit la même variante sur tous les placements du test. Cela entraîne les limitations suivantes :
* Seuls les nouveaux utilisateurs peuvent participer. Un nouvel utilisateur est celui qui n'a pas vu de paywall Adapty et dont l'application n'a jamais appelé `getPaywall`. Adapty ne peut pas garantir une chaîne de paywalls cohérente pour les autres utilisateurs.
* Le premier placement que l'utilisateur rencontre détermine le paywall qu'Adapty affiche. Vous ne pouvez pas modifier l'attribution d'un utilisateur ni inscrire le même utilisateur dans plus d'un test A/B crossplacement.
:::warning
Une fois qu'un utilisateur reçoit un paywall crossplacement, il le voit pendant 90 jours, même après l'arrêt du test. Pour modifier cette durée, dans les paramètres **General**, ajustez **[Cross-placement variation stickiness](general#9-cross-placement-variation-stickiness)**.
:::
## Priorité des tests A/B crossplacement \{#crossplacement-ab-test-priority\}
* Les tests A/B crossplacement ont toujours la priorité sur les tests A/B classiques et les tests d'onboarding. Si un nouvel utilisateur est éligible à la fois à un test crossplacement et à un test classique sur le même placement, c'est le test crossplacement qui est affiché.
* Lorsque plusieurs tests A/B crossplacement avec la même audience partagent le même placement, Adapty attribue automatiquement la priorité des tests selon l'ordre dans lequel ils ont été ajoutés. Le premier test obtient la priorité la plus élevée. Vous ne pouvez pas la modifier manuellement.
* Les tests ciblant des segments plus restreints de votre audience obtiennent automatiquement la priorité sur ceux qui ciblent le segment Tous les utilisateurs.
:::note
Dans Analytics, un test A/B crossplacement apparaît sous la forme de plusieurs tests enfants, un par placement. Les tests enfants suivent le schéma de nommage `
2. En haut à droite, cliquez sur **Create A/B test**.
3. Dans la fenêtre **Create the A/B test**, saisissez un **Test name**. Ce champ est obligatoire. Choisissez un nom qui décrit clairement l'objet du test afin de pouvoir l'identifier lors de l'analyse des résultats.
4. Remplissez le champ **Test goal** pour décrire ce que vous souhaitez accomplir (par exemple, augmenter les abonnements ou réduire le taux de désabonnement).
5. Cliquez sur **Select placement** et choisissez un placement de flow, paywall ou onboarding.
6. Configurez le contenu du test dans le tableau **Variants**. Chaque ligne est une variante, chaque colonne est un placement. Ajoutez un paywall à chaque intersection.
Par défaut, le tableau contient 2 variantes et 1 placement. Vous pouvez ajouter jusqu'à 20 variantes. Dès que vous ajoutez un second placement, le test devient un test A/B crossplacement. Notez que les tests A/B crossplacement sont uniquement disponibles pour les paywalls.
7. Enregistrez votre test. Vous avez deux options :
1. **Save as draft** : Le test ne sera pas lancé immédiatement. Vous pourrez le lancer ultérieurement depuis le placement ou la liste des tests A/B. Utilisez cette option pour vérifier la configuration avant le lancement.
2. **Run A/B test** : Lance le test immédiatement. Le test est actif dès que vous cliquez sur ce bouton.
Une fois enregistré en tant que brouillon, passez à [Lancer un test A/B](#run-an-ab-test).
## Modifier un test A/B \{#edit-an-ab-test\}
Vous ne pouvez modifier que les tests A/B enregistrés en tant que brouillons. Une fois qu'un test est en cours, il ne peut plus être modifié. Pour mettre à jour un test en cours, utilisez l'option **Modify** — cela crée un doublon avec le même nom dans lequel vous pouvez effectuer des modifications. Adapty arrête le test d'origine, et les deux versions (originale et modifiée) apparaissent séparément dans vos analyses.
## Lancer un test A/B \{#run-an-ab-test\}
Lancer un test A/B dans Adapty consiste à l'associer à un placement afin qu'il puisse commencer à afficher des paywalls et des onboardings aux utilisateurs.
1. Accédez à la section [A/B tests](ab-tests) depuis le menu principal d'Adapty.
2. Assurez-vous de consulter la bonne liste — les tests A/B **Paywall**, **Flow**, **Onboardings** et **Crossplacement** sont affichés dans des onglets séparés entre lesquels vous pouvez naviguer.
3. Passez à l'onglet **Drafts**. Seuls les tests en brouillon peuvent être démarrés.
4. À côté du test que vous souhaitez lancer, cliquez sur **Run A/B test**.
5. La fenêtre **Edit A/B test** s'ouvre. Vérifiez la configuration et apportez les dernières modifications. Si le placement ou l'audience est manquant, ajoutez-le maintenant.
6. Après avoir vérifié la configuration, cliquez sur **Run A/B test** pour démarrer.
Après le lancement du test, vous pouvez suivre sa progression et consulter les données de performance sur la page [Résultats et métriques du test A/B](results-and-metrics).
## Arrêter un test A/B \{#stop-an-ab-test\}
Lorsque vous arrêtez un test A/B, il se termine et vous pouvez analyser les résultats. Vous décidez également ce qui sera affiché aux utilisateurs dans les placements concernés après la fin du test.
1. Ouvrez la section [A/B tests](https://app.adapty.io/ab-tests) et accédez à l'onglet **Live**.
2. À côté du test que vous souhaitez arrêter, cliquez sur le menu à trois points, puis choisissez **Stop A/B test**.
3. Dans la fenêtre **Stop the A/B test**, décidez de ce qui doit se passer après la fin du test. Vous avez trois options :
| Option | Description |
|----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Display one of the tested paywalls/onboardings | Choisissez le paywall ou l'onboarding gagnant en fonction des résultats du test, comme le chiffre d'affaires, la probabilité d'être le meilleur (**P2BB**) et le chiffre d'affaires pour 1 000 utilisateurs. Ce paywall ou onboarding sera affiché pour le placement et l'audience sélectionnés. |
| Select paywalls/onboardings that don't participate in A/B test | Choisissez un paywall ou un onboarding qui ne fait pas partie du test A/B en cours. Utilisez cette option quand aucune des variantes testées n'a atteint vos objectifs. |
| Don't show any specific paywall/onboarding | Pour le placement et l'audience sélectionnés, aucun paywall ou onboarding spécifique ne sera sélectionné après la fin du test A/B. À la place, le prochain paywall ou onboarding disponible selon la priorité d'audience sera affiché. C'est un bon choix si vous préférez laisser votre configuration existante décider quel paywall ou onboarding afficher, sans en sélectionner un manuellement. |
:::note
L'arrêt d'un test A/B est irréversible — le test ne peut pas être relancé. Assurez-vous d'avoir collecté suffisamment de données avant de décider d'arrêter.
:::
4. Cliquez sur le bouton **Stop and complete this A/B test**.
Une fois le test A/B terminé, il ne sera plus actif et les paywalls ou onboardings qui en faisaient partie ne seront plus affichés aux nouveaux utilisateurs.
Vous pouvez toujours accéder aux résultats et aux métriques du test A/B sur la [page des métriques du test A/B](results-and-metrics#metrics-controls) pour analyser les performances des utilisateurs ayant participé pendant que le test était en cours. Les métriques peuvent continuer à se mettre à jour au fur et à mesure que de nouveaux événements d'achat ou de revenus sont attribués à ces utilisateurs.
---
# File: ab-test-no-paywall-variants
---
---
title: "Ajouter des variantes de test A/B sans flows ni paywalls"
description: "Lancez un test A/B où une variante ignore le flow ou le paywall, en utilisant un indicateur de Remote Config pour contrôler son affichage."
---
Vous pouvez mesurer l'impact de votre flow ou paywall en lançant un test A/B avec une variante vide. Une variante affiche votre flow/paywall ; l'autre n'affiche rien. Votre application lit un indicateur dans le Remote Config pour décider si elle doit effectuer le rendu.
## Fonctionnement \{#how-it-works\}
La configuration utilise deux flows/paywalls dans le même placement :
- **Flow/Paywall A** : le flow ou paywall que vous souhaitez tester, avec `show_paywall` défini sur `true` dans son Remote Config.
- **Flow/Paywall B** : un flow ou paywall vide avec `show_paywall` défini sur `false` dans son Remote Config.
Quand le SDK retourne un flow ou un paywall, votre application lit l'indicateur `show_paywall`. Si la valeur est `true`, l'application effectue le rendu. Si la valeur est `false`, l'application ignore le rendu et l'utilisateur continue sans rien voir.
## 1. Ajouter l'indicateur show_paywall dans le Remote Config \{#1-add-the-show_paywall-flag-in-remote-config\}
Vous avez besoin de deux flows ou paywalls dans le même placement : Flow/Paywall A (celui que vous voulez tester) et Flow/Paywall B (un flow/paywall vide). Ajoutez un champ `show_paywall` à chacun afin que votre application puisse se brancher sur la même clé pour les deux variantes.
Pour ajouter l'indicateur au Flow/Paywall A :
1. Ouvrez la section [**Flows**](https://app.adapty.io/flows)/[**Paywalls**](https://app.adapty.io/paywalls) dans le menu principal d'Adapty et sélectionnez Flow/Paywall A.
2. Ouvrez la section **Remote config**.
3. Créez un champ avec le nom `show_paywall` et la valeur `true`. Dans la vue **JSON**, l'entrée ressemble à ceci :
```json showLineNumbers
{
"show_paywall": true
}
```
4. Enregistrez les modifications.
Répétez les mêmes étapes pour Flow/Paywall B, mais définissez `show_paywall` sur `false`.
Pour plus de détails sur le Remote Config, consultez [Personnaliser un flow avec le Remote Config](customize-flow-with-remote-config) ou [Concevoir un paywall avec le Remote Config](customize-paywall-with-remote-config).
:::tip
Définir `show_paywall` sur les deux variantes permet de conserver un chemin de code identique pour les deux groupes et facilite l'ajout de nouvelles variantes par la suite.
:::
## 2. Configurer le test A/B \{#2-set-up-the-ab-test\}
1. [Créez un test A/B](run_stop_ab_tests) sur le placement et ajoutez les deux flows/paywalls comme variantes.
2. Définissez les poids des variantes pour répartir le trafic entre les utilisateurs qui voient le flow/paywall et ceux qui ne le voient pas.
## 3. Vérifier l'indicateur dans votre application \{#3-check-the-flag-in-your-app\}
Lisez `show_paywall` depuis le Remote Config retourné par le SDK. Si l'indicateur est à `false`, ignorez le rendu et laissez l'utilisateur continuer.
:::note
Adapty convertit les autres devises en USD au taux de change de [currencylayer.com](https://currencylayer.com/) (actualisé toutes les 8 heures). Le taux est **fixé au moment de la transaction** — les variations ultérieures n'affectent pas le résultat de la conversion.
:::
**Revenue** : cette métrique affiche le montant total généré en USD par les achats et les renouvellements, déduction faite des remboursements accordés aux utilisateurs. Elle inclut à la fois l'achat initial et les renouvellements d'abonnement ultérieurs. Revenue vous permet de comprendre comment chaque variante du test A/B se comporte financièrement et de déterminer laquelle génère le plus de revenus.
En savoir plus sur les métriques [paywall](paywall-metrics).
**Probability to be best** : Adapty utilise un cadre d'analyse mathématique robuste pour analyser les résultats des tests A/B et fournit une métrique appelée Probability to be best. Cette métrique évalue la probabilité qu'une variante particulière soit la meilleure option (en termes de revenus à long terme) parmi toutes les variantes testées. La métrique est exprimée en pourcentage allant de 1 % à 100 %. Pour des informations détaillées sur le calcul de cette métrique par Adapty, consultez la [documentation.](maths-behind-it) La meilleure option, déterminée par le Revenue per 1K user, est mise en évidence en vert et automatiquement sélectionnée par défaut.
**Revenue per 1K users** : la métrique Revenue per 1K users calcule le revenu moyen généré pour 1 000 utilisateurs pour chaque variante du test A/B. Cette métrique vous aide à comprendre l'efficacité des revenus de vos variantes, indépendamment du nombre total d'utilisateurs. Elle vous permet de comparer les performances des différentes variantes sur une échelle standardisée et de prendre des décisions éclairées basées sur l'efficacité de génération de revenus.
**Intervalles de prédiction pour le Revenue 1K users** : la métrique Revenue per 1K users inclut également des intervalles de prédiction. Ces intervalles représentent la plage dans laquelle le vrai revenu pour 1 000 utilisateurs d'une variante donnée est prédit de se situer, en se basant sur les données disponibles et l'analyse statistique.
Dans le contexte des tests A/B, lors de l'analyse des revenus générés par différentes variantes, nous calculons le revenu moyen pour 1 000 utilisateurs pour chaque variante. Comme les revenus peuvent varier d'un utilisateur à l'autre, les intervalles de prédiction fournissent une indication claire des valeurs plausibles pour le revenu pour 1 000 utilisateurs, en tenant compte de la variabilité et de l'incertitude associées au processus de prédiction.
En intégrant des intervalles de prédiction dans la métrique Revenue per 1K users, Adapty vous permet d'évaluer l'efficacité des revenus de vos variantes de test A/B tout en prenant en compte la plage des résultats de revenus potentiels. Ces informations vous aident à prendre des décisions basées sur les données et à optimiser efficacement votre stratégie d'abonnement, en tenant compte de l'incertitude dans le processus de prédiction et des valeurs plausibles pour le revenu pour 1 000 utilisateurs.
En analysant ces métriques fournies par Adapty, vous pouvez obtenir des insights sur les performances financières, la significativité statistique et l'efficacité des revenus de vos variantes de test A/B, vous permettant de prendre des décisions basées sur les données et d'optimiser efficacement votre stratégie d'abonnement.
## Métriques des tests A/B \{#ab-test-metrics\}
Adapty fournit un ensemble complet de métriques pour vous aider à mesurer efficacement les performances de vos tests A/B réalisés sur vos variantes de paywall ou d'onboarding. Ces métriques sont mises à jour en temps réel, à l'exception des vues qui sont mises à jour périodiquement. Comprendre ces métriques vous aidera à évaluer l'efficacité des différentes variantes et à prendre des décisions basées sur les données pour optimiser votre stratégie de paywall ou d'onboarding.
Les métriques des tests A/B sont disponibles dans la liste des tests A/B, où vous pouvez avoir une vue d'ensemble des performances de tous vos tests A/B. Cette vue complète offre des métriques agrégées pour chaque variante de test, vous permettant de comparer leurs performances et d'identifier les différences significatives. Pour une analyse plus détaillée de chaque test A/B, vous pouvez accéder aux métriques détaillées du test A/B. Cette section fournit des métriques approfondies spécifiques au test A/B sélectionné, vous permettant d'explorer les performances des variantes individuelles.
Toutes les métriques, à l'exception des vues, sont attribuées au produit au sein du paywall ou de l'onboarding.
## Filtrer les métriques par date d'installation \{#filter-metrics-by-install-date\}
Les métriques de paywall, d'essai et d'achat peuvent être regroupées selon deux dates différentes :
- **La date de l'événement** — quand le paywall a été consulté, l'essai commencé ou l'achat effectué.
- **La date d'installation** — quand l'utilisateur a ouvert l'application pour la première fois.
Les deux vues peuvent afficher des chiffres très différents pour la même plage de dates. La case **Filter metrics by install date** contrôle laquelle le tableau de bord utilise :
- **Décochée (par défaut)** : les métriques sont regroupées par date d'événement.
- **Cochée** : les métriques sont regroupées par date d'installation.
**Exemple.** Vous définissez la plage de dates du 1er au 30 avril et vous regardez les essais.
- **Décochée** : affiche les essais qui ont *démarré* en avril, quelle que soit la date d'installation de ces utilisateurs.
- **Cochée** : affiche les essais des utilisateurs qui se sont *installés* en avril, quelle que soit la date de début de leur essai.
Utilisez la vue par date d'installation pour mesurer les performances d'acquisition d'utilisateurs pour une cohorte spécifique. Utilisez la vue par date d'événement pour mesurer l'activité d'un paywall ou d'un onboarding sur une période donnée.
## Contrôles des métriques \{#metrics-controls\}
Le système affiche les métriques en fonction de la période sélectionnée et les organise selon le paramètre de la colonne de gauche avec trois niveaux d'indentation.
### Plages de temps \{#time-ranges\}
Vous pouvez choisir parmi différentes périodes pour analyser les données de métriques, ce qui vous permet de vous concentrer sur des durées spécifiques comme des jours, des semaines, des mois ou des plages de dates personnalisées.
### Filtres et regroupements disponibles \{#available-filters-and-grouping\}
:::link
Article principal : [Contrôles analytiques](controls-filters-grouping-compare-proceeds)
:::
Adapty propose des outils puissants pour filtrer et personnaliser l'analyse des métriques selon vos besoins. Depuis la page des métriques d'Adapty, vous avez accès à différentes plages de temps, options de regroupement et possibilités de filtrage.
- ✅ Filtrer par : Audience, attribution, pays, paywall, état du paywall, groupe de paywalls, onboarding, placement, pays, store, produit et store du produit.
- ✅ Regrouper par : Produit et store.
:::note
Lorsque vous filtrez par test A/B, les tests A/B cross-placement apparaissent comme des tests enfants séparés (par ex. `My test child-0`, `My test child-1`), un par placement. Consultez [Limitations des tests A/B cross-placement](ab-test-types#crossplacement-ab-test-limitations) pour plus de détails.
:::
## Graphique de métrique unique \{#single-metrics-chart\}
L'un des éléments clés de la page des métriques de paywall ou d'onboarding est la section graphique, qui représente visuellement les métriques sélectionnées et facilite l'analyse.
La section graphique de la page des métriques du test A/B comprend un graphique à barres horizontales qui représente visuellement les valeurs des métriques choisies. Chaque barre du graphique correspond à une valeur de métrique et est proportionnelle en taille, ce qui facilite la compréhension des données d'un coup d'œil. La ligne horizontale indique la période analysée, et la colonne verticale affiche les valeurs numériques des métriques. La valeur totale de toutes les valeurs de métriques est affichée à côté du graphique.
De plus, cliquer sur l'icône de flèche dans le coin supérieur droit de la section graphique développe la vue, affichant les métriques sélectionnées sur toute la ligne du graphique.
## Résumé du test A/B \{#ab-test-summary\}
À côté du graphique de métrique unique, la section de résumé des détails du test A/B est affichée. Elle comprend des informations sur l'état, la durée, les placements et d'autres détails relatifs au test A/B.
## Définitions des métriques \{#metrics-definitions\}
Voici les métriques clés disponibles pour les tests A/B :
### Revenue \{#revenue\}
Revenue représente le montant total généré en USD par les achats et les renouvellements résultant du test A/B. Il inclut l'achat initial et les renouvellements d'abonnement ultérieurs. La métrique Revenue est calculée avant déduction de la commission de l'App Store ou du Play Store.
En savoir plus sur les métriques [paywall](paywall-metrics#revenue) Revenue.
### CR to purchases \{#cr-to-purchases\}
Le taux de conversion vers les achats mesure l'efficacité de votre test A/B à convertir les vues en achats réels. Il est calculé en divisant le nombre d'achats par le nombre de vues. Par exemple, si vous avez 10 achats et 100 vues, le taux de conversion vers les achats serait de 10 %.
### CR trials \{#cr-trials\}
Le taux de conversion (CR) vers les essais est le nombre d'essais démarrés depuis le test A/B divisé par le nombre de vues. Le taux de conversion vers les essais mesure l'efficacité de votre test A/B à convertir les vues en activations d'essai. Il est calculé en divisant le nombre d'essais démarrés par le nombre de vues.
### Purchases \{#purchases\}
La métrique Purchases représente le nombre total de transactions effectuées dans le paywall ou l'onboarding résultant du test A/B. Elle inclut les types d'achats suivants :
- Nouveaux achats effectués.
- Conversions d'essais qui ont été activés.
- Déclassements, mises à niveau et changements de niveaux d'abonnements.
- Restaurations d'abonnement (par ex. lorsqu'un abonnement expire sans renouvellement automatique et est ensuite restauré).
Veuillez noter que les renouvellements ne sont pas inclus dans la métrique Purchases.
### Trials \{#trials\}
La métrique Trials indique le nombre total d'essais activés résultant du test A/B.
### Trials cancelled \{#trials-cancelled\}
La métrique Trials cancelled représente le nombre d'essais pour lesquels le renouvellement automatique a été désactivé. Cela se produit lorsque les utilisateurs se désinscrivent manuellement de l'essai.
### Refunds \{#refunds\}
Les Refunds pour le test A/B représentent le nombre d'achats et d'abonnements remboursés spécifiquement liés aux variantes testées.
### Views \{#views\}
Views est le nombre de vues des paywalls ou des onboardings qui composent le test A/B. Si l'utilisateur visite deux fois, cela compte comme deux visites.
### Unique views \{#unique-views\}
Unique views est le nombre de vues uniques du paywall ou de l'onboarding. Si l'utilisateur le visite deux fois, cela compte comme une seule vue unique.
### Probability to be the best \{#probability-to-be-the-best\}
La métrique Probability to be the best quantifie la probabilité qu'une variante spécifique d'un test A/B soit la meilleure option parmi tous les paywalls ou onboardings testés. Elle fournit une probabilité numérique indiquant les performances relatives de chaque paywall ou onboarding. La métrique est exprimée en pourcentage allant de 1 % à 100 %.
### ARPU (Average revenue per user) \{#arpu-average-revenue-per-user\}
Pour les tests A/B d'onboarding uniquement. Mesure le revenu moyen généré par chaque utilisateur sur une période donnée. Il est calculé en divisant le revenu total par le nombre d'utilisateurs uniques.
### ARPPU (Average revenue per paying user) \{#arppu-average-revenue-per-paying-user\}
ARPPU signifie Average Revenue Per Paying User résultant du test A/B. Il est calculé comme le revenu total divisé par le nombre d'utilisateurs payants uniques. Par exemple, si vous avez généré 15 000 $ de revenus auprès de 1 000 utilisateurs payants, l'ARPPU serait de 15 $.
### ARPAS (Average revenue per active subscriber) \{#arpas-average-revenue-per-active-subscriber\}
ARPAS est une métrique qui vous permet de mesurer le revenu moyen généré par abonné actif grâce à l'exécution du test A/B. Il est calculé en divisant le revenu total par le nombre d'abonnés ayant activé un essai ou un abonnement. Par exemple, si le revenu total est de 5 000 $ et que vous avez 1 000 abonnés, l'ARPAS serait de 5 $. Cette métrique aide à évaluer le potentiel de monétisation moyen par abonné.
### Proceeds \{#proceeds\}
La métrique Proceeds pour le test A/B représente le montant réel d'argent reçu par le propriétaire de l'application en USD provenant des achats et des renouvellements, après déduction de la commission applicable de l'App Store / Play Store. Elle reflète les revenus nets spécifiquement associés aux variantes testées dans le test A/B, contribuant directement aux gains de l'application. Pour plus d'informations sur le calcul des proceeds, vous pouvez consulter la [documentation](analytics-cohorts#revenue-vs-proceeds) Adapty.
### Unique subscribers \{#unique-subscribers\}
La métrique Unique subscribers représente le nombre de personnes distinctes qui se sont abonnées ou ont activé un essai via les variantes du test A/B. Elle ne compte chaque abonné qu'une seule fois, quel que soit le nombre d'abonnements ou d'essais qu'il initie.
### Unique paid subscribers \{#unique-paid-subscribers\}
La métrique Unique paid subscribers représente le nombre de personnes uniques qui ont réalisé un achat avec succès et sont devenues des abonnés payants via les variantes du test A/B.
### Refund rate \{#refund-rate\}
Le taux de remboursement pour le test A/B est calculé en divisant le nombre de remboursements spécifiquement associés aux variantes du test par le nombre de premiers achats (les renouvellements sont exclus). Par exemple, s'il y a 5 remboursements et 1 000 premiers achats, le taux de remboursement serait de 0,5 %.
### Unique CR purchases \{#unique-cr-purchases\}
Le taux de conversion unique vers les achats pour le test A/B est calculé en divisant le nombre d'achats spécifiquement associés aux variantes du test par le nombre de vues uniques. Par exemple, s'il y a 10 achats et 100 vues uniques, le taux de conversion unique vers les achats serait de 10 %.
### Unique CR trials \{#unique-cr-trials\}
Le taux de conversion unique vers les essais pour le test A/B est calculé en divisant le nombre d'essais démarrés spécifiquement associés aux variantes du test par le nombre de vues uniques. Par exemple, s'il y a 30 essais démarrés et 100 vues uniques, le taux de conversion unique vers les essais serait de 30 %.
### Completions & unique completions \{#completions--unique-completions\}
Pour les tests A/B d'onboarding uniquement. Les Completions comptent le nombre de fois où les utilisateurs complètent votre onboarding via les variantes du test A/B, c'est-à-dire qu'ils passent du premier au dernier écran. Si quelqu'un le complète deux fois, cela compte comme deux **completions** mais une seule **unique completion**.
### Unique completions rate \{#unique-completions-rate\}
Pour les tests A/B d'onboarding uniquement. Le nombre de completions uniques divisé par le nombre de vues uniques. Cette métrique vous aide à comprendre comment les utilisateurs s'engagent avec l'onboarding via les variantes du test A/B et à apporter des modifications si vous constatez que les utilisateurs l'ignorent.
---
# File: maths-behind-it
---
---
title: "Les mathématiques derrière les tests A/B"
description: "Comprenez les mathématiques derrière l'analyse des abonnements pour de meilleures perspectives de revenus."
---
Les tests A/B sont une technique puissante permettant de comparer les performances de deux versions différentes d'un flow, d'un paywall ou d'un onboarding. L'objectif final est de déterminer quelle version est la plus efficace en se basant sur le revenu moyen par utilisateur sur une période de 12 mois. Cependant, attendre une année entière pour collecter des données et prendre des décisions n'est pas pratique. C'est pourquoi le revenu par utilisateur sur 2 semaines est utilisé comme métrique proxy, choisi sur la base d'une analyse des données historiques pour approximer la métrique cible. Pour obtenir des résultats précis et fiables, il est crucial d'employer une méthode statistique robuste capable de gérer des types de données variés. La statistique bayésienne, une approche populaire dans l'analyse de données moderne, fournit un cadre flexible et intuitif pour les tests A/B. En intégrant des connaissances préalables et en les mettant à jour avec de nouvelles données, les méthodes bayésiennes permettent une meilleure prise de décision dans des situations d'incertitude. Ce document fournit un guide complet de l'analyse mathématique employée par Adapty pour évaluer les résultats des tests A/B et fournir des informations précieuses pour une prise de décision basée sur les données.
## Approche d'Adapty en matière d'analyse statistique \{#adaptys-approach-to-statistical-analysis\}
Adapty emploie une approche complète de l'analyse statistique afin d'évaluer les performances des tests A/B et de fournir des informations précises et fiables. Notre méthodologie comprend les étapes clés suivantes :
1. **Définition de la métrique :** Pour mener un test A/B avec succès, vous devez identifier et définir la métrique clé qui correspond aux objectifs spécifiques de l'analyse. Adapty a exploité une grande quantité de données historiques d'applications d'abonnement pour déterminer celle qui joue le rôle de métrique proxy pour l'objectif à long terme du revenu moyen après 1 an — il s'agit de l'ARPU après 14 jours.
2. **Formulation des hypothèses :** Nous créons deux hypothèses pour le test A/B. L'hypothèse nulle (H0) suppose qu'il n'y a pas de différence significative entre le groupe de contrôle (A) et le groupe de test (B). L'hypothèse alternative (H1) suggère qu'il existe une différence significative entre deux groupes ou plus.
3. **Sélection de la distribution :** Nous choisissons la famille de distribution la mieux adaptée en fonction des caractéristiques des données et de la métrique observée. Le choix le plus fréquent est la distribution log-normale (en tenant compte des valeurs nulles).
4. **Calcul de la probabilité d'être le meilleur :** En utilisant l'approche bayésienne des tests A/B, nous calculons la probabilité d'être la meilleure option pour chaque variante de paywall ou d'onboarding participant au test. Cette valeur est certes liée aux p-values que nous utilisions auparavant, mais il s'agit essentiellement d'une approche différente, plus robuste et plus facile à comprendre.
5. **Interprétation des résultats :** La probabilité d'être le meilleur est exactement ce que cela suggère. Plus la probabilité est élevée, plus une option spécifique a de chances d'être le meilleur choix pour la tâche. Vous devez déterminer vous-même le seuil pour la prise de décision ; celui-ci doit dépendre de nombreux autres facteurs propres à votre situation, mais un seuil de probabilité couramment utilisé est de 95 %.
6. **Intervalles de prédiction :** Adapty calcule des intervalles de prédiction pour les métriques de performance de chaque groupe, fournissant une plage de valeurs dans laquelle le vrai paramètre de la population est susceptible de se situer. Cela permet de quantifier l'incertitude associée aux métriques de performance estimées.
## Détermination de la taille de l'échantillon \{#sample-size-determination\}
Déterminer une taille d'échantillon appropriée est essentiel pour obtenir des résultats de tests A/B fiables et concluants. Adapty prend en compte des facteurs tels que la puissance statistique et la taille d'effet attendue, qui restent importants même avec l'approche bayésienne, afin de garantir une taille d'échantillon adéquate. Les méthodes d'estimation de la taille d'échantillon requise, spécifiques à l'approche bayésienne que nous employons désormais, garantissent la fiabilité de l'analyse.
Pour en savoir plus sur les fonctionnalités des tests A/B, nous vous recommandons de consulter notre documentation sur la [création](ab-tests) et [l'exécution des tests A/B](run_stop_ab_tests), ainsi que la compréhension des différentes [métriques et résultats des tests A/B](results-and-metrics).
Le cadre analytique d'Adapty pour les tests A/B emploie désormais une approche bayésienne, mais l'accent reste mis sur la définition des métriques, la formulation des hypothèses et la sélection des distributions. Cependant, au lieu de déterminer des p-values, nous calculons désormais les distributions a posteriori et la probabilité que chaque variante soit la meilleure. Nous déterminons également les intervalles de prédiction. Cette approche révisée, bien que toujours complète et encore plus robuste, est conçue pour fournir des informations plus intuitives et plus faciles à interpréter. L'objectif reste d'aider les entreprises à optimiser leurs stratégies, améliorer leurs performances et stimuler leur croissance grâce à une analyse statistique rigoureuse de leurs tests A/B.
---
# File: autopilot
---
---
title: "Conseiller IA de croissance"
description: "Optimisez vos paywalls pour maximiser vos revenus."
---
Growth Advisor est un outil de croissance dopé à l'IA pour les applications par abonnement. Il élabore un plan à long terme pour augmenter vos revenus grâce à des tests A/B, en s'appuyant sur des données marché issues de plus de 20 000 applications suivies par Adapty.
## Lire le graphique en entonnoir étape par étape \{#funnel-chart-step-by-step\}
Parcourons les éléments d'un entonnoir pour comprendre comment lire le parcours utilisateur sur le graphique.
### Installations \{#installs\}
La 1ère colonne (1) correspond au nombre d'installations. Elle est affichée en valeur absolue (2) du total des installations (et non des utilisateurs uniques), ainsi qu'à 100 % — la valeur d'entrée la plus élevée servant de base au calcul des conversions relatives. Si un utilisateur supprime l'application puis la réinstalle, deux installations distinctes sont comptabilisées.
La zone grise adjacente représente les paramètres de transition entre les étapes. Le pourcentage de conversion vers l'étape suivante (Paywall affiché) est indiqué sur un drapeau (3). Le pourcentage de chute et la valeur absolue du désabonnement sont affichés en dessous (4).
### Paywall affiché \{#paywall-displayed\}
La 2ème colonne (5) indique le nombre d'utilisateurs de l'application ayant vu un paywall au moins une fois (6). Seuls les utilisateurs dont l'installation s'est produite durant la période sélectionnée sont pris en compte. Si un utilisateur voit un paywall durant la période sélectionnée mais que sa date d'installation est hors plage, sa vue n'est pas comptabilisée.
Un pourcentage de ces vues rapporté à la 1ère étape est également affiché (7). Vous remarquerez que ce pourcentage est égal au drapeau gris (3) de la 1ère étape. Cette égalité ne s'applique qu'à ces deux premières étapes.
Nous collectons les données pour cette étape à partir de tous vos paywalls utilisant la méthode `logShowFlow()` (iOS SDK v4+) / `logShowPaywall()`. Assurez-vous donc d'envoyer chaque vue de paywall à Adapty via cette méthode, comme décrit dans la [documentation](present-remote-config-paywalls#track-paywall-view-events).
La zone grise à côté de la 2ème colonne représente la transition. Le pourcentage de conversion vers l'étape suivante (Période d'essai) est affiché sur un drapeau (8). Le pourcentage de chute et la valeur absolue des clients perdus après le paywall sont indiqués en dessous (9).
### Périodes d'essai \{#trials\}
La 3ème colonne (10) affiche le nombre de périodes d'essai activées sur les paywalls par les clients ayant installé l'application durant la période sélectionnée (11). Si un filtre est appliqué sur un ou des produits sans période d'essai, cette valeur est nulle et la colonne est vide.
Un pourcentage d'essais rapporté à la 1ère étape est également visible, indiquant la conversion des installations vers les essais (12).
Vous remarquerez que ce pourcentage n'est plus égal au drapeau gris (8) de la conversion de l'étape précédente. C'est parce que nous comparons la valeur actuelle avec la 1ère étape en haut du graphique et avec l'étape précédente sur les drapeaux gris.
La zone grise à côté de la 3ème colonne affiche donc le pourcentage de conversion vers l'étape suivante (Payant), indiqué sur un drapeau (13). Le pourcentage de chute et la valeur absolue des clients perdus durant la période d'essai sont affichés en dessous (14).
### Abonnements et renouvellements \{#subscriptions-and-renewals\}
La 4ème colonne affiche le nombre d'abonnements activés (15). Pour les produits sans période d'essai, ce nombre inclut les abonnements directs depuis un paywall. Pour les produits avec période d'essai, il contient le nombre d'essais convertis en abonnements payants. Si vous avez les deux types de produits, avec et sans essai, il s'agit de la somme des deux.
Le pourcentage en haut indique la conversion depuis les installations (16).
Le pourcentage sur le drapeau gris indique la conversion vers l'étape suivante (renouvellement pour la 2ème période) (17).
Le pourcentage de chute avant le renouvellement vers la 2ème période et sa valeur absolue sont affichés sous la conversion (18).
Cette étape marque le début d'une série d'étapes de structure similaire. Après le 2ème renouvellement vient le 3ème, puis le 4ème, etc. Si votre historique d'application contient suffisamment de données, vous pouvez visualiser des dizaines de périodes via le défilement horizontal. La logique de ces étapes reste la même :
- le pourcentage par rapport aux installations en haut,
- le pourcentage par rapport à l'étape précédente en bas,
- le nombre absolu de renouvellements en haut,
- le nombre absolu de désabonnements en bas,
- une info-bulle au survol pour les raisons de désabonnement.
### Raisons de désabonnement \{#churn-reasons\}
Adapty détaille les statistiques de *désabonnement* à partir de l'étape Période d'essai et au-delà. Chaque utilisateur ayant atteint une étape sans passer à la suivante est comptabilisé comme un désabonnement.
* Si un événement spécifique (par exemple, l'expiration d'un essai ou un problème de facturation) a causé l'absence de conversion, Adapty en affiche la raison.
* Le statut **unknown** est un état temporaire. Il indique que l'utilisateur n'a pas encore rencontré l'événement lui permettant de passer à l'étape suivante.
À l'étape Période d'essai, cela signifie généralement que l'essai n'a pas encore pris fin. C'est fréquent lorsque vous consultez les entonnoirs sur de courtes plages de dates ou sur une seule journée, car les essais prennent du temps à se conclure.
Adapty mettra à jour les informations une fois que l'utilisateur aura converti ou annulé l'essai.
### Vue tableau, filtres et export CSV \{#table-view-filters-and-csv-export\}
Le graphique en entonnoir est enrichi d'un tableau pour vous fournir un support pratique dans votre travail avec les chiffres.
Ce tableau reprend l'approche de l'entonnoir avec quelques ajustements.
Il comporte des colonnes affichant les données de toutes les étapes, à l'exception de l'étape du 1er abonnement payant.
À la place, deux colonnes distinctes sont présentes : Installation → Payant et Essai → Payant. Elles mettent en évidence le point clé de conversion où un utilisateur gratuit devient payant.
On pourrait penser qu'il s'agit d'une division par type de produit : la colonne Installation → Payant n'afficherait que les produits sans période d'essai, tandis que la colonne Essai → Payant ne contiendrait que les produits avec période d'essai. Mais ce n'est pas tout à fait ainsi que cela fonctionne. Car nous prenons également en compte les utilisateurs dont la période d'essai a expiré et qui achètent un produit avec essai comme s'il n'en avait pas.
En approfondissant les chiffres, vous découvrirez de puissants outils de filtrage pour formuler de nouvelles hypothèses.
N'hésitez pas à définir des conditions selon différentes dimensions. Collectez de véritables insights basés sur les données.
Faites varier :
1. Le type de produit — économie, durée, etc.
2. La plage de dates.
3. La segmentation par pays.
4. L'attribution du trafic.
5. Le store.
Sélectionnez Valeur absolue #, Pourcentage relatif % ou les deux pour n'afficher que les données nécessaires.
Enfin, à droite du panneau de contrôle, un bouton permet d'exporter les données de l'entonnoir au format CSV. Vous pouvez ensuite l'ouvrir dans Excel ou Google Sheets, ou l'importer dans votre propre système d'analyse.
:::important
Informez Adapty si votre application est inscrite à un programme de commission réduite. Pour garantir l'exactitude des calculs, précisez votre statut dans les programmes [Small Business Program](app-store-small-business-program) et [Reduced Service Fee program](google-reduced-service-fee) dans vos [paramètres d'application](general).
:::
---
# File: analytics-retention
---
---
title: "Analyse de la rétention"
description: "Comprenez les analyses de rétention des utilisateurs et optimisez votre stratégie d'abonnement."
---
Les graphiques de rétention peuvent vous aider à répondre aux questions suivantes :
1. Comment votre application fidélise-t-elle ses clients d'une période à l'autre ?
2. Quels produits sont les plus attractifs et retiennent le mieux les utilisateurs ?
3. Quels groupes d'utilisateurs sont les plus fidèles ?
4. Quel niveau de rétention peut servir de référence pour la croissance ?
5. Et bien sûr, comment économiser de l'argent en investissant dans l'audience déjà acquise plutôt qu'en cherchant de nouveaux utilisateurs.
Vous trouverez des informations précieuses sur le comportement des utilisateurs en définissant des filtres et des groupes.
La rétention est calculée à partir des données que nous collectons via le SDK et les notifications du store — aucune configuration supplémentaire n'est requise de votre côté.
:::tip
**Fidélisez vos abonnés avant qu'ils ne se désabonnent.** [Retention Messaging](retention-messaging) affiche un message personnalisé dans l'écran Annuler l'abonnement d'Apple — une raison de rester, juste au moment où l'abonné appuie sur Annuler.
:::
### Comment calculons-nous la rétention ? \{#how-do-we-calculate-retention\}
En observant le graphique de rétention, vous voyez comment le nombre d'utilisateurs évolue selon l'étape franchie : l'essai (si la case « show trials » est cochée), le 1er paiement, le 2e paiement, etc. Voici ce qui est comptabilisé lorsque vous choisissez une plage de dates pour le graphique de rétention.
Par exemple, vous avez sélectionné les 3 derniers mois dans le calendrier et la case « show trials » est décochée. Cela signifie que seuls les utilisateurs ayant effectué leur 1er abonnement au cours des 3 derniers mois sont comptés. Si la case « show trials » est cochée et que les 3 derniers mois sont sélectionnés, nous comptons tous les utilisateurs ayant démarré un essai au cours de ces 3 derniers mois. Pour ces abonnés, la rétention absolue à l'étape N correspond au nombre de ceux ayant effectué le Nième paiement. La valeur relative de rétention à l'étape N est calculée comme le ratio entre le nombre absolu de Nièmes paiements et le nombre total d'abonnements (ou d'essais) sur la période sélectionnée.
:::info
La rétention évolue rétrospectivement
Quel que soit le moment où vous consultez le graphique, le nombre de référence (100 %) reste identique pour la période sélectionnée. En revanche, la rétention vers la période suivante peut augmenter avec le temps.
Par exemple, pour un abonnement mensuel, si 20 premiers achats ont été effectués entre le 1er et le 31 décembre, la rétention vers la deuxième période devrait augmenter tout au long du mois de janvier (et peut-être même après), au fur et à mesure que les utilisateurs entrent dans la période d'abonnement suivante, parfois avec un léger décalage pour diverses raisons (par exemple, un délai de grâce).
:::
### Gestion des remboursements \{#refund-handling\}
Les remboursements ne sont **pas** exclus de la rétention. Un utilisateur remboursé reste comptabilisé sur la courbe de rétention, ce qui peut faire paraître la Rétention plus élevée que les [Abonnements actifs](active-subscriptions) ou les [Revenus](revenue) pour la même cohorte.
Pour une comparaison complète entre les métriques, consultez [Comment les métriques gèrent les remboursements](refund-events#how-metrics-handle-refunds).
### Opportunités de rétention \{#retention-opportunities\}
Voyons comment tirer le meilleur parti de la fonctionnalité de rétention d'Adapty.
Plutôt que de se limiter à une passion pour les chiffres, il est plus utile d'envisager la valeur business concrète que peuvent apporter les résultats analytiques. Avant de plonger dans les détails du graphique, il vaut mieux clarifier l'impact que ces données peuvent avoir.
Gardons donc en tête le POURQUOI et le COMMENT.
1 - travailler avec son audience.
Avant tout, la rétention concerne l'audience cible, ses préférences, et la question de savoir si votre produit répond à ses attentes tout au long de sa durée de vie en tant que client. Si vous vous êtes demandé comment mesurer la relation fondamentale de votre activité qui génère des revenus, la rétention est là pour vous.
Cette mesure est utile car il est généralement moins coûteux de vendre à un client existant qu'à un inconnu. Et ce coût est faible pour deux raisons : moins d'efforts pour conclure la vente et un panier moyen plus élevé. Il peut donc être judicieux d'investir dans la fidélité de vos abonnés lorsque la rétention baisse.
2 - travailler avec le produit.
La deuxième raison du POURQUOI, c'est que les graphiques de rétention montrent la durée de vie réelle de consommation de votre produit et permettent des prévisions à long terme. Et si vous souhaitez vous améliorer, corrigez le travail qui délivre le produit pour modifier sa durée de vie, puis refaites vos prévisions pour vous rapprocher de vos objectifs commerciaux. Ces ajustements peuvent s'inscrire dans une vision stratégique, en tandem avec une routine de prévision. Et oui, ce processus ne s'arrête jamais, car nous courons tous vite pour rester à la même place dans un environnement en constante évolution.
3 - travailler avec le marché.
Aller plus vite que les principaux concurrents, c'est bien, mais parfois sortir de la course ordinaire peut apporter davantage de bénéfices. Lorsque vous analysez le comportement des utilisateurs dans différents pays et stores, certaines particularités locales peuvent ouvrir des insights remarquables et de nouvelles opportunités pour l'activité. Le contexte culturel et de marché peut être analysé sous l'angle de la rétention pour être ensuite utilisé dans la segmentation et le développement futur. Par exemple, vous pourrez trouver de l'eau bleue dans certaines régions et y croître plus rapidement.
L'utilisation des données de rétention ne se limite bien sûr pas à cette interprétation de base, mais c'est un bon point de départ si vous souhaitez obtenir rapidement de la valeur concrète.
### Courbes, vue tableau, filtres et export CSV \{#curves-table-view-filters-and-csv-export\}
Maintenant que nous avons établi les bases concernant les objectifs de rétention et les principaux modes d'interprétation, passons en revue les outils qui facilitent tout cela.
Le cœur de la fonctionnalité de rétention dans Adapty est le graphique. Il montre comment le niveau de rétention évolue en fonction des étapes du cycle de vie d'un utilisateur.
Ces étapes sont affichées sur l'axe horizontal : Trial, Paid (le 1er abonnement), P2 (le 2e abonnement), P3, P4, etc.
Notez que l'axe commence par l'étape Trial uniquement lorsque la case « Show trials » est cochée.
Pour le calcul des données, cette case fonctionne de la façon suivante. Lorsque « Show trials » est sélectionné et que l'axe commence par l'étape Trial, seuls les scénarios incluant des essais sont affichés — les transactions provenant directement des installations ne sont pas prises en compte, et l'étape Paid ne contient que les transactions issues des essais. Lorsque « Show trials » n'est pas sélectionné et que l'axe commence par l'étape Paid, cette première étape regroupe toutes les premières transactions, qu'elles proviennent d'essais ou directement d'installations.
Lorsque vous survolez le graphique, une fenêtre contextuelle affichant un résumé des données apparaît. De même, si vous survolez une colonne du tableau ci-dessous, une fenêtre contextuelle récapitulative s'affiche avec les données correspondantes sur le graphique.
Le tableau contient les mêmes regroupements et filtres que ceux choisis pour le graphique.
Combinez librement filtres et regroupements pour une analyse avancée. Collectez de vraies informations à partir des données.
Variez :
1. Type de produit.
2. Durée.
3. Plage de temps.
4. Pays.
5. Attribution.
6. Store.
Utilisez les contrôles #Absolu et %Relatif pour afficher les données souhaitées.
Enfin, à droite du panneau de contrôle, un bouton permet d'exporter les données du funnel en CSV. Vous pouvez ensuite l'ouvrir dans Excel ou Google Sheets, ou l'importer dans votre propre système analytique pour continuer l'analyse et les prévisions dans l'environnement de votre choix.
:::warning
Veillez à indiquer que votre application est incluse dans le Small Business Program dans les [Paramètres généraux Adapty](https://app.adapty.io/settings/general).
:::
---
# File: analytics-conversion
---
---
title: "Analyse des conversions"
description: "Mesurez les taux de conversion des abonnements avec les outils d'analytique d'Adapty."
---
Là où les entonnoirs offrent une vue d'ensemble et la rétention se concentre sur la fidélité des utilisateurs, l'analyse des conversions est conçue pour vous aider à évaluer l'efficacité à chaque étape clé du parcours utilisateur — dans le temps.
Les conversions répondent aux questions suivantes :
1. Comment les conversions de l'application évoluent-elles dans le temps ? Y a-t-il des tendances saisonnières ?
2. Comment les conversions évoluent-elles lors d'activités marketing ou d'autres nouveaux événements ?
3. Comment les utilisateurs de différentes régions réagissent-ils à vos mises à jour d'application ?
4. Quels types de produits convertissent mieux dans le temps ?
La conversion est calculée à partir des données collectées via le SDK Adapty et les notifications du store, sans aucune configuration supplémentaire de votre part.
## Contrôles principaux et graphiques \{#main-controls-and-charts\}
Bien que le chiffre d'affaires soit souvent la métrique de référence pour mesurer le succès, ce n'est qu'une partie du tableau d'ensemble. Comprendre comment votre activité évolue dans le temps — à travers différents comportements utilisateurs et étapes du cycle de vie — est tout aussi important. C'est là qu'intervient l'analyse des conversions.
Vous pouvez obtenir des informations plus précieuses sur le comportement des utilisateurs en appliquant des filtres et des regroupements. Pour identifier et analyser les tendances, surveillez l'évolution de vos conversions quotidiennement, mensuellement ou annuellement.
Sur le côté gauche du graphique, vous trouverez le contrôle des étapes de conversion. Il vous permet de choisir quelles conversions suivre spécifiquement — par exemple Installation → Essai, Essai → Payant, ou Payant → Renouvellement.
Chaque métrique de conversion suit cette logique :
- Soit **X** le nombre d'utilisateurs ayant atteint l'état de départ à une date donnée (ex. : installations).
- Soit **Y** le nombre de ces utilisateurs ayant finalement atteint l'état cible (ex. : démarrages d'essai).
- Le taux de conversion est calculé ainsi : **Conversion = (Y / X) × 100 %**
:::note
La date affichée sur le graphique correspond au moment où les utilisateurs ont atteint l'état initial (X) — le moment où ils sont devenus éligibles à la conversion.
:::
Vous trouverez ci-dessous l'explication de chaque conversion, accompagnée d'un exemple pour illustration.
### Installation -> Payant \{#install---paid\}
Cette métrique indique le pourcentage d'utilisateurs ayant installé l'application à une date donnée et ayant finalement acheté leur premier abonnement.
La colonne **Predicted revenue** affiche le revenu total estimé qu'une cohorte d'abonnés devrait générer pendant la période sélectionnée après la création de la cohorte. Cette valeur est calculée à l'aide du modèle de prédiction d'Adapty, en se basant sur les tendances de rétention des cohortes historiques de l'application.
La colonne **Predicted LTV** affiche la valeur vie estimée de chaque utilisateur dans la cohorte sélectionnée. Cette valeur est calculée en divisant les revenus prédits par le nombre prédit d'utilisateurs payants dans la cohorte.
### Sélectionner l'horizon \{#select-the-horizon\}
Pour modifier l'horizon de prédiction, sélectionnez une valeur dans le menu déroulant **Predictions**. Les options disponibles sont 3, 6, 9, 12, 18 et 24 mois après la création de la cohorte.
### Filtrer par produit \{#filter-by-product\}
Vous pouvez filtrer les revenus prédits et la LTV par produit. Par défaut, les prédictions sont construites à partir de toutes les données d'achat — filtrer par produit montre la contribution de chaque produit.
## Quand les prédictions ne sont pas disponibles \{#when-predictions-are-unavailable\}
Quand une prédiction ne peut pas être produite pour une cohorte, les colonnes Revenus prédits et LTV prédite affichent des tirets cadratins (—) à la place des valeurs. Cela peut se produire pour plusieurs raisons :
- **Délai insuffisant depuis la création de la cohorte** : les prédictions ne deviennent disponibles qu'après que la cohorte a terminé sa première période de renouvellement — environ une semaine pour les abonnements hebdomadaires et environ quatre semaines pour les abonnements mensuels.
- **Taille de cohorte trop petite** : trop peu d'abonnés payants pour produire une projection fiable.
- **Comportement de cohorte inhabituel** : la cohorte s'écarte significativement des tendances attendues par le modèle. Attendre quelques semaines peut résoudre ce problème à mesure que davantage de données s'accumulent.
- **Horizon dépassé** : la cohorte est plus ancienne que l'horizon de prédiction sélectionné. Par exemple, la prédiction à 3 mois est masquée après trois mois, la prédiction à 12 mois après douze mois, et aucune prédiction n'est affichée pour les cohortes de plus de 24 mois.
:::warning
Lors de l'activation des prédictions, il est important de noter qu'il peut y avoir un délai maximum de 24 heures avant que les données de prédiction pour les Revenus et la LTV ne soient disponibles sur votre Adapty Dashboard.
:::
---
# File: predictions-in-ab-tests
---
---
title: "Prédictions dans les tests A/B"
description: "Découvrez comment les prédictions dans les tests A/B aident à affiner les stratégies de tarification des abonnements."
---
Bienvenue dans la documentation d'Adapty sur les analyses prédictives pour notre fonctionnalité de test A/B. Cet outil vous donnera un aperçu des résultats futurs de vos tests A/B en cours et vous aidera à prendre des décisions basées sur les données plus rapidement 🚀 grâce aux prédictions alimentées par l'IA d'Adapty.
### Qu'est-ce que les prédictions de test A/B ? \{#what-are-ab-test-predictions\}
Les prédictions de test A/B d'Adapty utilisent des techniques avancées de machine learning (notamment des modèles de gradient boosting) pour anticiper le potentiel de revenus à long terme des paywalls comparés dans un test A/B.
Ce modèle prédictif vous permet de sélectionner le paywall le plus efficace en fonction des revenus projetés sur un an, au lieu de vous appuyer uniquement sur les métriques observées pendant l'exécution du test. Cela vous permet de déterminer le gagnant de manière plus fiable et plus rapide, sans avoir à attendre des semaines que les données s'accumulent.
### Comment fonctionne le modèle ? \{#how-does-the-model-work\}
Le modèle est entraîné sur un vaste ensemble de données historiques de tests A/B provenant d'une grande variété d'applications dans différentes catégories. Il intègre un large éventail de caractéristiques pour prédire les revenus qu'un paywall est susceptible de générer dans l'année suivant le début de l'expérience. Ces caractéristiques comprennent :
- Les transactions des utilisateurs et les taux de conversion sur différentes périodes
- La répartition géographique des utilisateurs
- L'utilisation de la plateforme (iOS ou Android)
- Les taux de désabonnement et de remboursement
- Les produits d'abonnement et la durée de leurs périodes (quotidienne, mensuelle, annuelle, etc.)
- D'autres données liées aux transactions
Le modèle tient également compte des périodes d'essai dans les paywalls, en utilisant les taux de conversion historiques pour prédire les revenus comme si les utilisateurs étaient déjà convertis. Cela garantit une comparaison équitable entre les paywalls avec et sans offres d'essai, car nous prenons également en compte les essais actifs susceptibles de générer des revenus à l'avenir.
### En quoi le P2BB prédit diffère-t-il du P2BB classique ? \{#how-is-predicted-p2bb-different-from-just-the-p2bb\}
Nos tests A/B utilisent l'approche bayésienne : nous modélisons essentiellement la distribution des revenus par utilisateur (ou plus précisément « Revenus pour 1 000 utilisateurs »), puis nous calculons la probabilité qu'une distribution soit « vraiment » meilleure que l'autre et non par hasard — c'est ce que nous appelons la Probabilité d'être le meilleur ou P2BB (vous pouvez en savoir plus sur notre approche [ici](maths-behind-it)).
Il est important de noter que ce faisant, nous nous appuyons uniquement sur les revenus accumulés pendant la durée d'exécution du test. Ainsi, si vous deviez exécuter un test comparant un abonnement annuel à un abonnement hebdomadaire, vous devriez attendre très longtemps pour vraiment comprendre lequel est le plus performant. Une situation similaire se produit lorsque vous comparez des abonnements avec essai à des abonnements sans essai dans un test A/B — car les essais actifs susceptibles de faire pencher la balance vers un gagnant ne sont jamais pris en compte dans les revenus.
C'est là qu'intervient notre modèle prédictif. En s'appuyant sur la distribution actuelle des revenus dans un test A/B et entraîné sur un large jeu de données, il est capable de prédire la version future de la distribution des revenus (c'est-à-dire après 1 an). Ensuite, il produit un P2BB prédit — celui auquel vous aboutiriez si vous exécutiez le test pendant toute une année.
Notez que le P2BB prédit peut parfois contredire le P2BB actuel. Dans ce cas, nous mettons en évidence les lignes de variation en jaune, comme ceci :
Nous considérons cela comme un signal indiquant que vous devriez accumuler davantage de données pour confirmer le gagnant ou approfondir l'analyse du test A/B pour en comprendre la raison. En général, nous recommandons de faire confiance au P2BB prédit plutôt qu'au P2BB actuel, car il prend simplement en compte davantage de données, mais la décision finale vous appartient bien sûr.
### Précision et certitude du modèle \{#model-accuracy-and-certainty\}
Le modèle atteint un niveau de précision élevé, avec une erreur absolue moyenne en pourcentage (MAPE) légèrement inférieure à 10 %. Ce niveau de précision permet aux entreprises de se fier en toute confiance aux prédictions du modèle pour prendre des décisions basées sur les données.
Pour garantir davantage de stabilité, le modèle utilise un critère de « certitude » basé sur trois facteurs :
- Un intervalle de prédiction étroit — le modèle est confiant dans son résultat
- Un nombre suffisant d'abonnements et de revenus dans le test
- Au moins 2 semaines se sont écoulées depuis le début du test
Une prédiction est considérée comme fiable lorsqu'au moins deux de ces trois critères sont remplis.
Lorsqu'un nouveau test A/B commence, le modèle fournit une prédiction de revenus par 1 000 utilisateurs sur un an (notre principale métrique de test A/B) pour chaque paywall. Les prédictions ne sont affichées que lorsqu'elles satisfont aux critères de certitude. Si les données sont insuffisantes, le modèle indiquera « données insuffisantes pour la prédiction ».
### Limites et considérations \{#limitations-and-considerations\}
Bien que notre modèle prédictif soit un outil puissant, il est important d'en tenir compte ses limites.
Les performances du modèle dépendent de la qualité et de la représentativité des données disponibles. Un comportement de cohorte inhabituel ou de nouvelles applications non incluses dans l'ensemble d'entraînement peuvent affecter la précision des prédictions.
Néanmoins, les prédictions sont mises à jour quotidiennement pour refléter les dernières données et comportements des utilisateurs. Cela garantit que les informations que vous recevez sont toujours basées sur les données les plus récentes.
🚧 Remarque : Cet outil est un complément, et non un substitut, à votre expertise et à votre compréhension des dynamiques propres à votre application. Utilisez ces prédictions comme guide, en les combinant avec d'autres métriques et vos connaissances du marché, pour prendre des décisions éclairées.
---
# File: adapty-ads-manager
---
---
title: "Adapty Ads Manager"
description: "Obtenez des analyses en temps réel depuis Apple Ads et gérez et optimisez vos campagnes"
---
**Adapty Ads Manager** est une plateforme tout-en-un conçue pour vous aider à gérer, optimiser et faire évoluer vos campagnes Apple Ads plus efficacement. Elle connecte les performances de vos Apple Search Ads aux métriques de revenus clés — installations, essais, abonnements et valeur à vie — sans nécessiter de MMP.
Grâce à des analyses en temps réel, des prévisions pilotées par l'IA et une automatisation intelligente, Adapty Ads Manager élimine les ajustements manuels d'enchères fastidieux, les tableurs et les approximations, et les remplace par des insights clairs et des outils qui vous permettent d'agir plus vite.
Avec Adapty Ads Manager, vous bénéficiez de :
- **[Vue d'ensemble](ads-manager-overview)** : Toutes les métriques clés en un coup d'œil — dépenses, revenus, ROAS, CPA et plus encore — chacune avec un graphique de tendance quotidien
- **[Agent IA](ads-manager-ai-agent)** : Posez des questions en langage naturel et obtenez des réponses et recommandations sur l'ensemble du funnel
- **Données de performance en temps réel** : Pour les campagnes, groupes d'annonces et mots-clés
- **Suivi des revenus de bout en bout** : De la recherche → installation → essai → abonnement → LTV
- **Prédictions et recommandations IA** : Pour une mise à l'échelle rentable
- **Gestion en masse** : Des enchères, budgets, statuts et structures
- **[Automatisations basées sur des règles](ads-manager-automations)** : Gérez le cycle de vie complet des mots-clés
- **[Market Intelligence](ads-manager-market-intelligence)** : Stratégies de mots-clés concurrentiels dans plus de 50 pays
- **[Tests A/B CPP](ads-manager-cpp-ab-tests)** : Comparez les pages produit personnalisées en face à face et trouvez la meilleure
3. Dans l'éditeur de politique, collez le JSON suivant et remplacez `adapty-s3-integration-test` par le nom de votre bucket :
```json showLineNumbers title="Json"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListObjectsInBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
},
{
"Sid": "AllowAllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": [
"arn:aws:s3:::adapty-s3-integration-test/*",
"arn:aws:s3:::adapty-s3-integration-test"
]
},
{
"Sid": "AllowBucketLocation",
"Effect": "Allow",
"Action": "s3:GetBucketLocation",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
}
]
}
```
4. Une fois la politique configurée, vous pouvez ajouter des tags (facultatif), puis cliquer sur **Next** pour passer à l'étape finale
5. Dans cette étape, donnez un nom à votre politique et cliquez sur le bouton **Create policy** pour finaliser la création
#### 1.2. Créer un utilisateur IAM \{#12-create-iam-user\}
Pour permettre à Adapty Attribution de charger des rapports de données brutes dans votre bucket, vous devez lui fournir l'Access Key ID et la Secret Access Key d'un utilisateur disposant d'un accès en écriture sur le bucket concerné.
1. Accédez à la console IAM et sélectionnez la [section Utilisateurs](https://console.aws.amazon.com/iamv2/home#/users)
2. Cliquez sur le bouton **Add users**
3. Donnez un nom à l'utilisateur, choisissez **Access key – Programmatic access**, puis passez aux permissions
4. Pour l'étape suivante, sélectionnez l'option **Add user to group**, puis cliquez sur le bouton **Create group**
5. Ensuite, donnez un nom à votre groupe d'utilisateurs et sélectionnez la politique que vous avez créée précédemment
6. Une fois la politique sélectionnée, cliquez sur le bouton **Create group** pour finaliser le processus
7. Après avoir créé le groupe, **sélectionnez-le** et passez à l'étape suivante
8. C'est la dernière étape de cette section ; cliquez simplement sur le bouton **Create User**
9. Enfin, vous pouvez soit **télécharger les identifiants au format .csv**, soit les copier-coller directement depuis le tableau de bord
### Étape 2. Configurer l'intégration dans Adapty Attribution \{#step-2-configure-integration-in-adapty-attribution\}
1. Accédez à [**Integrations** -> **Amazon S3**](https://app.adapty.io/ua/integrations/s3)
2. Activez le bouton **Export install events to Amazon S3**.
3. Remplissez les champs suivants pour établir la connexion entre Amazon S3 et les profils Adapty Attribution :
| Champ | Description |
|:-----------------------------| :----------------------------------------------------------- |
| **Access Key ID** | Identifiant unique utilisé pour authentifier l'accès d'un utilisateur ou d'une application à un service AWS. Retrouvez cet identifiant dans le [fichier csv](ua-amazon-s3#step-1-create-amazon-s3-credentials) téléchargé. |
| **Secret Access Key** | Clé privée utilisée conjointement avec l'Access Key ID pour authentifier l'accès d'un utilisateur ou d'une application à un service AWS. Retrouvez cette clé dans le [fichier csv](ua-amazon-s3#step-1-create-amazon-s3-credentials) téléchargé. |
| **S3 Bucket Name** | Nom unique au monde identifiant un bucket S3 spécifique dans le cloud AWS. Les buckets S3 sont un service de stockage simple permettant de stocker et de récupérer des objets de données, comme des fichiers et des images, dans le cloud. |
| **Folder Inside the Bucker** | Nom du dossier que vous souhaitez créer dans le bucket S3 sélectionné. Notez que S3 simule les dossiers à l'aide de préfixes de clés d'objet, qui correspondent essentiellement à des noms de dossiers. |
| **Region** (Optionnel) | Retrouvez votre région dans AWS Management Console sous votre compte utilisateur IAM. |
## Export manuel des données \{#manual-data-export\}
En plus de l'export automatique des données d'événements vers Amazon S3, Adapty Attribution propose également une fonctionnalité d'export manuel de fichiers. Cette fonctionnalité vous permet de sélectionner une date précise pour les données d'acquisition utilisateur et de les exporter manuellement dans votre bucket S3, pour un contrôle total sur les données exportées et le moment de leur export.
## Structure de la table \{#table-structure\}
Dans l'intégration AWS S3, Adapty Attribution fournit une table pour stocker l'historique des événements d'installation. Cette table contient des informations sur le profil utilisateur, les revenus et les produits, le store d'origine, entre autres points de données.
:::warning
Notez que cette structure peut évoluer avec le temps — de nouvelles données peuvent être introduites par nos soins ou par les tiers avec lesquels nous travaillons. Assurez-vous que le code qui traite ces données est suffisamment robuste et s'appuie sur des champs spécifiques, et non sur la structure dans son ensemble.
:::
Voici la structure de la table pour les événements :
| Colonne | Description |
|--------------------------|-------------------------------------------|
| `adapty_profile_id` | Identifiant unique du profil Adapty |
| `install_id` | Identifiant unique de l'installation |
| `created_at` | Horodatage de création de l'enregistrement (ISO 8601) |
| `installed_at` | Horodatage d'installation de l'application (ISO 8601) |
| `store` | Store (`ios`, `android`) |
| `country` | Code pays de l'utilisateur (ISO 3166-1 alpha-2) |
| `ip_address` | Adresse IP du client |
| `idfa` | Identifiant iOS pour les annonceurs |
| `idfv` | Identifiant iOS pour les vendeurs |
| `gaid` | Identifiant publicitaire Google (Android) |
| `android_id` | Identifiant de l'appareil Android |
| `app_set_id` | Android App Set ID |
| `channel` | Canal d'attribution |
| `campaign_id` | Identifiant de la campagne |
| `campaign_name` | Nom de la campagne |
| `adset_id` | Identifiant du groupe d'annonces |
| `adset_name` | Nom du groupe d'annonces |
| `ad_id` | Identifiant de l'annonce |
| `ad_name` | Nom de l'annonce |
| `keyword_id` | Identifiant du mot-clé |
| `keyword_name` | Nom du mot-clé |
| `asa_org_id` | Identifiant d'organisation Apple Search Ads |
| `asa_keyword_match_type` | Type de correspondance du mot-clé ASA (`Exact`, `Broad`) |
| `asa_attribution` | Données d'attribution ASA (chaîne JSON) |
| `asa_conversion_type` | Type de conversion ASA |
| `asa_country_or_region` | Pays ou région ASA |
| `asa_creative_set_name` | Nom du jeu de créatifs ASA |
| `fbclid` | Facebook Click ID |
| `ttclid` | TikTok Click ID |
| `utm_source` | Paramètre source UTM |
| `utm_medium` | Paramètre medium UTM |
| `utm_campaign` | Paramètre campagne UTM |
| `utm_term` | Paramètre terme UTM |
| `utm_content` | Paramètre contenu UTM |
---
# File: ua-google-cloud-storage
---
---
title: "Google Cloud Storage dans Adapty Attribution"
description: "Intégrez Google Cloud Storage avec Adapty Attribution pour stocker en toute sécurité les données d'acquisition utilisateur."
---
L'intégration d'Adapty Attribution avec Google Cloud Storage vous permet de stocker en toute sécurité les données de vos campagnes d'acquisition utilisateur en un seul endroit centralisé. Vous pourrez enregistrer vos données de performance de campagne, vos données d'attribution et vos événements d'acquisition utilisateur dans votre bucket Google Cloud Storage sous forme de fichiers .csv.
Pour configurer cette intégration, vous devrez suivre quelques étapes simples dans la Google Cloud Console et dans le tableau de bord Adapty Attribution.
:::note
Planification
Adapty Attribution envoie vos données vers Google Cloud Storage toutes les 24h à 4h00 UTC.
Chaque fichier contiendra les données des événements créés pour l'ensemble de la veille en UTC. Par exemple, les données exportées automatiquement à 4h00 UTC le 8 mars contiendront tous les événements créés le 7 mars de 00:00:00 à 23:59:59 UTC.
:::
## Comment configurer l'intégration Google Cloud Storage \{#how-to-set-up-google-cloud-storage-integration\}
### Étape 1. Créer les identifiants Google Cloud Storage \{#step-1-create-google-cloud-storage-credentials\}
Ce guide vous aidera à créer les identifiants nécessaires dans votre Google Cloud Platform Console.
Pour qu'Adapty Attribution puisse envoyer des rapports de données brutes dans votre bucket désigné, la clé du compte de service est requise, ainsi qu'un accès en écriture au bucket correspondant. En fournissant la clé du compte de service et en accordant l'accès en écriture au bucket, vous permettez à Adapty Attribution de transférer en toute sécurité les rapports de données brutes vers votre environnement de stockage.
:::warning
Veuillez noter que nous prenons uniquement en charge l'autorisation par clé HMAC de compte de service. Il est donc indispensable que votre clé HMAC de compte de service dispose des rôles « Storage Object Viewer », « Storage Legacy Bucket Writer » et « Storage Object Creator » pour activer l'accès approprié à Google Cloud Storage.
:::
#### 2.1. Créer un compte de service \{#21-create-service-account\}
1. Accédez à la section [IAM](https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts) de votre compte Google Cloud et choisissez le projet concerné ou créez-en un nouveau
2. Ensuite, créez un nouveau compte de service pour Adapty Attribution en cliquant sur le bouton « + CREATE SERVICE ACCOUNT »
3. Remplissez les champs de la première étape ; l'accès sera accordé ultérieurement. Pour plus de détails sur cette page, consultez la documentation [ici](https://docs.cloud.google.com/iam/docs/service-accounts-create)
4. Pour créer et télécharger une [clé JSON privée](https://docs.cloud.google.com/iam/docs/keys-create-delete), accédez à la section KEYS et cliquez sur le bouton « ADD KEY »
5. Dans la section DETAILS, repérez la valeur Email associée au compte de service récemment créé et copiez-la. Ces informations seront nécessaires pour les étapes suivantes afin d'autoriser le compte et lui permettre d'écrire dans le bucket
#### 2.2. Configurer les permissions du bucket \{#22-configure-bucket-permissions\}
6. Accédez à la page [Buckets](https://console.cloud.google.com/storage/browser) de Google Cloud Storage et sélectionnez un bucket existant ou créez-en un nouveau pour stocker les rapports de données d'acquisition utilisateur d'Adapty Attribution
7. Accédez à la section PERMISSIONS et sélectionnez l'option [GRANT ACCESS](https://docs.cloud.google.com/identity/docs/how-to?hl=en)
8. Dans la section PERMISSIONS, saisissez l'Email du compte de service obtenu à la cinquième étape, puis choisissez le rôle Storage Object Creator
9. Enfin, cliquez sur SAVE pour appliquer les modifications
10. Notez le nom du bucket pour référence ultérieure
11. Une fois ces étapes terminées, vous avez effectué avec succès la configuration nécessaire dans la Google Cloud Console ! La dernière étape consiste à saisir le nom du bucket et à télécharger le fichier JSON à utiliser dans Adapty Attribution
### Étape 2. Configurer l'intégration dans Adapty Attribution \{#step-2-configure-integration-in-adapty-attribution\}
1. Accédez à [**Integrations** -> **Google Cloud Storage**](https://app.adapty.io/ua/integrations/google-cloud-storage)
2. Activez le bouton **Export install events to Google Cloud Storage**
3. Remplissez les champs requis pour établir la connexion entre Google Cloud Storage et Adapty Attribution :
| Champ | Description |
|:------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Google Cloud service account key file** | Le [fichier de clé JSON](ua-google-cloud-storage#step-1-create-google-cloud-storage-credentials) privé téléchargé. |
| **Google Cloud bucket name** | Le nom du bucket dans Google Cloud Storage où vous souhaitez stocker vos données. Il doit être unique dans l'environnement Google Cloud Storage et ne doit pas contenir d'espaces. |
| **Folder inside the bucket** | Le nom du dossier à l'intérieur du bucket où vous souhaitez stocker vos données. Il doit être unique au sein du bucket et peut servir à organiser vos données. Ce champ est facultatif. |
## Export manuel des données \{#manual-data-export\}
En plus de l'export automatique des données d'événements vers Google Cloud Storage, Adapty Attribution propose également une fonctionnalité d'export manuel de fichiers. Grâce à cette fonction, vous pouvez sélectionner une date précise pour les données d'acquisition utilisateur et les exporter manuellement dans votre bucket GCS. Cela vous donne un contrôle accru sur les données que vous exportez et sur le moment où vous les exportez.
## Structure de la table \{#table-structure\}
Dans l'intégration Google Cloud Storage, Adapty Attribution fournit une table pour stocker les données historiques des événements d'installation. La table contient des informations sur le profil utilisateur, les revenus et les gains, ainsi que sur le store d'origine, entre autres données.
:::warning
Notez que cette structure peut évoluer au fil du temps — de nouvelles données pouvant être introduites par nous-mêmes ou par les tiers avec lesquels nous travaillons. Assurez-vous que votre code qui la traite est suffisamment robuste et s'appuie sur des champs spécifiques, et non sur la structure dans son ensemble.
:::
Voici la structure de la table pour les événements :
| Colonne | Description |
|--------------------------|-------------------------------------------|
| `adapty_profile_id` | Identifiant unique du profil Adapty |
| `install_id` | Identifiant unique d'installation |
| `created_at` | Horodatage de création de l'enregistrement (ISO 8601) |
| `installed_at` | Horodatage d'installation de l'application (ISO 8601) |
| `store` | Store d'application (`ios`, `android`) |
| `country` | Code pays de l'utilisateur (ISO 3166-1 alpha-2) |
| `ip_address` | Adresse IP du client |
| `idfa` | Identifiant iOS pour les annonceurs |
| `idfv` | Identifiant iOS pour les vendeurs |
| `gaid` | Google Advertising ID (Android) |
| `android_id` | Identifiant d'appareil Android |
| `app_set_id` | Android App Set ID |
| `channel` | Canal d'attribution |
| `campaign_id` | Identifiant de campagne |
| `campaign_name` | Nom de la campagne |
| `adset_id` | Identifiant du groupe d'annonces |
| `adset_name` | Nom du groupe d'annonces |
| `ad_id` | Identifiant de l'annonce |
| `ad_name` | Nom de l'annonce |
| `keyword_id` | Identifiant du mot-clé |
| `keyword_name` | Nom du mot-clé |
| `asa_org_id` | Identifiant d'organisation Apple Search Ads |
| `asa_keyword_match_type` | Type de correspondance de mot-clé ASA (`Exact`, `Broad`) |
| `asa_attribution` | Données d'attribution ASA (chaîne JSON) |
| `asa_conversion_type` | Type de conversion ASA |
| `asa_country_or_region` | Pays ou région ASA |
| `asa_creative_set_name` | Nom du jeu créatif ASA |
| `fbclid` | Facebook Click ID |
| `ttclid` | TikTok Click ID |
| `utm_source` | Paramètre UTM source |
| `utm_medium` | Paramètre UTM medium |
| `utm_campaign` | Paramètre UTM campaign |
| `utm_term` | Paramètre UTM term |
| `utm_content` | Paramètre UTM content |
---
# File: adapty-mail
---
---
title: "Adapty Mail"
description: "Campagnes e-mail générées par IA qui convertissent les utilisateurs en essai en abonnés payants."
---
Les intégrations proposent les options de configuration suivantes, qui s'appliquent à tous les événements envoyés via cette intégration :
| Paramètre | Description |
|:---------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Reporting Proceeds** | Choisissez comment les valeurs de revenus sont présentées : nettes des commissions de l'App Store et du Play Store, ou brutes (avant déduction). Cochez la case « Send sales as proceeds » pour afficher les ventes en tant que revenus nets après déduction des commissions de l'App Store / Play Store. |
| **Send Trial Price** | Si cette case est cochée, Adapty transmettra le prix de l'abonnement pour l'événement Trial Started. |
| **Exclude Historical Events** | Permet d'exclure les événements survenus avant que l'utilisateur ait installé l'application avec le SDK Adapty. Cela évite les doublons et garantit des rapports précis. Par exemple, si un utilisateur a activé un abonnement mensuel le 10 janvier et mis à jour l'application avec le SDK Adapty le 6 mars, Adapty ignorera les événements antérieurs au 6 mars et conservera les événements suivants. |
| **Report User's Currency** | Choisissez si les ventes sont rapportées dans la devise de l'utilisateur ou en USD. |
| **Send User Attributes** | Si vous souhaitez envoyer des attributs spécifiques à l'utilisateur, comme les préférences de langue, et que votre forfait OneSignal prend en charge plus de 10 tags, sélectionnez cette option. L'activer permet d'inclure des informations supplémentaires au-delà des 10 tags par défaut. Notez que dépasser les limites de tags peut entraîner des erreurs. |
| **Send Attributions** | Activez cette option pour transmettre les informations d'attribution (par ex. l'attribution AppsFlyer) et recevoir les détails correspondants. |
| **Send Play Store purchase token** | Activez cette option pour recevoir le token Play Store nécessaire à la revalidation de l'achat si besoin. Cela ajoutera le paramètre `play_store_purchase_token` à l'événement. |
| **Delay events with future datetime** | **Pour AppsFlyer et les webhooks personnalisés uniquement** : lorsque cette option est activée, les événements de renouvellement et de conversion d'essai sont envoyés à la date à laquelle ils se produisent réellement. Lorsqu'elle est désactivée (par défaut), ces événements sont envoyés immédiatement lors de leur détection, même si la date est dans le futur. |
| **Data residency** | **Pour Mixpanel et Amplitude uniquement** : sélectionnez la résidence des données pour déterminer où vos événements sont traités et stockés. |
## Configurer les événements \{#configure-the-events\}
Sous les identifiants, trois groupes d'événements peuvent être envoyés à la plateforme d'intégration sélectionnée depuis Adapty. Activez ceux dont vous avez besoin.
Il est important de noter que la personnalisation des noms d'événements est disponible pour certaines intégrations, tandis que pour d'autres, les noms d'événements sont fixes et ne peuvent pas être modifiés. De plus, avec certaines intégrations comme [Airbridge](airbridge#configure-events-and-tags) par exemple, vous avez la possibilité d'associer plusieurs noms d'événements à un seul événement Adapty. Consultez la liste complète des événements proposés par Adapty [ici](events).
Bien que nous recommandions d'utiliser les noms d'événements par défaut d'Adapty, vous êtes libre d'adapter les noms d'événements selon vos besoins spécifiques.
---
# File: events
---
---
title: "Événements à envoyer aux intégrations tierces"
description: "Suivez les principaux événements d'abonnement grâce aux outils d'analyse d'Adapty."
---
Apple et Google envoient les événements d'abonnement directement aux serveurs via les [Notifications du serveur App Store](enable-app-store-server-notifications) et les [Notifications en temps réel pour les développeurs (RTDN)](enable-real-time-developer-notifications-rtdn). En conséquence, les applications mobiles ne peuvent pas envoyer de manière fiable des événements aux systèmes d'analyse en temps réel. Par exemple, si un utilisateur souscrit un abonnement sans jamais rouvrir l'application, le développeur ne recevra aucune mise à jour du statut d'abonnement sans serveur.
Adapty comble cette lacune en collectant les données d'abonnement et en les convertissant en événements lisibles. Ces événements d'intégration sont envoyés au format JSON. Bien que tous les événements partagent la même structure, leurs champs varient selon le type d'événement, le store et la configuration spécifique. Les champs exacts inclus dans chaque événement sont détaillés sur les pages d'intégration correspondantes.
Pour savoir comment déterminer si un événement a bien été traité ou si un problème est survenu, consultez la page [Statuts des événements](event-statuses).
## Types d'événements \{#event-types\}
La plupart des événements sont créés et envoyés à toutes les intégrations configurées si elles sont activées. Cependant, l'événement **Access level updated** ne se déclenche que si l'[intégration webhook](webhook) est configurée et que cet événement est activé. Cet événement apparaîtra dans le [Event Feed](https://app.adapty.io/event-feed) et sera également envoyé au webhook, mais ne sera pas partagé avec les autres intégrations.
Si aucune intégration webhook n'est configurée ou si ce type d'événement n'est pas activé, l'événement **Access level updated** ne sera pas créé et n'apparaîtra pas dans le [Event Feed](https://app.adapty.io/event-feed).
| Nom de l'événement | Description |
|:-----------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| subscription_started | Déclenché lorsqu'un utilisateur active un abonnement payant sans période d'essai, c'est-à-dire qu'il est facturé immédiatement. |
| subscription_renewed | Se produit lors du renouvellement d'un abonnement et de la facturation de l'utilisateur. Cet événement débute à partir de la deuxième facturation, que l'abonnement soit avec ou sans essai. |
| subscription_renewal_cancelled | Un utilisateur a désactivé le renouvellement automatique de son abonnement. Il conserve l'accès aux fonctionnalités premium jusqu'à la fin de la période d'abonnement payante. |
| subscription_renewal_reactivated | Déclenché lorsqu'un utilisateur réactive le renouvellement automatique de son abonnement. |
| subscription_expired | Déclenché lorsqu'un abonnement prend fin après une annulation. Par exemple, si un utilisateur annule son abonnement le 12 décembre mais qu'il reste actif jusqu'au 31 décembre, l'événement est enregistré le 31 décembre à l'expiration de l'abonnement. |
| subscription_paused | Se produit lorsqu'un utilisateur active la [mise en pause de l'abonnement](https://developer.android.com/google/play/billing/lifecycle/subscriptions#pause) (Android uniquement). |
| subscription_deferred | Déclenché lorsqu'un achat d'abonnement est [différé](https://adapty.io/glossary/subscription-purchase-deferral/), permettant aux utilisateurs de reporter le paiement tout en conservant l'accès aux fonctionnalités premium. Cette fonctionnalité est disponible via l'API Google Play Developer et peut être utilisée pour des essais gratuits ou pour les utilisateurs rencontrant des difficultés financières. |
| non_subscription_purchase | Tout achat sans abonnement, tel qu'un accès à vie ou des produits consommables comme des pièces dans un jeu. |
| trial_started | Déclenché lorsqu'un utilisateur active un abonnement d'essai. |
| trial_converted | Se produit lorsqu'un essai se termine et que l'utilisateur est facturé (premier achat). Par exemple, si un utilisateur a un essai jusqu'au 14 janvier mais est facturé le 7 janvier, cet événement est enregistré le 7 janvier. |
| trial_renewal_cancelled | Un utilisateur a désactivé le renouvellement automatique de son abonnement pendant la période d'essai. Il conserve l'accès aux fonctionnalités premium jusqu'à la fin de l'essai, mais ne sera pas facturé et ne démarrera pas d'abonnement. |
| trial_renewal_reactivated | Se produit lorsqu'un utilisateur réactive le renouvellement automatique de son abonnement pendant la période d'essai. |
| trial_expired | Déclenché lorsqu'un essai se termine sans conversion en abonnement. |
| entered_grace_period | Se produit lorsqu'une tentative de paiement échoue et que l'utilisateur entre dans un délai de grâce (si activé). L'utilisateur conserve l'accès premium pendant cette période. |
| billing_issue_detected | Déclenché lorsqu'un problème de facturation survient lors d'une tentative de débit (par exemple, solde de carte insuffisant). |
| subscription_refunded | Déclenché lorsqu'un abonnement est remboursé (par exemple, par le support Apple). |
| non_subscription_purchase_refunded | Déclenché lorsqu'un achat sans abonnement est remboursé. |
| access_level_updated | Se produit lorsque le niveau d'accès d'un utilisateur est mis à jour. |
Les événements ci-dessus couvrent entièrement l'état des utilisateurs en matière d'achats. Voici quelques exemples.
### Exemple 1 \{#example-1\}
_L'utilisateur a activé un abonnement mensuel le 1er avril avec une période d'essai de 7 jours. Le 4e jour, il s'est désabonné._
Dans ce cas, les événements suivants seront envoyés :
1. `trial_started` le 1er avril
2. `trial_renewal_cancelled` le 4 avril
3. `trial_expired` le 7 avril
### Exemple 2 \{#example-2\}
_L'utilisateur a activé un abonnement mensuel le 1er avril avec une période d'essai de 7 jours. Le 10e jour, il s'est désabonné._
Dans ce cas, les événements suivants seront envoyés :
1. `trial_started` le 1er avril
2. `trial_converted` le 7 avril
3. `subscription_renewal_cancelled` le 10 avril
4. `subscription_expired` le 1er mai
Pour une description détaillée des événements déclenchés dans chaque scénario, consultez les [Flux d'événements](event-flows).
---
# File: event-flows
---
---
title: "Flux d'événements"
description: "Découvrez les schémas détaillés des flux d'événements d'abonnement dans Adapty. Apprenez comment les événements d'abonnement sont générés et envoyés aux intégrations, pour suivre les moments clés du parcours de vos clients."
---
Dans Adapty, vous recevrez divers événements d'abonnement tout au long du parcours d'un client dans votre application. Ces flux d'abonnement décrivent les scénarios les plus courants pour vous aider à comprendre les événements qu'Adapty génère lorsque les utilisateurs s'abonnent, annulent ou réactivent des abonnements.
Gardez à l'esprit qu'Apple traite les paiements d'abonnement plusieurs heures avant la date de début ou de renouvellement effective. Dans les flux ci-dessous, nous représentons le début/renouvellement de l'abonnement et le débit comme ayant lieu simultanément pour simplifier les diagrammes.
De plus, les événements liés à la même action se produisent simultanément et peuvent apparaître dans votre **Event Feed** dans n'importe quel ordre, qui peut différer de la séquence présentée dans nos diagrammes.
## Cycle de vie d'un abonnement \{#subscription-lifecycle\}
### Flux d'achat initial \{#initial-purchase-flow\}
Ce flux se produit lorsqu'un client souscrit un abonnement pour la première fois sans essai. Dans ce cas, les événements suivants sont créés :
- **Subscription started**
- **Access level updated** pour accorder l'accès à l'utilisateur
Lorsque la date de renouvellement de l'abonnement arrive, l'abonnement est renouvelé. Les événements suivants sont alors créés :
- **Subscription renewal** pour démarrer une nouvelle période d'abonnement
- **Access level updated** pour mettre à jour la date d'expiration de l'abonnement, prolongeant l'accès d'une période supplémentaire
Les situations où le paiement échoue ou lorsque l'utilisateur annule le renouvellement sont décrites respectivement dans [Flux de résultat d'un problème de facturation](event-flows#billing-issue-outcome-flow) et [Flux d'annulation d'abonnement](event-flows#subscription-cancellation-flow).
### Flux d'annulation d'abonnement \{#subscription-cancellation-flow\}
Lorsqu'un utilisateur annule son abonnement, les événements suivants sont créés :
- **Subscription renewal canceled** pour indiquer que l'abonnement reste actif jusqu'à la fin de la période en cours, après quoi l'utilisateur perdra l'accès
- L'événement **Access level updated** est créé pour désactiver le renouvellement automatique de l'accès
Une fois l'abonnement terminé, l'événement **Subscription expired (churned)** est déclenché pour marquer la fin de l'abonnement.
Si un remboursement est approuvé, l'événement suivant remplace **Subscription expired (churned)** :
- **Subscription refunded** pour mettre fin à l'abonnement et fournir les détails du remboursement
Pour Stripe, un abonnement peut être annulé immédiatement, sans attendre la fin de la période restante. Dans ce cas, tous les événements sont créés simultanément :
- **Subscription renewal cancelled**
- **Subscription expired (churned)**
- **Access Level updated** pour supprimer l'accès de l'utilisateur
Si un remboursement est approuvé, un événement **Subscription refunded** est également déclenché au moment de son approbation.
### Flux de réactivation d'abonnement \{#subscription-reactivation-flow\}
Si un utilisateur annule un abonnement, celui-ci expire, puis l'utilisateur rachète le même abonnement plus tard, un événement **Subscription renewed** sera créé. Même s'il y a une interruption d'accès, Adapty traite cela comme une seule chaîne de transactions, liée par le `vendor_original_transaction_id`. Ainsi, le rachat est considéré comme un renouvellement.
Les événements **Access level updated** seront créés deux fois :
- à la fin de l'abonnement pour révoquer l'accès de l'utilisateur
- lors du rachat de l'abonnement pour accorder l'accès
### Flux de mise en pause d'abonnement (Android uniquement) \{#subscription-pause-flow-android-only\}
Ce flux s'applique lorsqu'un utilisateur met en pause puis reprend un abonnement sur Android.
La mise en pause d'un abonnement a des effets différés. Si un utilisateur met en pause un abonnement avant sa date de renouvellement, l'abonnement reste actif et l'utilisateur conserve l'accès payant pour le reste de la période de facturation.
1. Lorsque l'utilisateur met en pause un abonnement, l'événement **Subscription paused (Android only)** est déclenché.
2. À la fin de la période d'abonnement, Adapty déclenche l'événement **Access level updated** pour révoquer l'accès de l'utilisateur.
3. Lorsque l'utilisateur reprend l'abonnement, les événements suivants sont déclenchés :
- **Subscription renewed**
- **Access level updated** pour rétablir l'accès de l'utilisateur
Ces abonnements appartiendront à la même chaîne de transactions, liée par le même **vendor_original_transaction_id**.
## Flux d'essai \{#trial-flows\}
Si vous utilisez des essais dans votre application, vous recevrez des événements supplémentaires liés aux essais.
### Flux d'essai avec conversion réussie \{#trial-with-successful-conversion-flow\}
Le flux le plus courant se produit lorsqu'un utilisateur démarre un essai, fournit une carte bancaire et convertit avec succès vers un abonnement standard à la fin de la période d'essai. Dans ce cas, les événements suivants sont créés au moment du démarrage de l'essai :
- **Trial started** pour marquer le début de l'essai
- **Access level updated** pour accorder l'accès
L'événement **Trial converted** est créé lorsque l'abonnement standard démarre.
### Flux d'essai sans conversion réussie \{#trial-without-successful-conversion-flow\}
Si un utilisateur annule l'essai avant qu'il ne se convertisse en abonnement, les événements suivants sont créés au moment de l'annulation :
- **Trial renewal cancelled** pour désactiver la conversion automatique de l'essai en abonnement
- **Access level updated** pour désactiver le renouvellement de l'accès
L'utilisateur conservera l'accès jusqu'à la fin de l'essai, moment auquel l'événement **Trial expired** est créé pour marquer la fin de l'essai.
### Flux de réactivation d'abonnement après expiration d'essai \{#subscription-reactivation-after-expired-trial-flow\}
Si un essai expire (en raison d'un problème de facturation ou d'une annulation) et que l'utilisateur souscrit ensuite un abonnement, les événements suivants sont créés :
- **Access level updated** pour accorder l'accès à l'utilisateur
- **Trial converted**
Même avec un écart entre l'essai et l'abonnement, Adapty les relie via le `vendor_original_transaction_id`. Cette conversion est traitée comme faisant partie d'une chaîne de transactions continue, démarrant par un essai à prix zéro. C'est pourquoi l'événement **Trial converted** est créé plutôt que **Subscription started**.
## Changements de produit \{#product-changes\}
Cette section couvre les ajustements apportés aux abonnements actifs, comme les mises à niveau, les rétrogradations ou les achats d'un produit d'un autre groupe.
### Flux de changement de produit immédiat \{#immediate-product-change-flow\}
Après qu'un utilisateur change de produit, le changement peut être appliqué immédiatement dans le système avant la fin de l'abonnement (principalement en cas de mise à niveau ou de remplacement d'un produit). Dans ce cas, au moment du changement de produit :
- Le niveau d'accès est modifié, et deux événements **Access level updated** sont créés :
1. pour supprimer l'accès au premier produit.
2. pour accorder l'accès au second produit.
- L'ancien abonnement prend fin et un remboursement est effectué (l'événement **Subscription refunded** est créé avec `cancellation_reason` = `upgraded`). Notez qu'aucun événement **Subscription expired (churned)** n'est créé ; l'événement **Subscription refunded** le remplace.
- Le nouvel abonnement démarre (l'événement **Subscription started** est créé pour le nouveau produit).
Si un utilisateur rétrograde son abonnement, le premier abonnement durera jusqu'à la fin de la période payée, puis sera remplacé par un nouvel abonnement de niveau inférieur. Dans ce cas, seul l'événement **Access level updated** pour désactiver le renouvellement automatique de l'accès sera créé immédiatement. Tous les autres événements seront créés au moment du remplacement effectif de l'abonnement :
- Un autre événement **Access level updated** est créé pour accorder l'accès au second produit.
- L'événement **Subscription expired (churned)** est créé pour mettre fin à l'abonnement au premier produit.
- L'événement **Subscription started** est créé pour démarrer un nouvel abonnement pour le nouveau produit.
### Flux de changement de produit différé \{#delayed-product-change-flow\}
Il existe également un cas où un utilisateur change de produit au moment du renouvellement de l'abonnement. Ce cas est très similaire au précédent : un événement **Access level updated** sera créé immédiatement pour désactiver le renouvellement automatique de l'accès à l'ancien produit. Tous les autres événements seront créés au moment où l'utilisateur change d'abonnement et que le changement est appliqué dans le système :
- Un autre événement **Access level updated** est créé pour accorder l'accès au second produit.
- L'événement **Subscription expired (churned)** est créé pour mettre fin à l'abonnement au premier produit.
- L'événement **Subscription started** est créé pour démarrer un nouvel abonnement pour le nouveau produit.
## Flux de résultat d'un problème de facturation \{#billing-issue-outcome-flow\}
Si les tentatives de conversion d'un essai ou de renouvellement d'un abonnement échouent en raison d'un problème de facturation, la suite dépend de si un délai de grâce est activé ou non.
Avec un délai de grâce, si le paiement réussit, l'essai est converti ou l'abonnement est renouvelé. S'il échoue, le store continuera à tenter de débiter l'utilisateur pour l'abonnement ; en cas d'échec persistant, le store mettra fin à l'essai ou à l'abonnement.
Ainsi, au moment du problème de facturation, les événements suivants sont créés dans Adapty :
- **Billing issue detected**
- **Entered grace period** (si le délai de grâce est activé)
- **Access level updated** pour fournir l'accès jusqu'à la fin du délai de grâce
Si le paiement réussit ultérieurement, Adapty enregistre un événement **Trial converted** ou **Subscription renewed**, et l'utilisateur ne perd pas l'accès.
Si le paiement échoue définitivement et que le store annule l'abonnement, Adapty génère ces événements :
- **Trial expired** ou **Subscription expired (churned)** avec `cancellation_reason: billing_error`
- **Access level updated** pour révoquer l'accès de l'utilisateur
Sans délai de grâce, la période de nouvelle tentative de facturation (pendant laquelle le store continue de tenter de débiter l'utilisateur) démarre immédiatement.
Si le paiement n'aboutit jamais avant la fin de la période de nouvelle tentative, le flux est identique : les mêmes événements sont créés lorsque le store met fin automatiquement à l'abonnement :
- Événement **Trial expired** ou **Subscription expired (churned)** avec un `cancellation_reason` de `billing_error`
- **Access level updated** pour révoquer l'accès de l'utilisateur
## Flux de partage d'achats entre comptes utilisateurs \{#sharing-purchases-across-user-accounts-flows\}
Lorsqu'un
Voici un détail des champs relatifs à l'attribution et au transfert du niveau d'accès dans les événements générés dans ce scénario :
- **Utilisateur A : Access level updated (envoyé lorsque l'utilisateur A souscrit un abonnement dans l'application)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": UserA,
"event_properties": {
"profile_has_access_level": true,
},
"profiles_sharing_access_level": null
}
```
- **Utilisateur A : Access level updated (envoyé lorsque l'application est réinstallée et que l'utilisateur B se connecte, révoquant l'accès de l'utilisateur A)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": UserA,
"event_properties": {
"profile_has_access_level": false,
},
"profiles_sharing_access_level": null
}
```
- **Utilisateur B : Access level updated (envoyé lorsque l'utilisateur B se connecte et que l'accès lui est accordé)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000001",
"customer_user_id": UserB,
"event_properties": {
"profile_has_access_level": true,
},
"profiles_sharing_access_level": null
}
```
### Flux de partage d'accès entre utilisateurs \{#shared-access-between-users-flow\}
Cette option permet à plusieurs utilisateurs de partager le même niveau d'accès si leur appareil est connecté au même identifiant Apple/Google. C'est utile lorsqu'un utilisateur réinstalle l'application et se connecte avec une adresse e-mail différente — il conservera quand même l'accès à son achat précédent. Avec cette option, plusieurs utilisateurs identifiés peuvent partager le même niveau d'accès. Pendant le partage du niveau d'accès, toutes les transactions sont enregistrées sous le
Voici un détail des champs relatifs à l'attribution et au partage du niveau d'accès dans les événements générés dans ce scénario :
**Utilisateur B : Access level updated (envoyé lorsque l'utilisateur B se connecte et que l'accès lui est accordé)**
```json showLineNumbers
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": UserA,
"event_properties": {
"profile_has_access_level": true,
},
"profiles_sharing_access_level": [
{
"profile_id": "00000000-0000-0000-0000-000000000001,
"customer_user_id": UserB
}
]
}
```
### Flux sans partage d'accès entre utilisateurs \{#access-not-shared-between-users-flow\}
Avec cette option, seul le premier profil utilisateur à recevoir le niveau d'accès le conserve de façon permanente. C'est idéal si les achats doivent être liés à un seul
---
# File: event-statuses
---
---
title: "Statuts des événements d'intégration"
description: ""
---
Adapty détermine la délivrabilité en fonction du code de statut HTTP, considérant toute réponse en dehors de la plage `200-399` comme un échec.
Vous pouvez suivre le statut des événements d'intégration dans l'**Event List** au sein de l'Adapty Dashboard. Le système affiche les statuts pour toutes les intégrations activées, qu'un type d'événement spécifique soit activé ou non pour une intégration donnée.
- Noir : l'événement a été envoyé avec succès.
- Gris : le type d'événement est désactivé pour cette intégration.
- Rouge : un problème affecte l'intégration et nécessite votre attention.
Pour plus de détails sur les événements en échec, survolez le nom de l'intégration pour afficher une infobulle avec les informations d'erreur spécifiques.
L'**Event Feed** affiche les données des deux dernières semaines pour optimiser les performances. Cette limitation améliore la vitesse de chargement des pages, ce qui permet aux utilisateurs de parcourir et d'analyser les événements plus facilement.
---
# File: attribution-integration
---
---
title: "Intégration de l'attribution"
description: "Intégrez Adapty avec des outils d'attribution pour suivre l'acquisition d'utilisateurs et la LTV."
---
Adapty peut échanger des informations avec des services tiers pour attribuer les événements d'abonnement à des campagnes marketing spécifiques. Cet échange vous permet de :
* Découvrir quelles stratégies marketing génèrent le plus de revenus
* Filtrer les [graphiques d'abonnements](charts) Adapty par attribution
* Utiliser les fonctionnalités d'un service tiers pour analyser les données d'abonnements Adapty
Vous pouvez le configurer de deux façons :
* [L'attribution intégrée](#integrated-attribution) nécessite une configuration minimale et permet à Adapty d'échanger des données avec 9 plateformes populaires.
* [L'attribution manuelle](#manual-attribution) vous oblige à récupérer vous-même les données d'attribution depuis les API de services tiers avant de pouvoir les envoyer à Adapty.
:::tip
Activez [Adapty Attribution](user-acquisition) pour une vue complète de l'économie de votre application.
Adapty Attribution est un tableau de bord web facile à configurer qui consolide les données de différentes sources pour identifier les stratégies d'acquisition d'utilisateurs efficaces.
:::
:::warning
Gardez vos données propres : évitez la duplication d'événements et les conflits d'attribution. Suivez les conseils de la section **[Éviter les problèmes de données](#prevent-data-issues)** pour vous assurer qu'une nouvelle source de données ne pollue pas vos analyses.
:::
## Attribution intégrée \{#integrated-attribution\}
Adapty propose une intégration d'attribution clé en main avec 9 services populaires. Ces plateformes peuvent automatiquement recevoir les [données d'abonnements](events) d'Adapty, traiter chaque achat et répondre avec une attribution appropriée.
Chaque plateforme a un fonctionnement différent, mais les étapes sont similairement simples :
1. **Configurez le partage automatique des données.** Autorisez Adapty à communiquer avec la plateforme de votre choix.
2. **Intégrez le SDK Adapty.** Certaines plateformes nécessitent du code supplémentaire pour définir les données d'attribution.
3. **Désactivez les autres services de partage d'événements et sources d'attribution** pour éviter la [duplication d'événements](#avoid-event-duplication) et les [conflits de données](#select-a-single-attribution-source).
Consultez le guide spécifique à chaque plateforme pour un aperçu détaillé de l'intégration :
- [Adjust](adjust)
- [Airbridge](airbridge)
- [Apple Search Ads](apple-search-ads)
- [AppsFlyer](appsflyer)
- [Asapty](asapty)
- [Branch](branch)
- [Facebook Ads](facebook-ads)
- [Singular](singular)
- [Tenjin](tenjin)
:::note
Si vous souhaitez qu'Adapty étende cette liste, [créez une demande de fonctionnalité](https://adapty.featurebase.app/en?b=6979f233ebd3cffd4f425ba0) et exprimez votre intérêt pour un service particulier.
:::
## Attribution manuelle \{#manual-attribution\}
Si Adapty ne propose pas d'[attribution intégrée](#integrated-attribution) avec le service de votre choix, vous devez écrire votre propre code pour échanger des données avec la source d'attribution.
1. **Récupérez les données depuis le service d'attribution**. Utilisez l'API du service pour demander les données d'attribution.
2. **Créez un dictionnaire avec les données d'attribution reçues.**
Le dictionnaire peut contenir les clés suivantes :
- `status` (`organic`, `non-organic` ou `unknown`)
- `channel`
- `campaign`
- `ad_group`
- `ad_set`
- `creative`
:::important
* Toutes les clés sont optionnelles.
* Adapty ignore les clés qui ne figurent pas dans la liste.
* La valeur de chaque clé peut comporter jusqu'à 50 caractères.
:::
**Exemple** :
```swift showLineNumbers title="Swift"
let attribution = [
"status": "non_organic",
"channel": "Google Ads",
"campaign": "Christmas Sale",
"ad_group": "ad group 1",
"ad_set": "ad set 1",
"creative": "creative id 1"
]
```
3. **Définissez les données d'attribution** :
Transmettez le dictionnaire d'attribution à la méthode `updateAttribution`. Une fois la valeur d'attribution définie, elle ne peut plus être remplacée :
```swift showLineNumbers title="Swift"
Adapty.updateAttribution(attribution, source: "custom") { error in
if error == nil {
// successful attribution update
}
}
```
**Paramètres :**
- `attribution` (requis) : dictionnaire contenant les données d'attribution.
- `source` (requis) : source d'attribution. Définissez-la sur `.custom` si votre fournisseur d'attribution ne prend pas en charge l'[attribution intégrée](#integrated-attribution).
4. **Désactivez les autres services de partage d'événements et sources d'attribution** pour éviter la [duplication d'événements](#avoid-event-duplication) et les [conflits de données](#select-a-single-attribution-source).
## Éviter les problèmes de données \{#prevent-data-issues\}
### Choisir une seule source d'attribution \{#select-a-single-attribution-source\}
N'activez pas l'intégration d'attribution avec plusieurs plateformes simultanément. Adapty ne peut accepter qu'une seule source d'attribution à la fois, et une fois qu'il enregistre la valeur d'attribution, il ne peut plus la remplacer.
Si vous activez plusieurs sources d'attribution, Adapty sélectionnera la source avec le plus de données — pas nécessairement les meilleures.
Par exemple, l'[attribution Apple Search Ads](apple-search-ads) non organique aura toujours la priorité sur iOS. Pour désactiver l'attribution Apple Search Ads, ouvrez l'onglet [**App Settings** -> **Apple Search Ads**](https://app.adapty.io/settings/apple-search-ads) et désactivez le bouton **Receive Apple Search Ads attribution**.
### Éviter la duplication d'événements \{#avoid-event-duplication\}
Si vous utilisez Adapty pour partager des données d'abonnements en temps réel avec vos services d'attribution, **vous devez désactiver** les autres services qui remplissent le même rôle. Si vous avez connecté votre compte Facebook à AppsFlyer, Adjust ou Branch, vos événements seront automatiquement transmis à ces services, sauf si vous vous y opposez.
Les événements en double peuvent fausser vos analyses et rendre l'interprétation des données difficile. Une fois la configuration du partage d'événements Adapty terminée, désactivez les fonctionnalités de transfert d'événements tiers.
---
# File: adjust
---
---
title: "Adjust"
description: "Connectez Adjust à Adapty pour un meilleur suivi des abonnements et des analyses."
---
[Adjust](https://www.adjust.com/) est l'une des principales plateformes MMP (Mobile Measurement Partner) qui collecte et présente les données issues des campagnes marketing, aidant ainsi les entreprises à suivre leurs performances publicitaires.
Adapty fournit un ensemble complet de données vous permettant de suivre les [événements d'abonnement](events) depuis les stores en un seul endroit. Avec Adapty, vous pouvez facilement observer le comportement de vos abonnés, comprendre leurs préférences et communiquer avec eux de façon ciblée et efficace. Cette intégration vous permet donc de suivre les événements d'abonnement dans Adjust et d'analyser précisément les revenus générés par vos campagnes.
L'intégration entre Adapty et Adjust fonctionne de deux manières principales.
1. **Adapty reçoit les données d'attribution depuis Adjust**
Une fois l'intégration Adjust configurée, Adapty commencera à recevoir les données d'attribution depuis Adjust. Vous pouvez consulter ces données directement sur la page du profil utilisateur.
2. **Adapty envoie les événements d'abonnement à Adjust**
Adapty peut envoyer tous les événements d'abonnement configurés dans votre intégration vers Adjust. Vous pourrez ainsi suivre ces événements dans le tableau de bord Adjust, ce qui est particulièrement utile pour évaluer l'efficacité de vos campagnes publicitaires.
## Configurer l'intégration \{#set-up-integration\}
### Connecter Adapty à Adjust \{#connect-adapty-to-adjust\}
1. Ouvrez l'Adapty Dashboard et accédez à [Integrations > Adjust](https://app.adapty.io/integrations/adjust).
2. Activez le bouton en haut de la page.
3. Remplissez les champs et saisissez vos identifiants d'accès.
3. Si vous avez activé l'autorisation OAuth sur la plateforme Adjust, vous devez obligatoirement fournir un **OAuth Token** lors du processus d'intégration pour vos applications iOS et Android.
4. Ensuite, renseignez les **app tokens** de vos applications iOS et Android. Ouvrez votre tableau de bord Adjust pour retrouver vos applications.
:::note
Vous pouvez avoir des applications Adjust différentes pour iOS et Android — c'est pourquoi Adapty propose deux sections indépendantes. Si vous n'avez qu'une seule application Adjust, saisissez simplement les mêmes informations dans les deux sections.
:::
5. Sélectionnez votre application dans la liste et copiez l'**App Token**. Collez-le dans le champ correspondant sur l'Adapty Dashboard.
### Configurer les événements et les tags \{#configure-events-and-tags\}
Adjust fonctionne un peu différemment des autres plateformes. Vous devez créer manuellement des événements dans le tableau de bord Adjust, récupérer leurs tokens, puis les copier-coller dans les événements correspondants dans Adapty.
La première étape consiste donc à trouver les tokens d'événement pour tous les événements que vous souhaitez qu'Adapty envoie. Pour ce faire :
1. Dans le tableau de bord Adjust, ouvrez votre application et accédez à l'onglet **Events**.
1. Copiez le token de l'événement et collez-le dans Adapty. Sous les identifiants, vous trouverez trois groupes d'événements que vous pouvez envoyer depuis Adapty vers Adjust. Consultez la liste complète des événements proposés par Adapty [ici](events).
Adapty enverra les événements d'abonnement à Adjust via une intégration serveur à serveur, vous permettant de les visualiser dans votre tableau de bord Adjust et de les associer à vos campagnes d'acquisition.
:::important
Tenez compte des points suivants :
- Adjust ne prend pas en charge les événements de plus de 58 jours. Si un événement date de plus de 58 jours, Adapty l'enverra quand même à Adjust, mais la date et l'heure de l'événement seront remplacées par l'horodatage actuel.
- Adjust ne prend pas en charge l'IPv6. Si vous désactivez la collecte d'IP dans le SDK via **App settings** ou lors de l'activation du SDK, seule une IP backend en IPv6 pourrait être envoyée, ce qui peut faire échouer le suivi — gardez la collecte d'IP du SDK activée pour garantir l'utilisation de l'IPv4.
:::
### Connecter votre application à Adjust \{#connect-your-app-to-adjust\}
Une fois les étapes ci-dessus effectuées, ajoutez les deux méthodes suivantes à votre application pour établir la communication entre votre application et Adjust :
1. **Pour envoyer les données d'abonnement à Adjust** : transmettez l'identifiant appareil Adjust à la méthode SDK `setIntegrationIdentifier()`
2. **Pour recevoir les données d'attribution depuis Adjust** : mettez à jour les données d'attribution avec la méthode SDK `updateAttribution()`
Pour Adjust version 5.0 ou ultérieure, utilisez l'exemple suivant :
Ces deux informations se trouvent dans votre tableau de bord Airbridge, dans la section [Third-party Integrations > Adapty](https://app.airbridge.io/app/testad/integrations/third-party/adapty).
Le champ Adapty API token est prégénéré côté backend Adapty. Vous devez copier la valeur du token API Adapty et la coller dans le tableau de bord Airbridge, dans le champ Adapty Authorization Token.
### Configurer les événements et les tags \{#configure-events-and-tags\}
Sous les identifiants, vous trouverez trois groupes d'événements que vous pouvez envoyer à Airbridge depuis Adapty.
Activez simplement ceux dont vous avez besoin.
### Connecter votre application à Airbridge \{#connect-your-app-to-airbridge\}
Pour l'intégration, vous devez passer `airbridge_device_id` au profile builder et appeler `setIntegrationIdentifier` comme indiqué dans l'exemple ci-dessous :
## Configurer l'intégration \{#set-up-integration\}
### Connecter Adapty au framework AdServices \{#connect-adapty-to-the-adservices-framework\}
Apple Ads via [AdServices](https://developer.apple.com/documentation/adservices) nécessite une configuration dans l'Adapty Dashboard, et vous devrez également l'activer côté application. Pour configurer Apple Ads via le framework AdServices avec Adapty, suivez ces étapes :
#### Étape 1 : Obtenir la clé publique \{#step-1-obtain-public-key\}
Dans l'Adapty Dashboard, rendez-vous dans [Settings -> Apple Ads.](https://app.adapty.io/settings/apple-search-ads)
Repérez la clé publique pré-générée (Adapty génère une paire de clés pour vous) et copiez-la.
:::note
Si vous utilisez un service alternatif ou votre propre solution pour l'attribution Apple Ads, vous pouvez importer votre propre clé privée.
:::
#### Étape 2 : Configurer la gestion des utilisateurs sur Apple Ads \{#step-2-configure-user-management-on-apple-ads\}
Dans votre [compte Apple Ads](https://ads.apple.com/app-store), accédez à la page **Settings > User Management**. Pour qu'Adapty puisse récupérer les données d'attribution, vous devez inviter un autre compte Apple ID et lui accorder un accès API Account Manager. Vous pouvez utiliser n'importe quel compte auquel vous avez accès ou en créer un nouveau à cet effet. L'essentiel est que vous puissiez vous connecter à Apple Ads avec cet Apple ID.
#### Étape 3 : Générer les identifiants API \{#step-3-generate-api-credentials\}
Connectez-vous ensuite au compte nouvellement ajouté dans Apple Ads. Dans l'interface Apple Ads, accédez à Settings -> API. Collez la clé publique copiée précédemment dans le champ prévu à cet effet. Générez de nouveaux identifiants API.
#### Étape 4 : Configurer Adapty avec les identifiants Apple Ads \{#step-4-configure-adapty-with-apple-ads-credentials\}
Copiez les champs Client ID, Team ID et Key ID depuis les paramètres Apple Ads. Dans l'Adapty Dashboard, collez ces identifiants dans les champs correspondants.
### Connecter votre application au réseau AdServices \{#connect-your-app-to-the-adservices-network\}
Une fois que vous avez terminé [la configuration du framework AdServices](#connect-adapty-to-the-adservices-framework), Adapty commence automatiquement à collecter les données d'attribution Apple Search Ad. Vous n'avez pas besoin d'ajouter de code SDK.
Pour les applications iOS, ces données d'attribution auront **toujours** la priorité sur les données provenant d'autres sources. Si ce comportement n'est pas souhaité, *désactivez* l'attribution ASA en suivant les instructions ci-dessous.
## Désactiver l'intégration \{#disable-integration\}
Pour désactiver l'attribution Apple Search Ads, ouvrez l'onglet [**App Settings** -> **Apple Search Ads**](https://app.adapty.io/settings/apple-search-ads) et désactivez le bouton **Receive Apple Search Ads attribution**.
:::warning
Veuillez noter que la désactiver arrêtera complètement la réception des données analytiques ASA. Par conséquent, ASA ne sera plus utilisé dans les analyses ni envoyé aux intégrations. De plus, SplitMetrics Acquire et Asapty cesseront de fonctionner, car ils dépendent de l'attribution ASA pour fonctionner correctement.
L'attribution reçue avant cette modification ne sera pas affectée.
:::
## Téléverser vos propres clés \{#uploading-your-own-keys\}
:::note
Facultatif
Ces étapes ne sont pas nécessaires pour l'attribution Apple Ads, uniquement pour travailler avec d'autres services comme Asapty ou votre propre solution.
:::
Vous pouvez utiliser votre propre paire de clés publique-privée si vous faites appel à d'autres services ou à votre propre solution pour l'attribution ASA.
### Étape 1 \{#step-1\}
Générez une clé privée dans le Terminal
```text showLineNumbers title="Text"
openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
```
Importez-la dans Adapty Settings -> Apple Ads (bouton Upload private key)
### Étape 2
Générez la clé publique dans le Terminal
```text showLineNumbers title="Text"
openssl ec -in private-key.pem -pubout -out public-key.pem
```
Vous pouvez utiliser cette clé publique dans les paramètres Apple Ads de votre compte avec le rôle API Account Manager. Vous pouvez ainsi utiliser les valeurs Client ID, Team ID et Key ID générées pour Adapty et d'autres services.
---
# File: appsflyer
---
---
title: "AppsFlyer"
description: "Intégrez AppsFlyer avec Adapty pour un suivi avancé de l'attribution mobile."
---
[AppsFlyer](https://www.appsflyer.com/) est une plateforme de référence pour l'attribution mobile et l'analyse marketing. Il s'agit d'un service tiers qui collecte et organise les données des campagnes marketing, permettant aux entreprises de mesurer les performances de leurs campagnes en un seul endroit.
Adapty fournit un ensemble complet de données pour suivre les [événements d'abonnement](events) des stores en un seul endroit. Avec Adapty, vous pouvez facilement observer le comportement de vos abonnés, comprendre leurs préférences et utiliser ces informations pour leur communiquer de façon ciblée et efficace. Cette intégration vous permet ainsi de suivre les événements d'abonnement dans AppsFlyer et d'analyser précisément les revenus générés par vos campagnes.
L'intégration entre Adapty et AppsFlyer fonctionne de deux manières principales.
1. **Réception des données d'attribution depuis AppsFlyer**
Une fois que vous avez [configuré l'envoi de l'attribution AppsFlyer à Adapty dans le code de votre app](appsflyer#connect-your-app-to-appsflyer), Adapty commence à recevoir les données d'attribution d'AppsFlyer. Vous pouvez consulter ces données directement sur la page du profil utilisateur.
2. **Envoi des événements d'abonnement à AppsFlyer**
Adapty peut envoyer tous les événements d'abonnement configurés dans votre intégration à AppsFlyer. Vous pourrez ainsi suivre ces événements depuis le tableau de bord AppsFlyer, ce qui est utile pour évaluer l'efficacité de vos campagnes publicitaires.
## Configuration \{#set-up-configuration\}
### Connecter Adapty à AppsFlyer \{#connect-adapty-to-appsflyer\}
Pour configurer l'intégration avec AppsFlyer :
1. Ouvrez [**Integrations** -> **AppsFlyer**](https://app.adapty.io/integrations/appsflyer) dans l'Adapty Dashboard.
2. Activez le toggle pour activer l'intégration.
3. L'étape suivante consiste à renseigner les identifiants.
Pour iOS, trouvez l'App ID en copiant l'**Apple ID** depuis App Store Connect (ouvrez la page de votre app dans [App Store Connect](https://appstoreconnect.apple.com/), accédez à la page **App Information** dans la section **General**, puis trouvez l'**Apple ID** en bas à gauche de l'écran).
3.2. Collez l'**Apple ID** copié dans le champ **iOS App ID** de l'Adapty Dashboard.
:::warning
Si vous utilisez AppsFlyer API 2, vous devez passer à l'API 3, car la version précédente sera bientôt dépréciée par AppsFlyer. Pour ce faire, dans la liste **AppsFlyer S2S API**, sélectionnez **API 3**.
:::
5. Pour iOS et Android, ouvrez le [site AppsFlyer](https://www.appsflyer.com/home) et connectez-vous.
6. Cliquez sur **Your account name** -> **Security Center** dans le coin supérieur droit du tableau de bord.
7. Dans la fenêtre **Manage your account security**, cliquez sur le bouton **Manage your AppsFlyer API and S2S tokens**.
8. Si vous disposez déjà d'un token S2S, passez directement à l'étape 12. Sinon, cliquez sur le bouton **New token**.
9. Dans la fenêtre **New token**, saisissez le nom du token. Ce nom est uniquement pour votre référence.
10. Choisissez **S2S** dans la liste **Choose type**.
11. Cliquez sur le bouton **Create new token** pour enregistrer le nouveau token.
12. Dans la fenêtre **Tokens**, copiez le token S2S.
13. Dans l'Adapty Dashboard, collez la clé S2S copiée dans les champs **Dev key for iOS** et **Dev key for Android**.
14. Cliquez sur le bouton **Save** pour enregistrer les modifications.
:::info
AppsFlyer ne dispose pas de mode Sandbox pour l'intégration server-to-server. Vous devez donc utiliser une application/un compte différent dans AppsFlyer pour la Dev Key Sandbox. Si vous souhaitez envoyer des événements sandbox à la même app, utilisez simplement la même clé pour la production et le sandbox.
:::
Adapty mappe certains événements sur les [événements standard](https://support.appsflyer.com/hc/en-us/articles/115005544169-Rich-in-app-events-for-Android-and-iOS#event-types) d'AppsFlyer par défaut. Avec cette configuration, AppsFlyer peut ensuite transmettre les événements à chaque réseau publicitaire que vous utilisez sans configuration supplémentaire.
À noter également qu'AppsFlyer ne prend pas en charge les événements de plus de 26 heures. Ainsi, si un événement date de plus de 26 heures, Adapty l'enverra quand même à AppsFlyer, mais la date et l'heure de l'événement seront remplacées par l'horodatage actuel.
### Configurer les événements et les tags \{#configure-events-and-tags\}
Sous les identifiants, vous trouverez trois groupes d'événements que vous pouvez envoyer à AppsFlyer depuis Adapty. Activez simplement ceux dont vous avez besoin. Consultez la liste complète des événements proposés par Adapty [ici](events).
Nous recommandons d'utiliser les noms d'événements par défaut fournis par Adapty, mais vous pouvez les modifier selon vos besoins.
Adapty enverra les événements d'abonnement à AppsFlyer via une intégration server-to-server, vous permettant de voir tous les événements d'abonnement dans votre tableau de bord AppsFlyer et de les associer à vos campagnes d'acquisition.
### Connecter votre app à AppsFlyer \{#connect-your-app-to-appsflyer\}
Une fois les étapes ci-dessus effectuées, appelez la méthode `updateAttribution` pour enregistrer les données d'attribution, et utilisez `Adapty.setIntegrationIdentifier()` pour définir l'identifiant d'intégration.
Initialisez le SDK AppsFlyer et attendez le callback de son UID avant d'identifier les utilisateurs dans Adapty. Sinon, l'`appsflyer_id` atterrit sur un profil Adapty anonyme temporaire créé lors de l'activation et n'est pas toujours transféré vers le profil identifié. Dans ce cas, le transfert des revenus AppsFlyer échoue silencieusement.
3. Dans la fenêtre **Manage your account security**, cliquez sur le bouton **Manage your AppsFlyer API and S2S tokens**.
4. Si vous n'avez pas de token S2S, cliquez sur le bouton **New token**. Si vous en avez déjà un, passez directement à l'étape 8.
5. Dans la fenêtre **New token**, saisissez le nom du token. Ce nom est uniquement à titre de référence.
6. Choisissez **S2S** dans la liste **Choose type**.
7. N'oubliez pas de cliquer sur le bouton **Create new token** pour enregistrer le nouveau token.
8. Dans la fenêtre **Tokens**, copiez le token S2S.
9. Ouvrez [**Integrations** -> **AppsFlyer**](https://app.adapty.io/integrations/appsflyer) dans l'Adapty Dashboard.
10. Dans le champ **AppsFlyer S2S API**, sélectionnez **API 3**.
11. Collez la clé S2S copiée dans les champs **Dev key for iOS** et **Dev key for Android**.
12. Cliquez sur le bouton **Save** pour confirmer le changement.
À ce moment-là, votre intégration bascule instantanément vers l'API S2S AppsFlyer 3 et vos nouveaux événements seront envoyés à la nouvelle URL : `https://api3.appsflyer.com/inappevent`.
---
# File: asapty
---
---
title: "Asapty"
description: "Découvrez Asapty et son rôle dans l'écosystème d'abonnement d'Adapty."
---
L'intégration [Asapty](https://asapty.com/) vous permet d'optimiser vos campagnes Search Ads. Adapty envoie les événements d'abonnement à Asapty, ce qui vous permet d'y créer des tableaux de bord personnalisés basés sur l'attribution Apple Search Ads.
Cette intégration spécifique n'ajoute pas de données d'attribution à Adapty, car nous disposons déjà de tout ce dont nous avons besoin directement via [ASA](apple-search-ads).
## Configurer l'intégration \{#set-up-integration\}
### Connecter Adapty à Asapty \{#connect-adapty-to-asapty\}
Pour intégrer Asapty, accédez à [Integrations > Asapty](https://app.adapty.io/integrations/asapty) dans l'Adapty Dashboard et renseignez la valeur du champ Asapty ID.
L'Asapty ID se trouve dans la section Settings > General de votre compte Asapty.
### Configurer les événements et les tags \{#configure-events-and-tags\}
Sous les identifiants, vous trouverez trois groupes d'événements que vous pouvez envoyer à Asapty depuis Adapty. Activez simplement ceux dont vous avez besoin. Consultez la liste complète des événements proposés par Adapty [ici](events).
Nous recommandons d'utiliser les noms d'événements par défaut fournis par Asapty. Vous pouvez toutefois les modifier selon vos besoins.
### Connecter votre application à Asapty \{#connect-your-app-to-asapty\}
Une fois les étapes ci-dessus effectuées, Adapty reçoit automatiquement les données d'attribution d'Asapty. Il n'est pas nécessaire de demander explicitement ces données dans le code de votre application. Pour une meilleure précision des données d'attribution, configurez Asapty pour qu'il transmette le `customerUserId` avec les données de chaque événement.
## Structure des événements Asapty \{#asapty-event-structure\}
Adapty envoie les événements à Asapty via une requête GET utilisant des paramètres de requête. Chaque URL d'événement ressemble à ceci :
```
https://asapty.com/_api/mmpEvents/?source=adapty&asaptyid=a1b2c3d4&keywordid=12345&adgroupid=67890&campaignid=11223&conversiondate=1709294400000&event_name=subscription_renewed&install_time=1709100000&app_name=MyApp&json=%7B%22af_revenue%22%3A%229.99%22%2C%22af_currency%22%3A%22USD%22...%7D
```
Paramètres de requête :
| Paramètre | Type | Description |
|:-----------------|:-------|:-----------------------------------------------------|
| `source` | String | Toujours "adapty". |
| `asaptyid` | String | L'Asapty ID issu de vos identifiants. |
| `keywordid` | String | ID du mot-clé Apple Search Ads (si disponible). |
| `adgroupid` | String | ID du groupe d'annonces Apple Search Ads (si disponible). |
| `campaignid` | String | ID de la campagne Apple Search Ads (si disponible). |
| `conversiondate` | Long | Horodatage de l'événement en **millisecondes**. |
| `event_name` | String | Le nom de l'événement (mappé depuis l'événement Adapty). |
| `install_time` | Long | Horodatage de l'installation en secondes. |
| `app_name` | String | Le titre de l'application dans Adapty (si disponible). |
| `json` | String | Chaîne JSON encodée en URL contenant les détails de l'événement (voir ci-dessous). |
Le paramètre `json` est une chaîne JSON encodée en URL contenant les champs suivants :
| Paramètre | Type | Description |
|:--------------------------|:-------|:---------------------------------------------|
| `af_revenue` | String | Montant des revenus sous forme de chaîne. |
| `af_currency` | String | Code de devise (ex. : "USD"). |
| `transaction_id` | String | ID de transaction du store. |
| `original_transaction_id` | String | ID de transaction d'origine du store. |
| `purchase_date` | Long | Horodatage de l'achat en millisecondes. |
| `original_purchase_date` | Long | Horodatage de l'achat d'origine en millisecondes. |
| `environment` | String | `Production` ou `Sandbox`. |
| `vendor_product_id` | String | L'ID du produit dans le store. |
| `profile_country` | String | Code pays basé sur l'adresse IP de l'utilisateur. |
| `store_country` | String | Code pays du store de l'utilisateur. |
## Résolution des problèmes \{#troubleshooting\}
- Assurez-vous d'avoir configuré [Apple Search Ads](apple-search-ads) dans Adapty et d'avoir [téléversé vos identifiants](https://app.adapty.io/settings/apple-search-ads) — sans cela, Asapty ne fonctionnera pas.
- Seuls les profils avec une attribution ASA détaillée et non organique transmettront leurs événements à Asapty. Vous verrez le message « The user profile is missing the required integration data. » si l'attribution est insuffisante.
- Les profils créés avant la configuration des intégrations ne pourront pas transmettre leurs événements à Asapty.
- Si l'intégration avec Adapty ne fonctionne pas malgré une configuration correcte, vérifiez que le bouton **Receive Apple Search Ads attribution in Adapty** est activé dans l'onglet [**App Settings** -> **Apple Search Ads**](https://app.adapty.io/settings/apple-search-ads).
---
# File: branch
---
---
title: "Branch"
description: "Intégrez Branch avec Adapty pour suivre les deep links et les conversions d'applications."
---
[Branch](https://www.branch.io/) permet aux entreprises d'atteindre leurs utilisateurs, d'interagir avec eux et d'évaluer les résultats sur différents appareils, canaux et plateformes. C'est une plateforme facile à utiliser, conçue pour augmenter les revenus mobiles grâce à des liens spécialisés qui fonctionnent parfaitement sur tous les appareils, canaux et plateformes.
Adapty fournit un ensemble complet de données qui vous permet de suivre les [événements d'abonnement](events) depuis les stores en un seul endroit. Avec Adapty, vous pouvez facilement observer le comportement de vos abonnés, comprendre leurs préférences et utiliser ces informations pour communiquer avec eux de manière ciblée et efficace.
L'intégration entre Adapty et Branch fonctionne de deux manières principales.
1. **Réception des données d'attribution depuis Branch**
Une fois l'intégration Branch configurée, Adapty commencera à recevoir des données d'attribution de Branch. Vous pouvez accéder à ces données et les consulter facilement sur la page du profil utilisateur.
2. **Envoi des événements d'abonnement à Branch**
Adapty peut envoyer tous les événements d'abonnement configurés dans votre intégration à Branch. Vous pourrez ainsi suivre ces événements dans le tableau de bord Branch et les associer à vos campagnes d'acquisition.
## Configurer l'intégration \{#set-up-integration\}
### Connecter Adapty à Branch \{#connect-adapty-to-branch\}
Pour intégrer Branch, rendez-vous dans [Integrations > Branch](https://app.adapty.io/integrations/branch) dans l'Adapty Dashboard, activez le bouton et renseignez les champs.
Pour obtenir la valeur du **Branch Key**, ouvrez vos [Account Settings](https://dashboard.branch.io/account-settings/profile) Branch et trouvez le champ **Branch Key**. Utilisez-le pour le champ **Key test** (pour Sandbox) ou **Key live** (pour Production) dans l'Adapty Dashboard. Dans Branch, basculez entre les environnements Live et Tests pour récupérer la clé appropriée.
### Configurer les événements et les tags \{#configure-events-and-tags\}
Sous les identifiants, vous trouverez trois groupes d'événements que vous pouvez envoyer à Branch depuis Adapty. Activez simplement ceux dont vous avez besoin. Consultez la liste complète des événements proposés par Adapty [ici](events).
Vous pouvez envoyer un événement avec les Proceeds \(après la commission Apple/Google\) ou uniquement le chiffre d'affaires. Vous pouvez également cocher une case pour les rapports dans la devise de l'utilisateur.
Nous recommandons d'utiliser les noms d'événements par défaut fournis par Adapty. Vous pouvez toutefois les personnaliser selon vos besoins.
Adapty enverra les événements d'abonnement à Branch via une intégration serveur à serveur, ce qui vous permettra de consulter tous les événements d'abonnement dans votre tableau de bord Branch et de les associer à vos campagnes d'acquisition.
### Connecter votre application à Branch \{#connect-your-app-to-branch\}
1. Appelez la méthode SDK `.setIntegrationIdentifier()` pour initialiser la connexion. Vous pouvez passer votre Branch Identity ID au paramètre `customerUserId`.
:::note
Les SDK tiers génèrent des identifiants utilisateur de manière asynchrone. L'identifiant peut ne pas être disponible au moment où `Adapty.activate()` s'exécute. Si votre **Customer User ID** provient de l'un de ces SDK, appelez `Adapty.activate()` sans lui. Dès que l'identifiant est disponible, appelez `setIntegrationIdentifier()`, puis `identify()` avec le CUID.
:::
1. Pour trouver l'App ID, ouvrez la page de votre application dans [App Store Connect](https://appstoreconnect.apple.com/), accédez à la page **App Information** dans la section **General**, et repérez **Apple ID** en bas à gauche de l'écran.
2. Vous avez besoin d'une application sur la plateforme [Meta for Developers](https://developers.facebook.com/). Connectez-vous à votre application, puis accédez aux paramètres avancés. Vous trouverez l'**App ID** dans l'en-tête.
3. Désactivez le suivi côté client dans la configuration de votre SDK Meta pour éviter le double comptage des revenus dans Meta Ads Manager. Vous trouverez ce paramètre dans votre Meta Developer Console sous **App Settings > Advanced Settings**. Réglez **Log in-app events automatically** sur « No ». Cela garantit que les événements de revenus ne sont suivis que via l'intégration Adapty.
Pour suivre les événements d'installation et d'utilisation, vous devrez activer le SDK Meta dans votre code. Vous trouverez les détails d'implémentation dans la documentation du SDK Meta pour votre plateforme :
- [iOS SDK](https://developers.facebook.com/docs/ios/getting-started)
- [Android SDK](https://developers.facebook.com/docs/android/getting-started)
- [Unity SDK](https://developers.facebook.com/docs/unity/getting-started/canvas)
Vous pouvez également utiliser cette intégration avec des applications Android. Si vous configurez le SDK Android dans **App Settings**, il suffit de renseigner le **Facebook App ID**.
### Configurer les événements et les tags \{#configure-events-and-tags\}
Notez que l'intégration Facebook Ads s'adresse spécifiquement aux entreprises utilisant Meta pour leurs campagnes publicitaires et souhaitant les optimiser en fonction du comportement des utilisateurs. Elle prend en charge les événements standard de Meta à des fins d'optimisation. Par conséquent, la modification du nom des événements n'est pas disponible pour l'intégration Meta Ads. Adapty mappe efficacement vos événements utilisateur vers les événements Meta correspondants pour une analyse précise.
| Événement Adapty | Événement Meta Ads |
| :---------------------------- | :-------------------------- |
| Subscription initial purchase | Subscribe |
| Subscription renewed | Subscribe |
| Subscription cancelled | CancelSubscription |
| Trial started | StartTrial |
| Trial converted | Subscribe |
| Trial cancelled | CancelTrial |
| Non subscription purchase | fb_mobile_purchase |
| Billing issue detected | billing_issue_detected |
| Entered grace period | entered_grace_period |
| Auto renew off | auto_renew_off |
| Auto renew on | auto_renew_on |
| Auto renew off subscription | auto_renew_off_subscription |
| Auto renew on subscription | auto_renew_on_subscription |
StartTrial, Subscribe et CancelSubscription sont des événements standard.
Pour activer des événements spécifiques, activez simplement ceux dont vous avez besoin. Si plusieurs noms d'événements sont sélectionnés, Adapty regroupera les données de tous les événements choisis sous un seul nom d'événement Adapty.
### Connecter votre application à Facebook Ads \{#connect-your-app-to-facebook-ads\}
Si vous suivez les étapes ci-dessus, Facebook recevra automatiquement les données d'abonnement depuis Adapty.
Suite aux changements apportés à l'IDFA dans iOS 14.5, nous vous recommandons de demander le `facebookAnonymousId` de l'utilisateur auprès de Facebook. Ainsi, si l'IDFA de l'utilisateur est indisponible, l'intégration continuera de fonctionner. Suivez le
Sous les identifiants, trois groupes d'événements peuvent être envoyés à Singular depuis Adapty. Consultez la liste complète des événements proposés par Adapty [ici](events).
Nous recommandons d'utiliser les noms d'événements par défaut fournis par Adapty. Vous pouvez toutefois les modifier selon vos besoins.
Adapty enverra les événements d'abonnement à Singular via une intégration serveur à serveur, vous permettant de visualiser 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 configuration des intégrations ne pourront pas envoyer leurs événements à Singular.
:::
### Connecter votre application à Singular \{#connect-your-app-to-singular\}
L'intégration entre Adapty et Singular est de type serveur à serveur. Il n'est donc pas nécessaire d'ajouter de code supplémentaire à votre application.
## Structure des événements \{#event-structure\}
Adapty envoie les événements à Singular via une requête GET avec des paramètres de requête. Chaque événement est structuré comme suit :
```json
{
"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,
"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...\"}"
}
```
Où :
| Paramètre | Type | Description |
|:---------------------------|:--------|:---------------------------------------------------------------|
| `n` | String | Le nom de l'événement (mappé depuis l'événement Adapty). |
| `a` | String | Votre clé SDK Singular. |
| `p` | String | Plateforme (« iOS » ou « Android »). |
| `i` | String | ID de l'application dans le store (Bundle ID). |
| `ip` | String | Adresse IP de l'utilisateur. |
| `idfa` | String | **iOS uniquement**. ID for Advertisers (en majuscules). |
| `idfv` | String | **iOS uniquement**. ID for Vendors (en majuscules). |
| `aifa` | String | **Android uniquement**. Google Advertising ID (en minuscules). |
| `andi` | String | **Android uniquement**. Android ID (en minuscules). |
| `asid` | String | **Android uniquement**. App Set ID (en minuscules). |
| `ve` | String | Version du système d'exploitation. |
| `att_authorization_status` | Integer | **iOS uniquement**. Statut ATT (ex. : `3` pour autorisé). |
| `custom_user_id` | String | L'identifiant utilisateur client (Customer User ID). |
| `utime` | Long | Horodatage UNIX de l'événement en secondes. |
| `amt` | Float | Montant des revenus. |
| `cur` | String | Code de devise (ex. : « USD »). |
| `purchase_product_id` | String | L'identifiant du produit dans le store. |
| `purchase_transaction_id` | String | Identifiant de transaction d'origine. |
| `e` | String | Chaî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ètre | Type | Description |
|:--------------------------|:--------|:----------------------------------------------------|
| `is_revenue_event` | Boolean | `true` si l'événement contient des revenus. |
| `amt` | Float | Montant des revenus. |
| `cur` | String | Code de devise. |
| `purchase_product_id` | String | L'identifiant du produit dans le store. |
| `purchase_transaction_id` | String | Identifiant de transaction d'origine. |
---
# File: tenjin
---
---
title: "Intégration Tenjin"
description: ""
---
Tenjin est une plateforme d'attribution mobile et d'analytics pour les développeurs d'applications et les équipes marketing. Elle fournit des outils pour mesurer et optimiser les campagnes d'acquisition d'utilisateurs en offrant des informations détaillées sur les performances de l'application et le comportement des utilisateurs. Grâce à son approche transparente et flexible, Tenjin agrège les données des réseaux publicitaires et des stores d'applications, permettant aux équipes d'analyser le ROI, de suivre les conversions et de surveiller les métriques clés.
En transmettant les [événements d'abonnement](events) à Tenjin, vous pouvez voir exactement d'où viennent les conversions et quelles campagnes génèrent le plus de valeur sur tous les canaux, plateformes et appareils. En pratique, les tableaux de bord Tenjin offrent des analytics avancées pour les campagnes marketing.
En transmettant l'attribution de Tenjin à Adapty, vous enrichissez les analytics Adapty avec des critères de filtrage supplémentaires utilisables dans les analyses de cohortes et de conversions.
Cette intégration fonctionne de deux manières principales :
1. **Réception des données d'attribution depuis Tenjin**
Une fois intégrée, Adapty collecte les données d'attribution de Tenjin. Vous pouvez accéder à ces informations sur la page du profil de l'utilisateur dans l'Adapty Dashboard.
2. **Envoi des événements d'abonnement à Tenjin**
Adapty envoie les événements d'achat à Tenjin en temps réel. Ces événements permettent d'évaluer l'efficacité de vos campagnes publicitaires directement dans le tableau de bord de Tenjin.
| Caractéristique de l'intégration | Description |
| -------------------------------- | ------------------------------------------------------------ |
| Fréquence | Temps réel |
| Direction des données | Transmission bidirectionnelle :
3. Connectez-vous au [Tenjin Dashboard](https://tenjin.com/).
4. Allez dans **Configuration** -> **Apps** dans le menu de navigation.
5. Sélectionnez l'application pour votre plateforme (iOS ou Android) et accédez à l'onglet **App and SDK**.
6. Dans l'onglet **App and SDK**, cliquez sur **Copy** dans la colonne **SDK Key**. Si vous n'avez pas encore de clé SDK, cliquez sur le bouton **Generate SDK Key** pour en créer une.
7. Revenez dans l'Adapty Dashboard et collez la clé SDK copiée dans le champ correspondant à votre plateforme :
- Pour les applications iOS : collez dans le champ **iOS SDK Key** ou **iOS Sandbox SDK Key**
- Pour les applications Android : collez dans le champ **Android SDK Key** ou **Android Sandbox SDK Key**
:::info
Tenjin ne dispose pas d'un mode Sandbox spécifique pour l'intégration server-to-server. Utilisez une application Tenjin distincte ou la même clé pour les événements de production et sandbox.
:::
8. Si vous avez des applications sur les deux plateformes, répétez les étapes 5 à 7 pour l'autre plateforme.
9. (facultatif) Ajustez la section **How the revenue data should be sent** si nécessaire. Pour une explication détaillée de ses paramètres, consultez la section [Paramètres d'intégration](configuration#integration-settings).
10. Cliquez sur **Save** pour finaliser la configuration.
Adapty enverra désormais les événements d'achat à Tenjin et recevra les données d'attribution. Vous pouvez ajuster le partage des événements dans la section **Events names**.
### Configurer les événements et les tags \{#configure-events-and-tags\}
Tenjin n'accepte que les événements d'achat et les événements **Trial started**. Dans la section **Events names**, sélectionnez les événements à partager avec Tenjin en fonction de vos objectifs de suivi.
### Connecter votre application à Tenjin \{#connect-your-app-to-tenjin\}
Utilisez la méthode SDK `Adapty.updateAttribution()` pour récupérer les données d'attribution depuis Tenjin et les transmettre à Adapty.
Raison pour laquelle l'utilisateur a annulé un abonnement.
Valeurs possibles :
iOS & Android
_voluntarily_cancelled_, _billing_error_, _refund_
iOS
_price_increase_, _product_was_not_available_, _unknown_
Android
_new_subscription_replace_, _cancelled_by_developer_
| | **subscription_expires_at** | ISO 8601 date | Date d'expiration de l'abonnement. Généralement dans le futur. | | **consecutive_payments** | int | Nombre de périodes consécutives pendant lesquelles l'utilisateur est abonné sans interruption. Inclut la période actuelle. | | **rate_after_first_year** | bool | Booléen indiquant que l'abonnement bénéficie d'un taux de commission réduit (généralement 15 %) après un an de renouvellement continu. Les taux varient selon l'éligibilité au programme et le pays. Voir [Commission du store et taxes](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue) pour plus de détails. | | **promotional_offer_id** | str | ID de l'offre promotionnelle, tel qu'indiqué dans la section Produits de l'Adapty Dashboard. | | **store_offer_category** | str | Peut être _introductory_ ou _promotional_. | | **store_offer_discount_type** | str | Peut être _free_trial_, _pay_as_you_go_ ou _pay_up_front_. | | **paywall_name** | str | Nom du paywall depuis lequel la transaction a été initiée. | | **paywall_revision** | int | Révision du paywall depuis lequel la transaction a été initiée. La valeur est définie à 1. | | **developer_id** | str | ID développeur (SDK) du placement depuis lequel la transaction a été initiée. | | **ab_test_name** | str | Nom du test A/B depuis lequel la transaction a été initiée. | | **ab_test_revision** | int | Révision du test A/B depuis lequel la transaction a été initiée. La valeur est définie à 1. | | **cohort_name** | str | Nom de l'audience à laquelle appartient le profil. | | **profile_event_id** | uuid | Identifiant unique de l'événement, utilisable pour la déduplication. | | **store_country** | str | Pays transmis par le store. | | **profile_ip_address** | str | Adresse IP du profil (IPv4 ou IPv6, avec préférence pour IPv4 si disponible). Mise à jour à chaque changement d'IP de l'appareil. | | **profile_country** | str | Déterminé par Adapty, à partir de l'IP du profil. | | **profile_total_revenue_usd** | float | Revenu total du profil, remboursements inclus. | | **variation_id** | uuid | Identifiant unique du paywall sur lequel l'achat a été effectué. | | **access_level_id** | str | ID du niveau d'accès payant. | | **is_active** | bool | Booléen indiquant si le niveau d'accès payant est actif pour le profil. | | **will_renew** | bool | Booléen indiquant si le niveau d'accès payant sera renouvelé. | | **is_refund** | bool | Booléen indiquant si la transaction a été remboursée. | | **is_lifetime** | bool | Booléen indiquant si le niveau d'accès payant est à vie. | | **is_in_grace_period** | bool | Booléen indiquant si le profil est en délai de grâce. | | **starts_at** | ISO 8601 date | Date et heure auxquelles le niveau d'accès payant commence pour l'utilisateur. | | **renewed_at** | ISO 8601 date | Date et heure auxquelles le niveau d'accès payant sera renouvelé. | | **expires_at** | ISO 8601 date | Date et heure auxquelles le niveau d'accès payant expirera. | | **activated_at** | ISO 8601 date | Date et heure auxquelles le niveau d'accès payant a été activé. | | **billing_issue_detected_at** | ISO 8601 date | Date et heure du problème de facturation. | | **profile_has_access_level** | Bool | Booléen indiquant si le profil dispose d'un niveau d'accès actif (webhook uniquement). | Chaque événement possède les propriétés suivantes : `transaction_id, original_transaction_id, purchase_date, original_purchase_date, environment, vendor_product_id, event_datetime, store`. En outre, certains événements ont des propriétés supplémentaires. Pour les événements `subscription_refunded` et `non_subscription_purchase_refunded`, les valeurs de `price_usd` et `proceeds_usd` doivent obligatoirement être fournies en tant que propriétés supplémentaires. | Nom de l'événement | Propriétés | | :---------------------------------- | :----------------------------------------------------------- | | **subscription\_initial\_purchase** | price\_usd, proceeds\_usd, subscription\_expires\_at, consecutive\_payments, rate\_after\_first\_year, trial\_duration | | **subscription\_renewed** | price\_usd, proceeds\_usd, subscription\_expires\_at, consecutive\_payments, rate\_after\_first\_year, trial\_duration | | **subscription\_cancelled** | cancellation\_reason, trial\_duration | | **trial\_started** | subscription\_expires\_at, trial\_duration | | **trial\_converted** | price\_usd, proceeds\_usd, subscription\_expires\_at, consecutive\_payments, rate\_after\_first\_year, trial\_duration | | **trial\_cancelled** | cancellation\_reason, trial\_duration | | **non\_subscription\_purchase** | price\_usd, proceeds\_usd | | **billing\_issue\_detected** | subscription\_expires\_at, trial\_duration | | **entered\_grace\_period** | subscription\_expires\_at, trial\_duration | Exemple d'événement ```json title="Json" { "price_usd": 9.99, "proceeds_usd": 6.99, "transaction_id": "1000000628581600", "original_transaction_id": "1000000628581600", "purchase_date": "2020-02-18T18:40:22.000000+0000", "original_purchase_date": "2020-02-18T18:40:22.000000+0000", "environment": "Sandbox", "vendor_product_id": "premium", "event_datetime": "2020-02-18T18:40:22.000000+0000", "store": "app_store" } ``` Adapty envoie les événements à votre serveur et aux systèmes d'analyse tiers. La propriété **profile_ip_address** est synchronisée avec l'IP actuelle de l'appareil. À chaque fois que les serveurs Adapty reçoivent des informations du SDK, l'IP est mise à jour si elle diffère de celle enregistrée. ### Définir l'identifiant du profil \{#setting-the-profiles-identifier\} - Définissez l'identifiant du profil pour l'outil d'analyse sélectionné en utilisant les instructions pour
2. Activez **Amplitude integration** pour l'activer.
3. Renseignez les champs de l'intégration :
| Champ | Description |
| ------------------------------------------ | ------------------------------------------------------------ |
| **Amplitude iOS/ Android/ Stripe API key** | Saisissez la **clé API** Amplitude pour iOS/ Android/ Stripe dans Adapty. Retrouvez-la sous **Project settings** dans Amplitude. Pour obtenir de l'aide, consultez la [documentation Amplitude](https://amplitude.com/docs/apis/authentication). Commencez avec les clés **Sandbox** pour les tests, puis passez aux clés **Production** après des tests concluants. |
4. Paramètres optionnels pour personnaliser davantage :
| Paramètre | Description |
| --------------------------------------- | ------------------------------------------------------------ |
| **How the revenue data should be sent** | Choisissez d'envoyer le revenu brut ou le revenu après taxes et commissions. Consultez [Commission des stores et taxes](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue) pour plus de détails. |
| **Exclude historical events** | Choisissez d'exclure les événements antérieurs à l'installation du SDK Adapty, afin d'éviter les doublons. Par exemple, si un utilisateur s'est abonné le 10 janvier mais a installé le SDK Adapty le 6 mars, Adapty n'enverra que les événements à partir du 6 mars. |
| **Send User Attributes** | Sélectionnez cette option pour envoyer des attributs propres à l'utilisateur, comme ses préférences de langue. |
| **Always populate user_id** | Adapty envoie automatiquement `device_id` en tant que `amplitudeDeviceId`. Pour `user_id`, ce paramètre définit le comportement :
Nous recommandons d'utiliser les noms d'événements par défaut fournis par Adapty. Vous pouvez toutefois les modifier selon vos besoins. Adapty enverra les événements d'abonnement à Amplitude via une intégration serveur à serveur, vous permettant de visualiser tous les événements d'abonnement dans votre tableau de bord Amplitude.
### Configuration du SDK \{#sdk-configuration\}
Utilisez la méthode `setIntegrationIdentifier()` pour définir le paramètre `amplitude_device_id`. Cette étape est indispensable pour configurer l'intégration.
Si vous gérez l'inscription des utilisateurs, vous pouvez également transmettre `amplitude_user_id`.
:::note
Les SDK tiers génèrent des identifiants utilisateur de manière asynchrone. L'identifiant peut ne pas être disponible au moment où `Adapty.activate()` s'exécute. Si votre **Customer User ID** provient de l'un de ces SDK, appelez `Adapty.activate()` sans lui. Dès que l'identifiant est disponible, appelez `setIntegrationIdentifier()`, puis `identify()` avec le CUID.
:::
4. Rendez-vous dans [Integrations > AppMetrica](https://app.adapty.io/integrations/appmetrica) dans l'Adapty Dashboard
5. Collez vos identifiants AppMetrica.
### Événements et tags \{#events-and-tags\}
Adapty vous permet d'envoyer trois groupes d'événements à AppMetrica. Vous pouvez activer les événements dont vous avez besoin pour suivre les performances de votre application. Pour la liste complète des événements disponibles, consultez notre [documentation sur les événements](events).
:::note
AppMetrica synchronise les événements toutes les 4 heures, ce qui peut entraîner un délai avant que les événements n'apparaissent dans votre tableau de bord.
:::
:::tip
Nous recommandons d'utiliser les noms d'événements par défaut d'Adapty pour plus de cohérence, mais vous pouvez les personnaliser pour les adapter à votre configuration analytique existante.
:::
### Paramètres de revenus \{#revenue-settings\}
Par défaut, Adapty envoie les données de revenus sous forme de propriétés dans les événements, qui apparaissent dans le rapport Événements d'AppMetrica. Vous pouvez configurer la façon dont ces données de revenus sont calculées et affichées :
- **Calcul des revenus** : Choisissez comment les valeurs de revenus sont calculées pour correspondre à vos besoins de reporting financier :
- **Revenus bruts** : Affiche le total des revenus avant toute déduction, utile pour suivre le montant total payé par les clients
- **Recettes après commission du store** : Affiche les revenus après déduction des frais de l'App Store/Play Store, pour suivre vos gains réels
- **Recettes après commission du store et taxes** : Affiche les revenus nets après déduction des frais du store et des taxes applicables, offrant la vision la plus précise de vos gains
- **Report user's currency** : lorsque cette option est activée, les ventes sont rapportées dans la devise locale de l'utilisateur, ce qui facilite l'analyse des revenus par région. Lorsqu'elle est désactivée, toutes les ventes sont converties en USD pour un reporting cohérent sur l'ensemble des marchés.
- **Send revenue events** : activez cette option pour que les données de revenus apparaissent non seulement dans le rapport Événements, mais aussi dans le rapport [In-app and ad revenue](https://appmetrica.yandex.com/docs/en/mobile-reports/revenue-report) d'AppMetrica. Assurez-vous de ne pas envoyer des données de revenus depuis un autre endroit, car cela pourrait entraîner des doublons.
- **Exclude historical events** : Lorsque cette option est activée, Adapty n'envoie pas les événements survenus avant l'installation de l'app avec le SDK Adapty. Cela permet d'éviter les doublons si vous envoyiez déjà des événements à votre outil d'analyse avant d'intégrer Adapty.
### Configuration du SDK \{#sdk-configuration\}
Pour activer l'intégration AppMetrica dans votre application, vous devez configurer deux identifiants :
1. `appmetrica_device_id` : Requis pour l'intégration de base
2. `appmetrica_profile_id` : Optionnel, mais recommandé si votre application dispose d'un système d'inscription utilisateur
Utilisez la méthode `setIntegrationIdentifier()` pour définir ces valeurs. Voici comment l'implémenter sur chaque plateforme :
:::note
Les SDK tiers génèrent des identifiants utilisateur de manière asynchrone. L'identifiant peut ne pas être disponible au moment où `Adapty.activate()` s'exécute. Si votre **Customer User ID** provient de l'un de ces SDK, appelez `Adapty.activate()` sans lui. Dès que l'identifiant est disponible, appelez `setIntegrationIdentifier()`, puis `identify()` avec le CUID.
:::
### Trouver votre Mixpanel Token \{#finding-your-mixpanel-token\}
Pour obtenir votre **Mixpanel Token** :
1. Connectez-vous à votre [Mixpanel Dashboard](https://mixpanel.com/settings/project/).
2. Ouvrez **Settings** et sélectionnez **Organization Settings**.
3. Dans la barre latérale gauche, accédez à **Projects** et sélectionnez votre projet.
## Fonctionnement de l'intégration \{#how-the-integration-works\}
Adapty mappe automatiquement les propriétés d'événements pertinentes — comme l'identifiant utilisateur et les revenus — vers les [propriétés natives de Mixpanel](https://docs.mixpanel.com/docs/data-structure/user-profiles). Cela garantit un suivi et des rapports précis des événements liés aux abonnements.
De plus, Adapty cumule les données de revenus par utilisateur et met à jour leurs [User Profile Properties](https://docs.mixpanel.com/docs/data-structure/user-profiles), notamment `subscription state` et `subscription product ID`. Dès qu'un événement est reçu, Mixpanel met à jour les champs correspondants en temps réel.
## Événements et tags \{#events-and-tags\}
Sous les identifiants, vous trouverez trois groupes d'événements que vous pouvez envoyer à Mixpanel depuis Adapty. Activez simplement ceux dont vous avez besoin. Consultez la liste complète des événements proposés par Adapty [ici](events).
Nous recommandons d'utiliser les noms d'événements par défaut fournis par Adapty. Vous pouvez toutefois les modifier selon vos besoins.
## Configuration du SDK \{#sdk-configuration\}
Utilisez la méthode `.setIntegrationIdentifier()` pour définir le `mixpanelUserId`. Si cette valeur n'est pas renseignée, Adapty utilise votre identifiant utilisateur (`customerUserId`) ou, s'il est null, l'identifiant Adapty. Assurez-vous que l'identifiant utilisateur que vous envoyez à Mixpanel depuis votre application est identique à celui que vous envoyez à Adapty.
:::note
Les SDK tiers génèrent des identifiants utilisateur de manière asynchrone. L'identifiant peut ne pas être disponible au moment où `Adapty.activate()` s'exécute. Si votre **Customer User ID** provient de l'un de ces SDK, appelez `Adapty.activate()` sans lui. Dès que l'identifiant est disponible, appelez `setIntegrationIdentifier()`, puis `identify()` avec le CUID.
:::
2. Connectez-vous au [PostHog Dashboard](https://posthog.com/).
3. Accédez à **Settings -> Project**.
4. Dans la fenêtre **Project**, faites défiler jusqu'à la section **Project ID** et copiez la **Project API key**.
5. Collez la clé API dans le champ **Project API key** de l'Adapty Dashboard. PostHog ne dispose pas de mode Sandbox spécifique pour l'intégration serveur à serveur.
6. Choisissez votre **PostHog Deployment** :
| Option | Description |
| ------ | ------------------------------------------------------------ |
| us/eu | Déploiements hébergés par PostHog par défaut. |
| Custom | Pour les instances auto-hébergées. Saisissez l'URL de votre instance dans le champ **PostHog Instance URL**. |
7. (facultatif) Si vous utilisez un déploiement PostHog auto-hébergé, saisissez l'adresse de votre déploiement dans le champ **PostHog Instance URL**.
8. (facultatif) Ajustez les paramètres tels que **Reporting Proceeds**, **Exclude Historical Events**, **Report User's Currency** et **Send Trial Price**. Consultez les [paramètres d'intégration](configuration#integration-settings) pour plus de détails sur ces options.
9. (facultatif) Vous pouvez également personnaliser les événements envoyés à PostHog dans la section **Events names**. Désactivez les événements non souhaités ou renommez-les selon vos besoins.
10. Cliquez sur **Save** pour finaliser la configuration.
## Configuration du SDK \{#sdk-configuration\}
Pour activer la réception des données d'attribution depuis PostHog, transmettez la valeur `distinctId` à Adapty comme indiqué ci-dessous :
:::note
Les SDK tiers génèrent des identifiants utilisateur de manière asynchrone. L'identifiant peut ne pas être disponible au moment où `Adapty.activate()` s'exécute. Si votre **Customer User ID** provient de l'un de ces SDK, appelez `Adapty.activate()` sans lui. Dès que l'identifiant est disponible, appelez `setIntegrationIdentifier()`, puis `identify()` avec le CUID.
:::
Ouvrez votre compte SplitMetrics Acquire, survolez l'un des logos MMP et cliquez sur le bouton **Settings**. Trouvez votre Client ID dans la boîte de dialogue sous l'élément **5**, copiez-le, puis collez-le dans Adapty en tant que **Client ID**.
Vous devrez également renseigner votre Apple App ID pour utiliser l'intégration. Pour trouver votre App ID, ouvrez la page de votre app dans App Store Connect, accédez à la page **App Information** dans la section **General**, et repérez l'**Apple ID** en bas à gauche de l'écran.
## Événements et tags \{#events-and-tags\}
Sous les identifiants, vous trouverez trois groupes d'événements que vous pouvez envoyer à SplitMetrics Acquire depuis Adapty. Activez simplement ceux dont vous avez besoin. Consultez la liste complète des événements proposés par Adapty [ici](events).
Nous recommandons d'utiliser les noms d'événements par défaut fournis par Adapty. Vous pouvez cependant les modifier selon vos besoins. Adapty enverra les événements d'abonnement à SplitMetrics Acquire via une intégration server-to-server, ce qui vous permettra de les consulter dans votre tableau de bord SplitMetrics.
## Configuration du SDK \{#sdk-configuration\}
Aucune configuration côté SDK n'est nécessaire, mais nous recommandons d'envoyer le `customerUserId` à Adapty pour une meilleure précision.
:::warning
Assurez-vous d'avoir configuré [Apple Search Ads](apple-search-ads) dans Adapty et d'avoir [importé vos identifiants](https://app.adapty.io/settings/apple-search-ads) — sans cela, SplitMetrics Acquire ne fonctionnera pas.
:::
## Dépannage \{#troubleshooting\}
Si l'intégration avec SplitMetrics Acquire ne fonctionne pas malgré une configuration correcte :
- Assurez-vous d'avoir activé le bouton **Receive Apple Search Ads attribution in Adapty** dans l'onglet [App Settings -> Apple Search Ads](https://app.adapty.io/settings/apple-search-ads), d'avoir configuré [Apple Search Ads](apple-search-ads) dans Adapty et d'avoir [importé vos identifiants](https://app.adapty.io/settings/apple-search-ads) — sans cela, SplitMetrics ne fonctionnera pas.
- Vérifiez que les profils disposent d'une attribution ASA non organique. Seuls les profils avec une attribution ASA détaillée et non organique transmettront leurs événements à Adapty.
## Structure des événements SplitMetrics Acquire \{#splitmetrics-acquire-event-structure\}
Adapty envoie les événements à SplitMetrics Acquire via une requête GET en utilisant des paramètres de requête. Chaque événement est structuré comme suit :
```json
{
"source": "Apple Search Ads",
"app_id": "123456789",
"name": "subscription_renewed",
"type": "subscription_renewed",
"revenue": 9.99,
"currency": "USD",
"tap_time": "2024-03-01 12:00:00",
"open_time": "2024-03-01 12:05:00",
"event_time": "2024-03-02 12:00:00",
"adaccount_id": "123456",
"campaign_id": "123456789",
"adgroup_id": "123456789",
"keyword_id": "123456789",
"creative_set_id": "123456789",
"Ad_id": "123456789",
"country_or_region": "US",
"conversion_type": "Download",
"user_id": "user_12345",
"att_status": "3",
"device_type": "iphone",
"app_version": "1.2.3",
"sdk_version": "2.10.0",
"ios_version": "17.2",
"event_value": "{\"vendor_product_id\":\"yearly.premium.6999\",\"original_transaction_id\":\"GPA.3383...\"}",
"event_id": "123e4567-e89b-12d3-a456-426614174000"
}
```
Où :
| Paramètre | Type | Description |
|:--------------------|:-------|:-----------------------------------------------------------------------------------------------------------------------------------|
| `source` | String | Toujours "Apple Search Ads". |
| `app_id` | String | Apple App ID. |
| `name` | String | Nom de l'événement (mappé depuis l'événement Adapty). |
| `type` | String | Type d'événement (identique à `name`). |
| `revenue` | Float | Montant du revenu. |
| `currency` | String | Code de devise. |
| `tap_time` | String | Date et heure du clic sur la publicité. |
| `open_time` | String | Date et heure de l'ouverture de l'app (installation). |
| `event_time` | String | Date et heure de l'événement. |
| `adaccount_id` | String | ID de l'organisation ASA. |
| `campaign_id` | String | ID de la campagne ASA. |
| `adgroup_id` | String | ID du groupe d'annonces ASA. |
| `keyword_id` | String | ID du mot-clé ASA. |
| `creative_set_id` | String | ID du jeu de créatifs ASA. |
| `Ad_id` | String | ID de l'annonce ASA. |
| `country_or_region` | String | Pays ou région du store. |
| `conversion_type` | String | Type de conversion (ex. : "Download"). |
| `user_id` | String | Customer User ID ou Adapty Profile ID. |
| `att_status` | String | Statut d'autorisation du suivi (0-3). |
| `device_type` | String | Type d'appareil (ex. : "iphone", "ipad"). |
| `app_version` | String | Version de l'application. |
| `sdk_version` | String | Version du SDK Adapty. |
| `ios_version` | String | Version d'iOS. |
| `event_value` | String | Chaîne JSON contenant tous les [détails de l'événement](webhook-event-types-and-fields#for-most-event-types) disponibles. |
| `event_id` | String | Identifiant unique de l'événement (UUID). |
---
# File: messaging
---
---
title: "Intégrations de services de messagerie"
description: "Utilisez les outils de messagerie d'Adapty pour améliorer l'engagement et la rétention des abonnements."
---
L'acquisition n'est ni facile ni bon marché sur un marché mobile en pleine croissance. Bien traiter les utilisateurs attirés améliore donc votre économie unitaire, surtout dans les niches très concurrentielles.
Adapty fournit des informations en temps réel sur les principales actions de paiement des utilisateurs. Nous savons quand votre client a démarré un essai, s'il a rencontré des problèmes de paiement, ou s'il a souscrit un abonnement avant de décider de l'annuler. Ces événements, et bien d'autres, reflètent un changement d'état du client. C'est le meilleur moment pour réagir : envoyer une offre, un cadeau personnalisé ou tout autre action de rétention.
Les plateformes de notifications push permettent de décrire un utilisateur avec des tags standard et personnalisés afin de construire un système automatique de rétention efficace. Pour que ce système fonctionne, il suffit d'événements déclencheurs pour indiquer au système qu'il est temps d'envoyer un message. Ces événements arriveront sur la plateforme push depuis Adapty via l'intégration configurée.
Choisissez ci-dessous le service à intégrer et suivez les instructions :
- [Braze](braze)
- [OneSignal](onesignal)
- [Pushwoosh](pushwoosh)
- [Slack](slack)
:::note
Vous ne trouvez pas votre fournisseur d'attribution ?
Faites-le nous savoir ! [Créez une demande de fonctionnalité](https://adapty.featurebase.app/en?b=6979f233ebd3cffd4f425ba0) et nous envisagerons de l'ajouter.
:::
## Propriétés des événements \{#event-properties\}
Les événements webhook sont envoyés au format JSON. Tous les événements suivent la même structure, mais leurs champs varient selon le type d'événement, le store et votre configuration spécifique.
:::note
Adapty convertit les autres devises en USD au taux de change de [currencylayer.com](https://currencylayer.com/) (actualisé toutes les 8 heures). Le taux est **fixé au moment de la transaction** — les variations ultérieures n'affectent pas le résultat de la conversion.
:::
| Propriété | Type | Description |
| ----------------------------- | ------------- | ------------------------------------------------------------ |
| **profile_id** | uuid | ID utilisateur Adapty. |
| **currency** | str | Devise locale (USD par défaut). |
| **price_usd** | float | Prix du produit avant la commission Apple/Google. Revenu. |
| **proceeds_usd** | float | Prix du produit après la commission Apple/Google. Revenu net. |
| **net_revenue_usd** | float | Revenu net (revenu après commission Apple/Google et taxes) en USD. Peut être vide. |
| **price_local** | float | Prix du produit avant la commission Apple/Google en devise locale. Revenu. |
| **proceeds_local** | float | Prix du produit après la commission Apple/Google en devise locale. Revenu net. |
| **transaction_id** | str | Identifiant unique d'une transaction, comme un achat ou un renouvellement. |
| **original_transaction_id** | str | Identifiant de transaction de l'achat d'origine. |
| **purchase_date** | ISO 8601 date | Date et heure d'achat du produit. |
| **original_purchase_date** | ISO 8601 date | Date et heure de l'achat d'origine. |
| **environment** | str | Peut être _Sandbox_ ou _Production_. |
| **vendor_product_id** | str | ID du produit sur l'Apple App Store, le Google Play Store ou Stripe. |
| **base_plan_id** | str | [ID du plan de base](https://support.google.com/googleplay/android-developer/answer/12154973) sur le Google Play Store ou [ID de prix](https://docs.stripe.com/products-prices/how-products-and-prices-work#use-products-and-prices) sur Stripe. |
| **event_datetime** | ISO 8601 date | Date et heure de l'événement. |
| **store** | str | Peut être _app_store_ ou _play_store_. |
| **trial_duration** | str | Durée de la période d'essai en jours. Envoyée au format "{} days", par exemple "7 days". |
| **cancellation_reason** | str | Raison pour laquelle l'utilisateur a annulé son abonnement.
Peut être
iOS & Android
_voluntarily_cancelled_, _billing_error_, _refund_
iOS
_price_increase_, _product_was_not_available_, _unknown_
Android
_new_subscription_replace_, _cancelled_by_developer_
| | **subscription_expires_at** | ISO 8601 date | Date d'expiration de l'abonnement. Généralement dans le futur. | | **consecutive_payments** | int | Nombre de périodes pendant lesquelles l'utilisateur est abonné sans interruption. Inclut la période en cours. | | **rate_after_first_year** | bool | Booléen indiquant que l'abonnement est éligible à un taux de commission réduit (généralement 15 %) après un an de renouvellement continu. Les taux de commission varient selon l'éligibilité au programme et le pays. Voir [Commission du store et taxes](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue) pour plus de détails. | | **promotional_offer_id** | str | ID de l'offre promotionnelle tel qu'indiqué dans la section Produit de l'Adapty Dashboard. | | **store_offer_category** | str | Peut être _introductory_ ou _promotional_. | | **store_offer_discount_type** | str | Peut être _free_trial_, _pay_as_you_go_ ou _pay_up_front_. | | **paywall_name** | str | Nom du paywall d'où provient la transaction. | | **paywall_revision** | int | Révision du paywall d'où provient la transaction. La valeur est définie à 1. | | **developer_id** | str | ID développeur (SDK) du placement d'où provient la transaction. | | **ab_test_name** | str | Nom du test A/B d'où provient la transaction. | | **ab_test_revision** | int | Révision du test A/B d'où provient la transaction. La valeur est définie à 1. | | **cohort_name** | str | Nom de l'audience à laquelle appartient le profil. | | **profile_event_id** | uuid | ID d'événement unique pouvant être utilisé pour la déduplication. | | **store_country** | str | Le pays transmis par le store. | | **profile_ip_address** | str | IP du profil (peut être IPv4 ou IPv6, IPv4 étant préférée si disponible). Mise à jour à chaque changement d'IP de l'appareil. | | **profile_country** | str | Déterminé par Adapty, à partir de l'IP du profil. | | **profile_total_revenue_usd** | float | Revenu total pour le profil, remboursements inclus. | | **variation_id** | uuid | ID unique du paywall où l'achat a été effectué. | | **access_level_id** | str | ID du niveau d'accès payant. | | **is_active** | bool | Booléen indiquant si le niveau d'accès payant est actif pour le profil. | | **will_renew** | bool | Booléen indiquant si le niveau d'accès payant sera renouvelé. | | **is_refund** | bool | Booléen indiquant si la transaction est remboursée. | | **is_lifetime** | bool | Booléen indiquant si le niveau d'accès payant est à vie. | | **is_in_grace_period** | bool | Booléen indiquant si le profil est en délai de grâce. | | **starts_at** | ISO 8601 date | Date et heure auxquelles le niveau d'accès payant démarre pour l'utilisateur. | | **renewed_at** | ISO 8601 date | Date et heure auxquelles l'accès payant sera renouvelé. | | **expires_at** | ISO 8601 date | Date et heure auxquelles l'accès payant expirera. | | **activated_at** | ISO 8601 date | Date et heure auxquelles l'accès payant a été activé. | | **billing_issue_detected_at** | ISO 8601 date | Date et heure du problème de facturation. | | **profile_has_access_level** | Bool | Booléen indiquant si le profil dispose d'un niveau d'accès actif (webhook uniquement). | Chaque événement possède les propriétés suivantes : `transaction_id, original_transaction_id, purchase_date, original_purchase_date, environment, vendor_product_id, event_datetime, store`. De plus, certains événements ont des propriétés supplémentaires. Pour les événements `subscription_refunded` et `non_subscription_purchase_refunded`, il est obligatoire de fournir les valeurs de `price_usd` et `proceeds_usd` comme propriétés supplémentaires. | Nom de l'événement | Propriétés | | :---------------------------------- | :----------------------------------------------------------- | | **subscription\_initial\_purchase** | price\_usd, proceeds\_usd, subscription\_expires\_at, consecutive\_payments, rate\_after\_first\_year, trial\_duration | | **subscription\_renewed** | price\_usd, proceeds\_usd, subscription\_expires\_at, consecutive\_payments, rate\_after\_first\_year, trial\_duration | | **subscription\_cancelled** | cancellation\_reason, trial\_duration | | **trial\_started** | subscription\_expires\_at, trial\_duration | | **trial\_converted** | price\_usd, proceeds\_usd, subscription\_expires\_at, consecutive\_payments, rate\_after\_first\_year, trial\_duration | | **trial\_cancelled** | cancellation\_reason, trial\_duration | | **non\_subscription\_purchase** | price\_usd, proceeds\_usd | | **billing\_issue\_detected** | subscription\_expires\_at, trial\_duration | | **entered\_grace\_period** | subscription\_expires\_at, trial\_duration | Exemple d'événement ```json title="Json" { "price_usd": 9.99, "proceeds_usd": 6.99, "transaction_id": "1000000628581600", "original_transaction_id": "1000000628581600", "purchase_date": "2020-02-18T18:40:22.000000+0000", "original_purchase_date": "2020-02-18T18:40:22.000000+0000", "environment": "Sandbox", "vendor_product_id": "premium", "event_datetime": "2020-02-18T18:40:22.000000+0000", "store": "app_store" } ``` Adapty envoie les événements à votre serveur et aux systèmes analytiques tiers. La propriété **profile_ip_address** est synchronisée avec l'IP actuelle de l'appareil. Chaque fois que les serveurs Adapty reçoivent des informations du SDK, l'IP est mise à jour si elle diffère de celle enregistrée. --- # File: braze --- --- title: "Braze" description: "Intégrez Braze avec Adapty pour un engagement client et des notifications push sans friction." --- En tant que l'une des meilleures solutions d'engagement client, [Braze](https://www.braze.com/) propose un large éventail d'outils pour les notifications push, l'e-mail, le SMS et la messagerie in-app. En intégrant Adapty à Braze, vous accédez facilement à tous vos événements d'abonnement au même endroit, ce qui vous permet de déclencher des communications automatisées en fonction de ces événements. Adapty fournit un ensemble complet de données pour suivre les [événements d'abonnement](events) de tous les stores au même endroit, et peut être utilisé pour mettre à jour les profils de vos utilisateurs dans Braze. Avec Adapty, vous pouvez facilement observer le comportement de vos abonnés, comprendre leurs préférences et utiliser ces informations pour communiquer avec eux de manière ciblée et efficace. Cette intégration vous permet donc de suivre les événements d'abonnement dans votre tableau de bord Braze et de les associer à vos [campagnes d'acquisition.](https://www.braze.com/product/journey-orchestration) Adapty envoie les événements d'abonnement, les propriétés utilisateur et les achats vers Braze, afin que vous puissiez construire une communication ciblée avec vos clients via les notifications push Braze, après une intégration simple et rapide comme décrit ci-dessous. ## Comment configurer l'intégration Braze \{#how-to-set-up-braze-integration\} Pour intégrer Braze, rendez-vous dans [Integrations -> Braze](https://app.adapty.io/integrations/braze), activez le bouton et remplissez les champs. La première étape du processus d'intégration consiste à fournir les identifiants nécessaires pour établir une connexion entre vos profils Braze et Adapty. Vous aurez besoin de la **REST API Key**, de votre **Braze Instance ID** et des **App IDs** iOS et Android pour que l'intégration fonctionne correctement :
1. La **REST API Key** peut être créée dans **Braze Dashboard** → **Settings** → **API Keys**. Assurez-vous que votre clé dispose de la permission `users.track` lors de sa création :
2. Pour obtenir le **Braze Instance ID**, notez l'URL de votre Braze Dashboard et consultez la section de la [documentation Braze](https://www.braze.com/docs/api/basics/#endpoints) où l'ID d'instance est indiqué. Il doit avoir un format régional tel que US-03, EU-01, etc.
3. Les App IDs iOS et Android se trouvent également dans Braze Dashboard → Settings → API Keys. Copiez-les depuis ici :
## Événements, attributs utilisateur et achats \{#events-user-attributes-and-purchases\}
Sous les identifiants, trois groupes d'événements peuvent être envoyés à Braze depuis Adapty. Activez simplement ceux dont vous avez besoin. Vous pouvez également renommer les événements selon vos besoins avant de les envoyer à Braze. Consultez la liste complète des événements proposés par Adapty [ici](events) :
Adapty enverra les événements d'abonnement et les attributs utilisateur à Braze via une intégration server-to-server, ce qui vous permettra de les consulter dans votre Braze Dashboard et de configurer des campagnes en conséquence.
Pour les événements avec revenus, comme les conversions d'essai et les renouvellements, Adapty enverra ces informations à Braze sous forme d'achats.
[Ici](messaging#event-properties), vous trouverez les spécifications complètes des propriétés d'événements envoyées à Braze.
:::note
Attributs utilisateur utiles
Adapty envoie par défaut certains attributs utilisateur pour l'intégration Braze. Vous pouvez vous référer à la liste ci-dessous pour déterminer lesquels correspondent le mieux à vos besoins.
:::
| Attribut utilisateur | Type | Valeur |
|--------------|----|-----|
| `adapty_customer_user_id` | String | Contient la valeur de l'identifiant unique de l'utilisateur défini par le client. Peut être trouvé à la fois dans le [Dashboard](profiles-crm) Adapty et dans Braze. |
| `adapty_profile_id` | String | Contient la valeur de l'identifiant unique Adapty User Profile ID de l'utilisateur, qui peut être trouvé dans le [Dashboard](profiles-crm) Adapty. |
| `environment` | String | Indique si l'utilisateur opère dans un environnement sandbox ou de production.
Les valeurs sont soit `Sandbox`, soit `Production`
| | `store` | String |Contient le nom du Store utilisé pour effectuer l'achat.
Valeurs possibles :
`app_store` ou `play_store`.
| | `vendor_product_id` | String |Contient la valeur de l'ID de produit dans le store Apple/Google.
ex. : org.locals.12345
| | `subscription_expires_at` | String |Contient la date d'expiration du dernier abonnement.
Le format de la valeur est :
YYYY-MM-DDTHH:mm:ss.SSS+TZ
ex. : 2023-02-15T17:22:03.000+0000
| | `active_subscription` | String | La valeur sera définie à `true` lors de tout événement d'achat/renouvellement, ou `false` si l'abonnement est expiré. | | `period_type` | String |Indique le dernier type de période pour l'achat ou le renouvellement.
Les valeurs possibles sont
`trial` pour une période d'essai ou `normal` pour le reste.
| Toutes les valeurs flottantes seront arrondies à l'entier. Les chaînes restent inchangées. En plus de la liste prédéfinie de tags disponibles, il est possible d'envoyer des [attributs personnalisés](segments#custom-attributes) via des tags. Cela offre plus de flexibilité dans le type de données pouvant être incluses dans le tag et peut être utile pour suivre des informations spécifiques liées à un produit ou un service. Tous les attributs utilisateur personnalisés sont envoyés automatiquement à Braze si l'utilisateur coche la case **Send user attributes** sur [la page d'intégration](https://app.adapty.io/integrations/braze). ## Configuration du SDK \{#sdk-configuration\} Pour lier les profils utilisateur dans Adapty et Braze, vous devez soit configurer le SDK Braze avec le même identifiant utilisateur client que dans Adapty, soit utiliser sa méthode `.changeUser()` :
2. Activez le bouton de l'intégration.
3. Saisissez votre **OneSignal App ID**.
Pour configurer l'intégration avec OneSignal, accédez à [Integrations -> OneSignal](https://app.adapty.io/integrations/onesignal) dans votre Adapty Dashboard, activez le bouton 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**.
2. Copiez votre **OneSignal App ID** et collez-le dans le champ **App ID** de l'Adapty Dashboard.
Vous trouverez plus d'informations sur l'identifiant OneSignal dans la [documentation suivante](https://documentation.onesignal.com/docs/en/keys-and-ids).
### Configurer les é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).
Adapty envoie les événements d'abonnement à OneSignal via une intégration serveur-à-serveur, vous permettant de suivre toute l'activité liée aux abonnements dans OneSignal.
:::warning
À partir du 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 les [tarifs OneSignal](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 les tags générés par Adapty et tous les tags existants dans OneSignal. Dépasser cette limite peut provoquer des erreurs lors de l'envoi des événements.
:::
| Tag | Type | Description |
|---|----|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `adapty_customer_user_id` | String | L'identifiant unique de l'utilisateur dans votre application. Il doit être cohérent dans votre système, Adapty et OneSignal. |
| `adapty_profile_id` | String | L'identifiant de 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 l'app 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 d'événements Adapty](events).
1. L'**App ID** se trouve dans votre tableau de bord Pushwoosh.
2. L'**Auth token** se trouve dans la section API Access des paramètres Pushwoosh.
## Événements et tags \{#events-and-tags\}
Sous les identifiants, vous trouverez trois groupes d'événements que vous pouvez envoyer à Pushwoosh depuis Adapty. Activez simplement ceux dont vous avez besoin. Vous pouvez également renommer les événements selon vos besoins avant de les envoyer à Pushwoosh. Consultez la liste complète des événements proposés par Adapty [ici](events).
Adapty enverra les événements d'abonnement à Pushwoosh via une intégration serveur à serveur, ce qui vous permettra de consulter tous les événements d'abonnement dans votre Pushwoosh Dashboard.
:::note
Tags personnalisés
Avec Adapty, vous pouvez également utiliser vos propres tags personnalisés pour l'intégration Pushwoosh. Vous pouvez vous référer à la liste de tags ci-dessous pour déterminer lequel convient le mieux à vos besoins.
:::
| Tag | Type | Valeur |
|---|----|-----|
| `adapty_customer_user_id` | String | Contient la valeur de l'identifiant unique de l'utilisateur, qui peut être trouvé côté Pushwoosh. |
| `adapty_profile_id` | String | Contient la valeur de l'identifiant unique du profil utilisateur Adapty, que vous pouvez retrouver dans votre [tableau de bord](profiles-crm) Adapty. |
| `environment` | String | Indique si l'utilisateur opère dans un environnement sandbox ou de production.
Les valeurs possibles sont `Sandbox` ou `Production`.
| | `store` | String |Contient le nom du store utilisé pour effectuer l'achat.
Valeurs possibles :
`app_store` ou `play_store`.
| | `vendor_product_id` | String |Contient la valeur de l'ID produit dans le store Apple/Google.
Ex. : org.locals.12345
| | `subscription_expires_at` | String |Contient la date d'expiration du dernier abonnement.
Format de la valeur :
année-mois jourTheure:minute:seconde
Ex. : 2023-02-10T17:22:03.000000+0000
| | `last_event_type` | String | Indique le type du dernier événement reçu parmi les [événements Adapty](events) standard que vous avez activés pour l'intégration. | | `purchase_date` | String |Contient la date de la dernière transaction (achat initial ou renouvellement).
Format de la valeur :
année-mois jourTheure:minute:seconde
Ex. : 2023-02-10T17:22:03.000000+0000
| | `original_purchase_date` | String |Contient la date du premier achat selon la transaction.
Format de la valeur :
année-mois jourTheure:minute:seconde
Ex. : 2023-02-10T17:22:03.000000+0000
| | `active_subscription` | String | La valeur sera définie sur `true` lors de tout événement d'achat ou de renouvellement, ou sur `false` si l'abonnement est expiré. | | `period_type` | String |Indique le dernier type de période pour l'achat ou le renouvellement.
Valeurs possibles :
`trial` pour une période d'essai ou `normal` pour le reste.
| Toutes les valeurs flottantes seront arrondies à des entiers. Les chaînes restent inchangées. En plus de la liste prédéfinie de tags disponibles, il est possible d'envoyer des [attributs personnalisés](segments#custom-attributes) via des tags. Cela offre plus de flexibilité dans le type de données pouvant être incluses avec le tag et peut s'avérer utile pour suivre des informations spécifiques liées à un produit ou service. Tous les attributs utilisateur personnalisés sont envoyés automatiquement à Pushwoosh si l'utilisateur coche la case **Send user custom attributes** sur [la page d'intégration](https://app.adapty.io/integrations/pushwoosh). ## Configuration du SDK \{#sdk-configuration\} Pour relier Adapty à Pushwoosh, vous devez nous envoyer la valeur `HWID` :
2. Donnez-lui un nom quelconque (`Adapty` par exemple) et ajoutez-la à votre espace de travail :
### 2\. Accorder la permission de publier et obtenir un token pour votre application \{#2-give-permission-to-post-and-get-a-token-for-your-app\}
Vous serez redirigé vers la page de votre application dans Slack.
1. Faites défiler vers le bas et cliquez sur **Permissions** :
2. Après la redirection, faites défiler vers le bas jusqu'à **Scopes** et cliquez sur **Add an OAuth Scope** :
3. Accordez les permissions `chat:write`, `chat:write.public` et `chat:write.customize`. Celles-ci sont nécessaires pour publier dans vos canaux et personnaliser les messages :
4. Remontez en haut de la page et cliquez sur **Install to Workspace** :
5. Cliquez sur **Allow** ici :
Après cela, vous serez redirigé vers la même page, mais un token OAuth sera disponible (`xoxb-...`). C'est exactement ce qu'il faut pour finaliser la configuration :
### 3\. Configurer l'intégration dans Adapty \{#3-configure-the-integration-in-adapty\}
1. Rendez-vous dans [**Integrations** → **Slack**](https://app.adapty.io/integrations/slack) :
2. Collez le token `xoxb-...` de l'étape précédente et choisissez les canaux dans lesquels l'application publiera. Vous pouvez configurer l'intégration pour recevoir les événements uniquement en production, en sandbox, ou dans les deux environnements. Vous pouvez également choisir la devise dans laquelle publier (devise d'origine ou convertie en USD).
:::note
Si vous souhaitez que les messages d'Adapty soient publiés dans un canal privé, vous devrez ajouter manuellement l'application `Adapty` que vous avez créée dans Slack à ce canal. Sans cela, cela ne fonctionnera pas.
:::
3. Enfin, vous pouvez choisir les événements que vous souhaitez recevoir sous **Events** :
Tout est prêt !
Les événements seront envoyés dans les canaux que vous avez spécifiés. Vous pourrez voir le revenu lorsque cela est applicable et consulter le profil client dans Adapty :
---
# File: webhook-and-etl
---
---
title: "Webhook et intégrations ETL"
description: "Configurez l'intégration webhook et ETL pour un suivi avancé des événements d'abonnement."
---
Consultez les guides étape par étape d'Adapty pour intégrer le SDK Adapty avec les options webhook et ETL telles qu'Amazon S3 et Google Cloud Storage.
Avec l'intégration webhook, vous pouvez recevoir des notifications en temps réel concernant les actions et événements des utilisateurs. Ces notifications peuvent être personnalisées et envoyées vers un endpoint de votre choix, ce qui vous permet de surveiller et d'analyser facilement les données de votre application. Consultez la documentation suivante pour en savoir plus sur l'intégration webhook d'Adapty et comment la mettre en œuvre dans votre application :
- [Webhook](webhook)
Adapty propose une fonctionnalité pratique permettant la livraison automatique de toutes les données de transactions liées à votre application. Grâce à cette fonctionnalité, vous pouvez exporter sans effort vos données de transactions vers différents fournisseurs de stockage cloud sur une base quotidienne. Les données sont téléchargées sous forme de fichier .csv compressé au format gzip, ce qui permet un stockage et une analyse efficaces des informations. Découvrez comment gérer efficacement vos données et simplifier votre gestion des données en suivant nos guides faciles à utiliser :
- [Amazon S3](s3-exports)
- [Google Cloud Storage](google-cloud-storage)
---
# File: s3-exports
---
---
title: "Amazon S3"
description: "Exportez les données d'abonnement vers S3 pour des analyses et des rapports avancés."
---
L'intégration d'Adapty avec Amazon S3 vous permet de stocker les données d'événements et de visites de paywall de façon sécurisée en un seul endroit centralisé. Vous pouvez enregistrer vos [événements d'abonnement](events) dans votre bucket Amazon S3 sous forme de fichiers .csv.
Pour configurer cette intégration, vous devrez suivre quelques étapes simples dans la console AWS et dans l'Adapty Dashboard.
:::note
Planification
Adapty envoie vos données toutes les **24h** à 4h00 UTC.
Chaque fichier contiendra les données des événements créés au cours de l'intégralité de la journée calendaire précédente en UTC. Par exemple, les données exportées automatiquement à 4h00 UTC le 8 mars contiendront tous les événements créés le 7 mars de 00:00:00 à 23:59:59 UTC.
:::
## Comment configurer l'intégration Amazon S3 \{#how-to-set-up-amazon-s3-integration\}
Pour commencer à recevoir des données, vous aurez besoin des identifiants suivants :
1. Access key ID
2. Secret access key
3. S3 bucket name
4. Folder name inside the S3 bucket
:::note
Répertoires imbriqués
Vous pouvez spécifier des répertoires imbriqués dans le champ Amazon S3 bucket name, par exemple : adapty-events/com.sample-app
:::
Pour intégrer Amazon S3, rendez-vous dans [**Integrations** -> **Amazon S3**](https://app.adapty.io/integrations/s3), activez le bouton (de off à on) et renseignez les champs.
Commencez par saisir vos identifiants afin d'établir la connexion entre Amazon S3 et les profils Adapty.
Dans l'Adapty Dashboard, les champs suivants sont nécessaires pour configurer la connexion :
| Champ | Description |
| :--------------------------- | :----------------------------------------------------------- |
| **Access Key ID** | Un identifiant unique utilisé pour authentifier l'accès d'un utilisateur ou d'une application à un service AWS. Cet identifiant se trouve dans le [fichier csv](s3-exports#how-to-create-amazon-s3-credentials) téléchargé. |
| **Secret Access Key** | Une clé privée utilisée conjointement avec l'Access Key ID pour authentifier l'accès d'un utilisateur ou d'une application à un service AWS. Cette clé se trouve dans le [fichier csv](s3-exports#how-to-create-amazon-s3-credentials) téléchargé. |
| **S3 Bucket Name** | Un nom unique au niveau mondial qui identifie un bucket S3 spécifique dans le cloud AWS. Les buckets S3 sont un service de stockage simple permettant aux utilisateurs de stocker et de récupérer des objets de données, tels que des fichiers et des images, dans le cloud. |
| **Folder Inside the Bucker** | Le nom du dossier que vous souhaitez créer dans le bucket S3 sélectionné. Notez que S3 simule les dossiers en utilisant des préfixes de clé d'objet, qui correspondent essentiellement à des noms de dossiers. |
## Comment créer des identifiants Amazon S3 \{#how-to-create-amazon-s3-credentials\}
Ce guide vous aidera à créer les identifiants nécessaires dans votre AWS Console.
### 1\. Créer une politique d'accès \{#create-access-policy\}
Commencez par accéder au [tableau de bord des politiques IAM](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/policies) dans votre console AWS et sélectionnez l'option **Create Policy**.
Dans l'éditeur de politiques, collez le JSON suivant et remplacez `adapty-s3-integration-test` par le nom de votre bucket :
```json showLineNumbers title="Json"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListObjectsInBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
},
{
"Sid": "AllowAllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": [
"arn:aws:s3:::adapty-s3-integration-test/*",
"arn:aws:s3:::adapty-s3-integration-test"
]
},
{
"Sid": "AllowBucketLocation",
"Effect": "Allow",
"Action": "s3:GetBucketLocation",
"Resource": "arn:aws:s3:::adapty-s3-integration-test"
}
]
}
```
Une fois la configuration de la politique terminée, vous pouvez ajouter des tags (facultatif), puis cliquer sur **Next** pour passer à l'étape finale. Dans cette étape, nommez votre politique et cliquez sur **Create policy** pour finaliser la création.
### 2\. Créer un utilisateur IAM \{#2-create-iam-user\}
Pour permettre à Adapty de téléverser des rapports de données brutes dans votre bucket, vous devrez lui fournir l'Access Key ID et la Secret Access Key d'un utilisateur disposant d'un accès en écriture sur le bucket concerné.
Pour ce faire, accédez à la console IAM et sélectionnez la [section Utilisateurs](https://console.aws.amazon.com/iamv2/home#/users). Cliquez ensuite sur le bouton **Add users**.
Donnez un nom à l'utilisateur, choisissez **Access key – Programmatic access**, puis passez aux permissions.
Pour l'étape suivante, sélectionnez l'option **Add user to group**, puis cliquez sur le bouton **Create group**.
Ensuite, vous devez attribuer un nom à votre groupe d'utilisateurs et sélectionner la politique que vous avez créée précédemment. Une fois la politique sélectionnée, cliquez sur le bouton **Create group** pour finaliser le processus.
Une fois le groupe créé avec succès, veuillez **le sélectionner** et passer à l'étape suivante.
Comme il s'agit de la dernière étape de cette section, vous pouvez continuer en cliquant simplement sur le bouton **Create User**.
Enfin, vous pouvez soit **télécharger les identifiants au format .csv**, soit les copier-coller directement depuis le tableau de bord.
## Export manuel des données \{#manual-data-export\}
En plus de l'export automatique des données d'événements vers Amazon S3, Adapty propose également une fonctionnalité d'export manuel de fichiers. Grâce à cette fonctionnalité, vous pouvez sélectionner un intervalle de temps spécifique pour les données d'événements et les exporter manuellement vers votre bucket S3. Cela vous offre un meilleur contrôle sur les données que vous exportez et sur le moment où vous les exportez.
La plage de dates spécifiée sera utilisée pour exporter les événements créés entre la date A à 00:00:00 UTC et la date B à 23:59:59 UTC.
## Structure de la table \{#table-structure\}
Dans l'intégration AWS S3, Adapty fournit une table pour stocker les données historiques des événements de transaction et des visites de paywall. La table contient des informations sur le profil utilisateur, les revenus et les produits, ainsi que le store d'origine, entre autres données. Ces tables enregistrent essentiellement toutes les transactions générées par une application pour une période donnée.
:::warning
Notez que cette structure peut évoluer au fil du temps — de nouvelles données peuvent être introduites par nous ou par les tiers avec lesquels nous travaillons. Assurez-vous que votre code qui la traite est suffisamment robuste et s'appuie sur des champs spécifiques, mais pas sur la structure dans son ensemble.
:::
Voici la structure du tableau pour les événements :
:::note
Adapty convertit les autres devises en USD au taux de change de [currencylayer.com](https://currencylayer.com/) (actualisé toutes les 8 heures). Le taux est **fixé au moment de la transaction** — les variations ultérieures n'affectent pas le résultat de la conversion.
:::
| Colonne | Description |
|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **profile_id** | ID utilisateur Adapty. |
| **event_type** | Nom de l'événement en minuscules. Consultez la section [Événements](events) pour connaître les types d'événements. |
| **event_datetime** | Date au format ISO 8601. |
| **transaction_id** | Identifiant unique d'une transaction, comme un achat ou un renouvellement. |
| **original_transaction_id** | Identifiant de transaction de l'achat d'origine. |
| **subscription_expires_at** | Date d'expiration de l'abonnement. Généralement dans le futur. |
| **environment** | Peut être Sandbox ou Production. |
| **revenue_usd** | Revenu en USD. Peut être vide. |
| **proceeds_usd** | Recettes en USD. Peut être vide. |
| **net_revenue_usd** | Revenu net (après taxes) en USD. Peut être vide. |
| **tax_amount_usd** | Montant déduit pour les taxes en USD. Peut être vide. |
| **revenue_local** | Revenu en devise locale. Peut être vide. |
| **proceeds_local** | Recettes en devise locale. Peut être vide. |
| **net_revenue_local** | Revenu net (après taxes) en devise locale. Peut être vide. |
| **tax_amount_local** | Montant déduit pour les taxes en devise locale. Peut être vide. |
| **customer_user_id** | ID utilisateur développeur. Par exemple, il peut s'agir de votre UUID utilisateur, d'un e-mail ou de tout autre identifiant. Null si vous ne l'avez pas défini. |
| **store** | Peut être _app_store_ ou _play_store_. |
| **product_id** | ID du produit dans l'Apple App Store, le Google Play Store ou Stripe. |
| **base_plan_id** | [ID du plan de base](https://support.google.com/googleplay/android-developer/answer/12154973) dans le Google Play Store ou [ID de prix](https://docs.stripe.com/products-prices/how-products-and-prices-work#use-products-and-prices) dans Stripe. |
| **developer_id** | ID développeur (SDK) du paywall depuis lequel la transaction est originaire. |
| **ab_test_name** | Nom du test A/B depuis lequel la transaction est originaire. |
| **ab_test_revision** | Révision du test A/B depuis lequel la transaction est originaire. |
| **paywall_name** | Nom du paywall depuis lequel la transaction est originaire. |
| **paywall_revision** | Révision du paywall depuis lequel la transaction est originaire. |
| **profile_county** | Pays du profil déterminé par Adapty, d'après l'adresse IP. |
| **install_date** | Date d'installation au format ISO 8601. |
| **idfv** | [identifierForVendor](https://developer.apple.com/documentation/uikit/uidevice/identifierforvendor) sur les appareils iOS |
| **idfa** | [advertisingIdentifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/advertisingidentifier) sur les appareils iOS |
| **advertising_id** | L'Advertising ID est un code unique attribué par le système d'exploitation Android que les annonceurs peuvent utiliser pour identifier de manière unique l'appareil d'un utilisateur. |
| **ip_address** | IP de l'appareil (peut être IPv4 ou IPv6, IPv4 étant préférée lorsqu'elle est disponible). Elle est mise à jour à chaque changement d'adresse IP de l'appareil. |
| **cancellation_reason** | Raison pour laquelle l'utilisateur a annulé un abonnement.
Peut être :
**iOS & Android** _voluntarily_cancelled_, _billing_error_, _refund_
**iOS** _price_increase_, _product_was_not_available_, _unknown_, _upgraded_
**Android** _new_subscription_replace_, _cancelled_by_developer_
| | **android_app_set_id** | Un [AppSetId](https://developer.android.com/design-for-safety/privacy-sandbox/reference/adservices/appsetid/AppSetId) - ID réinitialisable par l'utilisateur, unique par appareil et par compte développeur, destiné aux cas d'usage publicitaires non monétisants. | | **android_id** | Sur Android 8.0 (niveau d'API 26) et versions supérieures, un nombre 64 bits (exprimé en chaîne hexadécimale), unique pour chaque combinaison de clé de signature d'application, d'utilisateur et d'appareil. Pour plus de détails, voir la [documentation Android developer](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID). | | **device** | Nom du modèle d'appareil visible par l'utilisateur final. | | **currency** | Code devise à 3 lettres (ISO-4217) de la transaction. | | **store_country** | Pays du profil déterminé par le store Apple/Google. | | **attribution_source** | Source d'attribution. | | **attribution_network_user_id** | ID attribué à l'utilisateur par la source d'attribution. | | **attribution_status** | Peut être organic, non_organic ou unknown. | | **attribution_channel** | Nom du canal marketing. | | **attribution_campaign** | Nom de la campagne marketing. | | **attribution_ad_group** | Groupe d'annonces d'attribution. | | **attribution_ad_set** | Ensemble d'annonces d'attribution. | | **attribution_creative** | Mot-clé créatif d'attribution. | | **attributes** | JSON des [attributs utilisateur personnalisés](setting-user-attributes#custom-user-attributes). Inclut tous les attributs personnalisés que vous avez configurés pour les envoyer depuis votre application mobile. Pour les envoyer, activez l'option **Send User Attributes** sur la page [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook). | | **integration_ids** | Tous les IDs d'intégration associés à un profil. Dictionnaire. Exemple : {'mixpanel_user_id': 'mixpanelUserId-test', 'facebook_anonymous_id': 'facebookAnonymousId-test'} | Voici la structure du tableau pour les visites de paywall : | Colonne | Description | | :-------------------- | :------------------------------------------------------------------------------------------------------------------------- | | **profile_id** | Identifiant utilisateur Adapty. | | **customer_user_id** | Identifiant utilisateur développeur. Par exemple, il peut s'agir d'un UUID, d'un e-mail ou de tout autre identifiant. Null si non défini. | | **profile_country** | Pays du profil déterminé par le store Apple/Google. | | **install_date** | Date ISO 8601 de l'installation. | | **store** | Peut être _app_store_ ou _play_store_. | | **paywall_showed_at** | La date à laquelle le paywall a été affiché au client. | | **developer_id** | Identifiant développeur (SDK) du paywall d'où provient la transaction. | | **ab_test_name** | Nom du test A/B d'où provient la transaction. | | **ab_test_revision** | Révision du test A/B d'où provient la transaction. | | **paywall_name** | Nom du paywall d'où provient la transaction. | | **paywall_revision** | Révision du paywall d'où provient la transaction. | ## Événements et tags \{#events-and-tags\} Vous pouvez gérer les données transmises par l'intégration. Celle-ci propose les options de configuration suivantes : | Paramètre | Description | | :--------------------------------- | :----------------------------------------------------------- | | **Exclude Historical Events** | Choisissez d'exclure les événements survenus avant que l'utilisateur ait installé l'application avec le SDK Adapty. Cela évite la duplication des événements et garantit des rapports précis. Par exemple, si un utilisateur a activé un abonnement mensuel le 10 janvier et mis à jour l'application avec le SDK Adapty le 6 mars, Adapty ignorera les événements antérieurs au 6 mars et conservera les événements suivants. | | **Include events without profile** | Choisissez d'inclure les transactions qui ne sont pas liées à un profil utilisateur dans Adapty. Il peut s'agir d'achats effectués avant l'installation du SDK Adapty ou de transactions reçues depuis les notifications du serveur du store qui ne peuvent pas être immédiatement associées à un utilisateur spécifique. | | **Send User Attributes** | Si vous souhaitez envoyer des attributs spécifiques à l'utilisateur, comme les préférences de langue, et que votre forfait OneSignal prend en charge plus de 10 tags, sélectionnez cette option. L'activer permet d'inclure des informations supplémentaires au-delà des 10 tags par défaut. Notez que dépasser les limites de tags peut entraîner des erreurs. |
Sous les paramètres d'intégration, vous trouverez trois groupes d'événements que vous pouvez exporter, envoyer et stocker dans Amazon S3 depuis Adapty. Activez simplement ceux dont vous avez besoin. Consultez la liste complète des événements proposés par Adapty [ici](events).
---
# File: google-cloud-storage
---
---
title: "Google Cloud Storage"
description: "Intégrez Google Cloud Storage avec Adapty pour un stockage sécurisé des données."
---
Activez l'intégration Google Cloud Storage pour stocker de manière sécurisée les [événements d'abonnement](events) et les [données de visites de paywall](paywall-metrics) dans un emplacement centralisé : votre bucket Google Cloud Storage.
Chaque jour à 4h00 UTC, Adapty téléverse des fichiers .csv contenant les données de la veille vers vos buckets. Vous pouvez choisir de recevoir les données d'**événements**, les données de **visites de paywall**, ou **les deux**. Vous pouvez également exporter ces données [manuellement](#manual-data-export) à tout moment, pour n'importe quelle période.
Pour configurer l'intégration, [générez une clé d'accès au bucket](#create-google-cloud-storage-credentials) dans votre console Google Cloud, puis [ajoutez-la dans vos paramètres Adapty](#set-up-google-cloud-storage-integration).
## Calendrier et durée des téléversements \{#upload-schedule-and-duration\}
Adapty téléverse les données vers Google Cloud Storage toutes les 24 heures, à 04:00 UTC.
Les fichiers contiennent les données des événements créés durant le jour calendaire précédent (UTC). Le fichier téléversé le 8 mars contiendra tous les événements créés le 7 mars, de 00:00:00 à 23:59:59 UTC.
Le processus peut prendre jusqu'à plusieurs heures selon le nombre total de fichiers en attente et la quantité de données que vous avez personnellement demandée. Si Adapty inclut des données historiques dans votre premier téléversement, celui-ci sera plus long que les téléversements quotidiens suivants.
## Configurer l'intégration Google Cloud Storage \{#set-up-google-cloud-storage-integration\}
Vous devez disposer d'une clé de compte de service Google Cloud valide avec un **accès en écriture**. Pour la générer, suivez les étapes de la section [créer des identifiants](#create-google-cloud-storage-credentials).
:::warning
Vous pouvez utiliser des buckets différents avec des identifiants différents pour les événements et les visites de paywall. Cependant, si **l'un ou l'autre** ensemble d'identifiants est invalide, [**les deux téléversements échoueront**](#troubleshooting).
:::
Accédez à [**Integrations** -> **Google Cloud Storage**](https://app.adapty.io/integrations/google-cloud-storage), puis ouvrez l'onglet souhaité (**Events** ou **Paywall visits**). Activez l'intégration.
Téléversez le fichier contenant votre **clé de compte de service Google Cloud**. Indiquez le **bucket** et le **dossier** cibles. Enregistrez vos modifications.
### Paramètres optionnels pour les données d'événements \{#optional-settings-for-event-data\}
Vous pouvez spécifier les événements à inclure dans le rapport et définir des noms personnalisés pour ces événements. Consultez l'article [événements](events) pour la liste complète des événements disponibles.
| Nom | Valeur par défaut | Description |
| ------------------------------ | ----------------- | ----------- |
| Exclude historical events | true | Exclure les informations sur les événements survenus avant l'intégration du SDK Adapty dans votre application. Un utilisateur a souscrit un abonnement mensuel le 10 janvier. La mise à jour du 1er mars de votre application est la première à inclure le SDK Adapty.
Si ce paramètre est **activé**, le rapport n'inclura ni l'événement « abonnement démarré » de janvier, ni l'événement « renouvellement d'abonnement » de février. Il **inclura** l'événement « renouvellement d'abonnement » du 10 mars.
La raison pour laquelle l'utilisateur a annulé un abonnement.
Valeurs possibles :
**iOS & Android** — *voluntarily_cancelled*, *billing_error*, *refund*
**iOS uniquement** — *price_increase*, *product_was_not_available*, *unknown*, *upgraded*
**Android uniquement** — *new_subscription_replace*, *cancelled_by_developer*
| | **android_app_set_id** | Un [AppSetId](https://developer.android.com/design-for-safety/privacy-sandbox/reference/adservices/appsetid/AppSetId) - identifiant réinitialisable par l'utilisateur, unique par appareil et par compte développeur, destiné aux cas d'utilisation publicitaires non monétaires. | | **android_id** | Sur Android 8.0 (API niveau 26) et les versions supérieures de la plateforme, un nombre de 64 bits (exprimé sous forme de chaîne hexadécimale), unique pour chaque combinaison de clé de signature d'application, d'utilisateur et d'appareil. Pour plus de détails, consultez la [documentation développeur Android](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID). | | **device** | Le nom du modèle d'appareil visible par l'utilisateur final. | | **currency** | Le code de devise à 3 lettres (ISO-4217) de la transaction. | | **store_country** | Pays du profil déterminé par le store Apple/Google. | | **attribution_source** | Source d'attribution. | | **attribution_network_user_id** | Identifiant attribué à l'utilisateur par la source d'attribution. | | **attribution_status** | Peut être organic, non_organic ou unknown. | | **attribution_channel** | Nom du canal marketing. | | **attribution_campaign** | Nom de la campagne marketing. | | **attribution_ad_group** | Groupe d'annonces d'attribution. | | **attribution_ad_set** | Ensemble d'annonces d'attribution. | | **attribution_creative** | Mot-clé créatif d'attribution. | | **attributes** | JSON des [attributs utilisateur personnalisés](setting-user-attributes#custom-user-attributes). Cela inclut tous les attributs personnalisés que vous avez configurés pour être envoyés depuis votre application mobile. Pour l'activer, activez l'option **Send User Attributes** dans la page [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook). | | **integration_ids** | Tous les identifiants d'intégration associés à un profil. Dictionnaire. Exemple : {'mixpanel_user_id': 'mixpanelUserId-test', 'facebook_anonymous_id': 'facebookAnonymousId-test'} | ### Visites de paywall \{#paywall-visits\} | Colonne | Description | | :-------------------- | :----------------------------------------------------------------------------------------------------------- | | **profile_id** | Identifiant utilisateur Adapty. | | **customer_user_id** | Identifiant utilisateur développeur. Par exemple, il peut s'agir de votre UUID utilisateur, email, ou tout autre identifiant. Null si vous ne l'avez pas défini. | | **profile_country** | Pays du profil déterminé par le store Apple/Google. | | **install_date** | Date ISO 8601 de l'installation. | | **store** | Peut être *app_store* ou *play_store*. | | **paywall_showed_at** | La date à laquelle le paywall a été affiché à l'utilisateur. | | **developer_id** | Identifiant développeur (SDK) du paywall depuis lequel la transaction est originaire. | | **ab_test_name** | Nom du test A/B depuis lequel la transaction est originaire. | | **ab_test_revision** | Révision du test A/B depuis lequel la transaction est originaire. | | **paywall_name** | Nom du paywall depuis lequel la transaction est originaire. | | **paywall_revision** | Révision du paywall depuis lequel la transaction est originaire. | ## Dépannage \{#troubleshooting\} Adapty vérifie la validité de vos clés d'accès **avant** de commencer le téléversement. Même si une seule de vos clés Google Cloud Storage est invalide, Adapty **interrompt le téléversement** et génère une erreur. Pour garantir des téléversements ininterrompus, remplacez vos clés avant leur expiration. Si vous mettez à jour la clé pour les **événements**, n'oubliez pas de mettre à jour également la clé pour les **visites de paywall**, et vice versa. --- # File: webhook --- --- title: "Intégration Webhook" description: "Intégrez les webhooks dans Adapty pour automatiser le suivi des événements d'abonnement." --- Un webhook est un moyen efficace de recevoir des notifications en temps réel sur les [événements](webhook-event-types-and-fields#webhook-event-types), notamment pour suivre les changements d'abonnements et d'achats. Cela vous permet de surveiller le statut des abonnés et d'y réagir en conséquence. Contrairement aux requêtes API qui nécessitent une interrogation constante, un webhook se configure une seule fois et envoie automatiquement des données via HTTP lorsqu'un événement se produit. :::tip Vous configurez ceci avec un agent de codage IA ? Consultez [Gérer les événements d'abonnement Adapty avec des webhooks](handle-webhooks-with-ai) pour un guide complet sur une seule page. ::: Avec les webhooks intégrés, vous pouvez : - Suivre les abonnements et les achats dans votre système backend. - Automatiser les processus et les workflows en fonction des cycles de vie des abonnements. - Interagir avec les abonnés en leur rappelant les avantages de l'application, en traitant les décisions de désabonnement et en gérant les problèmes de facturation. - Effectuer une analyse détaillée du comportement des utilisateurs. **Caractéristiques de l'intégration** | Caractéristique de l'intégration | Description | | :-------------------------------- | :----------------------------------------------------------------- | | Fréquence | Mises à jour en temps réel | | Direction des données | Transmission de données unidirectionnelle : d'Adapty vers votre serveur | | Flux d'intégration Adapty | Les événements sont envoyés par le serveur Adapty dès leur réception | ## Événements envoyés au webhook \{#events-sent-to-webhook\} Vous pouvez consulter tous les types d'événements pouvant être envoyés à un webhook sur la page [Types et champs d'événements webhook](webhook-event-types-and-fields). Vous pouvez tous les envoyer à votre webhook ou n'en choisir que certains. Consultez notre page [Flux d'événements](event-flows) pour décider quels événements sont nécessaires ou non. Vous pouvez désactiver les types d'événements dont vous n'avez pas besoin lors de la [configuration de votre intégration Webhook](set-up-webhook-integration#configure-webhook-integration-in-the-adapty-dashboard). Vous pouvez également y remplacer les identifiants d'événements Adapty par défaut par les vôtres si nécessaire. **Prochaines étapes :** - [Types et champs d'événements webhook](webhook-event-types-and-fields) : Explorez les descriptions détaillées de chaque événement et de leurs champs de données. - [Flux d'événements](event-flows) : Découvrez la séquence des événements et leurs dépendances. - [Configurer l'intégration webhook](set-up-webhook-integration) : Guide pas à pas pour configurer votre webhook dans l'Adapty Dashboard. - [Tester l'intégration webhook](test-webhook) : Vérifiez que votre webhook est correctement configuré grâce à nos outils de test. --- # File: webhook-event-types-and-fields --- --- title: "Types d'événements et champs des webhooks" description: "" --- Adapty envoie des webhooks en réponse aux événements d'abonnement. Cette section définit ces types d'événements ainsi que les données contenues dans chaque webhook. ## Types d'événements webhook \{#webhook-event-types\} Vous pouvez envoyer tous les types d'événements à votre webhook ou n'en choisir que certains. Consultez nos [Flux d'événements](event-flows) pour savoir quel type de données entrantes attendre et comment construire votre logique métier autour de ces données. Vous pouvez désactiver les types d'événements dont vous n'avez pas besoin lors de la [configuration de votre intégration Webhook](set-up-webhook-integration#configure-webhook-integration-in-the-adapty-dashboard). Vous pouvez également y remplacer les ID d'événements Adapty par défaut par les vôtres si nécessaire. | Nom de l'événement | Description | |:-----------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | subscription_started | Déclenché lorsqu'un utilisateur active un abonnement payant sans période d'essai, c'est-à-dire qu'il est facturé immédiatement. | | subscription_renewed | Se produit lors du renouvellement d'un abonnement et de la facturation de l'utilisateur. Cet événement débute à partir de la deuxième facturation, que l'abonnement soit avec ou sans essai. | | subscription_renewal_cancelled | Un utilisateur a désactivé le renouvellement automatique de son abonnement. Il conserve l'accès aux fonctionnalités premium jusqu'à la fin de la période d'abonnement payante. | | subscription_renewal_reactivated | Déclenché lorsqu'un utilisateur réactive le renouvellement automatique de son abonnement. | | subscription_expired | Déclenché lorsqu'un abonnement prend fin après une annulation. Par exemple, si un utilisateur annule son abonnement le 12 décembre mais qu'il reste actif jusqu'au 31 décembre, l'événement est enregistré le 31 décembre à l'expiration de l'abonnement. | | subscription_paused | Se produit lorsqu'un utilisateur active la [mise en pause de l'abonnement](https://developer.android.com/google/play/billing/lifecycle/subscriptions#pause) (Android uniquement). | | subscription_deferred | Déclenché lorsqu'un achat d'abonnement est [différé](https://adapty.io/glossary/subscription-purchase-deferral/), permettant aux utilisateurs de reporter le paiement tout en conservant l'accès aux fonctionnalités premium. Cette fonctionnalité est disponible via l'API Google Play Developer et peut être utilisée pour des essais gratuits ou pour les utilisateurs rencontrant des difficultés financières. | | non_subscription_purchase | Tout achat sans abonnement, tel qu'un accès à vie ou des produits consommables comme des pièces dans un jeu. | | trial_started | Déclenché lorsqu'un utilisateur active un abonnement d'essai. | | trial_converted | Se produit lorsqu'un essai se termine et que l'utilisateur est facturé (premier achat). Par exemple, si un utilisateur a un essai jusqu'au 14 janvier mais est facturé le 7 janvier, cet événement est enregistré le 7 janvier. | | trial_renewal_cancelled | Un utilisateur a désactivé le renouvellement automatique de son abonnement pendant la période d'essai. Il conserve l'accès aux fonctionnalités premium jusqu'à la fin de l'essai, mais ne sera pas facturé et ne démarrera pas d'abonnement. | | trial_renewal_reactivated | Se produit lorsqu'un utilisateur réactive le renouvellement automatique de son abonnement pendant la période d'essai. | | trial_expired | Déclenché lorsqu'un essai se termine sans conversion en abonnement. | | entered_grace_period | Se produit lorsqu'une tentative de paiement échoue et que l'utilisateur entre dans un délai de grâce (si activé). L'utilisateur conserve l'accès premium pendant cette période. | | billing_issue_detected | Déclenché lorsqu'un problème de facturation survient lors d'une tentative de débit (par exemple, solde de carte insuffisant). | | subscription_refunded | Déclenché lorsqu'un abonnement est remboursé (par exemple, par le support Apple). | | non_subscription_purchase_refunded | Déclenché lorsqu'un achat sans abonnement est remboursé. | | access_level_updated | Se produit lorsque le niveau d'accès d'un utilisateur est mis à jour. | :::note `subscription_renewal_reactivated` contient l'identifiant du produit **précédent** — celui qui était actif au moment où l'utilisateur a annulé — même si l'utilisateur a ensuite réactivé son abonnement en achetant un produit différent. Apple conserve le même `original_transaction_id` tout au long de la chaîne annulation → réactivation, de sorte que cet événement reflète le produit d'origine. Le nouveau produit apparaît dans le prochain événement `subscription_renewed`, lorsque la facturation du nouveau produit commence. ::: ## Structure des événements webhook \{#webhook-event-structure\} Adapty vous enverra uniquement les événements que vous avez sélectionnés dans la section **Events names** de la page [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook). Les événements webhook sont sérialisés en JSON. Le corps d'une requête `POST` envoyée à votre serveur contiendra l'événement sérialisé dans la structure ci-dessous. Tous les événements suivent la même structure, mais leurs champs varient selon le type d'événement, le store et votre configuration spécifique. Les attributs utilisateur correspondent aux [attributs utilisateur personnalisés](setting-user-attributes#custom-user-attributes) que vous avez définis, ils contiennent donc ce que vous avez configuré. Les champs de données d'attribution sont identiques pour tous les types d'événements, mais la liste des attributions dépend des sources d'attribution que vous utilisez dans votre application mobile. Voici un exemple d'événement : ```json title="Json" showLineNumbers { "profile_id": "00000000-0000-0000-0000-000000000000", "customer_user_id": "UserIdInYourSystem", "idfv": "00000000-0000-0000-0000-000000000000", "idfa": "00000000-0000-0000-0000-000000000000", "advertising_id": "00000000-0000-0000-0000-000000000000", "profile_install_datetime": "2000-01-31T00:00:00.000000+0000", "user_agent": "ExampleUserAgent/1.0 (Device; OS Version) Browser/Engine", "email": "john.doe@company.com", "event_type": "subscription_started", "event_datetime": "2000-01-31T00:00:00.000000+0000", "event_properties": { "store": "play_store", "currency": "USD", "price_usd": 4.99, "profile_id": "00000000-0000-0000-0000-000000000000", "cohort_name": "All Users", "environment": "Production", "price_local": 4.99, "original_price_usd": 4.99, "original_price_local": 4.99, "discount_amount_usd": 0, "discount_amount_local": 0, "base_plan_id": "b1", "developer_id": "onboarding_placement", "ab_test_name": "onboarding_ab_test", "ab_test_revision": 1, "paywall_name": "UsedPaywall", "proceeds_usd": 4.2315, "variation_id": "00000000-0000-0000-0000-000000000000", "purchase_date": "2024-11-15T10:45:36.181000+0000", "store_country": "AR", "event_datetime": "2000-01-31T00:00:00.000000+0000", "proceeds_local": 4.2415, "tax_amount_usd": 0, "transaction_id": "0000000000000000", "net_revenue_usd": 4.2415, "profile_country": "AR", "paywall_revision": "1", "profile_event_id": "00000000-0000-0000-0000-000000000000", "tax_amount_local": 0, "net_revenue_local": 4.2415, "vendor_product_id": "onemonth_no_trial", "profile_ip_address": "10.10.1.1", "consecutive_payments": 1, "rate_after_first_year": false, "original_purchase_date": "2000-01-31T00:00:00.000000+0000", "original_transaction_id": "0000000000000000", "subscription_expires_at": "2000-01-31T00:00:00.000000+0000", "profile_has_access_level": true, "profile_total_revenue_usd": 4.99, "promotional_offer_id": null, "store_offer_category": null, "store_offer_discount_type": null }, "event_api_version": 1, "profiles_sharing_access_level": [{"profile_id": "00000000-0000-0000-0000-000000000000", "customer_user_id": "UserIdInYourSystem"}], "attributions": { "appsflyer": { "ad_set": "Keywords 1.12", "status": "non_organic", "channel": "Google Ads", "ad_group": null, "campaign": "Social media influencers - Rest of the world", "creative": null, "created_at": "2000-01-31T00:00:00.000000+0000" } }, "user_attributes": {"Favourite_color": "Violet", "Pet_name": "Fluffy"}, "integration_ids": {"firebase_app_instance_id": "val1", "branch_id": "val2", "one_signal_player_id": "val3"}, "play_store_purchase_token": { "product_id": "product_123", "purchase_token": "token_abc_123", "is_subscription": true } } ``` ### Champs d'événement \{#event-fields\} Les paramètres d'événement sont identiques pour tous les types d'événements. | **Champ** | **Type** | **Description** | |---|---|---| | **advertising_id** | UUID | Advertising ID (Android uniquement). | | **attributions** | JSON | [Données d'attribution](webhook-event-types-and-fields#attributions). Inclus si **Send Attribution** est activé dans les [paramètres du Webhook](https://app.adapty.io/integrations/customwebhook). | | **customer_user_id** | String | ID utilisateur de votre application (UUID, e-mail ou autre identifiant) si vous l'avez défini dans le code de votre application lors de [l'identification des utilisateurs](ios-quickstart-identify). Si vous n'identifiez pas les utilisateurs dans le code de l'application ou si cet utilisateur est anonyme (non connecté), ce champ vaut `null`. | | **email** | String | E-mail de l'utilisateur si vous l'avez défini via la méthode [`updateProfile`](setting-user-attributes) du SDK Adapty ou lors de la création/mise à jour de profils via l'API server-side. Si vous ne transmettez pas la valeur `email` au SDK ou à la méthode API, ce champ vaut `null`. | | **event_api_version** | Integer | Version de l'API Adapty (actuelle : `1`). | | **event_datetime** | ISO 8601 | L'heure effective (métier) de l'événement — par exemple la date d'achat pour un achat ou la date d'expiration pour une expiration — et non le moment où Adapty a reçu ou envoyé l'événement. Format [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) (ex. : `2020-07-10T15:00:00.000000+0000`). Voir la note ci-dessous sur l'ordre des événements. | | **event_properties** | JSON | [Propriétés de l'événement](webhook-event-types-and-fields#event-properties). | | **event_type** | String | Nom de l'événement au format Adapty. Consultez les [types d'événements Webhook](webhook-event-types-and-fields#webhook-event-types) pour la liste complète. | | **idfa** | UUID | Advertising ID (Apple uniquement). **IDFA** dans le profil sur l'[Adapty Dashboard](https://app.adapty.io/profiles/users). Peut être `null` si indisponible en raison de restrictions de suivi, du mode enfant ou des paramètres de confidentialité. | | **idfv** | UUID | Identifier for Vendors (IDFV), unique par développeur. **IDFV** dans le profil sur l'[Adapty Dashboard](https://app.adapty.io/profiles/users). | | **integration_ids** | JSON | IDs d'intégration utilisateur si vous les avez définis via la méthode `setIntegrationIdentifier` du SDK Adapty ou lors de la création/mise à jour de profils via l'API server-side. Vaut `null` si indisponible ou si les intégrations sont désactivées. | | **play_store_purchase_token** | JSON | [Token d'achat Play Store](webhook-event-types-and-fields#play-store-purchase-token), inclus si **Send Play Store purchase token** est activé dans les [paramètres du Webhook](https://app.adapty.io/integrations/customwebhook). | | **profile_id** | UUID | ID de profil généré automatiquement par Adapty pour chaque profil. Un même identifiant Apple/Google peut être associé à différents IDs de profil si vous n'identifiez pas les utilisateurs ou autorisez les achats avant la connexion. En savoir [plus sur la façon dont Adapty gère les profils parent/héritier](how-profiles-work#parent-and-inheritor-profiles). | | **profile_install_datetime** | ISO 8601 | Horodatage d'installation au format [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) (ex. : `2020-07-10T15:00:00.000000+0000`). | | **profiles_sharing_access_level** | JSON | Liste des utilisateurs [partageant le niveau d'accès](general#6-sharing-paid-access-between-user-accounts), à l'exclusion du profil utilisateur actuel. Si le partage des niveaux d'accès est activé pour votre application, cette liste inclut les autres profils associés au même identifiant Apple/Google.Bien que les valeurs d'attributs personnalisés dans le code de l'application mobile puissent être définies en tant que flottants ou chaînes, les attributs reçus via l'API server-side ou une importation historique peuvent arriver dans des formats différents. Les valeurs booléennes et entières seront alors converties en flottants.
| :::note `event_datetime` reflète le moment où un événement s'est produit dans le cycle de vie de l'abonnement, et non le moment où Adapty l'a traité ou transmis. Pour cette raison, des événements peuvent partager le même `event_datetime` ou arriver dans le désordre chronologique. Par exemple, un événement `subscription_expired` peut avoir un `event_datetime` antérieur à celui d'un événement `subscription_renewal_cancelled` qu'Adapty lui transmet avant. Ne vous fiez pas à `event_datetime` pour ordonner les événements. Ordonnez-les plutôt selon votre propre heure de réception, et dédoublonnez-les à l'aide de `profile_event_id` ou des identifiants de transaction. ::: ### Attributions \{#attributions\} Pour envoyer les données d'attribution, activez l'option **Send Attribution** sur la page [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook). Si vous avez activé l'envoi des données d'attribution et configuré des [intégrations d'attribution](attribution-integration), les données ci-dessous seront envoyées avec l'événement pour chaque source. Les mêmes données d'attribution sont envoyées pour tous les types d'événements. ```json title="Json" showLineNumbers { "attributions": { "appsflyer": { "ad_set": "sample_ad_set_123", "status": "non_organic", "channel": "sample_channel", "ad_group": "sample_ad_group_456", "campaign": "sample_ios_campaign", "creative": "sample_creative_789", "created_at": "2000-01-31T00:00:00.000000+0000", "network_user_id": "0000000000000-0000000" } } } ``` | Nom du champ | Type de champ | Description | | :------------------ | :------------ | :------------------------------------------------- | | **ad_set** | String | Ensemble d'annonces d'attribution. | | **status** | String | Peut être `organic`, `non_organic,` ou `unknown`. | | **channel** | String | Nom du canal marketing. | | **ad_group** | String | Groupe d'annonces d'attribution. | | **campaign** | String | Nom de la campagne marketing. | | **creative** | String | Mot-clé créatif d'attribution. | | **created_at** | ISO 8601 date | Date et heure de création de l'enregistrement d'attribution. | | **network_user_id** | String | ID attribué à l'utilisateur par la source d'attribution. | ### ID d'intégration \{#integration-ids\} Les ID d'intégration suivants sont désormais utilisés dans les événements : - `adjust_device_id` - `airbridge_device_id` - `amplitude_device_id` - `amplitude_user_id` - `appmetrica_device_id` - `appmetrica_profile_id` - `appsflyer_id` - `branch_id` - `facebook_anonymous_id` - `firebase_app_instance_id` - `mixpanel_user_id` - `pushwoosh_hwid` - `one_signal_player_id` - `one_signal_subscription_id` - `tenjin_analytics_installation_id` - `posthog_distinct_user_id` ### Jeton d'achat Play Store \{#play-store-purchase-token\} Ce champ contient toutes les données nécessaires pour revalider un achat, si besoin. Il n'est envoyé que si l'option **Send Play Store purchase token** est activée dans les [paramètres de l'intégration Webhook](https://app.adapty.io/integrations/customwebhook). | Field | Type | Description | | :------------------ | :------ | :----------------------------------------------------------- | | **product_id** | String | L'identifiant unique du produit (SKU) acheté sur le Play Store. | | **purchase_token** | String | Un token généré par Google Play pour identifier de manière unique cette transaction d'achat. | | **is_subscription** | Boolean | Indique si le produit acheté est un abonnement (`true`) ou un achat unique (`false`). | ### Propriétés des événements \{#event-properties\} Les propriétés des événements peuvent varier selon le type d'événement, et même entre des événements du même type. Par exemple, un événement provenant de l'App Store ne comportera pas les propriétés spécifiques à Android comme `base_plan_id`. L'événement [Niveau d'accès mis à jour](webhook-event-types-and-fields#for-access-level-updated-event) possède des propriétés distinctes, c'est pourquoi nous lui avons consacré une section séparée. De même, nous avons séparé les [Propriétés fiscales et de revenus supplémentaires](webhook-event-types-and-fields#additional-tax-and-revenue-event-properties), car elles sont spécifiques à certains types d'événements seulement. #### Pour la plupart des types d'événements \{#for-most-event-types\} Les propriétés d'événement sont cohérentes pour la plupart des types d'événements (à l'exception de l'événement **Access Level Updated**, décrit dans sa propre section). Voici un tableau complet des propriétés, indiquant celles qui s'appliquent à des événements spécifiques. :::note Adapty convertit les autres devises en USD au taux de change de [currencylayer.com](https://currencylayer.com/) (actualisé toutes les 8 heures). Le taux est **fixé au moment de la transaction** — les variations ultérieures n'affectent pas le résultat de la conversion. ::: | Champ | Type | Description | |:------------------------------|:--------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **ab_test_name** | String | Nom du [test A/B Adapty](ab-tests) dont est issue la transaction. | | **ab_test_revision** | Integer | Révision du test A/B dont est issue la transaction. | | **base_plan_id** | String | [ID du plan de base](https://support.google.com/googleplay/android-developer/answer/12154973) dans le Google Play Store ou [ID de prix](https://docs.stripe.com/products-prices/how-products-and-prices-work#use-products-and-prices) dans Stripe. | | **cancellation_reason** | String |Raisons possibles d'annulation : `voluntarily_cancelled`, `billing_error`, `price_increase`, `product_was_not_available`, `refund`, `cancelled_by_developer`, `new_subscription_replace`, `upgraded`, `unknown`, `adapty_revoked`.
Présent dans les types d'événements suivants :
`subscription_cancelled`, `subscription_refunded` et `trial_cancelled`. | | **cohort_name** | String | Nom de l'[audience](audience) qui a déterminé quel paywall a été affiché à l'utilisateur. | | **consecutive_payments** | Integer | Nombre de périodes durant lesquelles l'utilisateur est abonné sans interruption. Inclut la période en cours. | | **currency** | String | Devise locale. | | **developer_id** | String | ID du [placement](placements) dont est issue la transaction. | | **discount_amount_local** | Float | La remise appliquée à la transaction : le prix standard moins le montant réellement facturé, avant la commission Apple/Google, en devise locale. `0` pour un achat au plein tarif. Pour un essai gratuit, équivaut au prix standard complet (`original_price_local`), rien n'étant facturé. `null` lorsqu'une offre a été appliquée mais que le prix standard est inconnu (voir `original_price_local`). Toujours `null` pour les offres App Store avec paiement anticipé : le montant unique versé couvre plusieurs périodes de facturation et ne peut donc pas être comparé au prix standard par période. | | **discount_amount_usd** | Float | Valeur de `discount_amount_local` en USD. | | **environment** | String | Valeurs possibles : `Sandbox` ou `Production`. | | **event_datetime** | ISO 8601 date | Date et heure de l'événement. Identique à la valeur au niveau racine de l'événement. | | **original_price_local** | Float | Prix standard non remisé du produit avant la commission Apple/Google, en devise locale. Pour les abonnements, il s'agit du prix de renouvellement. Égale `price_local` pour un achat au plein tarif et toujours égale `price_local` pour les achats uniques, les stores ne communiquant pas de prix standard distinct pour ceux-ci. `null` pour un achat remisé lorsque le store ne fournit pas de prix standard fiable (par exemple, le renouvellement automatique est désactivé, le renouvellement est toujours soumis à une offre, ou un changement de produit est en attente). | | **original_price_usd** | Float | Identique à `original_price_local`, en USD. | | **original_purchase_date** | ISO 8601 date | Pour les abonnements récurrents, l'achat d'origine est la première transaction de la chaîne, dont l'ID — appelé ID de transaction d'origine — relie la chaîne de renouvellements ; les transactions ultérieures en sont des extensions. La date d'achat d'origine est la date et l'heure de cette première transaction. | | **original_transaction_id** | String |Pour les abonnements récurrents, il s'agit de l'ID de transaction d'origine qui relie la chaîne de renouvellements. La transaction d'origine est la première de la chaîne ; les transactions ultérieures en sont des extensions.
En l'absence d'extension, `original_transaction_id` correspond à store_transaction_id.
| | **paywall_name** | String | Nom du paywall dont est issue la transaction. | | **paywall_revision** | String | Révision du paywall dont est issue la transaction. La valeur par défaut est 1. | | **price_local** | Float | Montant facturé pour la transaction avant la commission Apple/Google, en devise locale. `null` pour les essais gratuits, rien n'étant facturé. | | **price_usd** | Float | Montant facturé pour la transaction avant la commission Apple/Google, en USD. `null` pour les essais gratuits, rien n'étant facturé. | | **profile_country** | String | Déterminé par Adapty, sur la base de l'IP du profil. | | **profile_event_id** | UUID | ID d'événement unique pouvant être utilisé pour la déduplication. | | **profile_has_access_level** | Boolean | Booléen indiquant si le profil dispose d'un niveau d'accès actif. | | **profile_id** | UUID | ID de profil généré par Adapty. Identique à la valeur au niveau racine de l'événement. | | **profile_ip_address** | String | IP du profil (IPv4 ou IPv6, avec préférence pour IPv4 si disponible). `null` si **Collect users' IP addresses** est désactivé dans les [paramètres de l'application](https://app.adapty.io/settings/general). | | **profile_total_revenue_usd** | Float | Revenus totaux du profil, remboursements déduits. | | **promotional_offer_id** | String | ID Adapty de l'[offre promotionnelle](offers) utilisée. Cet ID est défini lors de la création de l'offre dans le tableau de bord. | | **purchase_date** | ISO 8601 date | Date et heure de l'achat du produit. | | **rate_after_first_year** | Boolean | Booléen indiquant que l'abonnement est éligible à un taux de commission réduit (généralement 15 %) après un an de renouvellement continu. Les taux de commission varient selon l'éligibilité au programme et le pays. Voir [Commission du store et taxes](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue) pour plus de détails. | | **store** | String | Store où le produit a été acheté. Valeurs standard : **app_store**, **play_store**, **stripe**, **paddle**.ID du produit dans l'Apple App Store, le Google Play Store ou Stripe.
Si l'accès a été accordé sans transaction réelle dans un store, `vendor_product_id` prendra l'une des valeurs suivantes :
Pour les abonnements récurrents, il s'agit de l'ID de transaction original qui relie la chaîne de renouvellements. La transaction originale est la première de la chaîne ; les transactions suivantes en sont des extensions.
En l'absence d'extensions, `original_transaction_id` correspond à store_transaction_id.
Identifiant de transaction de l'achat original. | | **paywall_name** | String | Nom du paywall dont est issue la transaction. | | **paywall_revision** | String | Révision du paywall dont est issue la transaction. La valeur par défaut est 1. | | **profile_country** | String | Déterminé par Adapty, d'après l'IP du profil. | | **profile_event_id** | UUID | ID d'événement unique pouvant être utilisé pour la déduplication. | | **profile_has_access_level** | Boolean | Indique si le profil dispose d'un niveau d'accès actif. | | **profile_id** | UUID | ID de profil utilisateur interne Adapty. | | **profile_ip_address** | String | IP du profil (IPv4 ou IPv6, IPv4 étant privilégiée si disponible). `null` si **Collect users' IP addresses** est désactivé dans les [paramètres de l'app](https://app.adapty.io/settings/general). | | **profile_total_revenue_usd** | Float | Revenus totaux du profil, remboursements inclus. | | **purchase_date** | ISO 8601 date | Date et heure de l'achat du produit. | | **renewed_at** | ISO 8601 date | Date et heure de renouvellement de l'accès. | | **starts_at** | ISO 8601 date | Date et heure de début du niveau d'accès. | | **store** | String | Store où le produit a été acheté. Valeurs standard : **app_store**, **play_store**, **stripe**, **paddle**.ID du produit dans le store (Apple/Google/Stripe).
Si l'accès a été accordé sans transaction réelle dans un store, `vendor_product_id` sera l'une des valeurs suivantes :
1. **Vous configurez votre endpoint :** 1. Assurez-vous que votre serveur peut traiter les requêtes Adapty avec l'en-tête **Content-Type** défini sur `application/json`. 2. Configurez votre serveur pour recevoir la requête de vérification d'Adapty et répondre avec n'importe quel statut `2xx` et un corps JSON. 3. [Gérez les événements d'abonnement](#subscription-events) une fois la connexion vérifiée. 2. **Vous configurez et activez l'intégration webhook** dans l'[Adapty Dashboard](#configure-webhook-integration-in-the-adapty-dashboard). Vous pouvez également [mapper les événements Adapty vers des noms d'événements personnalisés](#configure-webhook-integration-in-the-adapty-dashboard). Nous recommandons de tester dans l'**environnement Sandbox** avant de passer en production. 3. **Adapty envoie une requête de vérification** à votre serveur. 4. **Votre serveur répond** avec un statut `2XX` et un corps JSON. 5. **Une fois qu'Adapty reçoit une réponse valide, il commence à envoyer les événements d'abonnement.** ## Configurer votre serveur pour traiter les requêtes Adapty \{#set-up-your-server-to-process-adapty-requests\} Adapty enverra à votre endpoint webhook 2 types de requêtes : 1. [Requête de vérification](#verification-request) : la requête initiale pour vérifier que la connexion est correctement configurée. Cette requête ne contiendra aucun événement et sera envoyée au moment où vous cliquerez sur le bouton **Save** dans l'intégration Webhook de l'Adapty Dashboard. Pour confirmer que votre endpoint a bien reçu la requête de vérification, votre endpoint doit répondre avec la réponse de vérification. 2. [Événement d'abonnement](#subscription-events) : une requête standard qu'Adapty envoie chaque fois qu'un événement est créé dans son système. Votre serveur n'a pas besoin de répondre avec une réponse spécifique. La seule chose dont le serveur Adapty a besoin est de recevoir une réponse HTTP standard avec le code 200 s'il reçoit bien le message. ### Requête de vérification \{#verification-request\} Après avoir activé l'intégration webhook dans l'Adapty Dashboard, Adapty enverra une requête POST de vérification contenant un objet JSON vide `{}` en corps. Configurez votre endpoint pour que l'**en-tête Content-Type** soit `application/json`, c'est-à-dire que l'endpoint de votre serveur doit s'attendre à ce que la requête webhook entrante ait son contenu formaté en JSON. Votre serveur doit répondre avec un code de statut 2xx et envoyer n'importe quelle réponse JSON valide, par exemple : ```json title="Json" {} ``` Une fois qu'Adapty reçoit la réponse de vérification dans le bon format et avec un code de statut 2xx, votre intégration webhook Adapty est entièrement configurée. ### Événements d'abonnement \{#subscription-events\} Les événements d'abonnement sont envoyés avec l'en-tête **Content-Type** défini sur `application/json` et contiennent les données d'événement au format JSON. Pour les types d'événements possibles et les structures de requêtes, consultez [Types d'événements webhook et champs](webhook-event-types-and-fields). ## Configurer l'intégration webhook dans l'Adapty Dashboard \{#configure-webhook-integration-in-the-adapty-dashboard\} Dans Adapty, vous pouvez configurer des flows distincts pour les événements de production et les événements de test reçus depuis l'environnement sandbox d'Apple ou de Stripe, ou depuis un compte de test Google. :::tip Adapty prend en charge une seule URL webhook par environnement (production et sandbox). Pour envoyer des événements à plusieurs services, pointez le webhook vers votre propre backend et distribuez-les depuis là. ::: Pour les événements de production, utilisez le champ **Production endpoint URL** en spécifiant l'URL à laquelle les callbacks seront envoyés. Configurez également le champ **Authorization header value for production endpoint** — l'en-tête que votre serveur utilisera pour authentifier les événements Adapty. Notez que nous utiliserons la valeur spécifiée dans le champ **Authorization header value for production endpoint** comme en-tête `Authorization` exactement telle quelle, sans aucune modification ni ajout. Pour les événements de test, utilisez les champs **Sandbox endpoint URL** et **Authorization header value for sandbox endpoint** en conséquence. Pour configurer l'intégration webhook : 1. Ouvrez [Integrations -> Webhook](https://app.adapty.io/integrations/customwebhook) dans votre Adapty Dashboard.
2. Activez le bouton pour lancer l'intégration.
4. Remplissez les champs d'intégration :
| Champ | Description |
| ------------------------------------------------------ | ------------------------------------------------------------ |
| **Production endpoint URL** | L'URL qu'Adapty utilise pour envoyer des requêtes HTTP POST pour les événements en production. |
| **Authorization header value for production endpoint** | L'en-tête que votre serveur utilisera pour authentifier les requêtes d'Adapty en production. Notez que nous utiliserons la valeur spécifiée dans ce champ comme en-tête `Authorization` exactement telle quelle, sans aucune modification ni ajout.
Bien que non obligatoire, il est vivement recommandé pour une sécurité renforcée.
| De plus, pour vos besoins de test dans l'environnement sandbox, deux autres champs sont disponibles : | Champ de test | Description | | --------------------------------------------------- | ------------------------------------------------------------ | | **Sandbox endpoint URL** | L'URL qu'Adapty utilise pour envoyer des requêtes HTTP POST pour les événements dans l'environnement sandbox. | | **Authorization header value for sandbox endpoint** |L'en-tête que votre serveur utilisera pour authentifier les requêtes d'Adapty lors des tests dans l'environnement sandbox. Notez que nous utiliserons la valeur spécifiée dans ce champ comme en-tête `Authorization` exactement telle quelle, sans aucune modification ni ajout.
Bien que non obligatoire, il est vivement recommandé pour une sécurité renforcée.
| 4. (facultatif) Choisissez les événements que vous souhaitez recevoir et mappez leurs noms. Consultez nos [Flows d'événements](event-flows) pour voir quels événements sont déclenchés dans différentes situations. Si vos identifiants d'événements diffèrent de ceux utilisés dans Adapty, conservez les identifiants de votre système tels quels et remplacez les identifiants d'événements Adapty par défaut par les vôtres dans la section **Events names** de la page [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook). L'identifiant d'événement peut être n'importe quelle chaîne de caractères ; assurez-vous simplement que l'identifiant d'événement dans votre serveur de traitement webhook correspond à celui que vous avez saisi dans l'Adapty Dashboard. Vous ne pouvez pas laisser l'identifiant d'événement vide pour les événements activés.
5. Les champs et options supplémentaires ne sont pas obligatoires ; utilisez-les selon vos besoins :
| Paramètre | Description |
| :--------------------------------- | :----------------------------------------------------------- |
| **Send Trial Price** | Lorsque cette option est activée, Adapty inclura le prix de l'abonnement dans les champs `price_local` et `price_usd` pour l'événement **Trial Started**. |
| **Exclude Historical Events** | Choisissez d'exclure les événements survenus avant que l'utilisateur n'installe l'application avec le SDK Adapty. Cela évite la duplication des événements et garantit des rapports précis. Par exemple, si un utilisateur a activé un abonnement mensuel le 10 janvier et mis à jour l'application avec le SDK Adapty le 6 mars, Adapty ignorera les événements antérieurs au 6 mars et conservera les événements suivants. |
| **Send user attributes** | Activez cette option pour envoyer les attributs spécifiques à l'utilisateur, tels que les préférences de langue. Ces attributs apparaîtront dans le champ `user_attributes`. Consultez [Champs d'événement](webhook-event-types-and-fields#event-fields) pour plus d'informations. |
| **Send attribution** | Activez cette option pour inclure les informations d'attribution (par exemple, les données AppsFlyer) dans le champ `attributions`. Consultez la section [Données d'attribution](webhook-event-types-and-fields#attributions) pour plus de détails. |
| **Send Play Store purchase token** | Activez cette option pour recevoir le token Play Store requis pour la revalidation des achats, si nécessaire. Son activation ajoutera le paramètre `play_store_purchase_token` à l'événement. Pour plus de détails sur son contenu, consultez la section [Token d'achat Play Store](webhook-event-types-and-fields#play-store-purchase-token). |
6. N'oubliez pas de cliquer sur le bouton **Save** pour confirmer les modifications.
Au moment où vous cliquez sur le bouton **Save**, Adapty enverra une requête de vérification et attendra la réponse de vérification de votre serveur.
### Choisir les événements à envoyer et mapper les noms d'événements \{#choose-events-to-send-and-map-event-names\}
Choisissez les événements que vous souhaitez recevoir sur votre serveur en activant le bouton correspondant. Si vos noms d'événements diffèrent de ceux utilisés dans Adapty et que vous devez conserver vos noms tels quels, vous pouvez configurer le mapping en remplaçant les noms d'événements Adapty par défaut par les vôtres dans la section **Events names** de la page [Integrations -> Webhooks](https://app.adapty.io/integrations/customwebhook).
Le nom d'événement peut être n'importe quelle chaîne de caractères. Vous ne pouvez pas laisser les champs vides pour les événements activés. Si vous avez accidentellement supprimé un nom d'événement Adapty, vous pouvez toujours le copier depuis la rubrique [Événements à envoyer aux intégrations tierces](events).
## Gérer les événements webhook \{#handle-webhook-events\}
Les webhooks sont généralement envoyés dans un délai de 5 à 60 secondes après la survenue de l'événement. Les événements d'annulation, en revanche, peuvent prendre jusqu'à 2 heures à être envoyés après qu'un utilisateur annule son abonnement.
Si le code de statut de la réponse de votre serveur est en dehors de la plage 200-404, Adapty relance la livraison avec un backoff exponentiel. La première relance survient environ **1 minute** après l'échec initial, en doublant à chaque tentative suivante — jusqu'à 9 relances réparties sur 24 heures. Nous vous suggérons de configurer votre webhook pour effectuer uniquement une validation de base du corps de l'événement envoyé par Adapty avant de répondre. Si votre serveur ne peut pas traiter l'événement et que vous ne souhaitez pas qu'Adapty effectue de nouvelles tentatives, utilisez un code de statut dans la plage 200-404. Gérez également toutes les tâches chronophages de manière asynchrone et répondez rapidement à Adapty. Si Adapty ne reçoit pas de réponse dans les 10 secondes, il considérera la tentative comme un échec et effectuera une nouvelle tentative.
---
# File: test-webhook
---
---
title: "Tester l'intégration webhook"
description: "Testez les intégrations webhook dans Adapty pour automatiser le suivi des événements d'abonnement."
---
Une fois votre intégration configurée, il est temps de la tester. Vous pouvez tester aussi bien votre intégration sandbox que votre intégration de production. Nous recommandons de commencer par le sandbox et d'y valider le maximum de cas :
- Les événements sont bien envoyés et correctement reçus.
- Les options sont correctement configurées pour les événements historiques, le prix de l'abonnement pour l'événement **Trial started**, l'attribution, les attributs utilisateur, et le token d'achat Google Play Store — envoyés ou non avec un événement.
- Les noms d'événements sont correctement mappés et votre serveur peut les traiter.
## Comment tester \{#how-to-test\}
Avant de commencer à tester une intégration, assurez-vous d'avoir :
1. Configuré l'intégration webhook comme décrit dans la rubrique [Configurer l'intégration webhook](set-up-webhook-integration).
2. Configuré l'environnement comme décrit dans les rubriques [Tester les achats intégrés dans l'App Store Apple](test-purchases-in-sandbox) et [Tester les achats intégrés dans Google Play Store](testing-on-android). Vérifiez que votre application de test a bien été compilée en environnement sandbox et non en production.
3. Effectué un achat / démarré un essai / effectué un remboursement qui déclenchera un événement que vous avez choisi d'envoyer au webhook. Par exemple, pour obtenir l'événement **Subscription started**, souscrivez un nouvel abonnement.
## Validation du résultat \{#validation-of-the-result\}
### Résultat d'envoi d'événements réussi \{#successful-sending-events-result\}
En cas d'intégration réussie, un événement apparaîtra dans la section **Last sent events** de l'intégration et aura le statut **Success**.
### Résultat d'envoi d'événements échoué \{#unsuccessful-sending-events-result\}
| Problème | Solution |
|-----|--------|
| L'événement n'est pas apparu | Votre achat n'a pas eu lieu et l'événement n'a donc pas été créé. Consultez la rubrique [Résoudre les problèmes d'achats de test](troubleshooting-test-purchases) pour trouver une solution. |
| L'événement est apparu avec le statut **Sending failed** | Nous déterminons la délivrabilité en fonction du statut HTTP et considérons tout ce qui est **en dehors de la plage 200-399** comme un échec.
Pour en savoir plus sur le problème, survolez le statut **Sending failed** de votre événement en échec comme indiqué ci-dessous.
|
---
# File: handle-integration-errors
---
---
title: "Gérer les erreurs dans les intégrations"
description: "Gérer les erreurs dans les intégrations"
---
Lorsque vous utilisez des intégrations d'attribution, de messagerie ou d'analytique, vous pouvez rencontrer certaines erreurs courantes. Consultez ce guide pour les cas de dépannage.
## Écart de données \{#data-discrepancy\}
**Raison** : Cela peut se produire car tous vos utilisateurs n'utilisent pas la version de l'application qui intègre le SDK Adapty.
**Solution** : Pour garantir la cohérence des données, vous pouvez forcer vos utilisateurs à mettre à jour l'application vers une version intégrant le SDK Adapty.
## Erreurs réseau \{#network-errors\}
**Raison** : Cela est très probablement dû à une absence de connexion Internet entre le serveur Adapty et le serveur d'intégration.
**Solution** : Ces problèmes ne durent généralement pas longtemps et n'affectent qu'un faible nombre d'événements.
## Échec du traitement de l'événement par le serveur d'intégration \{#integration-server-failed-to-process-the-event\}
**Raison** : L'intégration est configurée de manière incorrecte.
**Solution** : Consultez l'article sur l'intégration dans notre documentation. Assurez-vous d'avoir effectué toutes les étapes de configuration dans l'Adapty Dashboard, du côté de l'outil tiers, et dans le code de votre application.
## Données d'intégration manquantes \{#missing-integration-data\}
**Raison** : Le profil ne contient pas certains identifiants spécifiques à l'intégration. Cela peut se produire lorsque l'intégration n'est pas correctement configurée dans le code de l'application.
**Solution** : Consultez l'article sur l'intégration dans notre documentation. Assurez-vous d'avoir implémenté les méthodes issues des extraits de code dans votre application et que ces méthodes interagissent bien avec les profils de vos utilisateurs.
## Identifiants d'intégration manquants \{#missing-integration-credentials\}
**Raison** : Certains identifiants d'intégration sont manquants ou incorrects.
**Solution** : Vérifiez tous les identifiants de cette intégration dans l'Adapty Dashboard. Le problème peut être lié à une incompatibilité de version ou d'environnement.
## L'événement a expiré \{#the-event-has-expired\}
**Raison** : L'option **Exclude historical events** est activée dans les paramètres de l'intégration, et la date de création de l'événement est antérieure à la date de création du profil dans notre système.
Cela peut se produire lorsqu'une chaîne de transactions remontant à plusieurs années arrive dans Adapty via la validation de reçu pour un profil créé récemment.
**Solution** : Assurez-vous que cela ne se produise pas pour les nouveaux événements. Si vous souhaitez envoyer des événements historiques à l'intégration, désactivez **Exclude historical events**.
## Type d'événement désactivé ou non pris en charge \{#disabledunsupported-event-type\}
**Raison** : Soit l'événement n'est pas pris en charge par cette intégration, soit vous l'avez désactivé lors de la configuration de l'intégration. Par exemple, les événements `access_level_updated` ne sont pas pris en charge par la plupart des intégrations.
**Solution** : Vérifiez dans la documentation de l'intégration si ce type d'événement est pris en charge. Si c'est le cas, dans l'Adapty Dashboard, assurez-vous que ce type d'événement est bien activé dans les paramètres de l'intégration.
---
# File: manage-adapty-with-ai
---
---
title: "Gérer Adapty avec des agents IA et des outils de code"
description: "Toutes les façons d'utiliser Adapty avec l'IA — intégrer le SDK avec un agent de code, interroger vos analytics avec un LLM, et alimenter vos outils IA avec la documentation Adapty."
---
Adapty fonctionne avec les outils de code IA et les agents. Utilisez-les pour intégrer le SDK, interroger vos analytics ou consulter la documentation Adapty sans quitter votre éditeur. Cette page liste ce qui est disponible et à qui chaque outil est destiné.
## Intégrer le SDK Adapty avec l'IA \{#integrate-the-adapty-sdk-with-ai\}
Deux façons d'ajouter le SDK Adapty à votre application avec un outil de code IA. Les deux fonctionnent avec Cursor, Claude et d'autres assistants IA.
### Intégration par compétence \{#skill-based-integration\}
La compétence d'intégration du SDK Adapty effectue toute l'intégration depuis votre outil de code IA en une seule commande. Utilisez-la quand vous souhaitez une configuration guidée et automatisée.
Choisissez votre plateforme : [iOS](adapty-sdk-integration-skill) · [Android](adapty-sdk-integration-skill-android) · [React Native](adapty-sdk-integration-skill-react-native) · [Flutter](adapty-sdk-integration-skill-flutter) · [Unity](adapty-sdk-integration-skill-unity) · [Kotlin Multiplatform](adapty-sdk-integration-skill-kmp) · [Capacitor](adapty-sdk-integration-skill-capacitor)
### Intégration étape par étape \{#step-by-step-integration\}
Guidez votre outil IA à travers l'intégration étape par étape, en lui fournissant les bonnes docs dans l'ordre. Utilisez-la quand vous souhaitez revoir chaque étape au fur et à mesure.
Choisissez votre plateforme : [iOS](adapty-cursor) · [Android](adapty-cursor-android) · [React Native](adapty-cursor-react-native) · [Flutter](adapty-cursor-flutter) · [Unity](adapty-cursor-unity) · [Kotlin Multiplatform](adapty-cursor-kmp) · [Capacitor](adapty-cursor-capacitor)
## Gérer Adapty depuis la ligne de commande \{#manage-adapty-from-the-command-line\}
Le [CLI développeur Adapty](developer-cli-quickstart) vous permet de gérer vos entités Adapty — applications, niveaux d'accès, produits, paywalls et placements — depuis le terminal, sans ouvrir le tableau de bord. Comme c'est un outil en ligne de commande, votre agent de code IA peut l'exécuter directement.
## Interroger vos données \{#ask-about-your-data\}
Connectez un agent de code IA à l'API Export Analytics pour interroger vos métriques en langage naturel — revenus, rétention, LTV, et plus encore. Aucun serveur MCP n'est requis.
[Interroger l'IA sur vos données analytics](export-analytics-with-ai)
## Fournir la documentation Adapty à votre outil IA \{#give-your-ai-tool-the-adapty-docs\}
### Docs en texte brut \{#plain-text-docs\}
Chaque doc Adapty est disponible en Markdown — ajoutez `.md` à l'URL de la page, ou cliquez sur **Copy for LLM** sous le titre. Pour un contexte plus large, donnez à votre outil l'index [`llms.txt`](https://adapty.io/docs/fr/llms.txt) ou un sous-ensemble spécifique à une plateforme comme [`ios-llms.txt`](https://adapty.io/docs/fr/ios-llms.txt).
### Context7 \{#context7\}
[Context7](https://context7.com/adaptyteam/adapty-docs) est un serveur MCP qui fournit la documentation Adapty à votre outil IA, mais il n'indexe que les extraits de code — pas le texte complet. Utilisez-le pour des exemples de code rapides ; pour des conseils complets, fournissez à votre outil les docs en texte brut ci-dessus. Context7 fonctionne avec Cursor, Claude Code, Windsurf et d'autres outils compatibles MCP.
---
# File: export-analytics-with-ai
---
---
title: "Interroger l'IA sur vos données analytiques"
description: "Interrogez vos données analytiques Adapty en langage naturel avec un agent IA, via l'API Export Analytics."
---
Posez des questions à un agent IA sur vos données analytiques Adapty en langage naturel — revenus, conversions, rétention, LTV — et laissez-le récupérer les chiffres pour vous. Connectez un outil capable d'effectuer des appels API à l'[API Export Analytics](https://adapty.io/docs/fr/export-analytics-api.md), et il interroge vos métriques à la demande.
## Ce que vous pouvez demander \{#what-you-can-ask-about\}
L'API Export Analytics retourne les mêmes métriques que celles affichées dans les graphiques du tableau de bord Adapty. Chaque métrique possède sa propre opération :
| Métrique | Ce qu'elle couvre | Opération |
| --- | --- | --- |
| Revenus, MRR, ARR, ARPU | Argent généré dans le temps, groupé par période, pays ou campagne | [retrieveAnalyticsData](https://adapty.io/docs/fr/api-export-analytics/operations/retrieveAnalyticsData.md) |
| Rétention par cohorte | Combien de temps les abonnés d'une cohorte donnée continuent à payer | [retrieveCohortData](https://adapty.io/docs/fr/api-export-analytics/operations/retrieveCohortData.md) |
| Taux de conversion | Combien d'utilisateurs progressent d'une étape ou d'un canal au suivant | [retrieveConversionData](https://adapty.io/docs/fr/api-export-analytics/operations/retrieveConversionData.md) |
| Churn et entonnoir | Où les utilisateurs abandonnent et à quelle vitesse ils se désabonnent | [retrieveFunnelData](https://adapty.io/docs/fr/api-export-analytics/operations/retrieveFunnelData.md) |
| Valeur vie (LTV) | Revenu moyen par segment d'utilisateurs dans le temps | [retrieveLTVData](https://adapty.io/docs/fr/api-export-analytics/operations/retrieveLTVData.md) |
| Rétention | Part des utilisateurs toujours actifs après un certain nombre de jours | [retrieveRetentionData](https://adapty.io/docs/fr/api-export-analytics/operations/retrieveRetentionData.md) |
Pour la liste complète des paramètres et filtres, consultez la [référence API](https://adapty.io/docs/fr/api-export-analytics.md).
## Avant de commencer \{#before-you-start\}
Il vous faut trois éléments :
- **Un compte Adapty avec des données** : L'API retourne les mêmes métriques que les graphiques de votre tableau de bord, donc votre application doit déjà collecter des données analytiques.
- **Une clé API secrète** : Trouvez-la dans [App settings → General](https://app.adapty.io/settings/general), dans le champ **Secret key**. Les clés sont spécifiques à chaque application, utilisez donc une clé distincte pour chacune. Stockez-la dans une variable d'environnement (par exemple, `ADAPTY_SECRET_KEY`) pour que votre agent puisse la lire sans que vous ayez à la coller dans le chat.
- **Un outil IA capable d'appeler des API** : Par exemple, Claude Code, Cursor, ou Claude Desktop avec un outil fetch. Les outils de chat classiques comme claude.ai ou ChatGPT ne peuvent pas appeler l'API directement.
## Fournir la spécification API à votre agent \{#give-your-agent-the-api-spec\}
La [spécification OpenAPI](https://adapty.io/docs/fr/api-specs/export-analytics-api.yaml) décrit chaque endpoint, l'en-tête d'authentification, le corps de la requête et des exemples de réponses. Une fois que votre agent dispose de la spec, il construit des requêtes correctes sans que vous ayez à écrire le moindre code.
Fournissez la spec à votre agent par URL :
- **Collez l'URL** : Si votre agent peut récupérer des URLs, donnez-lui `https://adapty.io/docs/fr/api-specs/export-analytics-api.yaml` et demandez-lui de lire la spec.
- **Utilisez un outil fetch** : Si votre agent dispose d'un outil qui récupère des URLs (par exemple, un serveur MCP fetch), pointez-le vers la même URL.
La spec définit l'URL de base sur `https://api-admin.adapty.io`, donc votre agent a tout ce dont il a besoin dès que votre clé est dans l'environnement.
## Interroger vos données \{#ask-about-your-data\}
Une fois la spec chargée et votre clé dans une variable d'environnement, décrivez la métrique souhaitée en langage naturel.
Exemples de questions :
```
What was my MRR at the end of each month this year, and how does it compare to last year?
Show my trial-to-paid conversion rate for the last 90 days, broken down by product.
Which countries drive the most revenue from my yearly subscription? Top 10.
How is week-1 retention trending for subscribers who started in the last 6 months?
What's the refund rate on my annual plan since launch, by month?
Compare LTV for paid-campaign users vs. organic over the last year, and export it as CSV.
```
L'agent associe votre demande à la bonne opération, lit la clé depuis l'environnement et retourne les données. Les réponses sont en JSON par défaut. Demandez un CSV si vous voulez un fichier prêt à utiliser dans un tableur — l'agent définit alors `format` sur `csv` dans le corps de la requête.
:::warning
Gardez votre clé secrète dans une variable d'environnement — ne la collez pas dans le chat et ne la commitez pas dans un fichier de règles. Les clés sont spécifiques à chaque application, donc renouvelez la vôtre dans **Settings → General** si elle est compromise. Consultez [rotation des clés API](https://adapty.io/docs/fr/export-analytics-api-authorization.md).
:::
## Configurer une fois pour une utilisation répétée \{#set-up-once-for-repeated-use\}
Pour éviter de refaire la configuration à chaque session, enregistrez la spec et la clé là où votre agent peut les réutiliser :
- **Sauvegardez le lien de la spec** : Ajoutez l'URL de la spec aux règles ou au fichier mémoire de votre agent (par exemple, un fichier `CLAUDE.md` ou un fichier de règles Cursor) pour qu'elle se charge à chaque session.
- **Stockez la clé dans votre environnement** : Conservez `ADAPTY_SECRET_KEY` dans votre profil shell ou le gestionnaire de secrets de l'outil, pour ne plus jamais avoir à la coller.
- **Sauvegardez des prompts réutilisables ou créez une compétence personnalisée** : Gardez vos questions courantes comme prompts enregistrés, ou encapsulez-les dans une compétence personnalisée ou une commande slash pour que votre agent génère un rapport à la demande.
## Limites \{#limits\}
Gardez ces contraintes à l'esprit :
- **Limite de débit** : L'API autorise 2 requêtes par seconde par clé API. En cas de dépassement, une erreur `429 Too Many Requests` est retournée. Indiquez à votre agent d'attendre et de réessayer en cas de `429`.
- **Clés spécifiques à chaque application** : Chaque clé fonctionne pour une seule application. Pour récupérer des données de plusieurs applications, fournissez la clé correspondante pour chacune.
- **Format de sortie** : Les réponses sont en JSON par défaut. Définissez `format` sur `csv` dans le corps de la requête pour un export CSV.
Pour les règles complètes d'authentification et de format des requêtes, consultez [Autorisation et format des requêtes](https://adapty.io/docs/fr/export-analytics-api-authorization.md).
---
# File: handle-webhooks-with-ai
---
---
title: "Gérer les événements d'abonnement Adapty avec les webhooks"
description: "Recevez et gérez les événements d'abonnement Adapty sur votre serveur avec les webhooks — configuration de l'endpoint, authentification, payload et tests en une seule page."
---
Les webhooks permettent à votre serveur de recevoir en temps réel les événements d'abonnement Adapty — achats, renouvellements, annulations, problèmes de facturation et remboursements — afin d'accorder des accès, synchroniser votre backend ou déclencher des workflows. Ce guide vous accompagne de la configuration de l'endpoint jusqu'à une intégration vérifiée et testée en une seule page, et montre comment confier l'écriture du handler à un agent de codage IA.
:::tip
Vous utilisez un agent de codage IA ? Cliquez sur **Copy for LLM** sous le titre et collez toute cette page dans votre agent — il y trouvera la configuration, le payload et la logique du handler dont il a besoin.
:::
## Comment fonctionnent les webhooks Adapty \{#how-adapty-webhooks-work\}
- **Unidirectionnel et temps réel** : Adapty envoie un `POST` HTTP à votre serveur dès qu'un événement se produit — pas de polling.
- **Deux types de requêtes** : Une requête de vérification unique (envoyée à la sauvegarde de l'intégration) et les événements d'abonnement continus.
- **Une URL par environnement** : Vous configurez un endpoint distinct pour la production et pour le sandbox.
- **Vous accusez réception de chaque requête** : Répondez rapidement avec un statut `2xx`, et Adapty relance en cas d'échec.
## Créer votre endpoint \{#build-your-endpoint\}
Créez un endpoint HTTPS public qui gère deux types de requêtes :
- **Requête de vérification** : Envoyée une seule fois à la sauvegarde de l'intégration. Elle a un corps JSON vide (`{}`). Répondez avec un statut `2xx` et un corps JSON.
- **Événements d'abonnement** : Requêtes `POST` continues avec l'événement dans le corps. Répondez `200` en moins de 10 secondes, puis effectuez tout travail lourd de manière asynchrone.
Choisissez une chaîne secrète et stockez-la comme variable d'environnement (par exemple, `ADAPTY_WEBHOOK_SECRET`). À chaque requête, vérifiez que l'en-tête `Authorization` correspond bien, et rejetez la requête dans le cas contraire — vous saisirez ce même secret dans le tableau de bord ensuite.
```javascript title="webhook.js"
const app = express();
app.use(express.json());
const WEBHOOK_SECRET = process.env.ADAPTY_WEBHOOK_SECRET;
app.post("/adapty/webhook", (req, res) => {
// 1. Verify the shared secret Adapty echoes back.
if (req.get("Authorization") !== WEBHOOK_SECRET) {
return res.sendStatus(401);
}
// 2. Acknowledge fast, then process asynchronously.
res.status(200).json({});
// 3. The verification request has an empty body — nothing to handle.
const event = req.body;
if (!event.event_type) return;
switch (event.event_type) {
case "subscription_started":
case "subscription_renewed":
case "trial_converted":
// Grant or extend access.
break;
case "subscription_expired":
case "subscription_refunded":
// Revoke access.
break;
default:
break;
}
});
app.listen(3000);
```
Déployez l'endpoint sur une URL HTTPS publique avant de configurer l'intégration — Adapty envoie la requête de vérification dès que vous sauvegardez.
### Événements clés et le payload \{#key-events-and-the-payload\}
Chaque événement partage la même enveloppe. Les champs varient selon le type d'événement, le store et les options que vous avez activées. Voici un événement `subscription_started` simplifié :
```json title="Example event"
{
"profile_id": "00000000-0000-0000-0000-000000000000",
"customer_user_id": "UserIdInYourSystem",
"event_type": "subscription_started",
"event_datetime": "2024-11-15T10:45:36.181000+0000",
"event_properties": {
"store": "play_store",
"currency": "USD",
"price_usd": 4.99,
"vendor_product_id": "onemonth_no_trial",
"transaction_id": "0000000000000000",
"original_transaction_id": "0000000000000000",
"subscription_expires_at": "2024-12-15T10:45:36.181000+0000",
"profile_event_id": "00000000-0000-0000-0000-000000000000"
},
"event_api_version": 1
}
```
Les événements que vous traiterez le plus souvent :
| Type d'événement | Se déclenche quand |
| --- | --- |
| `subscription_started` | Un utilisateur démarre un abonnement payant |
| `subscription_renewed` | Un abonnement se renouvelle et est facturé avec succès |
| `subscription_renewal_cancelled` | Un utilisateur désactive le renouvellement automatique (l'accès dure jusqu'à l'expiration) |
| `subscription_expired` | L'accès prend fin après l'expiration d'un abonnement non renouvelé |
| `trial_started` | Un utilisateur démarre un essai gratuit |
| `trial_converted` | Un essai se convertit en abonnement payant |
| `billing_issue_detected` | Un paiement de renouvellement échoue |
| `subscription_refunded` | Un achat d'abonnement est remboursé |
Pour la liste complète des événements et tous les champs, consultez [Types d'événements et champs webhook](https://adapty.io/docs/fr/webhook-event-types-and-fields.md).
:::warning
N'ordonnez pas les événements par `event_datetime` — c'est l'heure métier de l'événement, les événements peuvent donc arriver dans le désordre ou partager un même horodatage. Ordonnez-les selon votre propre heure de réception, et dédoublonnez en utilisant `profile_event_id` ou les identifiants de transaction.
:::
## Configurer le webhook dans Adapty \{#configure-the-webhook-in-adapty\}
1. Ouvrez [Integrations → Webhook](https://app.adapty.io/integrations/customwebhook) dans l'Adapty Dashboard.
2. Activez l'intégration.
3. Dans **Production endpoint URL**, saisissez l'URL HTTPS de l'endpoint que vous avez déployé.
4. Dans **Authorization header value for production endpoint**, entrez le même secret que celui vérifié par votre endpoint. Adapty renvoie cette valeur dans l'en-tête `Authorization` à chaque requête. C'est facultatif mais fortement recommandé.
5. Pour tester d'abord en sandbox, renseignez également **Sandbox endpoint URL** et sa valeur **Authorization header value**.
6. Cliquez sur **Save**. Adapty envoie immédiatement la requête de vérification à votre endpoint, qui répond avec un `2xx` pour finaliser la configuration.
Pour choisir les événements à envoyer, mapper les noms d'événements ou activer des champs optionnels (prix d'essai, événements historiques, attribution, attributs utilisateur, token Play Store), consultez [Configurer l'intégration webhook](https://adapty.io/docs/fr/set-up-webhook-integration.md).
## Créer le handler avec votre agent de codage IA \{#build-it-with-your-ai-coding-agent\}
Donnez à votre agent de codage IA ce guide et la documentation de référence en Markdown (ajoutez `.md` à l'URL de n'importe quelle page), indiquez-lui votre stack, et laissez-le générer le handler :
- [Types d'événements et champs webhook](https://adapty.io/docs/fr/webhook-event-types-and-fields.md)
- [Configurer l'intégration webhook](https://adapty.io/docs/fr/set-up-webhook-integration.md)
Exemple de prompt :
```
Read these Adapty webhook docs, then write a webhook handler for my Express app:
verify the Authorization header against ADAPTY_WEBHOOK_SECRET, answer the
verification request, acknowledge events with 200, and grant or revoke access
based on event_type.
```
L'agent écrit le code du handler, mais il ne peut pas déployer votre endpoint ni configurer le tableau de bord — hébergez l'endpoint vous-même et renseignez l'URL et le secret dans **Integrations → Webhook**.
## Tester votre webhook \{#test-your-webhook\}
Testez en sandbox avant la production :
1. Configurez l'endpoint sandbox et le secret comme décrit ci-dessus.
2. Dans votre app sandbox, effectuez un achat, démarrez un essai ou émettez un remboursement pour déclencher un événement.
3. Ouvrez la section **Last sent events** de l'intégration. Un événement livré affiche le statut **Success**.
Si un événement affiche **Sending failed**, votre serveur a renvoyé un statut hors de la plage 200–399 — survolez le statut pour obtenir des détails. Pour le guide de test complet, consultez [Tester l'intégration webhook](https://adapty.io/docs/fr/test-webhook.md).
## Limites \{#limits\}
- **Accusez réception en moins de 10 secondes** : Si Adapty ne reçoit pas de réponse à temps, la tentative est considérée comme échouée et relancée.
- **Nouvelles tentatives** : Si votre statut est hors de la plage 200–404, Adapty relance avec un backoff exponentiel — jusqu'à 9 tentatives sur 24 heures.
- **Délai d'annulation** : Les événements d'annulation peuvent mettre jusqu'à 2 heures à arriver.
- **Une URL par environnement** : Pour livrer les événements à plusieurs services, pointez le webhook vers votre propre backend et redistribuez-les depuis là.
---
# File: server-side-api-with-ai
---
---
title: "Vérifier et accorder l'accès à un abonnement depuis votre backend"
description: "Utilisez l'API côté serveur d'Adapty pour vérifier si un utilisateur a un abonnement actif et accorder l'accès manuellement, avec l'aide d'un agent IA."
---
Depuis votre backend, utilisez l'API côté serveur d'Adapty pour vérifier si un utilisateur a un abonnement actif et accorder l'accès manuellement. Ce guide couvre les deux appels les plus courants — `getProfile` et `grantAccessLevel` — et montre comment demander à un agent IA d'écrire l'intégration pour votre stack.
:::tip
Vous utilisez un agent IA ? Cliquez sur **Copy for LLM** sous le titre et collez toute cette page dans votre agent — il y trouvera les appels, les champs et les points de vigilance dont il a besoin.
:::
## Avant de commencer \{#before-you-start\}
- **Une clé API secrète** : retrouvez-la dans [App settings → General](https://app.adapty.io/settings/general), dans le champ **Secret key**. Les clés sont spécifiques à chaque app. Stockez-la dans une variable d'environnement (par exemple, `ADAPTY_SECRET_KEY`) et envoyez-la via `Authorization: Api-Key {key}`.
- **L'URL de base** : toutes les requêtes vont vers `https://api.adapty.io`.
- **Un moyen d'identifier l'utilisateur** : envoyez soit `adapty-customer-user-id` (votre propre identifiant utilisateur — fonctionne uniquement si vous identifiez les utilisateurs dans l'app) soit `adapty-profile-id` (l'identifiant de profil Adapty). Ils sont interchangeables ; utilisez l'un ou l'autre.
## Vérifier un abonnement \{#check-a-subscription\}
Pour vérifier le statut, appelez `getProfile` avec `GET` et passez l'identifiant utilisateur dans un header — il n'y a pas de corps de requête.
```javascript title="check-access.js"
const res = await fetch("https://api.adapty.io/api/v2/server-side-api/profile/", {
headers: {
"Authorization": `Api-Key ${process.env.ADAPTY_SECRET_KEY}`,
"adapty-customer-user-id": userId,
},
});
const { data } = await res.json();
function hasActiveAccess(profile, accessLevelId = "premium") {
const level = profile.access_levels?.find(a => a.access_level_id === accessLevelId);
if (!level) return false;
if (level.is_in_grace_period) return true;
if (!level.expires_at) return true; // lifetime / non-expiring
return new Date(level.expires_at) > new Date(); // not expired yet
}
if (hasActiveAccess(data)) {
// unlock premium features
}
```
Contrairement au profil SDK, la réponse côté serveur **n'a pas de champ `is_active`**. Déduisez le statut vous-même à partir de `access_levels[].expires_at` : `null` signifie un accès à vie, une date future signifie actif, et une date passée signifie expiré. Traitez `is_in_grace_period` comme toujours actif. Pour la liste complète des champs du profil et des niveaux d'accès, consultez [getProfile](https://adapty.io/docs/fr/api-adapty/operations/getProfile.md).
## Accorder l'accès manuellement \{#grant-access-manually\}
Pour débloquer des fonctionnalités payantes sans achat — codes promo, accès investisseur ou bêta, cas de support — appelez `grantAccessLevel` avec `POST`.
```javascript title="grant-access.js"
await fetch("https://api.adapty.io/api/v2/server-side-api/purchase/profile/grant/access-level/", {
method: "POST",
headers: {
"Authorization": `Api-Key ${process.env.ADAPTY_SECRET_KEY}`,
"adapty-customer-user-id": userId,
"Content-Type": "application/json",
},
body: JSON.stringify({ access_level_id: "premium" }), // add "expires_at" for temporary access
});
```
Deux points à garder à l'esprit :
- **Le niveau d'accès doit déjà exister** dans votre tableau de bord (**Access levels**) — `access_level_id` est son identifiant, pas un nouveau nom.
- **Les accords manuels n'apparaissent pas dans les analytics**. Ils sont transmis uniquement à votre intégration webhook et à l'Event Feed, donc les graphiques de revenus et de conversion ne les reflèteront pas.
Pour les détails de la requête et de la réponse, consultez [grantAccessLevel](https://adapty.io/docs/fr/api-adapty/operations/grantAccessLevel.md).
## Construire l'intégration avec votre agent IA \{#build-it-with-your-ai-coding-agent\}
Donnez à votre agent IA ce guide et la spécification API en Markdown (ajoutez `.md` à n'importe quelle URL de page), indiquez-lui votre stack, et laissez-le écrire les appels :
- [Spécification OpenAPI](https://adapty.io/docs/fr/api-specs/adapty-api.yaml)
- [getProfile](https://adapty.io/docs/fr/api-adapty/operations/getProfile.md)
- [grantAccessLevel](https://adapty.io/docs/fr/api-adapty/operations/grantAccessLevel.md)
Exemple de prompt :
```
Using the Adapty server-side API spec, write backend functions to check whether a
user has an active "premium" access level (GET /profile/, derive status from
expires_at — there's no is_active field) and to grant it (grantAccessLevel).
Authenticate with ADAPTY_SECRET_KEY and identify users by adapty-customer-user-id.
```
L'agent écrit le code, mais il ne peut pas exécuter votre backend ni configurer vos clés — vous fournissez la clé secrète et les identifiants utilisateurs.
## Limites \{#limits\}
- **Limite de débit** : jusqu'à 40 000 requêtes par minute et par app.
- **Clés spécifiques à chaque app** : chaque clé fonctionne pour une seule app ; utilisez la clé correspondante par app.
- **Un identifiant requis** : chaque requête nécessite `adapty-customer-user-id` ou `adapty-profile-id`.
---
# File: app-store-test
---
---
title: "Tester les achats intégrés dans l'App Store"
description: "Testez les achats dans l'environnement sandbox pour garantir des transactions fluides."
---
Une fois tout configuré dans l'Adapty Dashboard et votre application mobile, il est temps de procéder aux tests d'achats intégrés.
Il existe deux façons de tester les achats dans votre application iOS :
- [**Tests sandbox**](test-purchases-in-sandbox) : Utilisez un compte sandbox et lancez votre application depuis Xcode ou téléchargez-la depuis TestFlight. Cette option vous permet de tester l'ensemble du flow d'achat et de voir les mises à jour du profil dans l'Adapty Dashboard.
- [**Tests StoreKit dans Xcode**](local-sk-files) : Lancez votre application depuis Xcode sans avoir à créer ou réinitialiser un compte sandbox. Cette option convient particulièrement aux développeurs qui souhaitent tester différents scénarios dans l'environnement Xcode. Notez toutefois que tous les scénarios s'exécutent localement et qu'aucune modification n'apparaîtra dans l'Adapty Dashboard.
---
# File: test-purchases-in-sandbox
---
---
title: "Tests en sandbox"
description: "Testez vos achats dans l'environnement sandbox pour garantir des transactions fluides."
---
Une fois que vous avez tout configuré dans l'Adapty Dashboard et votre application mobile, il est temps de tester les achats intégrés.
**Remarque :** aucun des outils de test ne facture les utilisateurs lorsqu'ils testent l'achat d'un produit. L'App Store n'envoie pas d'e-mails pour les achats ou les remboursements effectués dans les environnements de test.
:::note
**Les transactions sandbox sont exclues de tous les graphiques analytiques.** Elles apparaissent tout de même sur les pages de profil individuelles et dans le flux d'événements.
:::
:::info
Pour procéder aux tests d'achats intégrés, assurez-vous que :
- Vous avez suivi les guides de [démarrage rapide](quickstart) sur l'intégration au store, l'ajout de produits et l'intégration du SDK Adapty.
- Votre produit est marqué [**Ready to submit**](InvalidProductIdentifiers#step-2-check-products) dans App Store Connect.
:::
## Tests en sandbox \{#sandbox-testing\}
2. Renseignez les informations de l'utilisateur de test. Veillez à définir le **Country or Region** que vous souhaitez tester, car cela influe sur la disponibilité des produits pour cette région et sur la devise d'achat.
:::tip
- Si vous utilisez Gmail ou iCloud, vous pouvez réutiliser votre adresse e-mail existante grâce au [sous-adressage avec le signe plus](https://www.wikihow.com/Use-Plus-Addressing-in-Gmail).
- Vous pouvez utiliser une adresse e-mail aléatoire qui n'existe même pas, mais veillez à refuser l'authentification à deux facteurs (2FA) lorsque vous vous connectez sur un appareil de test par la suite.
:::
3. Cliquez sur **Create**.
### Étape 2. Activer le mode développeur \{#step-2-enable-the-developer-mode\}
:::note
Ignorez cette étape si le mode développeur est **déjà activé** sur votre appareil de test ou si vous **n'avez pas de Mac**.
:::
Vous aurez besoin d'un Mac avec Xcode installé et du câble de votre appareil de test :
1. Ouvrez Xcode sur votre Mac. Si vous souhaitez tester des achats intégrés avec TestFlight, il vous suffit d'avoir Xcode installé ; vous n'avez pas besoin d'y avoir une application.
2. Connectez votre appareil de test au Mac à l'aide du câble.
3. Sur votre appareil de test, allez dans **Settings > Privacy & Security > Developer Mode** et activez le **Developer Mode**.
### Étape 3. Télécharger l'application depuis TestFlight \{#step-3-download-the-app-from-testflight\}
:::info
Cette étape s'applique uniquement si vous testez avec TestFlight. Si vous compilez l'application dans Xcode, passez cette étape.
:::
Pour savoir comment soumettre votre application à TestFlight, consultez la [documentation Apple](https://developer.apple.com/documentation/StoreKit/testing-in-app-purchases-with-sandbox#Prepare-for-sandbox-testing).
Avant de télécharger l'application TestFlight, assurez-vous d'être connecté avec votre compte Apple de production sur votre appareil de test. Téléchargez ensuite l'application à tester depuis TestFlight.
:::danger
N'ouvrez pas l'application une fois téléchargée. Passez directement aux étapes suivantes.
Si vous l'avez ouverte par accident, supprimez-la de votre appareil de test et téléchargez-la à nouveau. Sinon, votre historique d'achats risque de ne pas être vierge, et les tests d'achats intégrés généreront des erreurs.
:::
### Étape 4. Passer au compte de test Sandbox \{#step-4-switch-to-sandbox-test-account\}
4. Faites défiler vers le bas jusqu'à la section **Sandbox Apple Account** et appuyez sur **Sign In**.
5. Connectez-vous avec vos identifiants de compte Apple Sandbox.
### Étape 5. Effacer l'historique des achats \{#step-5-clear-purchase-history\}
Si vous venez de créer un nouveau compte de test Sandbox et de basculer vers celui-ci, vous pouvez ignorer cette étape, car elle ne s'applique qu'aux tests répétés utilisant le même compte de test Sandbox.
1. Rendez-vous dans **Settings > Developer > Sandbox Apple Account** sur votre appareil de test.
2. Sélectionnez **Manage** dans le menu contextuel.
3. Accédez à **Account Settings** et appuyez sur **Clear Purchase History**.
:::danger
Cette étape est obligatoire chaque fois que vous recommencez les tests avec le même compte de test Sandbox. Dans ce cas, vous devrez également [vous déconnecter de votre compte de test Sandbox](#step-4-switch-to-sandbox-test-account), puis vous reconnecter pour vider le cache de l'historique des achats sur l'appareil de test.
:::
### Étape 6. Compiler dans Xcode et lancer l'application \{#step-6-build-in-xcode-and-run\}
:::info
Cette étape s'applique uniquement si vous testez avec un build Xcode. Si vous utilisez TestFlight, ignorez cette étape.
:::
1. Connectez votre appareil de test à votre Mac.
2. Ouvrez Xcode.
3. Cliquez sur **Run** dans la barre d'outils ou choisissez **Product > Run** pour compiler et lancer l'application sur l'appareil connecté.
Si la compilation réussit, Xcode lancera l'application sur votre appareil et ouvrira une session de débogage dans la zone de débogage.
Votre application est maintenant prête pour les tests sur l'appareil.
### Étape 7. Effectuer un achat test \{#step-7-make-test-purchase\}
Ouvrez l'application et effectuez votre achat test via un paywall.
Une fois terminé, consultez l'article sur la [validation des achats test](validate-test-purchases) pour vérifier vos résultats.
### Étape 8. Continuer à tester \{#step-8-keep-testing\}
Votre environnement de test est maintenant prêt. Si vous souhaitez le tester à nouveau, [effacez l'historique des achats du compte sandbox](https://developer.apple.com/help/app-store-connect/test-in-app-purchases/manage-sandbox-apple-account-settings/).
## Problèmes lors des tests \{#testing-issues\}
Voici les problèmes courants que vous pouvez rencontrer lors du test d'une application.
### Problèmes avec TestFlight \{#testflight-issues\}
Vous ne pouvez pas effacer votre historique d'achats **si vous utilisez TestFlight sans compte de test Sandbox**, ce qui entraîne divers problèmes et des résultats de test erronés.
Si vous avez oublié par inadvertance de [passer au compte de test Sandbox](#step-4-switch-to-sandbox-test-account) et que vous avez ouvert l'application ne serait-ce qu'une fois, TestFlight associe votre historique d'achats à votre compte Apple de production, ce qui provoque des problèmes inattendus.
Pour remédier à cela, suivez ces étapes :
1. Supprimez l'application de l'appareil de test.
2. Suivez les étapes pour les [tests Sandbox](#sandbox-testing).
:::note
Il est important de ne pas seulement réinstaller l'application, mais aussi de passer au compte de test Sandbox, d'effacer l'historique des achats et de la lancer avec le compte de test Sandbox.
:::
### Problèmes liés aux niveaux d'accès partagés \{#shared-access-levels-issues\}
Si vous répétez les tests avec le même compte de test Sandbox, vous pourriez rencontrer un comportement inattendu avec les [niveaux d'accès partagés](sharing-paid-access-between-user-accounts) pour l'utilisateur de test.
Pour vérifier si l'utilisateur dispose d'un niveau d'accès hérité, accédez à [Profiles & Segments](https://app.adapty.io/profiles/users) depuis l'Adapty Dashboard et ouvrez le profil de l'utilisateur.
Si l'utilisateur dispose d'un niveau d'accès hérité, suivez ces étapes pour obtenir des résultats de test précis :
1. Supprimez le profil parent.
2. Retirez l'application de l'appareil de test.
3. [Téléchargez l'application depuis TestFlight](#step-3-download-the-app-from-testflight).
4. [Passez au compte de test Sandbox](#step-4-switch-to-sandbox-test-account).
5. [Effacez l'historique des achats](#step-5-clear-purchase-history).
6. [Ouvrez l'application et effectuez votre achat test](#step-7-make-test-purchase).
:::note
Effacer l'historique des achats, c'est ce qui réinitialise l'achat côté store. Supprimer le profil parent ne fait que supprimer l'enregistrement côté Adapty. Pour comprendre pourquoi un compte réutilisé conserve l'accès et quelles actions de réinitialisation fonctionnent réellement, consultez [Réinitialiser l'abonnement d'un testeur](#resetting-a-testers-subscription).
:::
### Mise à jour de l'application dans TestFlight \{#updating-app-in-testflight\}
Si l'application TestFlight a été mise à jour :
1. Supprimez l'application de l'appareil de test.
2. [Téléchargez l'application depuis TestFlight](#step-3-download-the-app-from-testflight).
3. [Passez au compte de test Sandbox](#step-4-switch-to-sandbox-test-account).
4. [Effacez l'historique des achats](#step-5-clear-purchase-history).
5. [Ouvrez l'application et effectuez votre achat test](#step-7-make-test-purchase).
## Réinitialiser l'abonnement d'un testeur \{#resetting-a-testers-subscription\}
Dans l'environnement sandbox, un achat est lié au **compte sandbox Apple**, pas au profil Adapty. Les actions effectuées sur le profil — suppression ou modification de son niveau d'accès — ne suppriment pas l'achat du compte store. Au prochain réinstallation ou synchronisation, le SDK rattache la même transaction, et le testeur retrouve l'accès.
Le tableau ci-dessous indique ce que chaque action de réinitialisation modifie et ce que le testeur voit ensuite.
| Action | Profil Adapty | Compte sandbox Apple | Accès du testeur après |
| :-------------------------------------------------------------------------------- | :------------------------------------------------------ | :--------------------- | :------------------------------------------------------------------------------------------------- |
| Supprimer le profil depuis l'Adapty Dashboard | Supprimé | Intact | **Revient** — à la réinstallation, un nouveau profil rattache la même chaîne de transactions |
| Supprimer le profil via l'[API Delete profile](api-adapty/operations/deleteProfile) | Supprimé | Intact | **Revient** — même comportement que la suppression depuis le Dashboard |
| Ajouter une date d'expiration passée via **Add access level** | Écrasé à la prochaine synchronisation | Intact | **Revient** au prochain renouvellement — l'abonnement actif réapplique une date d'expiration future |
| Appeler l'[API Revoke access level](api-adapty/operations/revokeAccessLevel) | Expire immédiatement, déclenche `access_level_updated` (`is_active=false`) | Intact | **Revient** au prochain renouvellement ou à la réinstallation — pas une réinitialisation sandbox fiable |
| Annuler l'abonnement dans le compte sandbox | Aucun changement direct | Abonnement annulé | Les renouvellements s'arrêtent, l'accès prend fin à l'expiration de la période en cours, et le testeur peut racheter le produit |
| Se connecter avec un nouveau compte sandbox Apple | Nouveau profil | Nouveau compte vide | **Propre** — recommandé pour les tests répétés |
### Réinitialiser un testeur dans un état vierge \{#reset-a-tester-to-a-clean-state\}
Pour tester le flux d'achat plusieurs fois, utilisez un nouveau compte sandbox Apple pour chaque test plutôt que de réinitialiser le profil. Suivez l'[Étape 1](#step-1-create-sandbox-test-account-in-app-store-connect) pour créer le compte et l'[Étape 4](#step-4-switch-to-sandbox-test-account) pour y basculer sur l'appareil. Si vous réutilisez un compte sandbox existant, [effacez d'abord son historique d'achats](#step-5-clear-purchase-history) — supprimer le profil Adapty ne l'efface pas.
### Supprimer l'accès d'un testeur existant \{#remove-access-from-an-existing-tester\}
Pour supprimer l'accès d'un testeur, n'antidatez pas la date d'expiration et n'appelez pas l'API Revoke access level. En sandbox, l'abonnement se renouvelle automatiquement toutes les quelques minutes. Chaque renouvellement restaure une date d'expiration future sur la même chaîne de transaction, donc l'accès est rétabli de lui-même. L'API Revoke access level déclenche bien un événement `access_level_updated` (`is_active=false`), mais le prochain renouvellement l'écrase.
Pour vraiment révoquer l'accès, annulez l'abonnement côté store. Sur l'appareil de test, allez dans **Settings > Developer > Sandbox Apple Account**, sélectionnez **Manage**, puis annulez l'abonnement. Les renouvellements cessent et l'accès prend fin à l'expiration de la période en cours.
### Pourquoi supprimer le profil rétablit l'accès \{#why-deleting-the-profile-brings-access-back\}
Quand un testeur réinstalle l'application, Adapty reçoit l'historique des achats du compte sandbox et associe la nouvelle installation à l'achat existant. L'achat est lié au compte du store, pas au profil que vous avez supprimé.
- **Profils anonymes** : Une réinstallation sans `customer_user_id` hérite toujours du niveau d'accès du compte store, quelle que soit votre configuration de [partage d'accès payant](sharing-paid-access-between-user-accounts).
- **Profils identifiés** : Le transfert de l'accès vers un nouveau `customer_user_id` dépend de votre configuration de partage d'accès payant.
Pour comprendre comment Adapty relie ces profils en chaîne, consultez [Comment fonctionnent les profils](how-profiles-work#parent-and-inheritor-profiles).
## Tester les abonnements \{#test-subscriptions\}
Lorsque vous testez votre application avec un compte de test Sandbox, vous pouvez définir le taux de renouvellement des abonnements pour chaque testeur dans le sandbox. Pour en savoir plus sur la modification des taux de renouvellement des abonnements, consultez la [documentation officielle d'Apple](https://developer.apple.com/help/app-store-connect/test-in-app-purchases/manage-sandbox-apple-account-settings).
Par défaut, les abonnements se renouvellent jusqu'à 12 fois avant de s'arrêter, selon le calendrier suivant :
| Durée de l'abonnement | 1 semaine | 1 mois | 2 mois | 3 mois | 6 mois | 1 an |
| :------------------------------------- | :--------- | :--------- | :--------- | :--------- | :--------- | :--------- |
| Vitesse de renouvellement | 3 minutes | 5 minutes | 10 minutes | 15 minutes | 30 minutes | 1 heure |
| Durée de la relance de facturation | 10 minutes | 10 minutes | 10 minutes | 10 minutes | 10 minutes | 10 minutes |
| Durée du délai de grâce de facturation | 3 minutes | 5 minutes | 5 minutes | 5 minutes | 5 minutes | 5 minutes |
:::note
Gardez à l'esprit que les transactions de test peuvent prendre jusqu'à 10 minutes pour apparaître dans le [flux d'événements](validate-test-purchases).
:::
Utilisez le sandbox pour vérifier que votre application et votre backend gèrent correctement les renouvellements, les nouvelles tentatives de facturation et les délais de grâce — et non pour prédire le calendrier de renouvellement en production. Le calendrier accéléré et plafonné décrit ci-dessus ne correspond pas à la production. Pour rejouer des transactions sur votre serveur à des fins de test backend, utilisez l'[API Set transaction](api-adapty/operations/setTransaction).
## Tester les offres \{#test-offers\}
Pour que l'éligibilité fonctionne correctement, il est nécessaire de supprimer tous les reçus d'achat de l'utilisateur avant de tester les offres.
La méthode la plus fiable consiste à utiliser un [compte de test Sandbox](#step-1-create-sandbox-test-account-in-app-store-connect) entièrement nouveau. Tester plusieurs fois avec le même compte de test Sandbox peut entraîner des comportements inattendus.
:::danger
Si vous testez plusieurs fois avec le même compte de test Sandbox, veillez à [effacer l'historique des achats](#step-5-clear-purchase-history) pour éviter tout problème d'éligibilité.
:::
---
# File: local-sk-files
---
---
title: "Test StoreKit dans Xcode"
description: "Testez les achats dans l'environnement sandbox pour garantir des transactions fluides."
---
Le test StoreKit dans Xcode vous permet de tester les achats intégrés localement sans configurer de compte sandbox.
Pour ce type de test, vous devez :
1. [Créer un produit dans Adapty](quickstart-products) et lui attribuer un **App Store product ID**.
2. Dans Xcode, créer un [fichier de configuration StoreKit](https://developer.apple.com/documentation/xcode/setting-up-storekit-testing-in-xcode) local et y ajouter un produit. L'ID produit doit être identique à l'**App Store product ID** dans Adapty.
3. Ajouter le fichier de configuration StoreKit à votre schéma de build et compiler l'application. Lancez-la sur l'émulateur ou sur votre appareil.
## Dois-je utiliser le test StoreKit dans Xcode ? \{#should-i-use-storekit-testing-in-xcode\}
Cette méthode de test est la plus pratique si vous êtes un développeur d'application qui souhaite tester le build à la volée ou tester différents scénarios d'achat grâce aux fonctionnalités de Xcode.
Toutefois, gardez à l'esprit que ce type de test est local : aucune modification n'apparaîtra sur l'Adapty Dashboard. Avant de lancer votre application en production, nous vous recommandons de tester le [fonctionnement avec les profils](ios-quickstart-identify) dans l'[environnement sandbox](test-purchases-in-sandbox).
Vous **devriez** utiliser le test StoreKit si vous souhaitez :
- Tester la logique d'achat
- Reproduire différents scénarios d'achat avec les outils Xcode (ex. : paiement annulé ou remboursement)
- Tester avec l'émulateur
Vous **ne devriez pas** utiliser le test StoreKit si vous souhaitez :
- Tester la logique liée aux profils
- Vérifier si vos actions dans l'application apparaissent dans l'Adapty Dashboard
- Partager votre application avec des équipes non-développeurs pour les tests
## Étape 1. Créer un fichier de configuration StoreKit \{#step-1-create-a-storekit-configuration-file\}
Pour créer un fichier de configuration StoreKit dans Xcode :
1. Cliquez sur **File > New > File from template**. Sélectionnez ensuite **StoreKit Configuration File** et cliquez sur **Next**.
2. Donnez-lui un nom. Selon que vous avez déjà des produits dans App Store Connect :
- Sélectionnez **Sync this file with an app in App Store Connect** : pour créer un fichier de configuration contenant tous vos produits App Store Connect, afin de les tester localement.
- Ne sélectionnez pas **Sync this file with an app in App Store Connect** : pour créer un fichier de configuration vide dans lequel vous devrez ajouter des produits manuellement.
Cliquez sur **Next**.
3. N'ajoutez pas votre application comme cible. Poursuivez simplement. Si vous travaillez avec des produits synchronisés depuis App Store Connect, passez à l'[Étape 2](#step-2-add-the-configuration-file-to-the-build-scheme).
4. Si vos produits ne sont pas synchronisés depuis App Store Connect, cliquez sur **+** en bas à gauche et sélectionnez un type de produit.
5. Saisissez un nom de groupe d'abonnement et cliquez sur **Next**.
6. Saisissez un nom de référence. Dans le champ **Product ID**, entrez l'**App Store product ID** de votre produit dans Adapty.
7. Configurez le prix, les offres et les autres paramètres du produit dans le fichier de configuration. Vous pouvez aussi y ajouter d'autres produits.
## Étape 2. Ajouter le fichier de configuration au schéma de build \{#step-2-add-the-configuration-file-to-the-build-scheme\}
Pour compiler l'application avec ce fichier de configuration, vous devez l'ajouter à un schéma de build. La bonne pratique consiste à séparer les schémas de test et de production ; nous vous suggérons donc de créer un nouveau schéma dédié aux tests :
1. En haut, cliquez sur le nom de votre application et sélectionnez **New scheme**.
2. Saisissez un nom pour le schéma et cliquez sur **OK**.
3. Cliquez à nouveau sur le nom de l'application et sélectionnez **Edit scheme**. Dans **StoreKit configuration**, sélectionnez votre fichier de configuration local pour qu'il soit utilisé lors du build.
## Étape 3. Compiler & tester \{#step-3-build--test\}
Vous pouvez maintenant compiler l'application et tester les achats intégrés sans vous connecter au backend de l'App Store. Vous pouvez acheter des produits et obtenir des niveaux d'accès localement. Ces modifications ne seront pas répercutées dans l'Adapty Dashboard, mais vous pourrez tout de même tester le déverrouillage des fonctionnalités payantes en local.
[En savoir plus](https://developer.apple.com/documentation/xcode/testing-in-app-purchases-with-storekit-transaction-manager-in-code) sur les autres fonctionnalités disponibles avec le test StoreKit dans Xcode.
---
# File: testing-on-android
---
---
title: "Tester les achats intégrés dans Google Play Store"
description: "Testez les achats d'abonnements sur Android avec Adapty."
---
Tester les achats intégrés (IAP) dans votre application Android est une étape essentielle avant de la publier. Le test en sandbox est un moyen sûr et efficace de tester les IAP sans facturer vos utilisateurs. Dans ce guide, nous vous accompagnons pas à pas pour tester les IAP en sandbox sur le Google Play Store pour Android.
:::note
**Les transactions sandbox sont exclues de tous les graphiques analytiques.** Elles apparaissent tout de même sur les pages de profil individuelles et dans le flux d'événements.
:::
## Environnement de test \{#testing-environment\}
Pour garantir des performances optimales de votre application Android, il est recommandé de la tester sur un vrai appareil plutôt que sur un émulateur. Bien que nous ayons réussi à tester sur des émulateurs, Google recommande l'utilisation d'un vrai appareil.
Si vous décidez d'utiliser un émulateur, assurez-vous qu'il dispose de Google Play. Cela vous aidera à vérifier que votre application fonctionne correctement.
## 1. Configurer un compte de test pour tester l'application \{#1-set-up-test-account-for-app-testing\}
Pour faciliter les tests lors des phases avancées du développement, vous devez configurer un utilisateur de test pour les achats intégrés. Cet utilisateur sera le premier compte avec lequel vous vous connecterez sur votre appareil de test Android.
Notez que le compte principal d'un appareil Android ne peut être modifié qu'en effectuant une réinitialisation d'usine, ce qui efface toutes vos données. Il est donc important de configurer correctement votre compte de test afin d'éviter d'avoir à effectuer cette réinitialisation.
:::important
La façon de configurer un compte de test dépend de l'appareil que vous utilisez :
- Si vous avez un appareil de test dédié, créez un **compte de test séparé (un nouveau compte Gmail)**.
- Si vous n'avez pas d'appareil de test dédié, vous pouvez utiliser votre **compte personnel** et activer temporairement le **License testing** pour ce compte.
- Si vous n'avez pas du tout d'appareil Android, vous pouvez **créer un compte de test séparé et l'utiliser avec un émulateur**. Cette approche n'est toutefois pas recommandée, car elle ne permet pas de détecter tous les problèmes potentiels liés aux vrais appareils.
:::
## 2. Activer le License testing \{#2-enable-license-testing\}
Une fois votre compte de test configuré, vous devez paramétrer le test de licence pour votre application. Pour ce faire, suivez ces étapes :
1. Dans la barre latérale de la Google Play Console, accédez à **Settings** et sélectionnez **License testing** dans la section **Monetization**.
2. Sélectionnez une liste de testeurs de licence existante ou créez-en une nouvelle.
3. Ajoutez le compte que vous utiliserez pour les tests à la liste et enregistrez les modifications. Si des membres de votre équipe doivent également tester l'application, vous pouvez ajouter leurs adresses e-mail à la liste afin que l'accès soit accordé à l'ensemble du groupe.
## 3. Créer une piste fermée et y ajouter le compte de test \{#3-create-closed-track-and-add-test-account-to-it\}
Pour commencer les tests, vous devez publier une version signée de votre application sur une piste fermée :
1. Ouvrez votre application et sélectionnez **Test and release > Testing > Closed testing** dans le menu. Cliquez ensuite sur **Create track**.
2. Saisissez le nom de la piste de test fermée et cliquez sur **Create track**.
3. Ajoutez une liste de testeurs à la piste.
4. Dans la section **How testers join your test**, copiez le lien et envoyez-le à l'appareil connecté avec le compte de test. Ouvrez le lien sur votre appareil de test pour désigner l'utilisateur comme testeur.
:::warning
Tenez compte des points suivants pour garantir le bon déroulement des tests :
- L'ouverture de l'URL d'inscription marque votre compte Play pour les tests. Si vous ne réalisez pas cette étape, les produits ne se chargeront pas.
- Les développeurs utilisent souvent un ID d'application différent pour leurs builds de test. Cela peut poser des problèmes, car Google Play Services utilise l'ID d'application pour retrouver vos achats intégrés.
- Il arrive qu'un utilisateur de test soit autorisé à acheter des consommables, mais pas des abonnements, si l'appareil de test n'a pas de code PIN. Cela peut se manifester par un message cryptique « Something went wrong ». Assurez-vous que l'appareil de test dispose d'un code PIN et qu'il est connecté au Google Play Store.
:::
## 4. Charger un APK signé sur la piste fermée \{#4-upload-a-signed-apk-to-the-closed-track\}
Générez un APK signé ou utilisez Android App Bundle pour charger un APK signé sur la piste fermée que vous venez de créer. Vous n'avez même pas besoin de déployer la version. Il suffit de charger l'APK. Vous trouverez plus d'informations à ce sujet dans [cet](https://support.google.com/googleplay/android-developer/answer/9859348?visit_id=638929100639477968-3849460621&rd=1) article d'assistance.
:::important
Si votre application est nouvelle, vous devrez peut-être la rendre disponible dans votre pays ou région. Pour ce faire, accédez à **Testing > Closed testing**, cliquez sur votre piste de test, puis allez dans **Countries/regions** pour ajouter les pays et régions souhaités.
:::
## 5. Tester les achats intégrés \{#5-test-in-app-purchases\}
Après avoir chargé l'APK, attendez quelques minutes que la version soit traitée. Ensuite, ouvrez votre appareil de test et connectez-vous avec le compte e-mail que vous avez ajouté à la liste des testeurs. Vous pouvez alors tester les achats intégrés comme vous le feriez sur une application en production.
## En savoir plus \{#read-more\}
Consultez les ressources suivantes pour en savoir plus sur les tests d'achats intégrés dans les applications Android :
- [Périodes de renouvellement en sandbox](https://developer.android.com/google/play/billing/test#subs)
- [Tester les achats uniques](https://developer.android.com/google/play/billing/test#one-time)
---
# File: validate-test-purchases
---
---
title: "Valider les achats test"
description: "Validez les achats test dans Adapty pour garantir des transactions sans accroc."
---
Avant de publier votre application mobile en production, il est essentiel de tester minutieusement les achats intégrés. Consultez nos articles [Tester les achats intégrés sur l'Apple App Store](test-purchases-in-sandbox) et [Tester les achats intégrés sur le Google Play Store](testing-on-android) pour des instructions détaillées. Une fois les tests lancés, vous devez vérifier que les achats test se déroulent correctement.
À chaque achat test effectué sur votre appareil mobile, consultez la transaction correspondante dans le [**Event Feed**](https://app.adapty.io/event-feed) de l'Adapty Dashboard. Si l'achat n'apparaît pas dans le **Event Feed**, c'est qu'Adapty ne le suit pas.
## L'achat test est réussi \{#test-purchase-is-successful\}
Si l'achat test est réussi, son événement de transaction s'affiche dans le **Event Feed** :
Si les transactions fonctionnent comme prévu, passez à la [Liste de vérification avant publication](release-checklist), puis procédez à la publication de l'application.
## L'achat test a échoué \{#test-purchase-is-not-successful\}
Si aucun événement de transaction n'apparaît dans les 10 minutes ou si vous rencontrez une erreur dans l'application mobile, consultez le [Dépannage](troubleshooting-test-purchases) ainsi que les articles sur la gestion des erreurs [pour iOS](ios-sdk-error-handling), [pour Android](android-sdk-error-handling), [pour React Native](react-native-handle-errors), [pour Flutter](error-handling-on-flutter-react-native-unity), [pour Unity](unity-handle-errors) et [Kotlin Multiplatform](kmp-handle-errors) pour trouver des solutions.
---
# File: troubleshooting-test-purchases
---
---
title: "Résolution des problèmes d'achats test"
description: "Résolvez les problèmes d'achats test dans Adapty et corrigez les erreurs courantes de transactions intégrées."
---
Si vous rencontrez des problèmes de transactions, assurez-vous d'abord d'avoir suivi toutes les étapes de la [checklist de mise en production](release-checklist). Si c'est déjà le cas et que les problèmes persistent, suivez les recommandations ci-dessous pour les résoudre :
## Une erreur est retournée dans l'application mobile \{#an-error-is-returned-in-the-mobile-app\}
Consultez la liste des erreurs pour votre plateforme : [pour iOS](ios-sdk-error-handling), [pour Android](android-sdk-error-handling), [pour React Native](react-native-troubleshoot-purchases), [Flutter](error-handling-on-flutter-react-native-unity) et [Unity](unity-troubleshoot-purchases), puis suivez nos recommandations pour résoudre le problème.
## La transaction est absente du fil d'événements bien qu'aucune erreur ne soit retournée dans l'application mobile \{#transaction-is-absent-from-the-event-feed-although-no-error-is-returned-in-the-mobile-app\}
Pour résoudre ce problème, vérifiez les points suivants :
1. **Pour iOS** : Assurez-vous d'utiliser un appareil réel plutôt qu'un simulateur.
2. Vérifiez que le `Bundle ID`/`Package name` de votre application correspond à celui indiqué dans les [**App settings**](https://app.adapty.io/settings/general).
3. Vérifiez que la `PUBLIC_SDK_KEY` de votre application correspond à la **Public SDK key** dans l'Adapty Dashboard : [**App settings** -> onglet **General** -> section **API keys**](https://app.adapty.io/settings/general).
4. Assurez-vous d'utiliser un compte sandbox et non un [fichier de configuration StoreKit local](local-sk-files). Si vous avez utilisé un fichier de configuration StoreKit local pour des tests précédents, vérifiez qu'il n'est pas utilisé dans le build actuel.
## Aucun événement n'est présent dans mon profil de test \{#no-event-is-present-in-my-testing-profile\}
C'est un comportement normal. Un nouveau profil utilisateur est automatiquement créé dans Adapty lorsque :
- Un utilisateur lance votre application pour la première fois
- Un utilisateur se déconnecte de votre application
**Pourquoi cela se produit :** Toutes les transactions et tous les événements sont liés au profil qui a généré la première transaction. Cela permet de conserver l'intégralité de l'historique des transactions (essais, achats, renouvellements) rattaché au même profil.
**Ce que vous verrez :** De nouveaux enregistrements de profil (appelés « profils non originaux ») peuvent apparaître sans événements, mais conserveront les niveaux d'accès. Vous pourrez voir des événements `access_level_updated`. C'est un comportement attendu.
**Pour les tests :** Afin d'éviter la création de plusieurs profils, créez un nouveau compte de test (Sandbox Apple ID) à chaque fois que vous réinstallez l'application.
Pour plus de détails, consultez [Création de profil](how-profiles-work#profile-creation).
Voici un exemple de profil non original. Notez l'absence d'événements dans l'**User history** et la présence d'un niveau d'accès.
## Les prix ne reflètent pas les prix réels définis dans App Store Connect \{#prices-do-not-reflect-the-actual-prices-set-in-app-store-connect\}
Dans les environnements Sandbox et TestFlight (qui utilise l'environnement sandbox pour les achats intégrés), l'important est de vérifier que le flux d'achat fonctionne correctement, et non l'exactitude des prix. Il est à noter que l'API d'Apple peut parfois fournir des données incorrectes, notamment lorsque des régions différentes sont configurées pour les appareils ou les comptes. Les prix provenant directement du store sans que le backend Adapty n'intervienne d'aucune façon sur ceux-ci, vous pouvez ignorer toute imprécision de prix lors des tests d'achats via Adapty.
Privilégiez donc le test du flux d'achat lui-même plutôt que l'exactitude des prix, afin de vous assurer qu'il fonctionne comme prévu.
## L'heure de la transaction dans le fil d'événements est incorrecte \{#the-transaction-time-in-the-event-feed-is-incorrect\}
Le **Event Feed** utilise le fuseau horaire défini dans les **App Settings**. Pour aligner le fuseau horaire des événements sur votre heure locale, ajustez le **Reporting timezone** dans [**App settings** -> onglet **General**](https://app.adapty.io/settings/general).
## Les paywalls et les produits prennent beaucoup de temps à charger \{#paywalls-and-products-take-a-long-time-to-load\}
Ce problème peut survenir si votre compte de test possède un historique de transactions long. Nous vous recommandons vivement de créer un nouveau compte de test à chaque fois, comme indiqué dans notre section [Créer un compte de test Sandbox (Sandbox Apple ID) dans App Store Connect](test-purchases-in-sandbox#step-1-create-sandbox-test-account-in-app-store-connect).
Si vous ne pouvez pas créer de nouveau compte, vous pouvez effacer l'historique des transactions de votre compte actuel en suivant ces étapes sur votre appareil iOS :
1. Ouvrez **Settings** et appuyez sur **App Store**.
2. Appuyez sur votre **Sandbox Apple ID**.
3. Dans la fenêtre contextuelle, sélectionnez **Manage**.
4. Sur la page **Account Settings**, appuyez sur **Clear Purchase History**.
Pour plus de détails, consultez la [documentation Apple Developer](https://developer.apple.com/documentation/storekit/testing-in-app-purchases-with-sandbox).
---
# File: test-devices
---
---
title: "Appareils de test"
description: "Découvrez comment gérer les appareils de test dans Adapty pour des tests d'application efficaces."
---
À des fins de test, vous pouvez désigner votre appareil comme appareil de test, ce qui désactive la mise en cache et garantit que vos modifications sont immédiatement prises en compte.
:::note
Les appareils de test sont pris en charge à partir de versions spécifiques du SDK :
- iOS : 2.11.1
- Android : 2.11.3
- React Native : 2.11.1
La prise en charge de Flutter et Unity sera ajoutée ultérieurement.
:::
## Marquer votre appareil comme appareil de test \{#mark-your-device-as-test\}
1. Ouvrez les [**App settings**](https://app.adapty.io/settings/general) dans l'Adapty Dashboard.
2. Faites défiler jusqu'à la section **Test devices** dans l'onglet **General**.
3. Cliquez sur le bouton **Add test device**.
4. Dans la fenêtre **Add test device**, renseignez :
| Champ | Description |
|:-----------------------------------------| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Test device name** | Nom du ou des appareils de test, à titre de référence. |
| **ID used to identify this test device** | Choisissez le type d'identifiant que vous souhaitez utiliser pour identifier le ou les appareils de test. Suivez nos recommandations dans la section [Quel identifiant utiliser](test-devices#which-identifier-you-should-use) ci-dessous pour choisir la meilleure option. |
| **ID value** | Saisissez la valeur de l'identifiant. |
5. N'oubliez pas de cliquer sur le bouton **Add test device** pour enregistrer les modifications.
## Quel identifiant utiliser \{#which-identifier-you-should-use\}
Plusieurs identifiants permettent d'identifier un appareil. Voici nos recommandations :
- **Customer User ID** pour les appareils iOS et Android si vous Un identifiant unique que vous définissez pour identifier vos utilisateurs dans votre système. Il peut s'agir de l'e-mail de l'utilisateur, de votre identifiant interne ou de toute autre chaîne. Pour utiliser cette option, vous devez
C'est le meilleur choix pour identifier un appareil de test, surtout si vous utilisez plusieurs appareils pour le même compte. Tous les appareils associés à ce compte seront considérés comme des appareils de test.
| | Adapty profile ID |Un identifiant unique pour le [profil utilisateur](profiles-crm) dans Adapty.
Utilisez-le si vous ne pouvez pas utiliser le Customer User ID, l'IDFA pour iOS ou l'Advertising ID pour Android. Notez que l'Adapty Profile ID peut changer si vous réinstallez l'application ou vous reconnectez.
| #### Comment obtenir le Customer User ID et l'Adapty profile ID \{#how-to-obtain-customer-user-id-and-adapty-profile-id\} Ces deux identifiants sont disponibles dans les détails du **Profile** sur l'Adapty Dashboard : 1. Retrouvez le profil de l'utilisateur dans l'onglet [**Adapty Profiles** -> **Event feed**](https://app.adapty.io/event-feed). :::note Pour identifier le bon profil, effectuez un type de transaction rare. Ainsi, lorsque la transaction apparaît dans l'[**Event Feed**](https://app.adapty.io/event-feed), vous pourrez l'identifier facilement. ::: 2. Copiez les valeurs des champs **Customer user ID** et **Adapty ID** dans les détails du profil :
### Identifiants Apple \{#apple-identifiers\}
| Identifiant | Utilisation |
|----------|-----|
| IDFA | L'Identifier for Advertisers (IDFA) est un identifiant unique attribué par Apple à l'appareil d'un utilisateur.
C'est le choix idéal pour les appareils iOS car il ne change jamais de lui-même, bien que vous puissiez le réinitialiser manuellement.
**Remarque** : depuis le déploiement d'iOS 14.5, les annonceurs doivent demander le consentement de l'utilisateur pour accéder à l'IDFA. Assurez-vous de demander ce consentement dans votre application et de l'avoir accordé sur votre appareil de test.
| | IDFV | L'Identifier for Vendors (IDFV) est un identifiant alphanumérique unique attribué par Apple à toutes les applications d'un même éditeur/fournisseur sur un seul appareil. Il peut changer si vous réinstallez ou mettez à jour votre application. | #### Comment obtenir l'IDFA \{#how-to-obtain-the-idfa\} Apple ne fournit pas l'IDFA par défaut. Obtenez-le depuis l'attribution du profil dans l'Adapty Dashboard : 1. Retrouvez le profil de l'utilisateur dans l'onglet [**Adapty Profiles** -> **Event feed**](https://app.adapty.io/event-feed). :::note Pour identifier le bon profil, effectuez un type de transaction rare. Ainsi, lorsque la transaction apparaît dans l'[**Event Feed**](https://app.adapty.io/event-feed), vous pourrez l'identifier facilement. ::: 2. Ouvrez les détails du profil et copiez la valeur du champ **IDFA** dans la section **Attributes** :
Vous pouvez également [trouver une application sur l'App Store qui vous affichera votre IDFA](https://www.apple.com/us/search/idfa?src=globalnav).
#### Comment obtenir l'Identifier for Vendors (IDFV) \{#how-to-obtain-the-identifier-for-vendors-idfv\}
Pour obtenir l'IDFV, demandez à votre développeur de le récupérer à l'aide de la méthode suivante dans votre application et d'afficher l'identifiant reçu dans vos logs ou votre panneau de débogage.
```swift showLineNumbers title="Swift"
UIDevice.current.identifierForVendor
```
### Identifiants Google \{#google-identifiers\}
| Identifiant | Utilisation |
|----------|-----|
| Advertising ID | L'Advertising ID est un identifiant unique attribué par Google à l'appareil d'un utilisateur.
C'est le choix idéal pour les appareils Android car il ne change jamais de lui-même, bien que vous puissiez le réinitialiser manuellement.
**Remarque** : pour l'utiliser, désactivez l'option **Opt out of Ads Personalization** dans vos paramètres **Ads** si vous utilisez Android 12 ou une version supérieure.
| | Android ID | L'Android ID est un identifiant unique pour chaque combinaison de clé de signature d'application, d'utilisateur et d'appareil. Disponible sur Android 8.0 et versions ultérieures. | #### Comment obtenir l'Advertising ID \{#how-to-obtain-advertising-id\} Pour trouver l'identifiant publicitaire de votre appareil : 1. Ouvrez l'application **Settings** sur votre appareil Android. 2. Appuyez sur **Google**. 3. Sélectionnez **Ads** sous **Services**. Votre identifiant publicitaire s'affiche en bas de l'écran. #### Comment obtenir l'Android ID \{#how-to-obtain-android-id\} Pour obtenir l'Android ID, demandez à votre développeur de récupérer l'[ANDROID_ID](https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID) à l'aide de la méthode suivante dans votre application et d'afficher l'identifiant reçu dans vos logs ou votre panneau de débogage. ```kotlin showLineNumbers title="Kotlin/Java" android.provider.Settings.Secure.getString(contentResolver, android.provider.Settings.Secure.ANDROID_ID); ``` --- # File: release-checklist --- --- title: "Release checklist" description: "Suivez la checklist de publication d'Adapty pour garantir une mise à jour fluide de votre application." --- Nous sommes ravis que vous ayez choisi d'utiliser Adapty ! Nous espérons que l'intégration s'est bien passée. Ce guide vous accompagne étape par étape pour vous assurer que votre application est prête à être publiée sur les stores et que le flux de monétisation fonctionne correctement. ## Prérequis avant de commencer \{#pre-flight-essentials\} Ce dont vous avez besoin avant de démarrer la validation : - Un vrai appareil avec un compte sandbox - Accès à l'Adapty Dashboard - Accès à App Store Connect / Google Play Console :::note Bien que les achats sandbox puissent fonctionner sur des simulateurs, les vrais appareils sont nécessaires pour tester tous les flux, notamment les fenêtres de paiement et les invites biométriques. ::: ## Validations universelles \{#universal-validations\} - [ ] **Connexion au store** : Assurez-vous d'avoir connecté Adapty à l'App Store et/ou Google Play : - [ ] [App Store](initial_ios) - [ ] [Google Play](initial-android) - [ ] **Livraison des événements d'abonnement** : Confirmez que les notifications serveur sont configurées : - [ ] [Notifications serveur App Store](enable-app-store-server-notifications) - [ ] [Notifications développeur en temps réel (RTDN)](enable-real-time-developer-notifications-rtdn) - [ ] **Identification du profil** : Validez la logique d'identification des utilisateurs et assurez-vous que les achats sont associés au bon profil : - [ ] [Vérifiez que la logique d'identification dans le code de votre application correspond à votre cas d'usage](ios-quickstart-identify) - [ ] [Assurez-vous de comprendre la logique parent/héritier pour le partage d'accès payant entre les profils utilisateurs](sharing-paid-access-between-user-accounts) - [ ] **Offres** : Si vous avez des offres promotionnelles App Store dans l'application, assurez-vous d'avoir [ajouté votre clé d'achat intégré](app-store-connection-configuration#step-4-for-trials-and-special-offers--set-up-promotional-offers) à la fois dans le champ principal et dans la section **App Store promotional offers**. - [ ] **Collecte de données** : Assurez-vous de respecter la confidentialité : - [ ] Si vous devez vous conformer à des réglementations sur la vie privée comme le RGPD ou le CCPA, ou si votre application est destinée aux enfants, contrôlez si vous [activez la collecte et le partage de l'IDFA et de l'IP](sdk-installation-ios#data-policies). - [ ] Si votre application utilise AppTrackingTransparency, assurez-vous d'[envoyer le statut d'autorisation à Adapty](ios-deal-with-att). - [ ] **Labels de confidentialité** : [En savoir plus](apple-app-privacy) sur les données collectées par Adapty et les indicateurs à définir pour la revue. ## Validations des achats \{#purchase-validations\} :::tip Des questions ou des problèmes ? Consultez notre [forum d'assistance](https://adapty.featurebase.app/) où vous trouverez des réponses aux questions fréquentes ou pourrez poser les vôtres. Notre équipe et notre communauté sont là pour vous aider ! ::: Avant le lancement, assurez-vous que les achats intégrés fonctionnent correctement dans votre application et que votre paywall est prêt pour la revue du store. La façon dont vous validez les achats intégrés dépend de la manière dont vous les implémentez : - Vous affichez un paywall créé avec le Paywall Builder d'Adapty - Vous avez implémenté votre propre paywall et utilisez la méthode `makePurchase` pour gérer les achats - Vous utilisez Adapty en mode observateur (avec le Paywall Builder d'Adapty ou votre propre paywall)
2. Sélectionnez **Product** > **Archive** dans la barre de menu supérieure.
3. Attendez la fin du processus d'archivage. La fenêtre **Organizer** s'ouvre automatiquement. Sélectionnez votre archive et cliquez sur **Distribute App**.
4. Choisissez **App Store Connect** comme méthode de distribution. Suivez les instructions pour finaliser l'importation.
:::note
L'importation peut échouer si des ressources requises sont manquantes, comme une icône d'app ou un écran de lancement. Consultez le journal d'erreurs Xcode pour plus de détails.
:::
### Étape 2. Vérifier le build dans App Store Connect \{#step-2-check-the-build-in-app-store-connect\}
1. Rendez-vous sur [App Store Connect](https://appstoreconnect.apple.com) et ouvrez votre app.
2. Faites défiler jusqu'à la section **Build**. Vérifiez que le build que vous venez d'importer y apparaît.
:::note
Il peut s'écouler quelques minutes avant que le build apparaisse dans App Store Connect après l'importation.
:::
## Soumettre votre app et vos produits pour examen \{#submit-your-app-and-products-for-review\}
Une fois le build visible dans la section **Build**, associez vos abonnements intégrés et soumettez l'app pour examen par Apple.
### Étape 1. Associer les produits à la soumission \{#step-1-attach-products-to-the-submission\}
Chaque abonnement doit avoir le statut **Ready to Submit** dans App Store Connect avant de pouvoir l'associer. Si un abonnement est encore à l'état brouillon ou qu'il manque des métadonnées, il n'apparaîtra pas dans la liste.
1. Sur la même page, faites défiler jusqu'à la section **In-App Purchases and Subscriptions**.
2. Cliquez sur **Select in-app purchases or subscriptions**.
3. Sélectionnez tous les produits à inclure dans cette soumission et cliquez sur **Done**.
### Étape 2. Soumettre pour examen \{#step-2-submit-for-review\}
1. Remplissez tous les champs obligatoires de la page (description, captures d'écran, mots-clés, etc.).
2. Dans la section **App Store Version Release**, indiquez si vous souhaitez publier votre app automatiquement, manuellement ou selon un calendrier après approbation.
3. Cliquez sur **Add for Review**, puis sur **Submit to App Review**.
Apple examine les apps en 1 à 2 jours, mais les délais peuvent varier.
## Vérifier votre app en production \{#verify-your-app-in-production\}
Après approbation de votre app par Apple :
1. Effectuez un achat réel (ou attendez que votre premier utilisateur achète).
2. Ouvrez le [**Event Feed**](https://app.adapty.io/event-feed) dans l'Adapty Dashboard et vérifiez que les événements de transactions en production apparaissent.
3. Vérifiez que les événements d'abonnement (renouvellements, annulations) s'écoulent correctement — cela dépend de la configuration des [notifications serveur de l'App Store](enable-app-store-server-notifications).
Si les événements en production n'apparaissent pas, vérifiez votre [configuration de connexion à l'App Store](app-store-connection-configuration).
## Prochaines étapes \{#next-steps\}
Votre app est en ligne. Commencez à développer vos revenus d'abonnement :
- **[Tests A/B](ab-tests)** : Expérimentez différents paywalls pour trouver ce qui convertit le mieux.
- **[Analytics](charts)** : Suivez les métriques d'abonnement comme le MRR, le taux de désabonnement et la conversion.
- **Intégrations** : Envoyez les événements d'abonnement vers des plateformes d'[analytics](analytics-integration) et d'[attribution](attribution-integration).
---
# File: general
---
---
title: "App settings"
description: "Explorez les paramètres généraux et les configurations dans Adapty pour une utilisation optimale."
---
Vous pouvez accéder à l'onglet General de la page App Settings pour gérer le comportement, l'apparence et le partage des revenus de votre application. Vous pouvez y personnaliser le nom et l'icône de votre application, gérer vos clés SDK et API Adapty, définir votre statut dans le programme Small Business et choisir le fuseau horaire pour les analyses et les graphiques de votre application.
## 1. Détails de l'application \{#1-app-details\}
Choisissez un nom et une icône uniques qui représentent votre application dans l'interface Adapty. Notez que le nom et l'icône de l'application n'auront aucun effet sur le nom et l'icône de l'application dans l'App Store ou Google Play. Veillez également à sélectionner une catégorie d'application appropriée qui reflète fidèlement le but et le contenu de votre application. Cela aidera les utilisateurs à découvrir votre application et à s'assurer qu'elle apparaît dans les bonnes catégories du store.
## 2\. Membre du programme Small Business et frais de service réduits \{#2-member-of-small-business-program-and-reduced-service-fee\}
Si votre organisation est inscrite au [programme Small Business](app-store-small-business-program) d'Apple ou au [programme de frais de service réduits](google-reduced-service-fee) de Google, vos applications bénéficient d'une commission de store réduite.
Informez Adapty si votre application est inscrite à un programme de commission réduite. Pour garantir des calculs corrects, précisez le statut de ces programmes dans la section "Reduced Store Fee".
Le paramètre de frais réduits ne s'applique qu'aux transactions futures. Modifiez votre statut **avant** qu'il entre en vigueur, et Adapty ajustera le taux de commission.
:::warning
* Si vous prolongez votre participation à un programme de frais réduits, **ajoutez une période d'éligibilité supplémentaire**.
* Si vous perdez votre adhésion au programme, **modifiez la date d'expiration** de votre période d'éligibilité actuelle.
:::
Les articles suivants approfondissent ce sujet :
* [App Store Small Business Program](app-store-small-business-program)
* [Google Reduced Service Fee](google-reduced-service-fee)
## 3\. Fuseau horaire de reporting \{#3-reporting-timezone\}
Choisissez le fuseau horaire correspondant à l'emplacement de votre organisation, ou là où les analyses et graphiques de votre application sont les plus pertinents. Nous recommandons d'utiliser le même fuseau horaire que votre compte App Store Connect ou Google Play Console pour assurer la cohérence. Notez que ce paramètre de fuseau horaire n'affecte pas les intégrations tierces dans le système Adapty, qui utilisent le fuseau horaire UTC.
Vous pouvez accéder aux paramètres de fuseau horaire dans la section Reported timezone de l'onglet General de la page App Settings. Vous pouvez également choisir d'appliquer le même fuseau horaire à toutes les applications de votre compte Adapty en cochant la case correspondante.
## 4\. Définition des installations pour les analyses \{#4-installs-definition-for-analytics\}
Choisissez ce qui est défini comme un nouvel événement d'installation dans les analyses :
| Base | Description |
|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| New device_ids | (Recommandé) Chaque installation de l'application depuis le store sur un appareil est comptabilisée comme une nouvelle installation. Cela inclut les premières installations et les réinstallations.
Les installations sont comptées par identifiant d'appareil et ne sont pas affectées par l'authentification de l'utilisateur. La création d'un profil (lors de l'activation du SDK ou de la déconnexion), la connexion ou la mise à jour de l'application ne génère pas d'événements d'installation supplémentaires.
Par exemple, si la même application est installée sur 5 appareils différents, vous verrez 5 installations dans les analyses.
| | New customer_user_ids |Cette option est destinée aux applications qui
Pour les utilisateurs connectés, seule la première installation associée à un identifiant utilisateur client est comptabilisée comme une installation. Les installations sur des appareils supplémentaires ne sont pas comptées comme de nouvelles installations.
Les utilisateurs anonymes (utilisateurs qui ne se sont pas connectés) ne sont pas comptabilisés dans les analyses.
La réinstallation de l'application ou une nouvelle connexion ne crée pas d'installations supplémentaires.
Les stores d'applications et les plateformes d'attribution (comme App Store Connect, Google Play Console et AppsFlyer) utilisent une approche basée sur les appareils pour compter les installations. Si vous comptez les installations par identifiants utilisateur client dans Adapty, les chiffres d'installation peuvent différer de ceux de ces services externes.
⚠️ Si vous n'identifiez pas les utilisateurs dans Adapty, aucune installation ne sera comptée avec cette option activée.
| | New profiles in Adapty | (Héritage) Chaque installation, réinstallation et profil anonyme créé lors de déconnexions est comptabilisé comme une nouvelle installation. | Gardez à l'esprit que cette option n'affecte que la page [**Analytics**](https://app.adapty.io/analytics) et n'a pas d'impact sur la page [**Overview**](https://app.adapty.io/overview), où vous pouvez configurer la vue séparément. ## 5. Logique d'augmentation de prix sur l'App Store \{#5-app-store-price-increase-logic\} Pour maintenir des données précises et éviter les écarts entre les analyses Adapty et les résultats d'App Store Connect, il est important de sélectionner l'option appropriée lors de l'ajustement des configurations liées aux augmentations de prix dans App Store Connect. Vous pouvez donc choisir la logique qui sera appliquée aux augmentations de prix d'abonnement dans Adapty :
- **Le prix d'abonnement pour les utilisateurs existants est conservé :** En sélectionnant cette option, le prix actuel sera maintenu pour vos abonnés existants, même si vous modifiez le prix dans App Store Connect. Cela signifie que les abonnés existants continueront à être facturés au prix d'abonnement d'origine.
- **Lorsque le prix d'abonnement est modifié dans App Store Connect, il change également pour les abonnés existants :** Si vous choisissez cette option, toute modification de prix effectuée dans App Store Connect sera également appliquée à vos abonnés existants. Cela signifie que les abonnés existants seront facturés au nouveau prix reflétant la tarification mise à jour dans App Store Connect.
:::warning
Il est important de prendre en compte que l'option sélectionnée n'affecte pas seulement les analyses dans Adapty, mais impacte également les intégrations et le comportement global de gestion des transactions.
:::
Assurez-vous de sélectionner l'option qui correspond à votre approche souhaitée pour la gestion des prix d'abonnement pour les abonnés existants. Cela contribuera à maintenir des données précises et une synchronisation entre les analyses Adapty et les résultats obtenus depuis App Store Connect.
## 6. Partage de l'accès payant entre les comptes utilisateurs \{#6-sharing-paid-access-between-user-accounts\}
:::link
Article principal : [Partage de l'accès payant entre les comptes utilisateurs](sharing-paid-access-between-user-accounts)
:::
Le paramètre **Sharing paid access between user accounts** détermine ce que fait Adapty lorsque plusieurs [profils utilisateurs](identifying-users) tentent d'accéder au même achat. Vous pouvez spécifier un paramètre de partage d'accès distinct pour l'[environnement sandbox](test-purchases-in-sandbox).
**Activé (par défaut)**
Les utilisateurs identifiés (ceux qui ont un [Customer User ID](identifying-users#set-customer-user-id-on-configuration)) peuvent partager le même [niveau d'accès](access-level) fourni par Adapty si leur appareil est connecté au même identifiant Apple/Google. C'est utile quand un utilisateur réinstalle l'application et se connecte avec un autre e-mail — il conserve tout de même l'accès à son achat précédent. Avec cette option, plusieurs utilisateurs identifiés peuvent partager le même niveau d'accès.
Même si le niveau d'accès est partagé, toutes les transactions passées et futures sont enregistrées comme événements dans le Customer User ID d'origine afin de maintenir des analyses cohérentes et conserver un historique de transactions complet — y compris les périodes d'essai, les achats d'abonnement, les renouvellements, etc., liés au même profil.
**Transférer l'accès au nouvel utilisateur**
Les utilisateurs identifiés peuvent continuer à accéder au [niveau d'accès](access-level) fourni par Adapty, même s'ils se connectent avec un [Customer User ID](identifying-users#set-customer-user-id-on-configuration) différent ou réinstallent l'application, tant que l'appareil est connecté au même identifiant Apple/Google.
Contrairement à l'option précédente, Adapty transfère l'achat entre les utilisateurs identifiés. Cela garantit que le contenu acheté est disponible, mais un seul utilisateur peut y avoir accès à la fois. Par exemple, si UserA achète un abonnement et que UserB se connecte sur le même appareil et restaure les transactions, UserB obtient l'accès à l'abonnement, et celui-ci est révoqué pour UserA.
Si l'un des utilisateurs (le nouveau ou l'ancien) n'est pas identifié, le niveau d'accès sera tout de même partagé entre ces profils dans Adapty.
Bien que le niveau d'accès soit transféré, toutes les transactions passées et futures sont enregistrées comme événements dans le Customer User ID d'origine afin de maintenir des analyses cohérentes et conserver un historique de transactions complet — y compris les périodes d'essai, les achats d'abonnement, les renouvellements, etc., liés au même profil.
Après être passé à **Transférer l'accès au nouvel utilisateur**, les niveaux d'accès ne seront pas transférés entre les profils immédiatement. Le processus de transfert pour chaque niveau d'accès spécifique est déclenché uniquement lorsqu'Adapty reçoit un événement du store, comme un renouvellement d'abonnement, une restauration ou lors de la validation d'une transaction.
**Désactivé**
Le premier profil d'utilisateur identifié à obtenir un niveau d'accès le conservera indéfiniment. C'est la meilleure option si votre logique métier exige que les achats soient liés à un seul Customer User ID.
Notez que les niveaux d'accès sont tout de même partagés entre les utilisateurs anonymes.
Vous pouvez « délier » un achat en [supprimant le profil de l'utilisateur propriétaire](https://adapty.io/docs/fr/api-adapty/operations/deleteProfile). Après la suppression, le niveau d'accès devient disponible pour le premier profil utilisateur qui le réclame, qu'il soit anonyme ou identifié.
La désactivation du partage ne concerne que les nouveaux utilisateurs. Les abonnements déjà partagés entre utilisateurs continueront de l'être même après la désactivation de cette option.
:::warning
Apple et Google exigent que les achats intégrés soient partagés ou transférés entre utilisateurs car ils s'appuient sur l'identifiant Apple/Google pour y associer l'achat. Sans partage, la restauration des achats risque de ne pas fonctionner lors des réinstallations ultérieures.
La désactivation du partage peut empêcher les utilisateurs de retrouver l'accès après connexion.
Nous recommandons de désactiver le partage uniquement si vos utilisateurs **sont tenus de se connecter** avant d'effectuer un achat. Dans le cas contraire, un utilisateur identifié pourrait acheter un abonnement, se connecter à un autre compte et perdre définitivement l'accès.
:::
### Quel paramètre choisir ? \{#which-setting-should-i-choose\}
| Mon application... | Option à choisir |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| N'a pas de système de connexion et utilise uniquement les identifiants de profil anonymes d'Adapty. | Utilisez l'option par défaut, car les niveaux d'accès sont toujours partagés entre les identifiants de profil anonymes pour les trois options. |
| Dispose d'un système de connexion optionnel et permet aux clients d'effectuer des achats avant de créer un compte. | Choisissez **Transférer l'accès au nouvel utilisateur** pour garantir que les clients qui achètent sans compte pourront toujours restaurer leurs transactions ultérieurement. |
| Exige que les clients créent un compte avant d'acheter, mais permet de lier les achats à plusieurs Customer User ID. | Choisissez **Transférer l'accès au nouvel utilisateur** pour garantir qu'un seul Customer User ID a accès à la fois, tout en permettant aux utilisateurs de se connecter avec un autre Customer User ID sans perdre leur accès payant. |
| Exige que les clients créent un compte avant d'acheter, avec des règles strictes liant les achats à un seul Customer User ID. | Choisissez **Désactivé** pour garantir que les transactions ne sont jamais transférées entre comptes. |
## 7. Clés SDK et API \{#7-sdk-and-api-keys\}
Utilisez une clé SDK publique pour intégrer les SDK Adapty dans votre application, et une clé secrète pour accéder à l'API serveur d'Adapty. Vous pouvez générer de nouvelles clés ou révoquer les clés existantes selon vos besoins. Pour créer des tokens pour le CLI développeur, accédez à **Settings → Developer API**. Voir [Authentication](developer-cli-authentication).
## 8. Appareils de test \{#8-test-devices\}
Spécifiez les appareils à utiliser pour les tests afin de s'assurer qu'ils reçoivent des mises à jour instantanées pour les modifications de paywall ou de placement, en contournant les délais de mise en cache. Pour plus d'informations, consultez [Testing devices](test-devices).
## 9. Adhérence de variation inter-placement \{#9-cross-placement-variation-stickiness\}
Définissez combien de temps après la fin d'un test un utilisateur continue à voir les variantes du test. Cela affecte la précision des analyses et l'expérience utilisateur — car présenter à un utilisateur une offre différente de celle qu'il a déjà vue peut influencer sa décision d'achat.
La période d'adhérence maximale et par défaut est de 90 jours.
:::warning
Tenez compte des points suivants :
- La modification de ce paramètre affectera tous les utilisateurs qui ont précédemment reçu une variante. Ils seront immédiatement éligibles à un nouveau paywall lorsqu'ils verront un placement, ce qui peut fausser les résultats de vos tests A/B en cours.
- Si la période d'adhérence est expirée pour un utilisateur, il peut recevoir un nouveau paywall ou test A/B. Cependant, même dans ce cas, il ne pourra jamais faire partie d'un autre test inter-placement.
:::
## 10. Supprimer l'application \{#10-delete-the-app\}
Si vous n'avez plus besoin d'une application, vous pouvez la supprimer d'Adapty.
:::warning
Veuillez noter que cette action est irréversible et que vous ne pourrez pas restaurer l'application ni ses données.
:::
---
# File: ios-settings
---
---
title: "Identifiants Apple App Store"
description: "Configurez les paramètres iOS dans Adapty pour une gestion fluide des abonnements."
---
Pour configurer les identifiants App Store et assurer le bon fonctionnement du SDK iOS Adapty, rendez-vous dans l'onglet [iOS SDK](https://app.adapty.io/settings/ios-sdk) de la page App Settings dans l'Adapty Dashboard. Configurez ensuite les paramètres suivants :
| Champ | Description |
|----------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Bundle ID** | L'[identifiant bundle](app-store-connection-configuration#step-1-provide-bundle-id-and-apple-app-id) de votre application. |
| **In-app purchase API (StoreKit 2)** | [Clés](app-store-connection-configuration#step-2-provide-issuer-id-and-key-id) permettant l'authentification sécurisée et la validation des requêtes d'historique des transactions d'achats intégrés. |
| **App Store Server Notifications** | URL utilisée pour activer les [notifications serveur à serveur](enable-app-store-server-notifications) depuis l'App Store, afin de surveiller et de répondre aux changements de statut des abonnements des utilisateurs. |
| **App Store Promotional Offers** | Clés d'abonnement pour créer des [offres promotionnelles](generate-in-app-purchase-key) dans Adapty pour des produits spécifiques. |
| **Apple app ID** | L'identifiant de votre application sur l'App Store. Pour le trouver, ouvrez la page de votre application dans App Store Connect, accédez à la page **App Information** depuis le menu de gauche et copiez l'**Apple ID**. |
| **App Store Connect shared secret (LEGACY)** | **Clé legacy pour le SDK Adapty antérieur à la v2.9.0**
[Une clé](app-store-connection-configuration#step-5-enter-app-store-shared-secret) pour la validation des reçus et la prévention des fraudes dans votre application.
| --- # File: android-settings --- --- title: "Identifiants Google Play Store" description: "Configurez les paramètres Android dans Adapty pour une gestion fluide des abonnements." --- Pour que le SDK Android Adapty fonctionne, vous devez configurer plusieurs paramètres.
| Champ | Description |
| :------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Package name** | Le Package name est l'identifiant unique de votre application dans le Google Play Store. Il est requis pour le fonctionnement de base d'Adapty, notamment le traitement des abonnements. |
| **Service account key file** | [Clés](create-service-account) permettant une authentification sécurisée et la validation des achats. |
| **Google Play RTDN topic name** | URL utilisée pour activer les [notifications serveur à serveur](enable-real-time-developer-notifications-rtdn) depuis le Play Store afin de surveiller et de réagir aux changements de statut des abonnements des utilisateurs. |
---
# File: google-play-store-connection-configuration
---
---
title: "Configurer l'intégration Google Play Store"
description: "Configurez la connexion Google Play Store dans Adapty pour une gestion fluide des achats intégrés."
---
Cette section décrit le processus d'intégration de votre application mobile distribuée via Google Play avec Adapty. Vous devrez saisir les données de configuration de votre application depuis le Play Store dans l'Adapty Dashboard. Cette étape est indispensable pour valider les achats et recevoir les mises à jour d'abonnement depuis le Play Store dans Adapty.
Vous pouvez effectuer cette démarche lors de l'onboarding initial ou apporter des modifications ultérieurement dans les **App Settings** de l'Adapty Dashboard.
:::danger
La modification de la configuration n'est acceptable qu'avant la publication de votre application mobile intégrant les paywalls Adapty. Toute modification après la publication cassera l'intégration et les paywalls cesseront de s'afficher dans votre application.
:::
## Étape 1. Renseigner le nom de package \{#step-1-provide-package-name\}
Le nom de package est l'identifiant unique de votre application dans le Google Play Store. Il est nécessaire au fonctionnement de base d'Adapty, notamment pour le traitement des abonnements.
1. Ouvrez la [Google Play Developer Console](https://play.google.com/console/u/0/developers).
2. Sélectionnez l'application dont vous avez besoin de l'identifiant. La fenêtre **Dashboard** s'ouvre.
3. Trouvez l'identifiant produit sous le nom de l'application et copiez-le.
4. Ouvrez les [**App settings**](https://app.adapty.io/settings/android-sdk) depuis le menu supérieur d'Adapty.
5. Dans l'onglet **Android SDK** de la fenêtre **App settings**, collez le **Package name** copié.
## Étape 2. Importer le fichier de clé de compte \{#step-2-upload-the-account-key-file\}
1. Importez le fichier de clé privée du compte de service au format JSON, que vous avez créé à l'étape [Créer un fichier de clé de compte de service](create-service-account), dans la zone **Service account key file**.
N'oubliez pas de cliquer sur le bouton **Save** pour confirmer les modifications.
**Étape suivante**
- [Activer les notifications en temps réel pour les développeurs (RTDN) dans la Google Play Console](enable-real-time-developer-notifications-rtdn)
---
# File: enable-real-time-developer-notifications-rtdn
---
---
title: "Activer les notifications développeur en temps réel (RTDN) dans Google Play Console"
description: "Restez informé des événements critiques et maintenez la précision des données en activant les Real-time Developer Notifications (RTDN) dans la Google Play Console pour Adapty. Découvrez comment configurer les RTDN pour recevoir des mises à jour instantanées sur les remboursements et d'autres événements importants depuis le Play Store"
---
La configuration des notifications développeur en temps réel (RTDN) est essentielle pour garantir la précision des données : elle vous permet de recevoir instantanément les mises à jour du Play Store, notamment les informations sur les remboursements et d'autres événements.
## Activer les notifications \{#enable-notifications\}
1. Assurez-vous que **Google Cloud Pub/Sub** est activé. Ouvrez [ce lien](https://console.cloud.google.com/flows/enableapi?apiid=pubsub) et sélectionnez votre projet d'application. Si vous n'avez pas encore activé **Google Cloud Pub/Sub**, vous devez le faire ici.
2. Accédez à [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) depuis le menu supérieur d'Adapty et copiez le contenu du champ **Enable Pub/Sub API** situé à côté du titre **Google Play RTDN topic name**.
:::note Si le contenu du champ **Enable Pub/Sub API** est dans un format incorrect (le format correct commence par `projects/...`), consultez la section [Corriger le format incorrect du champ Enable Pub/Sub API](enable-real-time-developer-notifications-rtdn#fixing-incorrect-format-in-enable-pubsub-api-field) pour obtenir de l'aide. ::: 3. Ouvrez la [Google Play Console](https://play.google.com/console/), choisissez votre application et accédez à **Monetize with Play** -> **Monetization setup**. Dans la section **Google Play Billing**, cochez la case **Enable real-time notifications**. 4. Collez le contenu du champ **Enable Pub/Sub API** que vous avez copié dans les **App Settings** d'Adapty dans le champ **Topic name**. 5. Cliquez sur **Save changes** dans la Google Play Console.
## Tester les notifications \{#test-notifications\}
Pour vérifier que vous êtes bien abonné aux notifications développeur en temps réel :
1. Enregistrez les modifications dans les paramètres de la Google Play Console.
2. Sous **Topic name** dans la Google Play Console, cliquez sur **Send test notification**.
3. Accédez à [**App settings > Android SDK**](https://app.adapty.io/settings/android-sdk) dans Adapty. Si une notification de test a été envoyée, vous verrez son statut au-dessus du nom du sujet.
## Corriger le format incorrect du champ Enable Pub/Sub API \{#fixing-incorrect-format-in-enable-pubsub-api-field\}
Si le contenu du champ **Enable Pub/Sub API** est dans un format incorrect (le format correct commence par `projects/...`), suivez ces étapes pour diagnostiquer et résoudre le problème :
### 1. Vérifier l'activation de l'API et les autorisations \{#1-verify-api-enablement-and-permissions\}
Assurez-vous soigneusement que toutes les API requises sont activées et que les autorisations sont correctement accordées au compte de service. Même si vous avez déjà effectué ces étapes, il est important de les refaire pour vous assurer qu'aucune sous-étape n'a été manquée. Répétez les étapes des sections suivantes :
1. [Activer les API développeur dans la Google Play Console](enabling-of-devepoler-api)
2. [Créer un compte de service dans la Google Cloud Console](create-service-account)
3. [Accorder des autorisations au compte de service dans la Google Play Console](grant-permissions-to-service-account)
4. [Générer le fichier de clé du compte de service dans la Google Play Console](create-service-account-key-file)
5. [Configurer l'intégration Google Play Store](google-play-store-connection-configuration)
### 2. Ajuster les politiques de domaine \{#2-adjust-domain-policies\}
Modifiez les politiques **Domain restricted contacts** et **Domain restricted sharing** :
1. Ouvrez la [Google Cloud Console](https://console.cloud.google.com/) et sélectionnez le projet dans lequel vous avez créé le compte de service pour gérer votre application.
2. Dans la section **Quick Access**, choisissez **IAM & Admin**.
3. Dans le panneau de gauche, choisissez **Organization Policies**.
4. Recherchez la politique **Domain restricted contacts**.
5. Cliquez sur le bouton représentant des points de suspension dans la colonne **Actions** et choisissez **Edit policy**.
6. Dans la fenêtre de modification de la politique :
1. Sous **Policy source**, sélectionnez le bouton radio **Override parent's policy**.
2. Sous **Policy enforcement**, sélectionnez le bouton radio **Replace**.
3. Sous **Rules**, cliquez sur le bouton **ADD A RULE**.
4. Sous **New rule** -> **Policy values**, choisissez **Allow All**.
5. Cliquez sur **SET POLICY**.
7. Répétez les étapes 4 à 6 pour la politique **Domain restricted sharing**.
Ensuite, recréez le contenu du champ **Enable Pub/Sub API** situé à côté du titre **Google Play RTDN topic name**. Le champ aura désormais le format correct.
Veillez à remettre **Policy source** sur **Inherit parent's policy** pour les politiques modifiées une fois que vous avez activé avec succès les Real-time Developer Notifications (RTDN).
## Transfert des événements bruts \{#raw-events-forwarding\}
Il peut arriver que vous souhaitiez tout de même recevoir les événements S2S bruts de Google. Pour continuer à les recevoir tout en utilisant Adapty, ajoutez simplement votre endpoint dans le champ **URL for forwarding raw Google events** et nous vous transmettrons les événements bruts tels quels depuis Google.
---
**Prochaine étape**
Configurez le SDK Adapty pour :
- [Android](sdk-installation-android)
- [React Native](sdk-installation-reactnative)
- [Flutter](sdk-installation-flutter)
- [Kotlin Multiplatform](sdk-installation-kotlin-multiplatform)
- [Unity](sdk-installation-unity)
---
# File: apple-search-ads
---
---
title: "Apple Ads"
description: "Intégrez Apple Ads avec Adapty pour optimiser les conversions d'abonnements."
---
:::important
L'intégration Apple Ads dans **App settings** est utilisée uniquement pour l'analyse de base et pour les intégrations SplitMetrics Acquire et Asapty.
[Adapty Ads Manager](adapty-ads-manager) utilise une connexion distincte. Connectez votre compte Apple Ads dans [Adapty Ads Manager](adapty-ads-manager-get-started).
:::
Adapty vous permet d'obtenir des données d'attribution depuis Apple Ads et d'analyser vos métriques avec une segmentation par campagne et par mot-clé. Adapty collecte automatiquement les données d'attribution pour Apple Ads via son SDK et le framework AdServices.
Une fois l'intégration Apple Ads configurée, Adapty commencera à recevoir les données d'attribution d'Apple Ads. Vous pouvez consulter ces données directement sur la page des profils.
## Configurer l'intégration \{#set-up-integration\}
### Connecter Adapty au framework AdServices \{#connect-adapty-to-the-adservices-framework\}
Apple Ads via [AdServices](https://developer.apple.com/documentation/adservices) nécessite une configuration dans l'Adapty Dashboard, et vous devrez également l'activer côté application. Pour configurer Apple Ads via le framework AdServices avec Adapty, suivez ces étapes :
#### Étape 1 : Obtenir la clé publique \{#step-1-obtain-public-key\}
Dans l'Adapty Dashboard, rendez-vous dans [Settings -> Apple Ads.](https://app.adapty.io/settings/apple-search-ads)
Repérez la clé publique pré-générée (Adapty génère une paire de clés pour vous) et copiez-la.
:::note
Si vous utilisez un service alternatif ou votre propre solution pour l'attribution Apple Ads, vous pouvez importer votre propre clé privée.
:::
#### Étape 2 : Configurer la gestion des utilisateurs sur Apple Ads \{#step-2-configure-user-management-on-apple-ads\}
Dans votre [compte Apple Ads](https://ads.apple.com/app-store), accédez à la page **Settings > User Management**. Pour qu'Adapty puisse récupérer les données d'attribution, vous devez inviter un autre compte Apple ID et lui accorder un accès API Account Manager. Vous pouvez utiliser n'importe quel compte auquel vous avez accès ou en créer un nouveau à cet effet. L'essentiel est que vous puissiez vous connecter à Apple Ads avec cet Apple ID.
#### Étape 3 : Générer les identifiants API \{#step-3-generate-api-credentials\}
Connectez-vous ensuite au compte nouvellement ajouté dans Apple Ads. Dans l'interface Apple Ads, accédez à Settings -> API. Collez la clé publique copiée précédemment dans le champ prévu à cet effet. Générez de nouveaux identifiants API.
#### Étape 4 : Configurer Adapty avec les identifiants Apple Ads \{#step-4-configure-adapty-with-apple-ads-credentials\}
Copiez les champs Client ID, Team ID et Key ID depuis les paramètres Apple Ads. Dans l'Adapty Dashboard, collez ces identifiants dans les champs correspondants.
### Connecter votre application au réseau AdServices \{#connect-your-app-to-the-adservices-network\}
Une fois que vous avez terminé [la configuration du framework AdServices](#connect-adapty-to-the-adservices-framework), Adapty commence automatiquement à collecter les données d'attribution Apple Search Ad. Vous n'avez pas besoin d'ajouter de code SDK.
Pour les applications iOS, ces données d'attribution auront **toujours** la priorité sur les données provenant d'autres sources. Si ce comportement n'est pas souhaité, *désactivez* l'attribution ASA en suivant les instructions ci-dessous.
## Désactiver l'intégration \{#disable-integration\}
Pour désactiver l'attribution Apple Search Ads, ouvrez l'onglet [**App Settings** -> **Apple Search Ads**](https://app.adapty.io/settings/apple-search-ads) et désactivez le bouton **Receive Apple Search Ads attribution**.
:::warning
Veuillez noter que la désactiver arrêtera complètement la réception des données analytiques ASA. Par conséquent, ASA ne sera plus utilisé dans les analyses ni envoyé aux intégrations. De plus, SplitMetrics Acquire et Asapty cesseront de fonctionner, car ils dépendent de l'attribution ASA pour fonctionner correctement.
L'attribution reçue avant cette modification ne sera pas affectée.
:::
## Téléverser vos propres clés \{#uploading-your-own-keys\}
:::note
Facultatif
Ces étapes ne sont pas nécessaires pour l'attribution Apple Ads, uniquement pour travailler avec d'autres services comme Asapty ou votre propre solution.
:::
Vous pouvez utiliser votre propre paire de clés publique-privée si vous faites appel à d'autres services ou à votre propre solution pour l'attribution ASA.
### Étape 1 \{#step-1\}
Générez une clé privée dans le Terminal
```text showLineNumbers title="Text"
openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
```
Importez-la dans Adapty Settings -> Apple Ads (bouton Upload private key)
### Étape 2
Générez la clé publique dans le Terminal
```text showLineNumbers title="Text"
openssl ec -in private-key.pem -pubout -out public-key.pem
```
Vous pouvez utiliser cette clé publique dans les paramètres Apple Ads de votre compte avec le rôle API Account Manager. Vous pouvez ainsi utiliser les valeurs Client ID, Team ID et Key ID générées pour Adapty et d'autres services.
---
# File: account
---
---
title: "Détails du compte et facturation"
description: "Gérez votre compte Adapty et optimisez les paramètres pour un meilleur suivi des abonnements."
---
La page **Account** vous permet de gérer votre profil, les membres de l'équipe et la facturation.
La page comporte trois onglets :
- [Général](#general-settings)
- [Abonnement et facturation](#subscription--billing)
- [Membres](#members)
Pour accéder aux paramètres de votre compte, cliquez sur **Account** en haut à droite ou rendez-vous sur [app.adapty.io/account](https://app.adapty.io/account).
## Paramètres généraux \{#general-settings\}
L'onglet General contient votre profil, les paramètres du compte, les préférences d'affichage et la configuration des rapports.
- **Profile** : Saisissez votre prénom, nom de famille et le nom de votre entreprise. Le nom de l'entreprise peut comporter jusqu'à 256 caractères.
- **Account settings** : Consultez votre adresse e-mail enregistrée et modifiez votre mot de passe.
- **Date & Time formats** : Choisissez comment les dates et les heures s'affichent dans Adapty :
- **American format** : January 31, 2022 et heure au format 12 heures (AM/PM)
- **European format** : 31 January, 2022 et heure au format 24 heures (16:00)
- **Email reports** : Configurez des rapports quotidiens, hebdomadaires ou mensuels pour une ou toutes vos applications. Recevez des rapports récapitulatifs pour toutes les applications à la fois, ou obtenez un rapport détaillé pour chaque application sélectionnée.
## Abonnement & Facturation \{#subscription--billing\}
L'onglet **Subscription & Billing** vous permet de gérer vos informations de paiement et votre accès aux fonctionnalités :
- Ajouter ou mettre à jour vos coordonnées de paiement
- Consulter les informations de facturation
- Acheter des fonctionnalités payantes supplémentaires
En savoir plus sur les [fonctionnalités et les tarifs](https://adapty.io/pricing).
## Membres \{#members\}
Vous pouvez gérer les membres de votre équipe dans les paramètres de votre compte. Pour ajouter des membres, invitez-les par e-mail et assignez-leur un rôle.
Pour en savoir plus sur la gestion des membres de l'équipe et leurs droits d'accès, consultez [cette page](members-settings).
---
# File: members-settings
---
---
title: "Membres"
description: "Gérez les paramètres et les permissions des membres dans le tableau de bord d'Adapty."
---
:::note
Cette page concerne les membres du tableau de bord Adapty
Si vous souhaitez attribuer différents niveaux d'accès aux utilisateurs de votre application, consultez [Niveau d'accès](access-level).
:::
Le système de membres du tableau de bord Adapty vous permet d'accorder différents niveaux d'accès à Adapty et de spécifier les applications pour chaque membre.
## Rôles \{#roles\}
Les rôles suivants sont disponibles pour les membres dans le tableau de bord Adapty :
| Rôle | Accès à la facturation | Ajouter des membres | Modifier tout | Accès à toutes les sections |
|-------------|------------------------|---------------------|---------------|-----------------------------|
| Owner | ✅ | ✅ | ✅ | ✅ |
| Admin | ❌ | ✅ | ✅ | ✅ |
| Developer | ❌ | ❌ | ✅ | ❌ |
| Viewer | ❌ | ❌ | ❌ | ✅ |
| Support | ❌ | ❌ | ❌ | ❌ |
| ASA manager | ❌ | ❌ | ❌ | ❌ |
- **Owner :** Le Owner est le créateur d'origine du compte Adapty et détient le niveau d'accès et de contrôle le plus élevé. Les Owners ont un accès complet à la facturation Adapty, ce qui leur permet de gérer les informations de paiement et les plans d'abonnement. De plus, seuls les Owners et les Admins peuvent spécifier l'accès aux applications pour les nouveaux membres. Il ne peut y avoir qu'un seul Owner par compte Adapty.
- **Admin :** Les membres ayant le rôle Admin ont un accès complet aux applications choisies. Ils peuvent effectuer diverses tâches de gestion, notamment créer et modifier des paywalls, réaliser des tests A/B, analyser les données et gérer les membres au sein de ces applications.
- **Developer :** Les membres ayant le rôle Developer ont un accès complet à toutes les entités, à l'exception des analyses et des membres du compte. Ils n'ont pas accès aux paramètres de facturation. Ce rôle est destiné à ceux qui configurent les paywalls, les tests A/B et d'autres entités et intègrent Adapty dans votre application, mais ne doivent pas voir les données financières.
- **Viewer :** Les membres ayant le rôle Viewer ont un accès en lecture seule aux applications choisies. Ils peuvent consulter les informations, mais ne peuvent pas créer ni modifier des paywalls, des tests A/B et d'autres fonctionnalités, inviter de nouveaux utilisateurs, créer de nouvelles applications ni modifier les paramètres de l'application.
- **Support :** Les membres ayant le rôle Support n'ont accès qu'aux profils d'utilisateurs dans les applications choisies. Ils ne peuvent toutefois pas effectuer des actions telles qu'ajouter de nouveaux membres ou accéder à d'autres sections d'Adapty. Ce rôle convient particulièrement aux équipes d'assistance ou aux personnes qui doivent aider les clients avec des questions liées aux abonnements ou le dépannage.
- **ASA manager** : Les membres ayant le rôle ASA manager n'ont accès qu'au tableau de bord [Adapty Ads Manager](adapty-ads-manager).
## Ajouter un membre \{#add-a-member\}
Dans Adapty, vous pouvez inviter jusqu'à 256 membres. L'ajout de nouveaux membres est gratuit.
:::note
Vous pouvez uniquement inviter des adresses e-mail qui ne sont pas encore enregistrées dans Adapty. Si votre collègue possède un compte indépendant, invitez une autre adresse e-mail ou contactez le support Adapty pour supprimer son compte existant.
:::
Pour ajouter un membre :
1. Cliquez sur **Account** en haut à droite et ouvrez l'onglet **Members**.
2. Cliquez sur **Invite member**.
3. Saisissez l'adresse e-mail du membre.
4. Sélectionnez un [rôle](#roles) dans la liste.
5. Sélectionnez les applications auxquelles accorder l'accès.
6. (Facultatif) Activez **Always allow access to new apps** pour accorder automatiquement l'accès aux futures applications.
7. Cliquez sur **Save**.
## Transférer la propriété du compte \{#transfer-account-ownership\}
Si vous devez transférer la **propriété du compte** dans son ensemble, contactez notre équipe d'assistance à [support@adapty.io](mailto:support@adapty.io).
Si vous devez transférer la **propriété de l'application**, consultez le [guide dédié](transfer-apps) pour plus d'informations.
---
# File: apple-platform-resources
---
---
title: "Ressources pour la plateforme Apple"
description: "Explorez les ressources de la plateforme Apple pour optimiser la monétisation et la gestion des abonnements de votre application."
---
Adapty propose des SDK et des intégrations adaptés aux plateformes Apple, simplifiant le développement des achats intégrés, des abonnements, des paywalls et des tests A/B.
Utilisez les ressources suivantes pour tirer le meilleur parti d'Adapty sur Apple.
### Configuration initiale dans App Store Connect \{#initial-configuration-in-app-store-connect\}
1. [Générer une clé d'achat intégré dans App Store Connect](generate-in-app-purchase-key)
### Configuration des produits et offres dans App Store Connect \{#products-and-offers-configuration-in-app-store-connect\}
1. [Produit dans l'App Store](app-store-products)
2. [Offres dans l'App Store](app-store-offers)
### Informations complémentaires \{#additional-information\}
1. [Configurer App Store Connect](set-up-app-store-connect)
2. [Confidentialité des applications Apple](apple-app-privacy)
3. [Partage familial Apple](apple-family-sharing)
4. [Programme App Store pour les petites entreprises](app-store-small-business-program)
---
# File: set-up-app-store-connect
---
---
title: "Configurer App Store Connect"
description: "Un guide pour les développeurs débutants expliquant comment s'inscrire au programme Apple Developer et configurer App Store Connect pour les achats intégrés."
---
Si vous **développez votre première app iOS**, vous devez configurer votre compte Apple Developer et App Store Connect avant d'intégrer Adapty.
:::note
Si vous avez déjà un compte Apple Developer et une app enregistrée dans App Store Connect, vous pouvez passer ce guide et aller directement à [Intégration initiale avec l'App Store](initial_ios).
:::
## Étape 1. S'inscrire au programme Apple Developer \{#step-1-enroll-in-apple-developer-program\}
Pour distribuer des apps sur l'App Store et vendre des achats intégrés, vous devez rejoindre l'[Apple Developer Program](https://developer.apple.com/programs/).
### Choisir le type d'inscription \{#choose-enrollment-type\}
Apple propose deux types d'inscription :
| | Individuel | Organisation |
|--------------------------------------|------------------------|-------------------------------------|
| **Pour qui** | Développeurs solo | Entreprises, équipes, associations |
| **Nécessite un numéro D-U-N-S** | Non | Oui |
| **Apps publiées sous** | Votre nom personnel | Le nom de votre organisation |
| **Gestion d'équipe** | Non disponible | Disponible |
:::tip
Si vous vous inscrivez en tant qu'organisation, vous avez besoin d'un **numéro D-U-N-S** — un identifiant d'entreprise unique à neuf chiffres fourni par Dun & Bradstreet. Vous pouvez [vérifier si votre organisation en possède déjà un](https://developer.apple.com/enroll/duns-lookup/) ou en demander un nouveau — le lien se trouve en bas de la page de recherche. La réception d'un numéro D-U-N-S peut prendre jusqu'à 5 jours ouvrables.
:::
### S'inscrire \{#enroll\}
1. Rendez-vous sur la [page d'inscription au programme Apple Developer](https://developer.apple.com/programs/enroll/).
2. Connectez-vous avec votre Apple ID. Si vous n'en avez pas, créez-en un d'abord.
3. Suivez les étapes correspondant à votre type d'inscription (individuel ou organisation).
4. Payez les frais annuels.
Une fois votre inscription traitée par Apple, vous accédez à [App Store Connect](https://appstoreconnect.apple.com). L'inscription prend généralement jusqu'à 48 heures. Pour les organisations, cela peut prendre plus longtemps si une vérification D-U-N-S est requise.
## Étape 2. Configurer votre app dans App Store Connect \{#step-2-set-up-your-app-in-app-store-connect\}
Avant de pouvoir vendre des achats intégrés, effectuez la configuration initiale dans App Store Connect. Cela comprend la signature des contrats, l'ajout de vos coordonnées bancaires et l'enregistrement de votre app.
### Signer le contrat Paid Applications Agreement \{#sign-the-paid-applications-agreement\}
Apple exige que vous signiez le Paid Applications Agreement avant de pouvoir vendre sur l'App Store. Cela s'applique aussi bien aux apps payantes qu'aux achats intégrés dans les apps gratuites.
1. Rendez-vous sur la page **Business** dans [App Store Connect](https://appstoreconnect.apple.com/business).
2. Trouvez le contrat **Paid Apps** et cliquez sur **Review and Agree**.
3. Complétez les informations requises :
- **Banking information** : Ajoutez un compte bancaire sur lequel Apple enverra vos revenus.
- **Tax information** : Remplissez les formulaires fiscaux pour les pays où vous souhaitez vendre.
- **Contact information** : Renseignez vos coordonnées.
:::important
Vous devez compléter les trois sections (bancaire, fiscale, contact) pour que le contrat devienne actif. Tant que le contrat n'est pas actif, vous ne pouvez pas vendre d'achats intégrés.
:::
### Créer un Bundle ID \{#create-a-bundle-id\}
Un Bundle ID identifie votre app de façon unique dans l'écosystème Apple. Vous en avez besoin pour enregistrer votre app dans App Store Connect et pour configurer l'intégration Adapty.
1. Ouvrez le [portail Apple Developer](https://developer.apple.com/account).
2. Accédez à **Certificates, Identifiers & Profiles** → **Identifiers**.
3. Cliquez sur **+** pour enregistrer un nouvel identifiant.
4. Sélectionnez **App IDs** et cliquez sur **Continue**.
5. Sélectionnez **App** comme type et cliquez sur **Continue**.
6. Remplissez les champs :
- **Description** : Un nom pour vous aider à identifier ce Bundle ID (ex. : « My Subscription App »).
- **Bundle ID** : Choisissez **Explicit** et saisissez un identifiant unique au format domaine inversé (ex. : `com.yourcompany.yourapp`).
7. Dans la section **Capabilities**, faites défiler vers le bas et cochez **In-App Purchase**.
8. Cliquez sur **Continue**, puis sur **Register**.
### Enregistrer votre app dans App Store Connect \{#register-your-app-in-app-store-connect\}
1. Rendez-vous sur la page **Apps** dans [App Store Connect](https://appstoreconnect.apple.com/apps).
2. Cliquez sur **+** → **New App**.
3. Remplissez les champs obligatoires :
- **Platforms** : Sélectionnez **iOS**.
- **Name** : Le nom de votre app tel qu'il apparaîtra sur l'App Store.
- **Primary language** : La langue par défaut des métadonnées de votre app.
- **Bundle ID** : Sélectionnez le Bundle ID créé à l'étape précédente.
- **SKU** : Un identifiant unique pour votre app (non visible par les utilisateurs). Par exemple, `my_subscription_app_2025`.
4. Cliquez sur **Create**.
Votre app est maintenant enregistrée dans App Store Connect et prête pour l'intégration Adapty.
## Et ensuite \{#whats-next\}
- [Intégration initiale avec l'App Store](initial_ios) : Connectez votre app App Store à Adapty
- [Intégration du SDK](quickstart-sdk) : Intégrez le SDK Adapty dans le code de votre app
- [Tests en sandbox](test-purchases-in-sandbox) : Testez vos achats intégrés avant la mise en ligne
- [Soumettre votre app iOS à l'App Store](submit-app-to-app-store) : Uploadez votre build et soumettez-le pour la revue Apple
- [Programme Small Business de l'App Store](app-store-small-business-program) : Réduisez votre commission App Store de 30 % à 15 %
---
# File: app-store-products
---
---
title: "Produit dans l'App Store"
description: "Gérez efficacement les produits App Store grâce aux outils d'abonnement d'Adapty."
---
Cette page vous guide dans la création d'un produit dans App Store Connect. Même si ces informations ne concernent pas directement les fonctionnalités d'Adapty, elles constituent une ressource utile si vous rencontrez des difficultés lors de la création de produits dans votre compte App Store Connect.
Pour créer un produit qui sera lié à Adapty :
1. Ouvrez **App Store Connect**. Accédez à la section [**Monetization** → **Subscriptions**](https://appstoreconnect.apple.com/apps/6477523342/distribution/subscriptions) dans le menu de gauche.
2. Si vous n'avez pas encore créé de groupe d'abonnements, cliquez sur le bouton **Create** sous le titre **Subscription Groups** pour démarrer le processus. Les [groupes d'abonnements](https://developer.apple.com/help/app-store-connect/manage-subscriptions/offer-auto-renewable-subscriptions) dans App Store Connect permettent de catégoriser et de gérer vos produits, offrant aux utilisateurs la possibilité de passer facilement d'une offre à l'autre. Notez qu'il n'est pas possible de créer un abonnement en dehors d'un groupe.
3. Dans la fenêtre **Create Subscription Group** qui s'ouvre, saisissez un nom pour le nouveau groupe d'abonnements dans le champ **Reference Name**. Ce nom de référence est une étiquette ou un identifiant défini par vous pour distinguer et gérer les différents groupes d'abonnements au sein de votre application.
Le nom de référence n'est pas visible par les utilisateurs ; il est destiné à votre usage interne et à votre organisation. Il vous permet d'identifier et de référencer facilement des groupes d'abonnements spécifiques lors de leur gestion dans l'interface App Store Connect. Cela s'avère particulièrement utile si vous proposez plusieurs offres d'abonnement ou souhaitez les catégoriser d'une façon cohérente avec la structure de votre application.
4. Cliquez sur le bouton **Create** pour confirmer la création du groupe d'abonnements.
5. Le groupe d'abonnements est créé et s'ouvre. Vous pouvez maintenant créer des abonnements dans ce groupe. Cliquez sur le bouton **Create** sous le titre **Subscriptions**. Si vous ajoutez un nouvel abonnement à un groupe existant, cliquez sur le bouton **Plus** à côté du titre **Subscriptions**.
6. Dans la fenêtre **Create Subscription** qui s'ouvre, saisissez le nom de l'abonnement dans le champ **Reference Name** et son code unique dans le champ **Product ID**.
Le Reference Name est un identifiant exclusif dans App Store Connect pour votre abonnement intégré. Il n'est pas visible par vos utilisateurs sur l'App Store. Nous recommandons d'utiliser une description claire et lisible qui représente précisément l'abonnement que vous souhaitez créer. Ce nom ne doit pas dépasser 64 caractères.
Le Product ID est un identifiant alphanumérique unique, indispensable pour accéder à votre produit pendant la phase de développement et pour le synchroniser avec Adapty. Seuls les caractères alphanumériques, les points et les underscores sont autorisés dans le Product ID.
7. Cliquez sur le bouton **Create** pour confirmer la création de l'abonnement.
8. L'abonnement est créé et s'ouvre. Sélectionnez maintenant la durée de l'abonnement dans la liste **Subscription Duration**. Même si la durée est déjà indiquée dans le nom de l'abonnement, pensez bien à renseigner le champ **Subscription Duration**.
9. Il est maintenant temps de configurer le prix de l'abonnement. Pour ce faire, cliquez sur le bouton **Add Subscription Price** sous le titre Subscription Prices. Vous devrez peut-être faire défiler la page vers le bas pour le trouver.
10. Dans la fenêtre **Subscription Price** qui s'ouvre, sélectionnez le pays de référence dans la liste **Country or Region** et la devise de base dans la liste **Price**. Apple calculera ensuite automatiquement les prix pour l'ensemble des 175 pays ou régions à partir de ce prix de base et des taux de change en vigueur.
11. Cliquez sur le bouton **Next**. Dans la fenêtre **Price by Country or Region** qui s'ouvre, vous voyez les prix recalculés automatiquement pour tous les pays. Vous pouvez les modifier si vous le souhaitez.
12. Après avoir mis à jour les prix régionaux, cliquez sur le bouton **Next** en bas de la fenêtre.
13. Dans la fenêtre **Confirm Subscription Price?** qui s'ouvre, vérifiez attentivement les prix finaux. Pour les corriger, vous pouvez cliquer sur le bouton **Back** pour revenir à la fenêtre **Price by Country or Region** et les modifier. Lorsque les prix vous conviennent, cliquez sur le bouton **Confirm**.
14. Après avoir fermé la fenêtre **Confirm Subscription Price?**, pensez à cliquer sur le bouton **Save** dans la fenêtre de votre abonnement. Sans cela, l'abonnement ne sera pas créé et toutes les données saisies seront perdues.
Notez que les étapes décrites jusqu'ici portent sur la configuration d'un abonnement auto-renouvelable. Cependant, si vous souhaitez configurer d'autres types d'achats intégrés, cliquez sur l'onglet **In-App Purchases** dans la barre latérale, plutôt que sur « Subscriptions ». Vous accéderez ainsi à la section où vous pouvez gérer et créer différents types d'achats intégrés.
### Ajouter des produits à Adapty \{#add-products-to-adapty\}
Une fois vos achats intégrés, abonnements et offres ajoutés dans App Store Connect, l'étape suivante consiste à [ajouter ces produits à Adapty](create-product).
---
# File: apple-app-privacy
---
---
title: "Confidentialité des apps Apple"
description: "Comprenez les politiques de confidentialité des apps Apple et leur impact sur votre app d'abonnement."
---
Apple exige une déclaration de confidentialité pour toutes les nouvelles apps et mises à jour d'apps, à la fois dans la section **App Privacy** d'App Store Connect et sous forme de fichier manifeste de l'app. Adapty est une dépendance tierce de votre app, vous devez donc indiquer comment vous utilisez Adapty en lien avec les données utilisateur.
## Manifeste de confidentialité des apps Apple \{#apple-app-privacy-manifest\}
Le [fichier manifeste de confidentialité](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests), nommé `PrivacyInfo.xcprivacy`, décrit quelles données privées votre app utilise et pourquoi. En tant que propriétaire d'app, vous devez créer un fichier manifeste pour votre app. De plus, si vous intégrez des SDK supplémentaires, assurez-vous que les fichiers manifestes de ceux figurant dans la liste des [SDK nécessitant un manifeste de confidentialité et une signature](https://developer.apple.com/support/third-party-SDK-requirements/) sont bien inclus. Lorsque vous compilez votre app, Xcode fusionnera tous ces fichiers manifestes en un seul.
Bien qu'Adapty ne figure pas dans la liste des [SDK nécessitant un manifeste de confidentialité et une signature](https://developer.apple.com/support/third-party-SDK-requirements/), les versions 2.10.2 et supérieures du SDK Adapty l'incluent pour votre commodité. Pensez à mettre à jour le SDK pour obtenir le manifeste.
Bien qu'Adapty ne nécessite aucune donnée à inclure dans le fichier manifeste (également appelé rapport de confidentialité de l'app), si vous utilisez le `customerUserId` d'Adapty à des fins de suivi, vous devez le spécifier dans votre fichier manifeste comme suit :
1. Ajoutez un dictionnaire au tableau `NSPrivacyCollectedDataTypes` dans votre fichier d'informations de confidentialité.
2. Ajoutez les clés `NSPrivacyCollectedDataType`, `NSPrivacyCollectedDataTypeLinked` et `NSPrivacyCollectedDataTypeTracking` au dictionnaire.
3. Ajoutez la chaîne `NSPrivacyCollectedDataTypeUserID` (identifiant du type de données `UserID` dans la [liste des catégories et types de données à déclarer dans le fichier manifeste](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests#Describe-the-data-your-app-or-third-party-SDK-collects)) pour la clé `NSPrivacyCollectedDataType` dans votre dictionnaire `NSPrivacyCollectedDataTypes`.
4. Ajoutez `true` pour les clés `NSPrivacyCollectedDataTypeTracking` et `NSPrivacyCollectedDataTypeLinked` dans votre dictionnaire `NSPrivacyCollectedDataTypes`.
5. Utilisez la chaîne `NSPrivacyCollectedDataTypePurposeProductPersonalization` comme valeur pour la clé `NSPrivacyCollectedDataTypePurposes` dans votre dictionnaire `NSPrivacyCollectedDataTypes`.
Si vous ciblez vos paywalls vers des audiences avec des attributs personnalisés, réfléchissez attentivement aux attributs que vous utilisez et vérifiez s'ils correspondent aux [catégories et types de données à déclarer dans le fichier manifeste](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests). Si c'est le cas, répétez les étapes ci-dessus pour chaque type de données.
Après avoir déclaré tous les types et catégories de données que vous collectez, créez le rapport de confidentialité de votre app comme décrit dans la [documentation Apple](https://developer.apple.com/documentation/bundleresources/describing-data-use-in-privacy-manifests#Create-your-apps-privacy-report).
## Déclaration de confidentialité des apps Apple dans App Store Connect \{#apple-app-privacy-disclosure-in-app-store-connect\}
1. Dans [App Store Connect](https://appstoreconnect.apple.com/), ouvrez votre app et accédez à **App Privacy**. Cliquez sur **Get Started**.
2. Sélectionnez **Yes, we collect data from this app** et cliquez sur **Next**.
### Types de données \{#data-types\}
Le tableau ci-dessous liste les types de données qu'Apple vous demande de déclarer et indique lesquels sont requis par Adapty. **Cela ne couvre qu'Adapty.** Si votre app collecte des données supplémentaires via d'autres SDK ou votre propre code, sélectionnez également ces types de données.
✅ = Requis par Adapty
👀 = Peut être requis \(voir les détails ci-dessous\)
❌ = Non requis par Adapty — à sélectionner si votre app collecte ces données par d'autres moyens
| Type de données | Requis | Remarque |
|-------------------------------------------------------------------------|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Identifiants | ✅ | Si vous identifiez les utilisateurs avec un customerUserId, sélectionnez « User ID ».
Adapty collecte l'IDFA, vous devez donc sélectionner « Device ID ».
| | Achats | ✅ | Adapty collecte l'historique des achats des utilisateurs. | | Informations de contact, dont nom, numéro de téléphone ou adresse e-mail | 👀 | Requis si vous transmettez des données personnelles comme le nom, le numéro de téléphone ou l'adresse e-mail via la méthode **`updateProfile`**. | | Données d'utilisation | 👀 | Si vous utilisez des SDK d'analyse tels qu'Amplitude, Mixpanel, AppMetrica ou Firebase, cela peut être requis. | | Localisation | ❌ | Adapty ne collecte pas de données de localisation précise. À sélectionner si votre app les collecte. | | Santé & Remise en forme | ❌ | Adapty ne collecte pas de données de santé ou de remise en forme. À sélectionner si votre app les collecte. | | Informations sensibles | ❌ | Adapty ne collecte pas d'informations sensibles. À sélectionner si votre app en collecte. | | Contenu utilisateur | ❌ | Adapty ne collecte pas de contenu utilisateur. À sélectionner si votre app en collecte. | | Diagnostics | ❌ | Adapty ne collecte pas de données de diagnostic. À sélectionner si votre app en collecte. | | Historique de navigation | ❌ | Adapty ne collecte pas l'historique de navigation. À sélectionner si votre app le collecte. | | Historique de recherche | ❌ | Adapty ne collecte pas l'historique de recherche. À sélectionner si votre app le collecte. | | Contacts | ❌ | Adapty ne collecte pas les listes de contacts. À sélectionner si votre app les collecte. | | Informations financières | ❌ | Adapty ne collecte pas d'informations financières. À sélectionner si votre app en collecte. | ### Types de données requis \{#required-data-types\} #### Achats \{#purchases\} Lors de l'utilisation d'Adapty, vous devez déclarer que votre app collecte l'**historique des achats**.
#### Identifiants \{#identifiers\}
Lors de l'utilisation d'Adapty, vous devez déclarer les identifiants suivants :
- **Device ID** — Adapty collecte l'IDFA.
- **User ID** — requis si vous identifiez les utilisateurs avec **`customerUserId`**.
### Utilisation des données \{#data-usage\}
Après avoir enregistré les **types de données**, vous devrez indiquer comment les données sont utilisées :
1. Cliquez sur **Set up purchase history** dans le bloc **Purchases**.
2. Lorsqu'Apple vous demande comment les données d'historique des achats sont utilisées, sélectionnez les options suivantes pour Adapty :
- **Analytics** — Adapty utilise l'historique des achats pour les analyses de revenus, les cohortes et les métriques.
- **Product Personalization** — Adapty utilise les données d'achat pour la segmentation des audiences et le ciblage des paywalls.
- **App Functionality** — Adapty valide les achats, gère les niveaux d'accès et suit le statut des abonnements.
Sélectionnez des finalités supplémentaires si votre app utilise les données d'achat d'autres façons (par exemple, si vous envoyez des événements d'achat à des plateformes publicitaires via les intégrations Adapty).
3. Cliquez sur **Next**.
4. Pour **Device ID** et **User ID** (si utilisé) :
1. Cliquez sur **Set up user/device ID** dans le bloc **User/Device ID**.
2. Lorsqu'Apple vous demande comment les données d'identifiant sont utilisées, sélectionnez les options suivantes pour Adapty :
- **App Functionality** — Adapty utilise les identifiants pour gérer les profils utilisateur, associer les achats et suivre les niveaux d'accès.
Si vous envoyez des données d'attribution à des plateformes tierces via les intégrations Adapty (comme AppsFlyer ou Adjust), sélectionnez également **Third-Party Advertising**. Sélectionnez des finalités supplémentaires si votre app utilise les identifiants d'autres façons.
5. Cliquez sur **Next**.
---
# File: apple-family-sharing
---
---
title: "Apple family sharing"
description: "Activez Apple Family Sharing dans Adapty pour prendre en charge les abonnements partagés."
---
Le partage familial Apple permet de distribuer des achats intégrés entre les membres d'une famille. Pour les utilisateurs d'applications orientées groupe, comme les services de streaming vidéo ou les applications pour enfants, c'est un moyen pratique de partager un abonnement sans avoir à communiquer son identifiant Apple. En permettant à jusqu'à cinq membres de la famille d'utiliser un abonnement, le [Partage familial](https://developer.apple.com/documentation/storekit/supporting-family-sharing-in-your-app) peut améliorer l'engagement et la fidélisation des utilisateurs de votre application.
Dans ce guide, nous expliquerons comment activer le Partage familial pour vos abonnements et comment Adapty gère les achats partagés au sein d'une famille.
Pour commencer, rendez-vous sur [App Store Connect](https://appstoreconnect.apple.com/). Le Partage familial est désactivé par défaut pour tous les achats intégrés, nouveaux comme existants. Vous devez donc l'activer individuellement pour chacun d'eux. Pour ce faire, accédez à la **page de votre application**, naviguez jusqu'à la page de l'achat intégré concerné, puis sélectionnez l'option **Turn On** dans la section Family Sharing.
Gardez à l'esprit qu'une fois le Partage familial activé pour un produit, **il ne peut plus être désactivé**, car cela perturberait l'expérience des utilisateurs qui ont déjà partagé l'abonnement avec leur famille.
Notez également que seuls les produits non consommables et les abonnements peuvent être partagés.
Dans la fenêtre modale qui s'affiche, cliquez simplement sur le bouton **Confirm** pour finaliser la configuration. La section Family Sharing devrait alors afficher le message « This subscription can be shared by everyone in a family group. », confirmant que l'abonnement est désormais activé pour le Partage familial et peut être partagé avec jusqu'à cinq membres de la famille.
Adapty prend en charge le Partage familial sans aucune configuration supplémentaire de votre part. Il vous suffit de [configurer vos produits](app-store-products) depuis l'App Store : une fois le **Partage familial** activé dans App Store Connect, il sera automatiquement disponible dans **Adapty** et vous sera transmis sous forme d'événement via le webhook.
:::note
Le Partage familial n'est pas pris en charge dans l'environnement sandbox.
:::
À noter que lorsqu'un utilisateur achète un abonnement et le partage avec les membres de sa famille, un **délai pouvant aller jusqu'à une heure** s'écoule avant que celui-ci ne soit disponible pour eux. Apple a prévu ce délai pour laisser à l'utilisateur le temps de changer d'avis et d'annuler le partage s'il le souhaite. En revanche, lors du renouvellement d'un abonnement, aucun délai n'est appliqué.
Lorsqu'un utilisateur achète un produit intégré partageable en famille, la transaction apparaît dans son reçu comme d'habitude, mais avec l'ajout d'un nouveau champ `in_app_ownership_type` ayant la valeur `PURCHASED`. De plus, une nouvelle transaction est créée pour chaque membre de la famille, avec un `web_order_line_item_id` et un `original_transaction_id` différents de ceux de l'achat d'origine, ainsi qu'un champ `in_app_ownership_type` ayant la valeur `FAMILY_SHARED`.
Pour garantir un calcul précis des revenus, seules les transactions dont le champ `in_app_ownership_type` a la valeur `PURCHASED` sont comptabilisées dans les analyses Adapty. Les transactions `FAMILY_SHARED` sont exclues des métriques de revenus et de conversion.
**Événements envoyés pour les transactions de Partage familial.**
Les transactions `FAMILY_SHARED` ne déclenchent qu'un événement **Access level updated**. Les événements d'abonnement par produit ne sont pas déclenchés pour les membres de la famille.
| Événement | `FAMILY_SHARED` | `PURCHASED` |
| --- | --- | --- |
| **Access level updated** | Oui | Oui |
| **Subscription started** | Non | Oui |
| **Trial started** | Non | Oui |
| **Subscription renewed** | Non | Oui |
| **Subscription expired** | Non | Oui |
| **Subscription refunded** | Non | Oui |
| **Billing issue detected** | Non | Oui |
Si vos analyses en aval se basent sur **Subscription started**, les membres de la famille n'y apparaîtront pas. Utilisez **Access level updated** pour détecter les membres de la famille actifs.
Pour identifier les autres membres de la famille dans Adapty, vous pouvez les retrouver dans les détails de l'événement. Commencez par localiser la transaction d'achat familial d'origine, puis examinez les détails de l'événement correspondant en recherchant le même produit, la même date d'achat et la même date d'expiration. En analysant ces détails, vous pourrez identifier les autres transactions d'adhésion familiale associées à l'achat d'origine.
---
# File: app-store-small-business-program
---
---
title: "App Store Small Business Program"
description: "Comprendre le programme Small Business d'Apple, son impact sur vos revenus et les analyses Adapty"
---
:::link
Pour le programme équivalent sur le Play Store, consultez [Google Reduced Service Fee](google-reduced-service-fee).
:::
Les organisations dont les revenus annuels sur l'App Store ne dépassent pas 1 million USD peuvent participer au [programme Small Business](https://developer.apple.com/app-store/small-business-program/) d'Apple. En vous inscrivant, le taux de commission standard de 30 % est réduit à **15 %**.
Les membres du programme doivent **modifier leurs paramètres Adapty** pour garantir des calculs de revenus corrects et un traitement approprié des événements d'intégration.
Cet article décrit :
* [Comment configurer Adapty](#configure-adapty) si votre application est inscrite au programme Small Business
* [Comment s'inscrire au programme](#apply-for-the-program) pour réduire votre commission sur le store
## Configurer Adapty \{#configure-adapty\}
Adapty peut appliquer le taux de commission réduit à vos [analyses](analytics) et [événements d'intégration](analytics-integration). Pour l'activer, indiquez votre statut dans le programme Small Business pour chaque application.
:::warning
Configurez votre statut SBP dans Adapty **dès que vous recevez l'approbation**. Les modifications tardives ne peuvent pas réécrire les événements webhook déjà envoyés ([détails](#retroactive-setting-changes)).
:::
1. Ouvrez [**App Settings** → **General**](https://app.adapty.io/account)
2. Repérez la section **Small Business Program**.
3. Cliquez sur **Add period**.
4. Sélectionnez la date de début de l'adhésion.
5. Sélectionnez une date de fin, ou activez la case **At the current moment** pour prolonger ce statut indéfiniment. Si vous [perdez votre éligibilité](#losing-eligibility) à l'avenir, vous pourrez modifier la date de fin.
6. Cliquez sur **Apply**.
Si votre organisation reste éligible au programme, son adhésion est reconduite pour l'année civile suivante. Mais le statut d'adhésion ne s'applique **qu'à la plage de dates que vous spécifiez**.
* Cliquez sur **Add period** pour ajouter une nouvelle période d'adhésion.
* Pour prolonger ce statut indéfiniment, activez la case **At the current moment**.
Pour vérifier votre configuration, ouvrez le [graphique Revenus](revenue) et sélectionnez **Proceeds after store commission**. Vérifiez que les revenus affichés reflètent bien le taux de commission réduit.
## S'inscrire au programme \{#apply-for-the-program\}
### Conditions d'éligibilité \{#eligibility-requirements\}
Apple détermine l'éligibilité au SBP en fonction de vos **revenus annuels** — les ventes de l'année civile précédente **après** déduction de la commission du store et des taxes.
Pour être éligible, les revenus annuels de votre organisation et de ses
2. Cliquez sur le bouton **Create subscription**.
3. Dans la fenêtre **Create subscription** qui s'ouvre, saisissez l'identifiant de l'abonnement dans le champ **Product ID** et le nom de l'abonnement dans le champ **Name**.
Le Product ID doit être unique, commencer par un chiffre ou une lettre minuscule, et peut également contenir des underscores (\_) et des points (.). Il sert à accéder à votre produit pendant le développement et à le synchroniser avec Adapty. Une fois qu'un Product ID est attribué à un produit dans la Google Play Console, il ne peut pas être réutilisé pour d'autres applications, même si le produit est supprimé.
Pour nommer votre Product ID, il est conseillé de suivre un format standardisé. Nous recommandons une approche plus concise en nommant le produit `
3. Une fois les détails de l'abonnement affichés, cliquez sur le bouton **Add base plan** sous le titre **Base plans and offers**. Vous devrez peut-être faire défiler la page vers le bas pour le trouver.
4. Dans la fenêtre **Add base plan** qui s'ouvre, saisissez un identifiant unique pour le plan de base dans le champ **Plan ID**. Il doit commencer par un chiffre ou une lettre minuscule, et peut contenir des chiffres (0-9), des lettres minuscules (a-z) et des tirets (-), puis remplissez les champs obligatoires.
5. Indiquez les prix par région.
6. Cliquez sur le bouton **Save** pour finaliser la configuration.
7. Cliquez sur le bouton **Activate** pour activer le plan de base.
Gardez à l'esprit que dans Adapty, les produits d'abonnement ne peuvent avoir qu'un seul plan de base avec une durée et un type de renouvellement cohérents.
### Produits de secours \{#fallback-products\}
:::warning
Prise en charge des plans de base non rétrocompatibles
Les versions plus anciennes des SDK Adapty ne prennent pas en charge les fonctionnalités de Google Billing Library v5+, notamment les plans de base multiples par produit d'abonnement et les offres. Seuls les plans de base marqués comme **[rétrocompatibles](https://support.google.com/googleplay/android-developer/answer/12124625?hl=en#backwards_compatible)** dans la Google Play Console sont accessibles avec ces versions du SDK. Notez qu'un seul plan de base par abonnement peut être marqué comme rétrocompatible.
:::
Pour exploiter pleinement les configurations et fonctionnalités d'abonnement Google améliorées dans Adapty, nous offrons la possibilité de configurer un produit de secours rétrocompatible. Ce produit de secours est utilisé exclusivement pour les applications utilisant des versions plus anciennes du SDK Adapty. Lors de la création de produits Google Play, vous pouvez désormais indiquer si le produit doit être marqué comme rétrocompatible dans la Play Console. Adapty utilise cette information pour déterminer si le produit peut être acheté par des versions plus anciennes du SDK (versions 2.5 et inférieures).
Supposons que vous ayez un abonnement nommé `subscription.premium` proposant deux plans de base : hebdomadaire (rétrocompatible) et mensuel. Si vous ajoutez le produit `subscription.premium:weekly` dans Adapty, vous n'avez pas besoin d'indiquer un produit rétrocompatible. En revanche, pour le produit `subscription.premium:monthly`, vous devrez en spécifier un. Ne pas le faire pourrait entraîner un achat involontaire du produit `subscription.premium:weekly` dans la bibliothèque de facturation Google v4. Pour résoudre ce problème, vous devez créer un produit distinct dont le plan de base est également mensuel et marqué comme rétrocompatible. Cela garantit que les utilisateurs qui choisissent l'option `subscription.premium:monthly` seront facturés correctement à la fréquence prévue.
## Ajouter des produits dans Adapty \{#add-products-to-adapty\}
Une fois que vous avez terminé d'ajouter vos achats intégrés, abonnements et offres dans l'App Store Connect, l'étape suivante consiste à [ajouter ces produits dans Adapty](create-product).
---
# File: google-play-data-safety
---
---
title: "Google Play Data Safety"
description: "Assurez la conformité avec les politiques de confidentialité des données Google Play dans Adapty."
---
La section Data Safety disponible sur Google Play offre aux développeurs d'applications une méthode simple pour informer les utilisateurs sur les données collectées ou partagées par leur application, ainsi que pour mettre en avant les mesures essentielles de confidentialité et de sécurité. Ces informations permettent aux utilisateurs de faire des choix plus éclairés au moment de sélectionner les applications à télécharger et à utiliser.
Voici un guide succinct sur les données collectées par Adapty pour vous aider à fournir les informations requises à Google Play.
## Collecte et sécurité des données \{#data-collection-and-security\}
**Votre application collecte-t-elle ou partage-t-elle l'un des types de données utilisateur requis ?**
Sélectionnez « Oui », car Adapty collecte l'historique d'achats des clients.
**Toutes les données utilisateur collectées par votre application sont-elles chiffrées en transit ?**
Sélectionnez « Oui », car Adapty chiffre les données en transit.
**Proposez-vous aux utilisateurs un moyen de demander la suppression de leurs données ?**
Si vous sélectionnez « Oui », assurez-vous que vos clients ont un moyen de contacter votre équipe d'assistance pour demander la suppression de leurs données. Vous pourrez supprimer le client directement depuis le tableau de bord Adapty ou via l'API REST.
## Types de données \{#data-types\}
Voici la liste des types de données que Google exige pour la déclaration. Nous avons précisé si Adapty collecte chaque type de données concerné.
| Type de données | Détails |
| :------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Localisation | Non collectée par Adapty |
| Santé et Forme physique | Non collectée par Adapty |
| Photos et Vidéos | Non collectée par Adapty |
| Fichiers et Documents | Non collectée par Adapty |
| Calendrier | Non collectée par Adapty |
| Contacts | Non collectée par Adapty |
| Contenu utilisateur | Non collectée par Adapty |
| Historique de navigation | Non collectée par Adapty |
| Historique de recherche | Non collectée par Adapty |
| Informations et performances de l'app | Non collectée par Adapty |
| Navigation web | Non collectée par Adapty |
| Coordonnées | Non collectée par Adapty |
| Informations financières | Adapty collecte l'historique d'achats des utilisateurs |
| Informations personnelles et identifiants | Adapty collecte l'identifiant utilisateur et d'autres informations d'identification, notamment le nom, l'adresse e-mail, le numéro de téléphone, etc., si vous les transmettez explicitement au SDK Adapty. |
| Identifiants d'appareil et autres | Adapty collecte des données sur l'identifiant d'appareil. |
## Utilisation et traitement des données \{#data-usage-and-handling\}
### Identifiants utilisateur \{#user-ids\}
**1. Ces données sont-elles collectées, partagées, ou les deux ?**
Ces données sont collectées par Adapty. Si vous utilisez des intégrations entre Adapty et des tiers qui ne sont pas considérés comme des prestataires de services, vous devrez peut-être également déclarer « Partagées » ici.
**2. Ces données sont-elles traitées de manière éphémère ?**
Sélectionnez « Non ».
**3. Ces données sont-elles obligatoires pour votre application, ou les utilisateurs peuvent-ils choisir de ne pas les partager ?**
La collecte de ces données est obligatoire et ne peut pas être désactivée.
**4. Pourquoi ces données utilisateur sont-elles collectées ? / Pourquoi ces données utilisateur sont-elles partagées ?**
Cochez les cases « Fonctionnalité de l'application » et « Analytique ».
### Informations financières \{#financial-info\}
Si vous utilisez Adapty, vous devez déclarer que votre application collecte des informations sur l'« Historique des achats » dans la section Types de données de la Google Play Console.
### Identifiants d'appareil ou autres \{#device-or-other-ids\}
## Étapes suivantes \{#next-steps\}
Une fois vos sélections de confidentialité des données effectuées, Google affichera un aperçu de la section confidentialité de votre application. Si vous avez opté pour « Informations financières » et « Identifiants d'appareil ou autres » comme indiqué précédemment, vos informations de confidentialité devraient ressembler à l'exemple suivant.
Si vous êtes prêt à soumettre votre application à l'examen, consultez notre document [Liste de vérification avant lancement](release-checklist) pour obtenir des conseils supplémentaires sur la préparation de votre application à la soumission.
---
# File: google-reduced-service-fee
---
---
title: "Frais de service réduits Google"
description: "Comprenez les frais de service réduits de Google, leur impact sur vos revenus et les analyses d'Adapty"
---
:::link
Pour le programme App Store correspondant, consultez [Programme pour les petites entreprises de l'App Store](app-store-small-business-program).
:::
Le [programme de frais de service réduits](https://support.google.com/googleplay/android-developer/answer/112622?hl=en) de Google Play réduit la commission sur vos premiers 1 million USD de revenus annuels, la faisant passer de 30 % à **15 %**. Les revenus dépassant 1 million USD au cours de la même année civile sont facturés au taux standard de 30 %.
:::note
Depuis le 1er janvier 2022, Google applique 15 % sur tous les abonnements à renouvellement automatique, indépendamment de ce programme. Les frais de service réduits profitent principalement aux achats intégrés hors abonnement et aux applications payantes.
:::
Les membres du programme doivent **modifier leurs paramètres Adapty** pour garantir des calculs de revenus corrects et une gestion appropriée des événements d'intégration.
Cet article décrit :
* [Comment configurer Adapty](#configure-adapty) si votre application est inscrite au programme de frais de service réduits
* [Comment s'inscrire au programme](#enroll-in-the-program) si vous souhaitez réduire votre commission store
## Configurer Adapty \{#configure-adapty\}
Adapty peut appliquer le taux de commission réduit à vos [analyses](analytics) et [événements d'intégration](analytics-integration). Pour activer cette option, indiquez votre statut de frais de service réduits pour chaque application.
:::warning
Configurez votre statut de frais de service réduits dans Adapty **dès votre inscription**. Les modifications tardives ne peuvent pas réécrire les événements webhook déjà envoyés ([détails](#retroactive-setting-changes)).
:::
1. Ouvrez [**App Settings** → **General**](https://app.adapty.io/account).
2. Repérez la section **Reduced Service Fee**.
3. Cliquez sur **Add period**.
4. Sélectionnez la date de début de l'adhésion.
5. Sélectionnez une date de fin, ou activez la case **At the current moment** pour prolonger ce statut indéfiniment. Si vos [revenus annuels dépassent 1 million USD](#exceeding-the-threshold), vous pouvez modifier la date de fin.
6. Cliquez sur **Apply**.
Le statut d'adhésion s'applique uniquement **à la plage de dates que vous spécifiez**. Le programme se réinitialise à chaque année civile.
* Cliquez sur **Add period** pour ajouter une nouvelle période d'adhésion.
* Pour prolonger ce statut indéfiniment, activez la case **At the current moment**.
Pour vérifier votre configuration, ouvrez le [graphique Revenue](revenue) et sélectionnez **Proceeds after store commission**. Confirmez que les revenus affichés reflètent bien le taux de commission réduit.
## S'inscrire au programme \{#enroll-in-the-program\}
### Conditions d'éligibilité \{#eligibility-requirements\}
Google détermine l'éligibilité en fonction de vos **revenus annuels** sur l'ensemble des comptes de votre | Option | Description | | ------- | ------------------------------------------------------------ | | Opt-out | (par défaut) Si Adapty ne connaît pas le statut de consentement de l'utilisateur, il suppose que le consentement **a été donné** et Refund Saver **partagera** les données liées aux remboursements avec Apple. | | Opt-in | Si Adapty ne connaît pas le statut de consentement de l'utilisateur, il suppose que le consentement **n'a pas été donné** et Refund Saver **ne partagera aucune** donnée avec Apple. C'est l'approche recommandée par Apple. | ## Mettre à jour le consentement de l'utilisateur dans le SDK \{#update-user-consent-in-the-sdk\} Pour indiquer à Adapty si un utilisateur donné a accordé son consentement, utilisez la méthode `updateCollectingRefundDataConsent`. La valeur est persistée côté serveur par profil, vous n'avez donc besoin de l'appeler que lorsque le consentement change.
:::note Pour suivre les événements d'abonnement, utilisez l'intégration [Webhook](webhook) dans Adapty ou intégrez directement votre service existant. ::: ## Cas 1 : Synchroniser les abonnés entre web et mobile \{#case-1-sync-subscribers-between-web-and-mobile\} Si vous utilisez des prestataires de paiement web comme Stripe, ChargeBee ou autres, vous pouvez synchroniser vos abonnés facilement. Voici comment : 1.
2. Donnez un nom explicite à votre onboarding et cliquez sur **Proceed to build onboarding**.
3. Vous serez redirigé vers le créateur d'onboarding.
Il contient un modèle de démonstration par défaut, que vous pouvez explorer pour comprendre comment les onboardings collectent des données et comment les personnaliser à l'aide de variables et de quiz. N'hésitez pas à supprimer les écrans dont vous n'avez pas besoin et à [concevoir votre propre expérience d'onboarding](design-onboarding).
4. Lorsque vous êtes prêt, cliquez sur le bouton **Preview** en haut à droite. Parcourez vous-même votre flow d'onboarding pour vérifier que tout fonctionne comme prévu.
5. Si tout fonctionne correctement, cliquez sur **Publish** en haut à droite. Attendez que la publication soit terminée avant de revenir dans Adapty. Dans le cas contraire, votre progression sera perdue.
:::danger
Si vous ne cliquez pas sur **Publish**, le SDK ne pourra pas récupérer l'onboarding que vous avez créé.
:::
Une fois votre onboarding publié, cliquez sur **Back to Adapty**. Votre onboarding est créé et vous pouvez l'ajouter à un placement pour commencer à l'utiliser.
## Étape 2. Créer un placement pour votre onboarding \{#step-2-create-a-placement-for-your-onboarding\}
1. Accédez à **Placements** depuis le menu principal et basculez sur l'onglet **Onboardings**. Cliquez sur **Create placement**.
2. Saisissez le nom et l'ID du placement. Ensuite, cliquez sur **Run onboarding** et sélectionnez un onboarding à afficher à tous les utilisateurs.
3. Si vous avez préparé un onboarding distinct pour un groupe d'utilisateurs spécifique, [ajoutez d'autres audiences](audience) et sélectionnez un onboarding différent pour elles.
## Étape 3. Intégrer l'onboarding dans votre application \{#step-3-integrate-the-onboarding-into-your-app\}
:::important
Les onboardings sont disponibles pour les applications utilisant le SDK Adapty v3.8.0+ (iOS, Android, React Native, Flutter), v3.14.0+ (Unity) ou v3.15.0+ (Kotlin Multiplatform, Capacitor).
:::
Pour commencer à afficher des onboardings dans votre application, intégrez-les avec le SDK Adapty :
- [iOS](ios-onboardings)
- [Android](android-onboardings)
- [React Native](react-native-onboardings)
- [Flutter](flutter-onboardings)
- [Unity](unity-onboardings)
- [Kotlin Multiplatform](kmp-onboardings)
- [Capacitor](capacitor-onboardings)
Pour déterminer quel onboarding fonctionne le mieux, vous pouvez également lancer des [tests A/B](ab-tests).
---
# File: design-onboarding
---
---
title: "Concevoir des onboardings"
description: "Créez des onboardings efficaces."
---
Le builder d'onboarding no-code pour applications mobiles est un outil puissant et personnalisable qui vous aide à offrir la meilleure expérience d'onboarding à vos utilisateurs. Inutile d'être développeur ou designer pour obtenir un excellent résultat.
## Écrans d'onboarding \{#onboarding-screens\}
Le flow d'onboarding est composé de plusieurs écrans que vous ajoutez et concevez.
Les utilisateurs appuient sur le bouton pour naviguer entre eux.
:::tip
Si certains de vos utilisateurs ont besoin d'un flow légèrement différent (par exemple, dans une application fitness, vous pourriez vouloir afficher des images d'« objectif » différentes selon le sexe de l'utilisateur), vous n'avez pas besoin de créer des onboardings séparés.
À la place, vous pouvez masquer certains écrans par défaut et les afficher uniquement dans certains cas.
:::
## Éléments d'onboarding \{#onboarding-elements\}
Les éléments d'onboarding s'affichent à gauche dans l'ordre où ils apparaissent. Cliquez sur **Add** en haut à droite pour ajouter un nouvel élément.
Voici les groupes d'éléments disponibles :
- **Containers** : Les conteneurs vous permettent de configurer une mise en page flexible. Par exemple, si vous souhaitez ajouter un texte sur deux colonnes, ajoutez **Columns** puis faites glisser deux blocs de texte dans **Columns** dans le panneau de gauche. Ou, si vous ajoutez un carrousel, vous devrez ajouter des images aux éléments **Media** à l'intérieur.
- **Typography** : Ajoutez des blocs de texte préformatés et configurez leur apparence selon vos besoins.
- **Media & Display** : En plus des images et des vidéos, vous pouvez ajouter des graphiques animés qui démontrent la valeur de votre application et encouragent les utilisateurs.
Les **formats vidéo pris en charge** sont MP4 et WebM. La **taille maximale des fichiers médias** est de 15 Mo.
Si vous souhaitez ajouter un élément animé non pris en charge (comme Lottie), vous pouvez le convertir en vidéo (par exemple avec [cet outil](https://www.lottielab.com/lottie/lottie-to-video)) et l'intégrer en tant que vidéo.
- **Quiz** : Créez de courts questionnaires avec des options texte et image pour personnaliser l'expérience d'onboarding et mieux connaître vos utilisateurs.
- **Inputs** : Collectez les données de vos utilisateurs.
- **Buttons** : Les boutons permettent à vos utilisateurs de naviguer entre les écrans, de fermer l'onboarding ou d'accéder au paywall. Vous pouvez également ajouter des boutons brillants ou animés pour attirer l'attention des utilisateurs et convertir leur installation en achat.
- **Loaders** : Des loaders animés maintiennent l'engagement des utilisateurs pendant le processus.
- **User engagement** : Ajoutez des témoignages, des listes d'e-mails d'utilisateurs et des comptes à rebours.
:::note
Dans le groupe **Media & Display**, vous pouvez également ajouter du code HTML personnalisé si les options de personnalisation disponibles ne sont pas suffisantes.
Cependant, les éléments HTML personnalisés ne sont ni préchargés ni mis en cache, il est donc recommandé d'utiliser **Raw HTML** uniquement pour des éléments petits et légers.
:::
### ID d'élément et ID d'action \{#element-id-and-action-id\}
Si vous souhaitez utiliser un bouton pour des actions personnalisées, attribuez-lui un **action ID** puis utilisez-le dans votre code source. Les action IDs vous permettent de gérer différents boutons avec le même action ID de la même manière.
Si vous souhaitez traiter la saisie d'un utilisateur dans un champ spécifique (par exemple, enregistrer son âge ou son e-mail), attribuez-lui un **element ID** puis utilisez-le dans votre code source pour associer les questions aux réponses. Les element IDs ne peuvent être utilisés qu'une seule fois dans votre onboarding.
## Options de personnalisation \{#customization-options\}
Vous disposez des options de personnalisation suivantes dans le builder :
- Onglet **Styles** : Ajustez l'apparence de l'élément.
- Onglet **Element** : Définissez les attributs de l'élément, tels que la visibilité, les actions associées aux boutons ou d'autres propriétés sans rapport avec l'apparence de l'élément.
- Onglet **Screen** : Configurez les paramètres généraux de l'écran, comme un en-tête ou l'affichage d'un compteur d'écrans.
## Copier des écrans et des éléments \{#copy-screens-and-elements\}
Si vous avez créé un onboarding et souhaitez en réutiliser des parties, ou si vous voulez apporter de légères modifications et lancer des tests A/B, vous pouvez copier un ou plusieurs écrans d'un onboarding vers un autre.
Pour copier des écrans, ouvrez le builder d'onboarding et procédez de l'une des façons suivantes :
- Faites un clic droit sur un écran et sélectionnez **Copy**
- Sélectionnez l'écran souhaité et appuyez sur `Ctrl+C` (Windows) ou `⌘+C` (Mac)
Vous pouvez également copier des éléments individuels ou des blocs de texte, que ce soit dans le même onboarding ou entre différents onboardings.
## Copier des écrans depuis des funnels web-to-app \{#copy-screens-from-web-to-app-funnels\}
Si vous utilisez des funnels web-to-app créés dans [FunnelFox](https://funnelfox.com/) et souhaitez utiliser des écrans de ces funnels dans vos onboardings, vous pouvez le faire rapidement en copiant des écrans dans le funnel builder et en les collant dans le builder d'onboarding :
1. Dans le funnel builder FunnelFox, faites un clic droit sur un écran et sélectionnez **Copy**, ou sélectionnez l'écran et appuyez sur `Ctrl+C`/`⌘+C`.
2. Ouvrez le builder d'onboarding.
3. Faites un clic droit sur l'écran sous lequel vous souhaitez insérer l'écran copié et sélectionnez **Paste**, ou sélectionnez-le et appuyez sur `Ctrl+V`/`⌘+V`. L'écran copié sera inséré sous l'écran sélectionné.
---
# File: adapty-paywall-builder
---
---
title: "Adapty Paywall Builder (Legacy)"
description: "Créez des paywalls et des flows d'onboarding avec l'éditeur visuel no-code."
---
:::warning
Le Paywall Builder est pleinement fonctionnel, mais Adapty n'y ajoute plus de fonctionnalités ni de mises à jour. Pour les nouveaux projets, pensez à l'[Adapty Flow Builder](adapty-flow-builder) — un éditeur visuel no-code pour créer des paywalls à écran unique et des flows d'onboarding multi-écrans qui s'affichent nativement sur l'appareil :
- **Tous types de flows** : Créez des paywalls à écran unique, des onboardings multi-étapes incluant un paywall, et tout ce qui se trouve entre les deux.
- **Rendu natif** : Les flows s'affichent via le SDK Adapty, sans web view.
- **Mise à jour sans redéploiement** : Modifiez les textes, le design ou la logique à tout moment — les mises à jour parviennent aux utilisateurs sans publication d'une nouvelle version de l'app.
:::
Le **Paywall Builder** d'Adapty est un outil visuel no-code pour concevoir des paywalls personnalisés. Vous pouvez partir d'un modèle, personnaliser la mise en page et ajouter des éléments comme des carrousels, des cartes, des listes de produits et des pieds de page. L'éditeur prend également en charge les polices personnalisées, les tags de produits et la localisation.
Le Paywall Builder nécessite le SDK Adapty v3.0 ou une version ultérieure. Une fois votre paywall conçu, [ajoutez-le à un placement](add-audience-paywall-ab-test) et affichez-le dans votre app :
- [iOS](ios-quickstart-paywalls)
- [Android](android-quickstart-paywalls)
- [React Native](react-native-quickstart-paywalls)
- [Flutter](flutter-quickstart-paywalls)
- [Unity](unity-quickstart-paywalls)
- [Capacitor](capacitor-quickstart-paywalls)
- [Kotlin Multiplatform](kmp-quickstart-paywalls)
---
# File: flutterflow
---
---
title: "Plugin Adapty pour FlutterFlow"
description: "Intégrez FlutterFlow avec Adapty pour une gestion améliorée des abonnements."
---
Adapty est une plateforme polyvalente conçue pour aider les applications mobiles à se développer. Que vous démarriez tout juste ou que vous ayez déjà des milliers d'utilisateurs, Adapty vous permet d'économiser des mois d'intégration des achats intégrés et de doubler vos revenus d'abonnements grâce à la gestion des paywalls.
Le plugin Adapty pour FlutterFlow vous permet de tirer parti de toutes les fonctionnalités d'Adapty sans une seule ligne de code. Vous pouvez concevoir vos pages de paywall dans FlutterFlow, activer les achats sur celles-ci, puis contrôler à distance quels produits y sont affichés — avec ciblage vers des groupes d'utilisateurs spécifiques ou tests A/B. Et après la sortie de votre application, vous accédez instantanément à des analytics détaillées sur les achats de vos clients directement dans notre tableau de bord.
Vous souhaitez mettre à jour les produits disponibles sur votre paywall ? C'est simple ! Faites vos modifications en quelques clics dans l'Adapty Dashboard, et vos clients verront immédiatement les nouveaux produits — pas besoin de publier une nouvelle version de l'application !
Ce qu'Adapty vous offre en plus :
- **Abonnements et achats intégrés** : Adapty gère pour vous la validation des reçus côté serveur et synchronise vos clients sur toutes les plateformes, y compris le web.
- **Tests A/B pour les paywalls** : Testez différents prix, durées, périodes d'essai et éléments visuels pour optimiser vos offres d'abonnements et d'achats uniques.
- **Analytics puissantes** : Accédez à des métriques détaillées pour mieux comprendre et améliorer la monétisation de votre application.
- **Intégrations** : Adapty se connecte parfaitement aux outils d'analytics tiers comme Amplitude, AppsFlyer, Adjust, Branch, Mixpanel, Facebook Ads, AppMetrica, des Webhooks personnalisés, et bien plus encore.
---
# File: ff-getting-started
---
---
title: "Démarrer"
description: "Commencez avec les Feature Flags Adapty pour personnaliser vos flows d'abonnement."
---
Avec Adapty, vous pouvez créer et exécuter des paywalls et des tests A/B à différents points du parcours utilisateur de votre application mobile, comme l'Onboarding, les Paramètres, etc. Ces points s'appellent des [Placements](placements). Un placement dans votre application peut gérer plusieurs paywalls ou [tests A/B](ab-tests) à la fois, chacun destiné à un groupe d'utilisateurs spécifique, que nous appelons des [Audiences](audience). De plus, vous pouvez expérimenter avec les paywalls en en remplaçant un par un autre au fil du temps, sans publier de nouvelle version de l'application. La seule chose que vous codez en dur dans l'application mobile est l'identifiant du placement.
La bibliothèque Adapty maintient votre paywall à jour avec les derniers produits de votre Adapty Dashboard. Elle [récupère les données des produits](ff-action-flow) et [les affiche sur votre paywall](ff-add-variables-to-paywalls), [gère les achats](ff-make-purchase) et [vérifie le niveau d'accès de l'utilisateur](ff-check-subscription-status) pour déterminer s'il doit accéder au contenu payant.
Pour commencer, il suffit d'[ajouter la bibliothèque Adapty](ff-getting-started#add-the-adapty-library-as-a-dependency) à votre projet FlutterFlow et de [l'initier](ff-getting-started#initiate-adapty-plugin) comme indiqué ci-dessous.
:::warning
Avant de commencer, prenez note des limitations suivantes :
- La bibliothèque Adapty pour FlutterFlow ne prend pas en charge les applications web. Évitez de compiler des applications web avec elle.
- La bibliothèque Adapty pour FlutterFlow ne prend pas en charge les paywalls créés avec le Paywall Builder d'Adapty. Vous devez concevoir votre propre paywall dans FlutterFlow avant d'activer les achats avec Adapty.
:::
## Ajouter la bibliothèque Adapty en tant que dépendance \{#add-the-adapty-library-as-a-dependency\}
1. Dans le [FlutterFlow Dashboard](https://app.flutterflow.io/dashboard), ouvrez votre projet, puis cliquez sur **Settings and Integrations** dans le menu de gauche. Dans la section **Project setup** à gauche, sélectionnez **Project dependencies**.
2. Dans la section **FlutterFlow Libraries**, cliquez sur **Add Library** et saisissez `adapty-xtuel0`. Cliquez sur **Add**.
3. Vous devez maintenant associer votre clé SDK à la bibliothèque. Cliquez sur **View details** en regard de la bibliothèque.
4. Copiez la **Public SDK key** depuis l'onglet [**App Settings** -> **General**](https://app.adapty.io/settings/general) dans l'Adapty Dashboard.
5. Collez la clé dans **AdaptyApiKey** dans FlutterFlow.
La bibliothèque Adapty FF sera désormais ajoutée en tant que dépendance à votre projet. Dans la fenêtre de la bibliothèque Adapty FF, vous trouverez toutes les ressources Adapty qui ont été importées dans votre projet.
## Appeler la nouvelle action d'activation au lancement de l'application \{#call-the-new-activation-action-at-application-launch\}
1. Accédez à la section **Custom Code** depuis le menu de gauche et ouvrez `main.dart`.
2. Cliquez sur **+** et sélectionnez `activate (Adapty)`.
3. Cliquez sur **Save**.
## Initier le plugin Adapty \{#initiate-adapty-plugin\}
Pour que l'Adapty Dashboard reconnaisse votre application, vous devez fournir une clé spéciale dans FlutterFlow.
1. Dans votre projet FlutterFlow, accédez à **Settings and Integrations > Permissions** depuis le menu de gauche.
2. Dans la fenêtre **Permissions** qui s'ouvre, cliquez sur le bouton **Add Permission**.
3. Dans les champs **iOS Permission Key** et **Android Permission Key**, collez `AdaptyPublicSdkKey`.
4. Pour le champ **Permission Message**, copiez la **Public SDK key** depuis l'onglet [**App Settings** -> **General**](https://app.adapty.io/settings/general) dans l'Adapty Dashboard. Chaque application a sa propre clé SDK, donc si vous avez plusieurs applications, assurez-vous de prendre la bonne.
Une fois ces étapes terminées, vous pourrez appeler votre paywall dans votre application FlutterFlow et activer les achats via celui-ci.
## Et maintenant ? \{#whats-next\}
1. [Créez un action flow](ff-action-flow) pour gérer les produits du paywall Adapty et leurs données dans FlutterFlow.
2. [Mappez les données reçues sur le paywall](ff-add-variables-to-paywalls) que vous avez conçu dans FlutterFlow.
3. [Configurez le bouton d'achat](ff-make-purchase) sur votre paywall pour traiter les transactions via Adapty lors du clic.
4. Enfin, [ajoutez des vérifications du statut d'abonnement](ff-check-subscription-status) pour déterminer si le contenu payant doit être affiché à l'utilisateur.
---
# File: ff-action-flow
---
---
title: "Étape 1. Créer un flow pour afficher les données du paywall"
description: "Configurez des flows d'action avec les feature flags dans Adapty pour personnaliser le parcours d'abonnement des utilisateurs."
---
:::important
Lorsque vous utilisez le plugin FlutterFlow, vous ne pouvez pas utiliser les paywalls créés dans le Paywall Builder d'Adapty. Vous devez implémenter votre propre page de paywall dans FlutterFlow et la connecter à Adapty.
:::
Après avoir ajouté la bibliothèque Adapty en tant que dépendance à votre projet FlutterFlow, il est temps de construire le flow qui **récupère les données du paywall et des produits Adapty et les affiche sur le paywall que vous avez conçu dans FlutterFlow**.
Nous devons d'abord recevoir les données du paywall depuis Adapty. Nous commencerons par demander le paywall Adapty, puis ses produits associés, et enfin vérifier si les données ont bien été reçues. Si c'est le cas, nous afficherons le titre du produit et son prix sur la page du paywall. Sinon, nous afficherons un message d'erreur.
Avant de continuer, assurez-vous d'avoir effectué les étapes suivantes :
1. [Créé au moins un paywall et ajouté au moins un produit](create-paywall) dans l'Adapty Dashboard.
2. [Créé au moins un placement](create-placement) et [ajouté votre paywall](add-audience-paywall-ab-test) dans l'Adapty Dashboard.
C'est parti !
## Étape 1.1. Demander le paywall Adapty \{#step-11-request-adapty-paywall\}
Comme mentionné, pour afficher des données dans votre paywall FlutterFlow, nous devons d'abord les récupérer depuis Adapty. La première étape consiste à obtenir le paywall Adapty lui-même. Voici comment procéder :
1. Ouvrez votre écran de paywall et passez à la section **Actions** dans le panneau de droite. Là, ouvrez l'**Action Flow Editor**.
2. Dans la fenêtre **Select Action Trigger**, sélectionnez **On Page Load**.
3. Cliquez sur **Add Action**. Ensuite, recherchez l'action personnalisée `getPaywall` et sélectionnez-la.
4. Dans la section **Set Actions Arguments**, saisissez l'ID réel du [placement que vous avez créé](create-placement) dans l'Adapty Dashboard qui inclut le paywall. Dans cet exemple, c'est `monthly`. Assurez-vous d'utiliser votre vrai ID de placement !
5. Si vous avez [localisé](localizations-and-locale-codes) votre paywall dans l'Adapty Dashboard, vous pouvez également configurer l'argument **locale**.
6. Dans l'**Action Output Variable Name**, créez une nouvelle variable et nommez-la `getPaywallResult`. Nous l'utiliserons à l'étape suivante pour référencer le paywall Adapty et demander ses produits.
## Étape 1.2. Demander les produits du paywall Adapty \{#step-12-request-adapty-paywall-products\}
Parfait ! Nous avons récupéré le paywall Adapty. Maintenant, obtenons les produits associés à ce paywall :
1. Cliquez sur **+** sous l'action créée et sélectionnez **Add Action**. Cette action permettra de recevoir les produits du paywall Adapty. Pour cela, recherchez et sélectionnez `getPaywallProducts`.
2. Dans la section **Set Actions Arguments**, sélectionnez la variable `getPaywallResult` créée précédemment.
3. Remplissez les autres champs comme suit :
- **Available Options** : Data Structured Field
- **Select Field** : value
- **Available Options** : Aucune modification supplémentaire
4. Cliquez sur **Confirm**.
5. Dans l'**Action Output Variable Name**, créez une nouvelle variable et nommez-la `getPaywallProductsResult`. Nous l'utiliserons pour associer le paywall que vous avez conçu dans FlutterFlow aux données du paywall Adapty.
## Étape 1.3. Ajouter une vérification du chargement du paywall \{#step-13-add-check-if-the-paywall-uploaded-successfully\}
Avant de continuer, vérifions que le paywall Adapty a bien été reçu. Si c'est le cas, nous pouvons mettre à jour le paywall avec les données des produits. Sinon, nous gérerons l'erreur. Voici comment ajouter la vérification :
1. Cliquez sur **+** puis sur **Add Conditional**.
2. Dans la section **Action Output**, sélectionnez la variable de sortie d'action créée précédemment (`getPaywallResult` dans notre exemple).
3. Pour vérifier que le paywall Adapty a bien été reçu, contrôlez la présence d'un champ avec une valeur. Remplissez les champs comme suit :
- **Available Options** : Has Field
- **Field (AdaptyGetPaywallResult)** : value
4. Cliquez sur **Confirm** pour finaliser la condition.
## Étape 1.4. Enregistrer la vue du paywall \{#step-14-log-the-paywall-review\}
Pour qu'Adapty Analytics comptabilise la vue du paywall, nous devons enregistrer cet événement. Sans cette étape, la vue ne sera pas comptée dans les analyses. Voici comment procéder :
1. Cliquez sur **+** sous le label **TRUE** et cliquez sur **Add Action**.
2. Dans le champ **Select Action**, recherchez et choisissez **logShowPaywall**.
3. Cliquez sur **Value** dans la zone **Set Action Arguments** et choisissez la variable `getPaywallResult` que nous avons créée. Cette variable contient les données du paywall.
4. Remplissez les champs comme suit :
- **Available Options** : Data Structured Field
- **Select Field** : value
5. Cliquez sur **Confirm**.
## Étape 1.5. Afficher une erreur si le paywall n'est pas reçu \{#step-15-show-error-if-paywall-not-received\}
Si le paywall Adapty n'est pas reçu, vous devez [gérer l'erreur](error-handling-on-flutter-react-native-unity#system-storekit-codes). Dans cet exemple, nous afficherons simplement un message d'alerte.
1. Ajoutez une action **Informational Dialog** au label **FALSE**.
2. Dans le champ **Title**, ajoutez le texte que vous souhaitez voir comme titre du dialogue. Dans cet exemple, c'est **Error**.
3. Cliquez sur **Value** dans la zone **Message**.
4. Remplissez les champs comme suit :
- **Set Variable** : variable `getPaywallProductResult` que nous avons créée
- **Available Options** : Data Structure Field
- **Select Field** : error
- **Available Options** : Data Structure Field
- **Select Field** : errorMessage
5. Cliquez sur **Confirm**.
6. Ajoutez une action **Terminate action** au flow **FALSE**.
7. Cliquez sur **Close** dans le coin supérieur droit.
Félicitations ! Vous avez bien reçu les données des produits. Maintenant, [associez-les au paywall que vous avez conçu dans FlutterFlow](ff-add-variables-to-paywalls).
---
# File: ff-add-variables-to-paywalls
---
---
title: "Étape 2. Ajouter des données à la page paywall"
description: "Ajoutez des variables Feature Flag aux paywalls dans Adapty."
---
Une fois que vous avez [récupéré toutes les données produit nécessaires](ff-action-flow), il est temps de les associer au beau paywall que vous avez conçu dans FlutterFlow. Dans cet exemple, nous allons associer le titre du produit et son prix.
## Étape 2.1. Ajouter le titre du produit à la page paywall \{#step-21-add-product-title-to-paywall-page\}
1. Double-cliquez sur le texte du produit dans votre page paywall. Dans la fenêtre **Set from Variable**, recherchez la variable `getPaywallProductResult` et sélectionnez-la.
2. Remplissez les champs comme suit :
- **Available Options** : Data Structured Field
- **Select Field** : value
- **Available Options** : Item at Index
- **List Index Options** : First
- **Available Options** : Data Structured Field
- **Select Field** : localizedTitle
- **Default Variable Value** : null
- **UI Builder Display Value** : N'importe quoi, dans l'exemple c'est `product.title`
3. Cliquez sur **Confirm** pour enregistrer les modifications.
## Étape 2.2. Ajouter le texte du prix à la page paywall \{#step-22-add-price-text-to-paywall-page\}
Répétez les étapes de l'Étape 2.1 pour le texte du prix comme indiqué ci-dessous :
1. Double-cliquez sur le texte du prix dans votre page paywall. Dans la fenêtre **Set from Variable**, recherchez la variable `getPaywallProductResult` et sélectionnez-la.
2. Remplissez les champs comme suit :
- **Available Options** : Data Structured Field
- **Select Field** : value
- **Available Options** : Item at Index
- **List Index Options** : First
- **Available Options** : Data Structured Field
- **Select Field** : price
- **Default Variable Value** : null
- **UI Builder Display Value** : N'importe quoi, dans l'exemple c'est `product.price`
3. Cliquez sur le bouton **Confirm** pour enregistrer les modifications.
### Ajouter le prix en devise locale à la page paywall \{#add-price-in-local-currency-to-paywall-page\}
1. Double-cliquez sur le prix dans votre page paywall. Dans la fenêtre **Set from Variable**, recherchez la variable `getPaywallProductResult` et sélectionnez-la.
2. Remplissez les champs comme suit :
- **Available Options** : Data Structured Field
- **Select Field** : value
- **Available Options** : Item at Index
- **List Index Options** : First
- **Available Options** : Data Structured Field
- **Select Field** : price
- **Available Options** : Data Structured Field
- **Select Field** : amount
- **Available Options** : Decimal
- **Decimal Type** : Automatic
- **Default Variable Value** : null
- **UI Builder Display Value** : N'importe quoi, dans l'exemple c'est `price.amount`
3. Cliquez sur **Confirm** pour enregistrer les modifications.
Et voilà ! Désormais, au lancement de votre application, elle affichera les données produit du paywall Adapty directement sur votre page paywall !
Il est temps de [laisser vos utilisateurs acheter ce produit](ff-make-purchase).
---
# File: ff-make-purchase
---
---
title: "Étape 3. Activer l'achat"
description: "Découvrez comment effectuer des achats grâce au système de Feature Flags d'Adapty."
---
Félicitations ! Vous avez réussi à [configurer votre paywall pour afficher les données produit depuis Adapty](ff-add-variables-to-paywalls), notamment le titre du produit et son prix.
Passons maintenant à l'étape finale : permettre aux utilisateurs d'effectuer un achat via le paywall.
## Étape 3.1. Permettre aux utilisateurs d'effectuer des achats \{#step-31-enable-users-to-make-purchases\}
1. Double-cliquez sur le bouton d'achat de votre page de paywall. Dans le panneau de droite, ouvrez la section **Actions** si elle n'est pas déjà ouverte.
2. Ouvrez l'**Action Flow Editor**.
3. Dans la fenêtre **Select Action Trigger**, choisissez **On Tap**.
4. Dans la fenêtre **No Actions Created**, cliquez sur **Add Action**. Recherchez l'action `makePurchase` et sélectionnez-la.
5. Dans la section **Set Actions Arguments**, choisissez la variable `getPaywallProductsResult` créée précédemment.
6. Remplissez les champs comme suit :
- **Available Options** : Data Structure Field
- **Select Field** : value
- **Available Options** : Item at Index
- **List Index Options** : First
7. Cliquez sur `subscriptionUpdateParameters`, recherchez `AdaptySubscriptionUpdateParameters` et sélectionnez-le. Cliquez sur **Confirm**.
:::info
Par défaut, vous pouvez laisser tous les champs de l'objet vides. Vous devrez les remplir pour remplacer un abonnement par un autre dans les applications Android. En savoir plus [ici](https://android.adapty.io/adapty/com.adapty.models/-adapty-subscription-update-parameters/).
:::
8. Cliquez sur **Confirm**.
9. Dans **Action Output Variable Name**, créez une nouvelle variable et nommez-la `makePurchaseResult` — elle sera utilisée ensuite pour confirmer que l'achat a bien été effectué.
## Étape 3.2. Vérifier si l'achat a réussi \{#step-32-check-if-the-purchase-was-successful\}
Configurons maintenant une vérification pour savoir si l'achat a bien abouti.
1. Cliquez sur **+** puis sur **Add Conditional**.
2. Dans **Set Condition for Action**, sélectionnez la variable `makePurchaseResult`.
3. Dans la fenêtre **Set Variable**, remplissez les champs comme suit :
- **Available Options** : Has Field
- **Select Field** : profile
4. Cliquez sur **Confirm**.
## Étape 3.3. Ouvrir le contenu payant \{#step-33-open-paid-content\}
Si l'achat réussit, vous pouvez déverrouiller le contenu payant. Voici comment procéder :
1. Cliquez sur **+** sous le libellé **TRUE** et cliquez sur **Add Action**.
2. Dans le champ **Define Action**, recherchez et sélectionnez la page que vous souhaitez ouvrir dans la liste **Navigate To**. Dans cet exemple, la page est **Questions**.
## Étape 3.4. Afficher un message d'erreur si l'achat échoue \{#step-34-show-error-message-if-purchase-failed\}
Si l'achat échoue, affichons une alerte à l'utilisateur.
1. Ajoutez une action **Informational Dialog** au libellé **FALSE**.
2. Dans le champ **Title**, saisissez le texte souhaité pour le titre de la boîte de dialogue, par exemple **Purchase Failed**.
3. Cliquez sur **Value** dans la zone **Message**. Dans la fenêtre **Set from Variable**, recherchez `makePurchaseResult` et sélectionnez-le. Remplissez les champs comme suit :
- **Available Options** : Data Structure Field
- **Select Field** : error
- **Available Options** : Data Structure Field
- **Select Field** : errorMessage
4. Cliquez sur **Confirm**.
5. Ajoutez une action **Terminate** au flow **FALSE**.
6. Enfin, cliquez sur **Close** dans le coin supérieur droit.
Félicitations ! Vos utilisateurs peuvent désormais acheter vos produits. Pour aller plus loin, [configurez une vérification de l'accès des utilisateurs au contenu payant](ff-check-subscription-status) ailleurs dans l'application, afin de décider si leur afficher le contenu payant ou le paywall.
---
# File: ff-check-subscription-status
---
---
title: "Étape 4. Vérifier l'accès au contenu payant"
description: "Découvrez comment vérifier le statut d'un abonnement en utilisant les feature flags d'Adapty pour une meilleure segmentation des utilisateurs."
---
Pour déterminer si un utilisateur a accès à un contenu payant spécifique, vous devez vérifier son niveau d'accès. Cela consiste à s'assurer que l'utilisateur possède au moins un niveau d'accès et que ce niveau est bien celui requis.
Pour cela, consultez le profil utilisateur, qui contient tous les niveaux d'accès disponibles.
Voici comment permettre aux utilisateurs d'accéder à votre produit :
1. Double-cliquez sur le bouton qui doit afficher le contenu payant, puis ouvrez la section **Actions** dans le panneau de droite si elle n'est pas déjà ouverte.
2. Ouvrez l'**Action Flow Editor**.
3. Dans la fenêtre **Select Action Trigger**, choisissez **On Tap**.
4. Dans la fenêtre **No Actions Created**, cliquez sur le bouton **Add Conditional Action**.
5. Cliquez sur **UNSET** pour définir les arguments de l'action et choisissez la variable `currentProfile`. Il s'agit de la variable Adapty qui contient les données du profil de l'utilisateur actuel.
6. Remplissez les champs comme suit :
- **Available Options** : Data Structure Field
- **Select Field** : accessLevels
- **Available Options** : Filter List Items
- **Filter Conditions** :
1. Sélectionnez **Conditions -> Single Condition** et cliquez sur **UNSET**.
2. Dans le champ **First value**, sélectionnez **Item in list** comme **Source** et remplissez les champs comme suit :
- **Available Options** : Data Structure Field
- **Select Field** : accessLevelIdentifier
3. Définissez l'opérateur de filtre sur **Equal to**.
4. Cliquez sur **UNSET** à côté de **Second value** et dans le champ **Value**, saisissez l'ID de votre niveau d'accès ; dans notre exemple, nous utilisons `premium`.
5. Cliquez sur **Confirm** et continuez à remplir les autres champs ci-dessous.
- **Available Options** : Item at Index
- **List Index Options** : First
- **Available Options** : Data Structure Field
- **Select Field** : accessLevel
- **Available Options** : Data Structure Field
- **Select Field** : isActive
7. Cliquez sur **Confirm**.
Ajoutez maintenant les actions correspondant à la suite — selon que l'utilisateur dispose ou non du bon abonnement. Redirigez-le soit vers la page réservée aux abonnés premium, soit vers la page du paywall pour qu'il puisse acheter l'accès.
---
# File: ff-resources
---
---
title: "Actions et types de données du plugin FlutterFlow d'Adapty"
description: "Accédez aux ressources de feature flag d'Adapty pour simplifier les fonctionnalités basées sur les abonnements."
---
## Actions personnalisées \{#custom-actions\}
Voici les méthodes Adapty disponibles dans FlutterFlow via le plugin Adapty. Elles peuvent être utilisées comme actions personnalisées dans FlutterFlow.
| Custom Action | Description | Action Arguments | Adapty Data Types - Action Output Variable |
|---|----|--------|----|
| activate | Initialise le SDK Adapty | Aucun ||
| getPaywall
| Récupère un paywall. Ne retourne pas les produits du paywall. Utilisez l'action `getPaywallProducts` pour obtenir les produits réels |getPaywallProducts
| Retourne une liste des produits réels du paywall | [AdaptyPaywall](ff-resources#adaptypaywall) | [AdaptyGetProductsResult](ff-resources#adaptygetproductsresult) | |getProductsIntroductoryOfferEligibility
| Vérifie si l'utilisateur est éligible à une offre de lancement iOS | [AdaptyPaywallProduct](product) | [AdaptyGetIntroEligibilitiesResult](ff-resources#adaptygetintroeligibilitiesresult) | |makePurchase
| Finalise un achat et déverrouille le contenu. Si un paywall comporte une offre promotionnelle, Adapty l'applique automatiquement lors du paiement |getProfile
|Récupère le profil de l'utilisateur actuel de l'application. Cela vous permet de définir les niveaux d'accès et d'autres paramètres
En cas d'échec (par ex. absence de connexion internet), les données en cache sont renvoyées. Adapty met régulièrement à jour le cache du profil pour que les informations restent aussi actuelles que possible
| Aucun | [AdaptyGetProfileResult](ff-resources#adaptygetprofileresult) | | updateProfile | Modifie les attributs optionnels du profil de l'utilisateur actuel, comme l'adresse e-mail, le numéro de téléphone, etc. Vous pouvez ensuite utiliser ces attributs pour créer des [segments](segments) d'utilisateurs ou les consulter dans le CRM | L'ID et les paramètres à mettre à jour pour l'[AdaptyProfile](ff-resources#adaptyprofile) | [AdaptyError](ff-resources#adaptyerror) (Optionnel) | | restorePurchases | Restaure tous les achats effectués par l'utilisateur | Aucun | [AdaptyGetProfileResult](ff-resources#adaptygetprofileresult) | | logShowPaywall | Enregistre l'affichage d'un paywall spécifique à l'utilisateur | [AdaptyPaywall](ff-resources#adaptypaywall) | [AdaptyError](ff-resources#adaptyerror) (Optionnel) | | identify | Identifie l'utilisateur à l'aide du `customerUserId` de votre système | customerUserId | [AdaptyError](ff-resources#adaptyerror) (Optionnel) | | logout | Déconnecte l'utilisateur actuel de votre application | Aucun | [AdaptyError](ff-resources#adaptyerror) (Optionnel) | | presentCodeRedemptionSheet | Affiche une feuille permettant aux utilisateurs de saisir des codes de remboursement (iOS uniquement) | Aucun | Aucun | ## Types de données \{#data-types\} Les types de données Adapty (collections de valeurs de données) transmis à FlutterFlow via le plugin Adapty. ### AdaptyAccessLevel Informations sur le [niveau d'accès](access-level) de l'utilisateur. | Nom du champ | Type | Description | |--------------------------|----------|-------------| | activatedAt | DateTime | L'heure à laquelle ce niveau d'accès a été activé | | activeIntroductoryOfferType | String | Le type d'offre de lancement active. Si défini, cela signifie qu'une offre a été appliquée durant cette période d'abonnement | | activePromotionalOfferId | String | L'identifiant de l'offre promotionnelle active (achetée depuis iOS) | | activePromotionalOfferType | String | Le type d'offre promotionnelle active (achetée depuis iOS). Si défini, cela signifie qu'une offre a été appliquée durant cette période d'abonnement | | billingIssueDetectedAt | DateTime | L'heure à laquelle un problème de facturation a été détecté. L'abonnement peut toujours être actif. Défini à null si le paiement est traité avec succès | | cancellationReason | String | La raison pour laquelle l'abonnement a été annulé | | expiresAt | DateTime | La date d'expiration du niveau d'accès (peut être dans le passé ou non définie pour un accès à vie) | | id | String | L'identifiant du niveau d'accès | | isActive | Boolean | True si ce niveau d'accès est actif. En général, vous pouvez vérifier cette propriété pour déterminer si un utilisateur a accès aux fonctionnalités premium | | isInGracePeriod | Boolean | True si cet abonnement auto-renouvelable est en [délai de grâce](https://developer.apple.com/help/app-store-connect/manage-subscriptions/enable-billing-grace-period-for-auto-renewable-subscriptions) | | isLifetime | Boolean | True si ce niveau d'accès est actif à vie (sans date d'expiration) | | isRefund | Boolean | True si cet achat a été remboursé | | offerId | String | L'identifiant de l'offre promotionnelle active (achetée depuis Android) | | renewedAt | DateTime | L'heure du dernier renouvellement du niveau d'accès | | startsAt | DateTime | L'heure de début de ce niveau d'accès (peut être dans le futur) | | store | String | Le store où l'achat a été effectué | | unsubscribedAt | DateTime | L'heure à laquelle le renouvellement automatique a été désactivé pour l'abonnement. L'abonnement peut toujours être actif. Si non défini, l'utilisateur a réactivé l'abonnement | | vendorProductId | String | L'identifiant du produit dans le store qui a déverrouillé ce niveau d'accès | | willRenew | Boolean | True si cet abonnement auto-renouvelable est configuré pour se renouveler | ### AdaptyAccessLevelIdentifiers Cette structure est destinée à remplacer la paire clé-valeur pour `Map
Adapty utilise le namespace `AdaptySDK`. En haut de vos fichiers de script qui utilisent le SDK Adapty, vous pouvez ajouter :
```csharp showLineNumbers title="C#"
using AdaptySDK;
```
Abonnez-vous aux événements Adapty :
```csharp showLineNumbers title="C#"
using UnityEngine;
using AdaptySDK;
public class AdaptyListener : MonoBehaviour, AdaptyEventListener {
public void OnLoadLatestProfile(AdaptyProfile profile) {
// handle updated profile data
}
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
}
```
Nous recommandons d'ajuster l'ordre d'exécution des scripts pour placer l'AdaptyListener avant Default Time. Cela garantit qu'Adapty s'initialise le plus tôt possible.
Configurez maintenant les paywalls dans votre application :
- Si vous utilisez le [Paywall Builder d'Adapty](adapty-paywall-builder), commencez par [activer le module AdaptyUI](#activate-adaptyui-module-of-adapty-sdk) ci-dessous, puis suivez le [guide de démarrage rapide du Paywall Builder](unity-quickstart-paywalls).
- Si vous créez votre propre interface de paywall, consultez le [guide de démarrage rapide pour les paywalls personnalisés](unity-quickstart-manual).
## Activer le module AdaptyUI du SDK Adapty \{#activate-adaptyui-module-of-adapty-sdk\}
Si vous prévoyez d'utiliser le [Paywall Builder](adapty-paywall-builder) et avez installé le module AdaptyUI, vous devez activer AdaptyUI. Vous pouvez l'activer lors de la configuration :
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetActivateUI(true);
```
## Configuration optionnelle \{#optional-setup\}
### Journalisation \{#logging\}
#### Configurer le système de journalisation \{#set-up-the-logging-system\}
Adapty enregistre les erreurs et d'autres informations importantes pour vous aider à comprendre ce qui se passe. Les niveaux suivants sont disponibles :
| Level | Description |
| ---------- | ------------------------------------------------------------ |
| `error` | Seules les erreurs seront journalisées |
| `warn` | Les erreurs et les messages du SDK qui ne causent pas d'erreurs critiques, mais méritent attention, seront journalisés |
| `info` | Les erreurs, avertissements et divers messages d'information seront journalisés |
| `verbose` | Toute information supplémentaire pouvant être utile lors du débogage, comme les appels de fonctions, les requêtes API, etc., sera journalisée |
Vous pouvez définir le niveau de log dans votre application lors de la configuration d'Adapty :
```csharp showLineNumbers title="C#"
// 'verbose' is recommended for development and the first production release
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY");
builder.LogLevel = AdaptyLogLevel.Verbose;
```
Vous pouvez également modifier le niveau de log à l'exécution :
```csharp showLineNumbers title="C#"
Adapty.SetLogLevel(AdaptyLogLevel.Verbose, (error) => {
// handle result
});
```
### Politiques de données \{#data-policies\}
Adapty ne stocke pas les données personnelles de vos utilisateurs sauf si vous les envoyez explicitement, mais vous pouvez mettre en place des politiques de sécurité des données supplémentaires pour vous conformer aux directives du store ou des pays.
#### Désactiver la collecte et le partage des adresses IP \{#disable-ip-address-collection-and-sharing\}
Lors de l'activation du module Adapty, définissez `SetIPAddressCollectionDisabled` sur `true` pour désactiver la collecte et le partage des adresses IP des utilisateurs. La valeur par défaut est `false`.
Utilisez ce paramètre pour renforcer la confidentialité des utilisateurs, vous conformer aux réglementations régionales de protection des données (comme le RGPD ou le CCPA), ou réduire la collecte de données inutiles lorsque les fonctionnalités basées sur l'adresse IP ne sont pas nécessaires pour votre application.
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetIPAddressCollectionDisabled(true);
```
#### Désactiver la collecte et le partage de l'identifiant publicitaire \{#disable-advertising-id-collection-and-sharing\}
Lors de l'activation du module Adapty, définissez `SetAppleIDFACollectionDisabled` et/ou `SetGoogleAdvertisingIdCollectionDisabled` à `true` pour désactiver la collecte des identifiants publicitaires. La valeur par défaut est `false`.
Utilisez ce paramètre pour respecter les politiques de l'App Store/Google Play, éviter de déclencher l'invite App Tracking Transparency, ou si votre application n'a pas besoin d'attribution publicitaire ni d'analytiques basées sur les identifiants publicitaires.
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAppleIDFACollectionDisabled(true)
.SetGoogleAdvertisingIdCollectionDisabled(true);
```
#### Configurer le cache média pour AdaptyUI \{#set-up-media-cache-configuration-for-adaptyui\}
Par défaut, AdaptyUI met en cache les médias (images et vidéos) pour améliorer les performances et réduire la consommation réseau. Vous pouvez personnaliser ces paramètres en fournissant une configuration personnalisée.
Utilisez `SetAdaptyUIMediaCache` pour remplacer les paramètres de cache par défaut :
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAdaptyUIMediaCache(
100 * 1024 * 1024, // MemoryStorageTotalCostLimit 100MB
null, // MemoryStorageCountLimit
100 * 1024 * 1024 // DiskStorageSizeLimit 100MB
);
```
Paramètres :
| Paramètre | Requis | Description |
|-----------------------------|----------|-----------------------------------------------------------------------------------------------|
| memoryStorageTotalCostLimit | optionnel | Taille totale du cache en mémoire en octets. Valeur par défaut spécifique à la plateforme. |
| memoryStorageCountLimit | optionnel | Nombre maximal d'éléments dans le stockage en mémoire. Valeur par défaut spécifique à la plateforme. |
| diskStorageSizeLimit | optionnel | Taille limite des fichiers sur disque en octets. Valeur par défaut spécifique à la plateforme. |
### Activer les niveaux d'accès locaux (Android) \{#enable-local-access-levels-android\}
Par défaut, les [niveaux d'accès locaux](local-access-levels) sont activés sur iOS et désactivés sur Android. Pour les activer également sur Android, définissez `SetGoogleLocalAccessLevelAllowed` sur `true` :
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetGoogleLocalAccessLevelAllowed(true);
```
### Effacer les données lors d'une restauration de sauvegarde \{#clear-data-on-backup-restore\}
Lorsque `SetAppleClearDataOnBackup` est défini sur `true`, le SDK détecte quand l'application est restaurée depuis une sauvegarde iCloud et supprime toutes les données SDK stockées localement, notamment les informations de profil en cache, les détails des produits et les paywalls. Le SDK s'initialise ensuite dans un état propre. La valeur par défaut est `false`.
:::note
Seul le cache local du SDK est supprimé. L'historique des transactions avec Apple et les données utilisateur sur les serveurs Adapty restent inchangés.
:::
```csharp showLineNumbers title="C#"
var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY")
.SetAppleClearDataOnBackup(true);
```
## Dépannage \{#troubleshooting\}
#### Règles de sauvegarde Android (configuration Auto Backup) \{#android-backup-rules-auto-backup-configuration\}
Certains SDKs (dont Adapty) embarquent leur propre configuration Android Auto Backup. Si vous utilisez plusieurs SDKs qui définissent des règles de sauvegarde, la fusion du manifeste Android peut échouer avec une erreur mentionnant `android:fullBackupContent`, `android:dataExtractionRules` ou `android:allowBackup`.
Symptômes typiques : `Manifest merger failed: Attribute application@dataExtractionRules value=(@xml/your_data_extraction_rules)
is also present at [com.other.sdk:library:1.0.0] value=(@xml/other_sdk_data_extraction_rules)`
:::note
Ces modifications doivent être effectuées dans votre répertoire de la plateforme Android (généralement situé dans le dossier `android/` de votre projet).
:::
Pour résoudre ce problème, vous devez :
- Indiquer au gestionnaire de fusion de manifeste d'utiliser les valeurs de votre application pour les attributs liés à la sauvegarde.
- Créer des fichiers de règles de sauvegarde qui fusionnent les règles d'Adapty avec celles des autres SDKs.
#### 1. Ajoutez l'espace de noms `tools` à votre manifeste \{#1-add-the-tools-namespace-to-your-manifest\}
Dans votre fichier `AndroidManifest.xml`, assurez-vous que la balise racine `
2. Ajoutez la ligne suivante à `/Assets/Plugins/Android/launcherTemplate.gradle` :
```groovy showLineNumbers
apply plugin: 'com.android.application'
// highlight-next-line
apply plugin: 'kotlin-android'
apply from: 'setupSymbols.gradle'
apply from: '../shared/keepUnitySymbols.gradle'
```
3. Ajoutez la ligne suivante dans `/Assets/Plugins/Android/baseProjectTemplate.gradle` :
```groovy showLineNumbers
plugins {
// If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
// See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
// See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
// To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
id 'com.android.application' version '8.3.0' apply false
id 'com.android.library' version '8.3.0' apply false
// highlight-next-line
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
**BUILD_SCRIPT_DEPS**
}
```
---
# File: unity-quickstart-paywalls
---
---
title: "Activer les achats avec Flow Builder dans le SDK Unity"
description: "Guide de démarrage rapide pour activer les achats intégrés avec Adapty Flow Builder."
---
Ce guide utilise les APIs du SDK Adapty Unity v4 (bêta). Si vous utilisez la v3, consultez le [guide de migration](migration-to-unity-sdk-v4) pour les noms de méthodes correspondants.
Pour activer les achats intégrés, vous devez comprendre trois concepts clés :
- [**Produits**](product) – tout ce que les utilisateurs peuvent acheter (abonnements, consommables, accès à vie)
- [**Flows**](adapty-flow-builder) – séquences d'écrans qui présentent des produits aux utilisateurs, construites dans le Flow Builder sans code. Le SDK les récupère via `GetFlow`. Si vous préférez créer l'interface dans votre propre code, utilisez un paywall à la place — voir [Implémenter des paywalls manuellement](unity-quickstart-manual).
- [**Placements**](placements) – où et quand vous affichez des flows dans votre application (par exemple `main`, `onboarding`, `settings`). Vous associez des flows à des placements dans le tableau de bord, puis vous les demandez par ID de placement dans votre code. Cela facilite l'exécution de tests A/B et l'affichage de flows différents selon les utilisateurs.
Adapty vous propose trois façons d'activer les achats dans votre application. Choisissez celle qui correspond à vos besoins :
| Implémentation | Complexité | Quand l'utiliser |
|---|---|---|
| Adapty Flow Builder | ✅ Facile | Vous [créez un flow complet et prêt à l'achat dans le builder no-code](quickstart-paywalls). Adapty le rend automatiquement et gère en coulisses tout le flow d'achat, la validation des reçus et la gestion des abonnements. |
| Paywalls créés manuellement | 🟡 Moyen | Vous implémentez l'interface de votre paywall dans le code de votre application, mais récupérez tout de même l'objet flow depuis Adapty pour conserver une flexibilité dans les offres de produits. Consultez le [guide](unity-quickstart-manual). |
| Mode Observer | 🔴 Difficile | Vous disposez déjà de votre propre infrastructure de gestion des achats et souhaitez continuer à l'utiliser. Notez que le mode Observer présente certaines limitations dans Adapty. Consultez l'[article](observer-vs-full-mode). |
:::important
**Les étapes ci-dessous montrent comment implémenter un flow créé dans l'Adapty Flow Builder.**
Si vous préférez construire l'UI du paywall vous-même, consultez [Implémenter les paywalls manuellement](unity-quickstart-manual).
:::
Pour afficher un flow créé dans l'Adapty Flow Builder, dans le code de votre application, il vous suffit de :
1. **Récupérer le flow** : Obtenez-le depuis Adapty.
2. **L'afficher et Adapty gérera les achats pour vous** : Affichez la vue dans votre application.
3. **Gérer les actions des boutons** : Associez les interactions utilisateur aux réponses de votre application. Par exemple, ouvrir des liens ou fermer le flow lorsque les utilisateurs cliquent sur des boutons.
## Avant de commencer \{#before-you-start\}
Avant de commencer, effectuez ces étapes :
1. Connectez votre application à l'[App Store](initial_ios) et/ou à [Google Play](initial-android) dans Adapty Dashboard.
2. [Créez vos produits](create-product) dans Adapty.
3. [Créez un flow et ajoutez-y des produits](create-paywall).
4. [Créez un placement et ajoutez votre flow](create-placement).
5. [Installez et activez le SDK Adapty](sdk-installation-unity) dans le code de votre application.
:::tip
Le moyen le plus rapide d'effectuer ces étapes est de suivre le [guide de démarrage rapide](quickstart) ou de créer des flows et des placements à l'aide du [CLI développeur](developer-cli-quickstart).
:::
## 1. Récupérer le flow \{#1-get-the-flow\}
Vos flows sont associés à des placements configurés dans le tableau de bord. Les placements vous permettent d'afficher des flows différents selon les audiences ou de lancer des [tests A/B](ab-tests).
Pour récupérer un flow créé dans l'Adapty Flow Builder, vous devez :
1. Récupérer l'objet `flow` par l'ID du [placement](placements) en utilisant la méthode `GetFlow`.
2. Créer la vue du flow à l'aide de la méthode `CreateFlowView`. La vue contient les éléments d'interface et le style nécessaires à l'affichage du flow. Si le flow n'a pas de vue configurée, `CreateFlowView` retourne une erreur — gérez-la dans le callback.
:::important
Pour afficher la vue, vous devez activer le bouton **Show on device** dans le Flow Builder. Sinon, `CreateFlowView` retournera une erreur et le flow ne s'affichera pas.
:::
```csharp showLineNumbers
Adapty.GetFlow("YOUR_PLACEMENT_ID", (flow, error) => {
if (error != null) {
// handle the error
return;
}
// Create the flow view
AdaptyUI.CreateFlowView(flow, (view, error) => {
if (error != null) {
// the flow has no view configured, or view creation failed
return;
}
// view - the flow view ready to be presented
});
});
```
:::info
Ce démarrage rapide fournit la configuration minimale requise pour afficher un flow. Pour les détails de configuration avancée, consultez notre [guide sur la récupération des flows](unity-get-pb-paywalls).
:::
## 2. Afficher le flow \{#2-display-the-flow\}
Maintenant que vous avez la vue du flow, il suffit d'ajouter quelques lignes pour l'afficher.
Pour afficher le flow, utilisez la méthode `view.Present()` sur le `view` créé par la méthode `CreateFlowView`. Chaque `view` ne peut être utilisé qu'une seule fois : après l'avoir fermé, appelez à nouveau `CreateFlowView` pour afficher le flow une nouvelle fois.
```csharp showLineNumbers title="Unity"
view.Present((error) => {
// handle the error
});
```
:::info
Pour plus de détails sur la façon d'afficher un flow, consultez notre [guide](unity-present-paywalls).
:::
## 3. Gérer les actions des boutons \{#handle-button-actions\}
Lorsque les utilisateurs cliquent sur des boutons dans le flow, le SDK Unity gère automatiquement les achats et la restauration. Cependant, d'autres boutons ont des identifiants personnalisés ou prédéfinis et nécessitent une gestion des actions dans votre code.
Par exemple, votre flow dispose probablement d'un bouton de fermeture et d'URLs à ouvrir (par exemple, les conditions d'utilisation et la politique de confidentialité). Pour gérer ces actions, votre classe doit implémenter l'interface `IAdaptyFlowsEventsListener` et s'enregistrer en tant qu'écouteur.
Notez que le flow reste ouvert après un achat réussi. Si vous souhaitez le fermer une fois l'achat terminé, fermez la vue dans le callback `FlowViewDidFinishPurchase`.
:::tip
Consultez nos guides sur la gestion des [actions](unity-handle-paywall-actions) et des [événements](unity-handling-events) de bouton.
:::
```csharp showLineNumbers title="Unity"
public class YourClass : MonoBehaviour, IAdaptyFlowsEventsListener
{
void Start()
{
// Register this class as the flows events listener
Adapty.SetFlowsEventsListener(this);
}
// IAdaptyFlowsEventsListener method - handles button actions
public void FlowViewDidPerformAction(
AdaptyUIFlowView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
break;
default:
break;
}
}
// IAdaptyFlowsEventsListener method - dismiss the flow after a purchase
public void FlowViewDidFinishPurchase(
AdaptyUIFlowView view,
AdaptyPaywallProduct product,
AdaptyPurchaseResult purchasedResult
) {
if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
view.Dismiss(null);
}
}
}
```
## Prochaines étapes
:::tip
Des questions ou des problèmes ? Consultez notre [forum d'assistance](https://adapty.featurebase.app/) où vous trouverez des réponses aux questions fréquentes ou pourrez poser les vôtres. Notre équipe et notre communauté sont là pour vous aider !
:::
Votre flow est prêt à être affiché dans l'application. Testez vos achats dans le [sandbox App Store](test-purchases-in-sandbox) ou sur [Google Play Store](testing-on-android) pour vous assurer de pouvoir effectuer un achat test depuis le flow.
Ensuite, vous devez [vérifier le niveau d'accès des utilisateurs](unity-check-subscription-status) pour vous assurer d'afficher un flow ou de donner accès aux fonctionnalités payantes aux bons utilisateurs.
## Exemple complet \{#full-example\}
Voici comment intégrer toutes ces étapes dans votre application.
```csharp showLineNumbers
using System;
using System.Collections.Generic;
using UnityEngine;
using AdaptySDK;
public class FlowManager : MonoBehaviour, IAdaptyFlowsEventsListener
{
[SerializeField] private string placementId = "YOUR_PLACEMENT_ID";
void Start()
{
// Register for flow events
Adapty.SetFlowsEventsListener(this);
GetAndDisplayFlow();
}
private void GetAndDisplayFlow()
{
Adapty.GetFlow(placementId, (flow, error) => {
if (error != null) {
Debug.LogError("Error getting flow: " + error.Message);
return;
}
CreateAndPresentFlowView(flow);
});
}
private void CreateAndPresentFlowView(AdaptyFlow flow)
{
AdaptyUI.CreateFlowView(flow, (view, error) => {
if (error != null) {
// the flow has no view configured — use custom logic
Debug.LogError("Error creating flow view: " + error.Message);
return;
}
view.Present((presentError) => {
if (presentError != null) {
Debug.LogError("Error presenting flow: " + presentError.Message);
return;
}
Debug.Log("Flow presented successfully");
});
});
}
// IAdaptyFlowsEventsListener implementation
public void FlowViewDidPerformAction(
AdaptyUIFlowView view,
AdaptyUIUserAction action
) {
switch (action.Type) {
case AdaptyUIUserActionType.Close:
Debug.Log("Close button pressed");
view.Dismiss(null);
break;
case AdaptyUIUserActionType.OpenUrl:
AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
break;
default:
break;
}
}
public void FlowViewDidFinishPurchase(
AdaptyUIFlowView view,
AdaptyPaywallProduct product,
AdaptyPurchaseResult purchasedResult
) {
if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
view.Dismiss(null);
}
}
// Required interface methods (implement as needed)
public void FlowViewDidAppear(AdaptyUIFlowView view) { }
public void FlowViewDidDisappear(AdaptyUIFlowView view) { }
public void FlowViewDidSelectProduct(AdaptyUIFlowView view, string productId) { }
public void FlowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) { }
public void FlowViewDidFailPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void FlowViewDidStartRestore(AdaptyUIFlowView view) { }
public void FlowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) { }
public void FlowViewDidFailRestore(AdaptyUIFlowView view, AdaptyError error) { }
public void FlowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) { }
public void FlowViewDidFailLoadingProducts(AdaptyUIFlowView view, AdaptyError error) { }
public void FlowViewDidFinishWebPaymentNavigation(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
public void FlowViewDidReceiveAnalyticEvent(AdaptyUIFlowView view, string name, IDictionary
### Lors de la connexion/inscription \{#during-loginsignup\}
Si vous identifiez les utilisateurs après le lancement de l'application (par exemple, après qu'ils se soient connectés à votre application ou inscrits), utilisez la méthode `identify` pour définir leur customer user ID.
- Si vous **n'avez jamais utilisé ce customer user ID auparavant**, Adapty le liera automatiquement au profil actuel.
- Si vous **avez déjà utilisé ce customer user ID pour identifier l'utilisateur**, Adapty basculera vers le profil associé à ce customer user ID.
:::important
Les customer user IDs doivent être uniques pour chaque utilisateur. Si vous codez en dur la valeur du paramètre, tous les utilisateurs seront considérés comme un seul.
:::
Attendez le callback de complétion d'`Identify` avant d'appeler d'autres méthodes du SDK. Les appels simultanés produisent `#3006 profileWasChanged` ou atterrissent sur le profil anonyme. Consultez [Ordre des appels dans le SDK Unity](unity-sdk-call-order).
```csharp showLineNumbers
Adapty.Identify("YOUR_USER_ID", (error) => { // Unique for each user
if(error == null) {
// successful identify
}
});
```
### Lors de l'activation du SDK \{#during-the-sdk-activation\}
Si vous connaissez déjà un customer user ID lors de l'activation du SDK, vous pouvez l'envoyer dans la méthode `activate` plutôt que d'appeler `identify` séparément.
Si vous connaissez un customer user ID mais ne le définissez qu'après l'activation, cela signifie que, lors de l'activation, Adapty créera un nouveau profil anonyme et ne basculera vers le profil existant qu'après l'appel à `identify`.
Vous pouvez passer un customer user ID existant (que vous avez déjà utilisé auparavant) ou un nouveau. Si vous en passez un nouveau, le nouveau profil créé lors de l'activation sera automatiquement lié au customer user ID.
:::note
Par défaut, la création de profils anonymes n'affecte pas les tableaux de bord des analyses, car les installations sont comptées par ID d'appareils.
Un ID d'appareil représente une seule installation de l'application depuis le store sur un appareil et n'est régénéré qu'après la réinstallation de l'application.
Il ne dépend pas du fait qu'il s'agisse d'une première ou d'une nouvelle installation, ni de l'utilisation d'un customer user ID existant.
La création d'un profil (lors de l'activation du SDK ou de la déconnexion), la connexion ou la mise à jour de l'application sans la réinstaller ne génèrent pas d'événements d'installation supplémentaires.
Si vous souhaitez comptabiliser les installations par utilisateurs uniques plutôt que par appareils, accédez à **App settings** et configurez [**Installs definition for analytics**](general#4-installs-definition-for-analytics).
:::
```csharp showLineNumbers
using UnityEngine;
using AdaptySDK;
var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY")
.SetCustomerUserId("YOUR_USER_ID"); // Customer user IDs must be unique for each user. If you hardcode the parameter value, all users will be considered as one.
Adapty.Activate(builder.Build(), (error) => {
if (error != null) {
// handle the error
return;
}
});
```
### Déconnecter les utilisateurs \{#log-users-out\}
Si vous avez un bouton pour déconnecter les utilisateurs, utilisez la méthode `logout`.
:::important
La déconnexion d'un utilisateur crée un nouveau profil anonyme pour cet utilisateur.
:::
```csharp showLineNumbers
Adapty.Logout((error) => {
if(error == null) {
// successful logout
}
});
```
:::info
Pour reconnecter les utilisateurs à l'application, utilisez la méthode `identify`.
:::
### Autoriser les achats sans connexion \{#allow-purchases-without-login\}
Si vos utilisateurs peuvent effectuer des achats aussi bien avant qu'après s'être connectés à votre application, vous devez vous assurer qu'ils conserveront leur accès après la connexion :
1. Lorsqu'un utilisateur déconnecté effectue un achat, Adapty le lie à son ID de profil anonyme.
2. Lorsque l'utilisateur se connecte à son compte, Adapty bascule vers son profil identifié.
- S'il s'agit d'un nouveau customer user ID (par exemple, l'achat a été effectué avant l'inscription), Adapty attribue le customer user ID au profil actuel, de sorte que tout l'historique des achats est conservé.
- S'il s'agit d'un customer user ID existant (le customer user ID est déjà lié à un profil), vous devez récupérer le niveau d'accès réel après le changement de profil. Vous pouvez soit appeler [`getProfile`](unity-check-subscription-status) juste après l'identification, soit [écouter les mises à jour du profil](unity-check-subscription-status) pour que les données se synchronisent automatiquement.
## Prochaines étapes \{#next-steps\}
Félicitations ! Vous avez implémenté la logique de paiement intégré dans votre application ! Nous vous souhaitons tout le succès possible pour la monétisation de votre application !
Pour tirer encore plus parti d'Adapty, vous pouvez explorer ces sujets :
- [**Tests**](troubleshooting-test-purchases) : Assurez-vous que tout fonctionne comme prévu
- [**Onboardings**](onboardings) : Engagez les utilisateurs avec des onboardings et favorisez la rétention
- [**Intégrations**](configuration) : Intégrez des services d'attribution marketing et d'analyses en une seule ligne de code
- [**Définir des attributs de profil personnalisés**](unity-setting-user-attributes) : Ajoutez des attributs personnalisés aux profils utilisateurs et créez des segments pour lancer des tests A/B ou afficher différents paywalls à différents utilisateurs
---
# File: adapty-sdk-integration-skill-unity
---
---
title: "Intégrer Adapty dans votre application Unity avec la compétence d'intégration SDK"
description: "Utilisez la compétence adapty-sdk-integration pour intégrer le SDK Adapty dans votre application Unity de bout en bout avec votre outil de codage IA."
---
:::important
La compétence est en version bêta. Si elle se bloque ou se comporte de manière inattendue, suivez le [guide d'intégration étape par étape](adapty-cursor-unity) à la place — il guide votre outil IA à travers chaque étape avec la documentation appropriée.
:::
La [compétence adapty-sdk-integration](https://github.com/adaptyteam/adapty-sdk-integration-skill) automatise l'intégration Adapty de bout en bout : configuration du tableau de bord, installation du SDK, paywall et vérification à chaque étape. Elle détecte automatiquement votre plateforme et récupère la documentation Adapty pertinente à chaque étape.
**Outils compatibles** : Claude Code, GitHub Copilot CLI, OpenAI Codex, Gemini CLI.
Pour installer, choisissez le formulaire correspondant à votre outil. La liste complète se trouve dans le [README de la compétence](https://github.com/adaptyteam/adapty-sdk-integration-skill).
**Claude Code**
```
claude plugin marketplace add adaptyteam/adapty-sdk-integration-skill
claude plugin install adapty-sdk-integration@adapty
```
**GitHub Copilot CLI**
```
gh skill install adaptyteam/adapty-sdk-integration-skill
```
**Gemini CLI**
```
gemini skills install https://github.com/adaptyteam/adapty-sdk-integration-skill
```
**OpenAI Codex ou tout autre outil** — utilisez la [CLI skills](https://skills.sh) (notez que les compétences installées de cette façon ne se mettent pas à jour automatiquement) :
```
npx skills add adaptyteam/adapty-sdk-integration-skill
```
Vous pouvez également cloner le dépôt et copier `skills/adapty-sdk-integration/` dans le répertoire des compétences de votre outil.
Après l'installation, exécutez la compétence dans votre projet :
```
/adapty-sdk-integration
```
La compétence pose quelques questions de configuration, puis guide à travers la configuration du tableau de bord, l'installation du SDK, le paywall et la vérification.
---
# File: adapty-cursor-unity
---
---
title: "Intégrer Adapty dans votre application Unity avec l'aide de l'IA"
description: "Un guide étape par étape pour intégrer Adapty dans votre application Unity avec Cursor, Context7, ChatGPT, Claude ou d'autres outils IA."
---
Ce guide vous accompagne étape par étape dans l'intégration d'Adapty dans votre application Unity à l'aide d'un outil IA — vous lui fournissez les bonnes docs Adapty dans le bon ordre.
For a fully automated integration, use the [adapty-sdk-integration skill](https://github.com/adaptyteam/adapty-sdk-integration-skill): it runs the whole integration from your AI coding tool in one command.
## Avant de commencer : configuration du tableau de bord \{#before-you-start-dashboard-setup\}
Adapty nécessite quelques réglages dans le tableau de bord avant d'écrire la moindre ligne de code SDK. Vous pouvez le faire via un skill LLM interactif, ou manuellement depuis le Dashboard.
### Approche par skill (recommandée) \{#skill-approach-recommended\}
Le skill Adapty CLI permet à votre LLM de configurer votre application, vos produits, niveaux d'accès, paywalls et placements directement — sans ouvrir le Dashboard à chaque étape. Vous n'avez qu'à [connecter vos stores](integrate-payments) dans le Dashboard.
```
npx skills add adaptyteam/adapty-cli --skill adapty-cli
```
Une fois le skill ajouté, lancez `/adapty-cli` dans votre agent. Il vous guidera à chaque étape — y compris quand ouvrir le Dashboard pour connecter vos stores.
### Approche manuelle \{#dashboard-approach\}
Si vous préférez tout configurer manuellement, voici ce qu'il vous faut avant d'écrire du code. Votre LLM ne peut pas récupérer les valeurs du tableau de bord à votre place — vous devrez les lui fournir.
1. **Connectez vos stores** : Dans l'Adapty Dashboard, allez dans **App settings → General**. Connectez l'App Store et Google Play si votre application Unity cible les deux plateformes. C'est indispensable pour que les achats fonctionnent.
[Connecter les stores](integrate-payments)
2. **Copiez votre clé SDK publique** : Dans l'Adapty Dashboard, allez dans **App settings → General**, puis repérez la section **API keys**. Dans le code, c'est la chaîne que vous passez au builder de configuration Adapty.
3. **Créez au moins un produit** : Dans l'Adapty Dashboard, accédez à la page **Products**. Vous ne référencez pas les produits directement dans le code — Adapty les livre via les paywalls.
[Ajouter des produits](quickstart-products)
4. **Créez un paywall et un placement** : Dans l'Adapty Dashboard, créez un paywall sur la page **Paywalls**, puis assignez-le à un placement sur la page **Placements**. Dans le code, l'ID de placement est la chaîne que vous passez à `Adapty.GetPaywall("YOUR_PLACEMENT_ID")`.
[Créer un paywall](quickstart-paywalls)
5. **Configurez les niveaux d'accès** : Dans l'Adapty Dashboard, configurez-les par produit sur la page **Products**. Dans le code, la chaîne vérifiée dans `profile.AccessLevels["premium"]?.IsActive`. Le niveau d'accès `premium` par défaut convient à la plupart des applications. Si les utilisateurs payants accèdent à des fonctionnalités différentes selon le produit (par exemple, un plan `basic` vs. un plan `pro`), [créez des niveaux d'accès supplémentaires](assigning-access-level-to-a-product) avant de commencer à coder.
:::tip
Une fois ces cinq éléments en place, vous êtes prêt à écrire du code. Indiquez à votre LLM : « Ma clé SDK publique est X, mon ID de placement est Y » pour qu'il génère un code d'initialisation et de récupération de paywall correct.
:::
### À configurer quand vous serez prêt \{#set-up-when-ready\}
Ces éléments ne sont pas indispensables pour démarrer, mais vous en aurez besoin à mesure que votre intégration mûrit :
- **Tests A/B** : Configurez-les sur la page **Placements**. Aucun changement de code nécessaire.
[Tests A/B](ab-tests)
- **Paywalls et placements supplémentaires** : Ajoutez d'autres appels `GetPaywall` avec des ID de placement différents.
- **Intégrations analytics** : Configurez-les sur la page **Integrations**. La mise en place varie selon l'intégration. Voir [intégrations analytics](analytics-integration) et [intégrations attribution](attribution-integration).
## Fournir la documentation Adapty à votre LLM \{#feed-adapty-docs-to-your-llm\}
### Utiliser Context7 (recommandé) \{#use-context7-recommended\}
[Context7](https://context7.com) est un serveur MCP qui donne à votre LLM un accès direct à la documentation Adapty à jour. Votre LLM récupère automatiquement les bonnes docs selon vos questions — pas besoin de coller des URL manuellement.
Context7 fonctionne avec **Cursor**, **Claude Code**, **Windsurf** et d'autres outils compatibles MCP. Pour le configurer, lancez :
```
npx ctx7 setup
```
Cette commande détecte votre éditeur et configure le serveur Context7. Pour une configuration manuelle, consultez le [dépôt GitHub Context7](https://github.com/upstash/context7).
Une fois configuré, référencez la bibliothèque Adapty dans vos prompts :
```
Use the adaptyteam/adapty-docs library to look up how to install the Unity SDK
```
:::warning
Même si Context7 évite de coller des liens de docs manuellement, l'ordre d'implémentation est important. Suivez le [parcours d'implémentation](#implementation-walkthrough) ci-dessous étape par étape pour que tout fonctionne correctement.
:::
### Utiliser les docs en texte brut \{#use-plain-text-docs\}
Vous pouvez accéder à n'importe quelle doc Adapty en texte brut Markdown. Ajoutez `.md` à la fin de son URL, ou cliquez sur **Copy for LLM** sous le titre de l'article. Par exemple : [adapty-cursor-unity.md](https://adapty.io/docs/fr/adapty-cursor-unity.md).
Chaque étape du [parcours d'implémentation](#implementation-walkthrough) ci-dessous inclut un bloc « À envoyer à votre LLM » avec des liens `.md` à coller.
Pour accéder à plus de documentation en une fois, consultez les [fichiers d'index et sous-ensembles par plateforme](#plain-text-doc-index-files) ci-dessous.
## Parcours d'implémentation \{#implementation-walkthrough\}
La suite de ce guide décrit l'intégration d'Adapty dans l'ordre d'implémentation. Chaque étape inclut les docs à envoyer à votre LLM, ce que vous devez observer une fois terminé, et les problèmes courants.
### Planifier votre intégration \{#plan-your-integration\}
Avant de plonger dans le code, demandez à votre LLM d'analyser votre projet et de créer un plan d'implémentation. Si votre outil IA dispose d'un mode planification (comme le mode plan de Cursor ou Claude Code), utilisez-le pour que le LLM puisse lire à la fois la structure de votre projet et les docs Adapty avant d'écrire du code.
Indiquez à votre LLM quelle approche vous utilisez pour les achats — cela détermine les guides à suivre :
- [**Adapty Paywall Builder**](adapty-paywall-builder) : Vous créez des paywalls dans le builder no-code d'Adapty, et le SDK les affiche automatiquement.
- [**Paywalls créés manuellement**](unity-making-purchases) : Vous construisez votre propre interface de paywall dans le code, mais utilisez toujours Adapty pour récupérer les produits et gérer les achats.
- [**Mode observateur**](observer-vs-full-mode) : Vous conservez votre infrastructure d'achat existante et utilisez Adapty uniquement pour l'analytics et les intégrations.
Vous ne savez pas lequel choisir ? Lisez le [tableau comparatif dans le quickstart](unity-quickstart-paywalls).
### Installer et configurer le SDK \{#install-and-configure-the-sdk\}
Ajoutez le package SDK Adapty via Unity Package Manager et activez-le avec votre clé SDK publique. C'est le socle — rien d'autre ne fonctionne sans ça.
**Guide :** [Installer et configurer le SDK Adapty](sdk-installation-unity)
À envoyer à votre LLM :
```
Read these Adapty docs before writing code:
- https://adapty.io/docs/fr/sdk-installation-unity.md
```
:::tip[Checkpoint]
- **Attendu :** Le projet se compile et s'exécute. La console Unity affiche le log d'activation Adapty.
- **Point d'attention :** « Public API key is missing » → vérifiez que vous avez remplacé le placeholder par votre vraie clé depuis App settings.
:::
### Afficher les paywalls et gérer les achats \{#show-paywalls-and-handle-purchases\}
Récupérez un paywall par ID de placement, affichez-le et gérez les événements d'achat. Les guides dont vous avez besoin dépendent de la façon dont vous gérez les achats.
Testez chaque achat en sandbox au fur et à mesure — n'attendez pas la fin. Consultez [Tester les achats en sandbox](test-purchases-in-sandbox) pour les instructions de configuration.
Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'obtiendront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, ce qui permet de l'utiliser en toute sécurité pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les flows et les paywalls localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour les récupérer plus rapidement et un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour garantir que vous obtenez toujours la dernière version tout en assurant la fiabilité, même lorsque la connexion internet est limitée.
| | **loadTimeout** | défaut : 5 sec |Cette valeur limite le délai d'expiration de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut impliquer différentes requêtes en interne.
| | Paramètre | Description | | :-------- | :---------- | | Flow | Un objet `AdaptyFlow` contenant le placement, les identifiants (`InstanceIdentity`, `VariationId`), le nom, les variantes de paywall (`Paywalls` — une liste d'`AdaptyFlowPaywall`) et les Remote Configs (`RemoteConfigs` — une liste avec une entrée par locale). Pour récupérer les produits réels en vue d'un préchargement, d'une UI personnalisée ou de vérifications programmatiques, appelez `GetPaywallProducts(flow)`. | ## Récupérer la configuration de la vue \{#fetch-the-view-configuration\} Après avoir récupéré le flow ou le paywall, chargez sa configuration de vue et créez la vue en une seule étape avec la méthode `CreateFlowView`. Il n'y a pas d'indicateur distinct à vérifier : si le placement a été conçu dans le **Flow Builder** (un flow) ou le **Paywall Builder** (un paywall), `CreateFlowView` retourne la vue prête à être affichée. Si le placement est un paywall personnalisé sans interface Builder, `CreateFlowView` retourne une erreur — [gérez-la comme un paywall Remote Config](present-remote-config-paywalls-unity). :::important Assurez-vous d'activer le bouton **Show on device** dans le Flow Builder. Si cette option n'est pas activée, la configuration de la vue ne sera pas disponible pour être récupérée. ::: ```csharp showLineNumbers var parameters = new AdaptyUICreateFlowViewParameters() .SetPreloadProducts(true) .SetLoadTimeout(TimeSpan.FromSeconds(5)); AdaptyUI.CreateFlowView(flow, parameters, (view, error) => { if (error != null) { // the flow has no view configured, or view creation failed return; } // use view }); ``` | Paramètre | Présence | Description | | :--------------------------- | :------------- | :----------------------------------------------------------- | | **flow** | obligatoire | Un objet `AdaptyFlow` obtenu via `Adapty.GetFlow`. | | **Locale** | optionnel | L'identifiant de la [localisation du Builder](add-paywall-locale-in-adapty-paywall-builder) à utiliser pour afficher le flow ou le paywall, par exemple `en` ou `pt-br`. Un flow est localisé lors de la création de sa vue ; c'est donc le seul endroit où choisir sa localisation. Si vous l'omettez, Adapty détermine la localisation depuis l'appareil. Voir [Utiliser les localisations et les codes de langue](unity-localizations-and-locale-codes). | | **LoadTimeout** | optionnel | Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont retournés. Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `LoadTimeout`, car l'opération peut comporter plusieurs requêtes en interne. | | **PreloadProducts** | optionnel | Définissez à `true` pour précharger les produits et améliorer les performances. Lorsque cette option est activée, les produits sont chargés à l'avance, ce qui réduit le temps nécessaire pour afficher le flow ou le paywall. | | **ProductPurchaseParameters** | optionnel | Android uniquement (ignoré sur iOS). Un dictionnaire associant `AdaptyProductIdentifier` à `AdaptyPurchaseParameters`. Utilisez-le pour configurer des paramètres d'achat spécifiques comme les offres personnalisées ou les paramètres de mise à jour d'abonnement pour chaque produit du flow ou du paywall. | | **EnableSafeAreaPaddings** | optionnel | Android uniquement (ignoré sur iOS). Lorsque la valeur est `true`, la vue du flow applique des marges de zone sécurisée. Valeur par défaut : `true`. La valeur par défaut convient à la plupart des cas. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation dans le Builder](add-paywall-locale-in-adapty-paywall-builder). ::: Une fois chargé, [présentez le flow ou le paywall](unity-present-paywalls). ## Obtenez un flow ou un paywall pour l'audience par défaut afin d'accélérer la récupération \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\} En général, les flows et les paywalls sont récupérés quasi instantanément, vous n'avez donc pas à vous soucier d'optimiser ce processus. Cependant, si vous avez de nombreuses audiences et placements et que vos utilisateurs ont une connexion internet faible, la récupération d'un flow ou d'un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un flow ou un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher. Pour y remédier, vous pouvez utiliser la méthode `GetFlowForDefaultAudience`, qui récupère le flow ou le paywall du placement spécifié pour l'audience **All Users**. Il est cependant essentiel de comprendre que l'approche recommandée est de récupérer le flow ou le paywall via la méthode `GetFlow`, comme expliqué dans la section [Récupérer un flow/paywall](#fetch-flowpaywall) ci-dessus. :::warning Pourquoi nous recommandons d'utiliser `GetFlow` La méthode `GetFlowForDefaultAudience` présente plusieurs inconvénients majeurs : - **Problèmes potentiels de compatibilité ascendante** : si vous devez afficher des flows différents selon les versions de l'application (version actuelle et versions futures), vous pourriez rencontrer des difficultés. Vous devrez soit concevoir des flows compatibles avec la version actuelle (héritée), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des flows qui ne s'affichent pas correctement. - **Perte de ciblage** : tous les utilisateurs verront le même flow conçu pour l'audience **All Users**, ce qui signifie que vous perdez le ciblage personnalisé (notamment par pays, attribution marketing ou attributs personnalisés). Si vous acceptez ces inconvénients pour bénéficier d'une récupération plus rapide du flow ou du paywall, utilisez la méthode `GetFlowForDefaultAudience` comme suit. Sinon, utilisez `GetFlow` décrit [ci-dessus](#fetch-flowpaywall). ::: ```csharp showLineNumbers Adapty.GetFlowForDefaultAudience( "YOUR_PLACEMENT_ID", AdaptyPlacementFetchPolicy.Default, (flow, error) => { if (error != null) { // handle the error return; } // flow - the requested flow } ); ``` | Paramètre | Présence | Description | |---------|--------|-----------| | **placementId** | obligatoire | L'identifiant du [Placement](placements). C'est la valeur que vous avez indiquée lors de la création d'un placement dans votre Adapty Dashboard. | | **fetchPolicy** | par défaut : `AdaptyPlacementFetchPolicy.Default` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter des requêtes réseau.
Notez que le cache est conservé après le redémarrage de l'application et n'est effacé que lors de la désinstallation de celle-ci ou par un nettoyage manuel.
| ## Personnaliser les ressources \{#customize-assets\} Pour personnaliser les images et vidéos dans votre flow ou paywall, implémentez des ressources personnalisées. Les images et vidéos hero ont des IDs prédéfinis : `hero_image` et `hero_video`. Dans un bundle de ressources personnalisées, vous ciblez ces éléments par leurs IDs et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un ID personnalisé](custom-media) dans l'Adapty Dashboard. Par exemple, vous pouvez : - Afficher une image ou vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. Voici un exemple montrant comment fournir des ressources personnalisées via un dictionnaire simple : ```csharp showLineNumbers var customAssets = new Dictionaryoptionnel
défaut : `en`
|L'identifiant de la [localisation du paywall](add-paywall-locale-in-adapty-paywall-builder). Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second la région.
Exemple : `en` signifie l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](localizations-and-locale-codes) pour plus d'informations sur les codes de langue et nos recommandations d'utilisation.
| | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs sont confrontés à une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache lorsqu'elles existent. Dans ce cas, les utilisateurs ne recevront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session afin d'éviter des requêtes réseau.
Notez que le cache est conservé lors du redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | défaut : 5 sec |Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans `loadTimeout`, car l'opération peut regrouper différentes requêtes en coulisses.
| Paramètres de réponse : | Paramètre | Description | | :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Un objet [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) contenant une liste d'identifiants de produits, l'identifiant du paywall, la Remote Config, et plusieurs autres propriétés. | ## Récupérer la configuration d'affichage d'un paywall créé avec Paywall Builder \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\} :::important Assurez-vous d'activer le bouton **Show on device** dans le Paywall Builder. Si cette option n'est pas activée, la configuration d'affichage ne sera pas disponible pour la récupération. ::: Après avoir récupéré le paywall, vérifiez s'il inclut une `ViewConfiguration`, ce qui indique qu'il a été créé avec Paywall Builder. Cela vous guidera sur la façon d'afficher le paywall. Si la `ViewConfiguration` est présente, traitez-le comme un paywall Paywall Builder ; sinon, [gérez-le comme un paywall Remote Config](present-remote-config-paywalls-unity). Dans le SDK Unity, appelez directement la méthode `CreatePaywallView` sans récupérer manuellement la configuration de la vue au préalable. :::warning Le résultat de la méthode `CreatePaywallView` ne peut être utilisé qu'une seule fois. Si vous devez l'utiliser à nouveau, appelez de nouveau la méthode `CreatePaywallView`. L'appeler deux fois sans recréer peut entraîner l'erreur `AdaptyUIError.viewAlreadyPresented`. ::: ```csharp showLineNumbers var parameters = new AdaptyUICreatePaywallViewParameters() .SetPreloadProducts(preloadProducts) .SetLoadTimeout(new TimeSpan(0, 0, 3)); AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => { // handle the result }); ``` Paramètres : | Paramètre | Présence | Description | | :------------------ | :------------- | :----------------------------------------------------------- | | **paywall** | obligatoire | Un objet `AdaptyPaywall` permettant d'obtenir un contrôleur pour le paywall souhaité. | | **loadTimeout** | défaut : 5 sec | Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront retournés. Notez que dans de rares cas, cette méthode peut expirer légèrement après la valeur spécifiée dans `loadTimeout`, car l'opération peut impliquer différentes requêtes en interne. | | **PreloadProducts** | optionnel | Fournissez un tableau d'`AdaptyPaywallProducts` pour optimiser le moment d'affichage des produits à l'écran. Si `nil` est passé, AdaptyUI récupérera automatiquement les produits nécessaires. | | **CustomTags** | optionnel | Définissez un dictionnaire de tags personnalisés et leurs valeurs résolues. Les tags personnalisés servent de balises dans le contenu du paywall, remplacées dynamiquement par des chaînes spécifiques pour un contenu personnalisé. Consultez la rubrique Tags personnalisés dans le Paywall Builder pour plus de détails. | | **CustomTimers** | optionnel | Définissez un dictionnaire de minuteries personnalisées et leurs dates de fin. Les minuteries personnalisées permettent d'afficher des comptes à rebours dans votre paywall. | :::note Si vous utilisez plusieurs langues, découvrez comment ajouter une [localisation Paywall Builder](add-paywall-locale-in-adapty-paywall-builder) et comment utiliser correctement les codes de langue [ici](localizations-and-locale-codes). ::: Une fois que vous avez la vue, [affichez le paywall](unity-present-paywalls). ## Personnaliser les assets \{#customize-assets\} Pour personnaliser les images et vidéos de votre paywall, implémentez des assets personnalisés. Les images et vidéos hero ont des IDs prédéfinis : `hero_image` et `hero_video`. Dans un bundle d'assets personnalisé, vous ciblez ces éléments par leurs IDs et personnalisez leur comportement. Pour les autres images et vidéos, vous devez [définir un ID personnalisé](custom-media) dans l'Adapty Dashboard. Par exemple, vous pouvez : - Afficher une image ou vidéo différente à certains utilisateurs. - Afficher une image de prévisualisation locale pendant le chargement d'une image principale distante. - Afficher une image de prévisualisation avant de lancer une vidéo. :::important Pour utiliser cette fonctionnalité, mettez à jour le SDK Unity d'Adapty vers la version 3.8.0 ou supérieure. ::: Voici un exemple de la façon dont vous pouvez fournir des ressources personnalisées via un simple dictionnaire : ```csharp showLineNumbers var customAssets = new Dictionaryoptionnel
par défaut : `en`
|L'identifiant de la localisation du paywall. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second désigne la région.
Exemple : `en` signifie l'anglais, `pt-br` représente le portugais brésilien.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après un redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les paywalls de secours. Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour garantir que vous disposez toujours de la dernière version de vos paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
|
## Le nombre d'affichages du paywall est trop élevé \{#the-paywall-view-number-is-too-big\}
**Problème** : Le nombre d'affichages du paywall est deux fois plus élevé que prévu.
**Raison** : Vous appelez peut-être `LogShowFlow` (SDK v4+) / `LogShowPaywall` dans votre code, ce qui duplique le compteur d'affichages si vous utilisez le Paywall Builder ou le Flow Builder. Pour les flows et les paywalls créés avec ces outils, l'analyse est suivie automatiquement et vous n'avez pas besoin d'utiliser cette méthode.
**Solution** : Vérifiez que vous n'appelez pas `LogShowFlow` (SDK v4+) / `LogShowPaywall` dans votre code si vous utilisez le Paywall Builder ou le Flow Builder.
## Autres problèmes \{#other-issues\}
**Problème** : Vous rencontrez d'autres problèmes liés au Paywall Builder qui ne sont pas couverts ci-dessus.
**Solution** : Mettez à jour le SDK vers la dernière version en utilisant les [guides de migration](unity-sdk-migration-guides) si nécessaire. De nombreux problèmes sont résolus dans les versions plus récentes du SDK.
---
# File: unity-implement-paywalls-manually
---
---
title: "Implémenter les paywalls manuellement dans le SDK Unity"
description: "Découvrez comment implémenter les paywalls manuellement dans votre application Unity avec le SDK Adapty."
---
## Accepter les achats \{#accept-purchases\}
Si vous travaillez avec des paywalls que vous avez implémentés vous-même, vous pouvez déléguer la gestion des achats à Adapty en utilisant la méthode `makePurchase`. Adapty prendra alors en charge tous les scénarios utilisateur, et vous n'aurez qu'à gérer les résultats des achats.
:::important
`makePurchase` fonctionne avec les produits créés dans l'Adapty Dashboard. Assurez-vous de configurer les produits et les moyens de les récupérer dans le tableau de bord en suivant le [guide de démarrage rapide](quickstart).
:::
Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs risquent de ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les flows et les paywalls sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](unity-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les flows et les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir en permanence la dernière version de vos flows et paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'expiration de cette méthode. Si le délai est atteint, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après la valeur spécifiée dans `loadTimeout`, car l'opération peut comprendre plusieurs requêtes en coulisses.
| Ne codez pas les identifiants de produit en dur ! Puisque les flows sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent changer au fil du temps. Assurez-vous que votre code gère bien ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, votre application doit tous les afficher sans nécessiter de modification du code. La seule chose à coder en dur est l'identifiant du placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Flow | Un objet `AdaptyFlow` contenant : l'identifiant du flow, les variantes de paywall (`Paywalls` — chacune avec ses propres identifiants de produits), une liste `RemoteConfigs` (une entrée par locale configurée), et plusieurs autres propriétés. Pour récupérer les produits du flow, appelez `GetPaywallProducts(flow)`. | :::note Dans la v4, `GetFlow` n'a pas de paramètre `locale`. Lorsque vous affichez un flow avec `CreateFlowView`, la localisation est résolue automatiquement. Pour les paywalls personnalisés, toutes les localisations disponibles sont retournées ensemble dans `flow.RemoteConfigs` — choisissez la locale correspondant à l'appareil de l'utilisateur ou au paramètre de votre application. Consultez [Localisations et codes de langue](unity-localizations-and-locale-codes) pour plus de détails. ::: ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le flow, vous pouvez récupérer le tableau de produits qui lui correspond : ```csharp showLineNumbers Adapty.GetPaywallProducts(flow, (products, error) => { if (error != null) { // handle the error return; } // products - the requested products array }); ``` Paramètres de la réponse : | Paramètre | Description | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | Liste d'objets `AdaptyPaywallProduct` contenant : identifiant du produit, nom du produit, prix, devise, durée de l'abonnement et plusieurs autres propriétés. | Lors de la mise en œuvre de votre propre design de flow, vous aurez probablement besoin d'accéder à ces propriétés depuis l'objet `AdaptyPaywallProduct`. Les propriétés les plus couramment utilisées sont illustrées ci-dessous. | Propriété | Description | |-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Pour afficher le titre du produit, utilisez `product.LocalizedTitle`. La localisation se base sur le pays du store sélectionné par l'utilisateur, et non sur la locale de l'appareil. | | **Price** | Pour afficher une version localisée du prix, utilisez `product.Price.LocalizedString`. Cette localisation se base sur les informations de locale de l'appareil. Vous pouvez également accéder au prix sous forme numérique via `product.Price.Amount` — la valeur est fournie dans la devise locale. Pour obtenir le symbole de devise associé, utilisez `product.Price.CurrencySymbol`. | | **Subscription Period** | Pour afficher la période (ex. : semaine, mois, année, etc.), utilisez `product.Subscription?.LocalizedPeriod`. Cette localisation se base sur la locale de l'appareil. Pour récupérer la période d'abonnement par programmation, utilisez `product.Subscription?.Period`. Vous pouvez ensuite accéder à l'enum `Unit` pour obtenir la durée (c'est-à-dire `AdaptySubscriptionPeriodUnit.Day`, `AdaptySubscriptionPeriodUnit.Week`, `AdaptySubscriptionPeriodUnit.Month`, `AdaptySubscriptionPeriodUnit.Year`, ou `AdaptySubscriptionPeriodUnit.Unknown`). La valeur `NumberOfUnits` vous donne le nombre d'unités de période. Par exemple, pour un abonnement trimestriel, vous verrez `AdaptySubscriptionPeriodUnit.Month` dans la propriété `Unit`, et `3` dans la propriété `NumberOfUnits`. | | **Introductory Offer** | Pour afficher un badge ou tout autre indicateur signalant qu'un abonnement contient une offre de lancement, consultez la propriété `product.Subscription?.Offer?.Phases`. Il s'agit d'une liste pouvant contenir jusqu'à deux phases de remise : la phase d'essai gratuit et la phase de prix de lancement. Chaque objet de phase expose les propriétés suivantes :Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad` pour renvoyer les données en cache lorsqu'elles existent. Dans ce cas, les utilisateurs ne disposeront peut-être pas des toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact lors du redémarrage de l'application et n'est effacé que lors de la réinstallation de l'application ou via un nettoyage manuel.
|optionnel
par défaut : `en`
|L'identifiant de la [localisation du paywall](add-remote-config-locale). Ce paramètre doit être un code de langue composé d'un ou plusieurs sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de langue](unity-localizations-and-locale-codes) pour en savoir plus sur les codes de langue et notre approche recommandée.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne bénéficieront peut-être pas des toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache est conservé lors du redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les [paywalls de secours](unity-use-fallback-paywalls). Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour garantir que vous obtenez toujours la dernière version de vos paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai indiqué dans `loadTimeout`, car l'opération peut comprendre différentes requêtes en arrière-plan.
| N'écrivez pas les identifiants de produits en dur ! Puisque les paywalls sont configurés à distance, les produits disponibles, leur nombre et les offres spéciales (comme les essais gratuits) peuvent changer à tout moment. Assurez-vous que votre code gère ces scénarios. Par exemple, si vous récupérez initialement 2 produits, votre application doit afficher ces 2 produits. Mais si vous en récupérez ensuite 3, votre application doit tous les afficher sans nécessiter de modifications du code. La seule chose à écrire en dur est l'identifiant du placement. Paramètres de réponse : | Paramètre | Description | | :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Paywall | Un objet [`AdaptyPaywall`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html) contenant : une liste d'identifiants de produits, l'identifiant du paywall, le Remote Config, et plusieurs autres propriétés. | ## Récupérer les produits \{#fetch-products\} Une fois que vous avez le paywall, vous pouvez récupérer le tableau de produits qui lui correspond : ```csharp showLineNumbers Adapty.GetPaywallProducts(paywall, (products, error) => { if(error != null) { // handle the error return; } // products - the requested products array }); ``` Paramètres de réponse : | Paramètre | Description | | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Products | Liste d'objets [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) contenant : l'identifiant du produit, le nom du produit, le prix, la devise, la durée de l'abonnement, ainsi que d'autres propriétés. | Lors de l'implémentation de votre propre design de paywall, vous aurez probablement besoin d'accéder à ces propriétés depuis l'objet [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html). Les propriétés les plus couramment utilisées sont illustrées ci-dessous, mais consultez le document lié pour obtenir des informations complètes sur toutes les propriétés disponibles. | Propriété | Description | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Title** | Pour afficher le titre du produit, utilisez `product.LocalizedTitle`. La localisation est basée sur le pays du store sélectionné par l'utilisateur et non sur la langue de l'appareil. | | **Price** | Pour afficher le prix dans une version localisée, utilisez `product.Price.LocalizedString`. Cette localisation est basée sur les informations de langue de l'appareil. Vous pouvez également accéder au prix sous forme numérique via `product.Price.Amount`. La valeur sera fournie dans la devise locale. Pour obtenir le symbole de devise associé, utilisez `product.Price.CurrencySymbol`. | | **Subscription Period** | Pour afficher la période (ex. : semaine, mois, année, etc.), utilisez `product.Subscription?.LocalizedPeriod`. Cette localisation est basée sur la langue de l'appareil. Pour récupérer la période d'abonnement par programmation, utilisez `product.Subscription?.Period`. Vous pouvez ensuite accéder à l'enum `Unit` pour obtenir la durée (c'est-à-dire `AdaptySubscriptionPeriodUnit.Day`, `AdaptySubscriptionPeriodUnit.Week`, `AdaptySubscriptionPeriodUnit.Month`, `AdaptySubscriptionPeriodUnit.Year` ou `AdaptySubscriptionPeriodUnit.Unknown`). La valeur `NumberOfUnits` indique le nombre d'unités de période. Par exemple, pour un abonnement trimestriel, vous obtiendrez `AdaptySubscriptionPeriodUnit.Month` dans la propriété Unit et `3` dans la propriété NumberOfUnits. | | **Introductory Offer** | Pour afficher un badge ou un autre indicateur signalant qu'un abonnement contient une offre de lancement, consultez la propriété `product.Subscription?.Offer?.Phases`. Il s'agit d'une liste pouvant contenir jusqu'à deux phases de remise : la phase d'essai gratuit et la phase de prix de lancement. Chaque objet de phase contient les propriétés utiles suivantes :optionnel
par défaut : `en`
|L'identifiant de la localisation du paywall. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag désigne la langue, le second désigne la région.
Exemple : `en` signifie anglais, `pt-br` représente le portugais brésilien.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs ne disposeront peut-être pas des toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser en cours de session pour éviter les requêtes réseau.
Notez que le cache reste intact après un redémarrage de l'application et n'est effacé que lors d'une réinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les paywalls localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les paywalls de secours. Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'inaccessibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos paywalls, tout en assurant la fiabilité même lorsque la connexion internet est limitée.
|Si la requête a réussi, la réponse contient cet objet. Un objet [AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) fournit des informations complètes sur les niveaux d'accès, les abonnements et les achats uniques d'un utilisateur dans l'application.
Vérifiez le statut du niveau d'accès pour déterminer si l'utilisateur dispose de l'accès requis à l'application.
| :::warning **Remarque :** si vous utilisez encore StoreKit en version inférieure à v2.0 et le SDK Adapty en version inférieure à v2.9.0, vous devez fournir le [secret partagé de l'App Store Apple](app-store-connection-configuration#step-5-enter-app-store-shared-secret) à la place. Cette méthode est actuellement dépréciée par Apple. ::: ## Changer d'abonnement lors d'un achat \{#change-subscription-when-making-a-purchase\} Lorsqu'un utilisateur choisit un nouvel abonnement plutôt que de renouveler celui en cours, le fonctionnement dépend du store : - Sur l'App Store, l'abonnement est automatiquement mis à jour au sein du groupe d'abonnements. Si un utilisateur souscrit à un abonnement d'un groupe alors qu'il en a déjà un d'un autre groupe, les deux abonnements seront actifs en même temps. - Sur Google Play, l'abonnement n'est pas mis à jour automatiquement. Vous devrez gérer le changement dans le code de votre application mobile comme décrit ci-dessous. Pour remplacer un abonnement par un autre sur Android, appelez la méthode `.makePurchase()` avec le paramètre supplémentaire suivant : ```csharp showLineNumbers // Create subscription update parameters var subscriptionUpdateParams = new AdaptySubscriptionUpdateParameters( "old_product_id", // Product ID of the current subscription AdaptySubscriptionUpdateReplacementMode.WithTimeProration ); Adapty.MakePurchase(product, subscriptionUpdateParams, (profile, error) => { if(error != null) { // Handle the error return; } // successful cross-grade }); ``` Paramètre de requête supplémentaire : | Paramètre | Présence | Description | | :--------------------------- | :------- |:-------------------------------------------------------------------------------------------------------| | **subscriptionUpdateParams** | requis | un objet [`AdaptySubscriptionUpdateParameters`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_subscription_update_parameters.html). | Vous pouvez en apprendre davantage sur les abonnements et les modes de remplacement dans la documentation Google pour les développeurs : - [À propos des modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-modes) - [Recommandations de Google pour les modes de remplacement](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations) - Mode de remplacement [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE()). Remarque : cette méthode est disponible uniquement pour les mises à niveau d'abonnement. Les rétrogradations ne sont pas prises en charge. - Mode de remplacement [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED()). Remarque : le changement d'abonnement effectif n'aura lieu qu'à la fin de la période de facturation en cours. ## Utiliser des codes d'offre sur iOS \{#redeem-offer-codes-in-ios\}Un objet [`AdaptyProfile`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html). Ce modèle contient des informations sur les niveaux d'accès, les abonnements et les achats uniques.
Vérifiez le **statut du niveau d'accès** pour déterminer si l'utilisateur a accès à l'application.
| :::tip Vous souhaitez voir un exemple concret d'intégration du SDK Adapty dans une application mobile ? Consultez nos [exemples d'applications](sample-apps), qui illustrent la configuration complète, notamment l'affichage des paywalls, les achats et d'autres fonctionnalités de base. ::: --- # File: implement-observer-mode-unity --- --- title: "Implémenter le mode Observateur dans le SDK Unity" description: "Implémentez le mode observateur dans Adapty pour suivre les événements d'abonnement utilisateur dans le SDK Unity." --- Si vous disposez déjà de votre propre infrastructure d'achat et n'êtes pas prêt à passer entièrement à Adapty, vous pouvez explorer le [mode Observateur](observer-vs-full-mode). Dans sa forme de base, le mode Observateur offre des analyses avancées et une intégration transparente avec les systèmes d'attribution et d'analyse. Si cela correspond à vos besoins, il vous suffit de : 1. L'activer lors de la configuration du SDK en définissant le paramètre `observerMode` sur `true`. Suivez les instructions de configuration pour [Unity](sdk-installation-unity#activate-adapty-module-of-adapty-sdk). 2. [Signaler les transactions](report-transactions-observer-mode-unity) depuis votre infrastructure d'achat existante à Adapty. :::tip Dans la version 4 du SDK, vous pouvez également présenter des flows et des paywalls rendus par Adapty en mode Observer : lorsqu'un utilisateur appuie sur le bouton d'achat ou de restauration, le SDK transmet l'action à votre code afin que vous puissiez effectuer l'achat ou la restauration vous-même. Voir [Présenter des flows en mode Observer](unity-present-flows-in-observer-mode). ::: ### Configuration du mode Observateur \{#observer-mode-setup\} Activez le mode Observateur si vous gérez vous-même les achats et le statut des abonnements, et que vous utilisez Adapty uniquement pour l'envoi d'événements d'abonnement et l'analytique. :::important En mode Observateur, le SDK Adapty ne clôture aucune transaction — assurez-vous de les gérer vous-même. ::: :::note Dans le SDK 4.0, les interfaces de listener suivent la convention C# avec le préfixe I : implémentez `IAdaptyEventListener` plutôt que `AdaptyEventListener`. Les méthodes restent inchangées. Consultez le [guide de migration](migration-to-unity-sdk-v4). ::: ```csharp showLineNumbers title="C#" using UnityEngine; using AdaptySDK; public class AdaptyListener : MonoBehaviour, AdaptyEventListener { void Start() { DontDestroyOnLoad(this.gameObject); Adapty.SetEventListener(this); var builder = new AdaptyConfiguration.Builder("YOUR_PUBLIC_SDK_KEY") .SetObserverMode(true); // Enable observer mode Adapty.Activate(builder.Build(), (error) => { if (error != null) { // handle the error return; } }); } public void OnLoadLatestProfile(AdaptyProfile profile) { } public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { } public void OnInstallationDetailsFail(AdaptyError error) { } } ``` | Paramètre | Description | |--------------|---------------------------------------------------------------------------------------------------------------------| | observerMode | Une valeur booléenne qui contrôle le [mode Observateur](observer-vs-full-mode). La valeur par défaut est `false`. | ## Utiliser les paywalls Adapty en mode Observer \{#using-adapty-paywalls-in-observer-mode\} Si vous souhaitez également utiliser les paywalls et les fonctionnalités de test A/B d'Adapty, c'est possible — mais cela nécessite une configuration supplémentaire en mode Observer. Voici ce que vous devrez faire en plus des étapes ci-dessus : 1. Affichez les paywalls normalement pour les [paywalls avec Remote Config](present-remote-config-paywalls-unity). 3. [Associez les paywalls](report-transactions-observer-mode-unity) aux transactions d'achat. --- # File: report-transactions-observer-mode-unity --- --- title: "Signaler les transactions en Observer Mode dans le SDK Unity" description: "Signalez les transactions d'achat en Observer Mode Adapty pour obtenir des informations utilisateurs et suivre les revenus dans le SDK Unity." ---Pour iOS, StoreKit 1 : un objet [SKPaymentTransaction](https://developer.apple.com/documentation/storekit/skpaymenttransaction).
Pour iOS, StoreKit 2 : un objet [Transaction](https://developer.apple.com/documentation/storekit/transaction).
Pour Android : identifiant de type String (purchase.getOrderId de l'achat, où l'achat est une instance de la classe [Purchase](https://developer.android.com/reference/com/android/billingclient/api/Purchase) de la bibliothèque de facturation.
| | variationId | requis | L'identifiant de type String de la variante. Vous pouvez l'obtenir via la propriété `variationId` de l'objet [AdaptyPaywall](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall.html). |phoneNumber
firstName
lastName
| String | | gender | Enum, les valeurs autorisées sont : `female`, `male`, `other` | | birthday | Date | ### Attributs utilisateur personnalisés \{#custom-user-attributes\} Vous pouvez définir vos propres attributs personnalisés, généralement liés à l'utilisation de votre application. Par exemple, pour une application de fitness, il peut s'agir du nombre d'exercices par semaine ; pour une application d'apprentissage des langues, du niveau de connaissance de l'utilisateur, etc. Vous pouvez les utiliser dans des segments pour créer des paywalls et des offres ciblés, ainsi que dans les analyses pour identifier quelles métriques produit influencent le plus les revenus. ```csharp showLineNumbers try { builder = builder.SetCustomStringAttribute("string_key", "string_value"); builder = builder.SetCustomDoubleAttribute("double_key", 123.0f); } catch (Exception e) { // handle the exception } ``` Pour supprimer une clé existante, utilisez la méthode `.withRemoved(customAttributeForKey:)` : ```csharp showLineNumbers try { builder = builder.RemoveCustomAttribute("key_to_remove"); } catch (Exception e) { // handle the exception } ``` Il peut parfois être utile de connaître les attributs personnalisés déjà définis. Pour cela, utilisez le champ `customAttributes` de l'objet `AdaptyProfile`. :::warning Gardez à l'esprit que la valeur de `customAttributes` peut ne pas être à jour, car les attributs utilisateur peuvent être envoyés depuis différents appareils à tout moment — les attributs sur le serveur peuvent donc avoir été modifiés depuis la dernière synchronisation. ::: ### Limites \{#limits\} - Jusqu'à 30 attributs personnalisés par utilisateur - Les noms de clés peuvent comporter jusqu'à 30 caractères. Le nom de clé peut contenir des caractères alphanumériques ainsi que les caractères suivants : `_` `-` `.` - La valeur peut être une chaîne de caractères ou un nombre décimal (float) d'au plus 50 caractères. --- # File: unity-listen-subscription-changes --- --- title: "Vérifier le statut d'abonnement dans le SDK Unity" description: "Suivez et gérez le statut d'abonnement des utilisateurs dans Adapty pour améliorer la rétention client dans votre application Unity." --- Avec Adapty, suivre le statut d'un abonnement est simple. Vous n'avez pas besoin d'insérer manuellement des ID de produits dans votre code. Il vous suffit de vérifier l'existence d'un [niveau d'accès](access-level) actif pour confirmer le statut d'abonnement d'un utilisateur.Un objet [AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html). En général, il suffit de vérifier le statut du niveau d'accès du profil pour déterminer si l'utilisateur dispose d'un accès premium à l'application.
La méthode `.getProfile` fournit le résultat le plus à jour, car elle interroge toujours l'API. Si, pour une raison quelconque (par exemple, absence de connexion internet), le SDK ne parvient pas à récupérer les informations depuis le serveur, les données du cache sont renvoyées. Il est également important de noter que le SDK met régulièrement à jour le cache `AdaptyProfile` afin de maintenir ces informations aussi récentes que possible.
| La méthode `.getProfile()` vous fournit le profil utilisateur à partir duquel vous pouvez obtenir le statut du niveau d'accès. Vous pouvez avoir plusieurs niveaux d'accès par application. Par exemple, si vous avez une application de presse et vendez des abonnements à différentes thématiques indépendamment, vous pouvez créer des niveaux d'accès « sports » et « science ». Mais la plupart du temps, un seul niveau d'accès suffira ; dans ce cas, vous pouvez simplement utiliser le niveau d'accès par défaut « premium ». Voici un exemple pour vérifier le niveau d'accès par défaut « premium » : ```csharp showLineNumbers Adapty.GetProfile((profile, error) => { if (error != null) { // handle the error return; } // "premium" is an identifier of default access level var accessLevel = profile.AccessLevels["premium"]; if (accessLevel != null && accessLevel.IsActive) { // grant access to premium features } }); ``` ### Écouter les mises à jour du statut d'abonnement \{#listening-for-subscription-status-updates\} Chaque fois que l'abonnement d'un utilisateur change, Adapty déclenche un événement. Pour recevoir des messages d'Adapty, vous devez effectuer quelques configurations supplémentaires : :::note Dans le SDK 4.0, les interfaces de listener suivent la convention C# avec préfixe I : implémentez `IAdaptyEventListener` plutôt que `AdaptyEventListener`. Les méthodes restent inchangées. Consultez le [guide de migration](migration-to-unity-sdk-v4). ::: ```csharp showLineNumbers // Extend `AdaptyEventListener ` with `OnLoadLatestProfile ` method: public class AdaptyListener : MonoBehaviour, AdaptyEventListener { public void OnLoadLatestProfile(AdaptyProfile profile) { // handle any changes to subscription state } } ``` Adapty déclenche également un événement au démarrage de l'application. Dans ce cas, le statut d'abonnement mis en cache sera transmis. ### Cache du statut d'abonnement \{#subscription-status-cache\} Le cache implémenté dans le SDK Adapty stocke le statut d'abonnement du profil. Ainsi, même si le serveur est indisponible, les données en cache restent accessibles pour fournir les informations sur le statut d'abonnement du profil. Cependant, il est important de noter qu'il n'est pas possible d'effectuer des requêtes directes sur le cache. Le SDK interroge périodiquement le serveur toutes les minutes pour vérifier s'il existe des mises à jour ou des modifications liées au profil. Si des changements sont détectés, comme de nouvelles transactions ou d'autres mises à jour, ils seront envoyés aux données en cache afin de les maintenir synchronisées avec le serveur. --- # File: unity-deal-with-att --- --- title: "Gérer l'ATT dans le SDK Unity" description: "Démarrez avec Adapty sur Unity pour simplifier la configuration et la gestion des abonnements." --- Si votre application utilise le framework AppTrackingTransparency et présente une demande d'autorisation de suivi à l'utilisateur, vous devez envoyer le [statut d'autorisation](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus/) à Adapty. ```csharp showLineNumbers var builder = new Adapty.ProfileParameters.Builder() .SetAppTrackingTransparencyStatus(IOSAppTrackingTransparencyStatus.Authorized); Adapty.UpdateProfile(builder.Build(), (error) => { if(error != null) { // handle the error } }); ``` :::warning Nous vous recommandons vivement d'envoyer cette valeur le plus tôt possible dès qu'elle change — c'est la seule façon de garantir que les données sont transmises en temps opportun aux intégrations que vous avez configurées. ::: --- # File: kids-mode-unity --- --- title: "Mode Enfants dans le SDK Unity" description: "Activez facilement le Mode Enfants pour respecter les politiques d'Apple et de Google. Pas de collecte d'IDFA, GAID ou de données publicitaires dans le SDK Unity." ---optionnel
par défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
Consultez [Localisations et codes de locale](flutter-localizations-and-locale-codes) pour plus d'informations sur les codes de locale et leur utilisation recommandée.
| | **fetchPolicy** | par défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.
Toutefois, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas les toutes dernières données, mais le chargement sera plus rapide, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache n'est pas effacé au redémarrage de l'application ; il est uniquement supprimé lors de la désinstallation ou d'un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement sur deux couches : le cache mis à jour régulièrement décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos onboardings tout en assurant une fiabilité même en cas de connexion internet limitée.
| | **loadTimeout** | par défaut : 5 sec |Cette valeur limite le délai d'attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local sont renvoyés.
Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai indiqué dans `loadTimeout`, car l'opération peut reposer sur plusieurs requêtes en arrière-plan.
| Paramètres de réponse : | Paramètre | Description | |:----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Onboarding | Un objet [`AdaptyOnboarding`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_onboarding.html) contenant : l'identifiant et la configuration de l'onboarding, le Remote Config, ainsi que plusieurs autres propriétés. | Après avoir récupéré l'onboarding, appelez la méthode `CreateOnboardingView`. :::warning Le résultat de la méthode `CreateOnboardingView` ne peut être utilisé qu'une seule fois. Si vous en avez besoin à nouveau, appelez de nouveau la méthode `CreateOnboardingView`. L'appeler deux fois sans recréer peut entraîner l'erreur `AdaptyUIError.viewAlreadyPresented`. ::: ```csharp showLineNumbers AdaptyUI.CreateOnboardingView(onboarding, (view, error) => { // handle the result }); ``` Paramètres : | Paramètre | Présence | Description | |:---------------| :------------- |:-----------------------------------------------------------------------------| | **onboarding** | requis | Un objet `AdaptyOnboarding` pour obtenir une vue pour l'onboarding souhaité. | | **externalUrlsPresentation** |optionnel
par défaut : `InAppBrowser`
|Contrôle la façon dont les liens de l'onboarding sont ouverts. Options disponibles :
- `AdaptyWebPresentation.InAppBrowser` - Ouvre les liens dans un navigateur intégré à l'application (par défaut)
- `AdaptyWebPresentation.ExternalBrowser` - Ouvre les liens dans le navigateur externe de l'appareil
Consultez [Personnaliser l'ouverture des liens dans les onboardings](unity-present-onboardings#customize-how-links-open-in-onboardings) pour des exemples d'utilisation.
| Une fois que vous avez chargé avec succès l'onboarding et sa configuration d'affichage, vous pouvez [le présenter dans votre application mobile](unity-present-onboardings). ## Accélérer la récupération des onboardings avec l'onboarding de l'audience par défaut \{#speed-up-onboarding-fetching-with-default-audience-onboarding\} En général, les onboardings sont récupérés presque instantanément, vous n'avez donc pas à vous soucier d'accélérer ce processus. Cependant, si vous avez de nombreuses audiences et onboardings, et que vos utilisateurs disposent d'une connexion internet faible, la récupération d'un onboarding peut prendre plus de temps que souhaité. Dans ces situations, vous pouvez afficher un onboarding par défaut pour garantir une expérience fluide plutôt que de ne rien afficher du tout. Pour résoudre ce problème, vous pouvez utiliser la méthode `GetOnboardingForDefaultAudience`, qui récupère l'onboarding du placement spécifié pour l'audience **All Users**. Cependant, il est essentiel de comprendre que l'approche recommandée est de récupérer l'onboarding via la méthode `getOnboarding`, comme détaillé dans la section [Récupérer l'onboarding](#fetch-onboarding-and-create-view) ci-dessus. :::warning Préférez `GetOnboarding` à `GetOnboardingForDefaultAudience`, car cette dernière présente des limitations importantes : - **Problèmes de compatibilité** : Peut créer des problèmes lors de la prise en charge de plusieurs versions de l'application, nécessitant soit des conceptions rétrocompatibles, soit d'accepter que les anciennes versions s'affichent incorrectement. - **Pas de personnalisation** : Affiche uniquement le contenu pour l'audience « Tous les utilisateurs », supprimant le ciblage basé sur le pays, l'attribution ou les attributs personnalisés. Si une récupération plus rapide compense ces inconvénients pour votre cas d'utilisation, utilisez `GetOnboardingForDefaultAudience` comme indiqué ci-dessous. Sinon, utilisez `GetOnboarding` comme décrit [ci-dessus](#fetch-onboarding-and-create-view). ::: ```csharp showLineNumbers Adapty.GetOnboardingForDefaultAudience("YOUR_PLACEMENT_ID", (onboarding, error) => { if (error != null) { // handle the error return; } // the requested onboarding }); ``` Paramètres : | Paramètre | Présence | Description | |---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **placementId** | requis | L'identifiant du [Placement](placements) souhaité. C'est la valeur que vous avez spécifiée lors de la création d'un placement dans l'Adapty Dashboard. | | **locale** |optionnel
défaut : `en`
|L'identifiant de la localisation de l'onboarding. Ce paramètre doit être un code de langue composé d'un ou deux sous-tags séparés par le caractère moins (**-**). Le premier sous-tag correspond à la langue, le second à la région.
Exemple : `en` désigne l'anglais, `pt-br` représente le portugais brésilien.
| | **fetchPolicy** | défaut : `.reloadRevalidatingCacheData` |Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d'échec. Nous recommandons cette option car elle garantit que vos utilisateurs obtiennent toujours les données les plus récentes.
Cependant, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d'utiliser `.returnCacheDataElseLoad` pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n'auront peut-être pas les toutes dernières données, mais le chargement sera plus rapide, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l'utiliser pendant la session pour éviter les requêtes réseau.
Notez que le cache reste intact après le redémarrage de l'application et n'est effacé que lors de la désinstallation ou via un nettoyage manuel.
Le SDK Adapty stocke les onboardings localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les onboardings de secours. Nous utilisons également un CDN pour récupérer les onboardings plus rapidement, ainsi qu'un serveur de secours indépendant en cas d'indisponibilité du CDN. Ce système est conçu pour garantir que vous obtenez toujours la dernière version de vos onboardings tout en assurant la fiabilité même lorsque la connexion internet est limitée.
| --- # File: unity-present-onboardings --- --- title: "Présenter les onboardings dans le SDK Unity" description: "Apprenez à présenter les onboardings efficacement pour augmenter vos conversions." --- :::warning **Les onboardings sont dépréciés dans le SDK v4 et seront supprimés dans une prochaine version.** Ils ne reçoivent plus de correctifs ni d'améliorations. Utilisez les [flows](unity-get-pb-paywalls) à la place : contrairement aux onboardings, qui s'exécutent dans une WebView, les flows s'affichent nativement sur l'appareil — offrant des animations plus fluides, un rendu natif cohérent, des temps de chargement plus rapides et aucune dépendance à un runtime WebView. Consultez [Obtenir des flows et paywalls](unity-get-pb-paywalls) et [Afficher des flows et paywalls](unity-present-paywalls) pour commencer. ::: Si vous avez personnalisé un onboarding avec le builder, vous n'avez pas besoin de vous soucier de son rendu dans votre code Unity pour l'afficher à l'utilisateur. Un tel onboarding contient à la fois ce qui doit être affiché et comment cela doit l'être. Avant de commencer, assurez-vous que : 1. Vous avez installé [Adapty Unity SDK](sdk-installation-unity) 3.14.0 ou version ultérieure. 2. Vous avez [créé un onboarding](create-onboarding). 3. Vous avez ajouté l'onboarding à un [placement](placements). Pour afficher un onboarding, utilisez la méthode `view.Present()` sur la `view` créée par la méthode `CreateOnboardingView`. Chaque `view` ne peut être utilisée qu'une seule fois. Si vous devez afficher le paywall à nouveau, appelez `CreateOnboardingView` une nouvelle fois pour créer une nouvelle instance de `view`. :::warning Réutiliser la même `view` sans la recréer peut entraîner une erreur `AdaptyUIError.viewAlreadyPresented`. ::: ```csharp showLineNumbers title="Unity" view.Present((presentError) => { if (presentError != null) { // handle the error } }; ``` ## Configurer le style de présentation iOS \{#configure-ios-presentation-style\} Configurez la façon dont l'onboarding est présenté sur iOS en passant le paramètre `iosPresentationStyle` à la méthode `Present()`. Le paramètre accepte les valeurs `AdaptyUIIOSPresentationStyle.FullScreen` (par défaut) ou `AdaptyUIIOSPresentationStyle.PageSheet`. ```csharp showLineNumbers title="Unity" view.Present(AdaptyUIIOSPresentationStyle.PageSheet, (error) => { // handle the error }); ``` ## Personnaliser l'ouverture des liens dans les onboardings \{#customize-how-links-open-in-onboardings\} :::important La personnalisation de l'ouverture des liens dans les onboardings est prise en charge à partir du SDK Adapty v3.15. ::: Par défaut, les liens dans les onboardings s'ouvrent dans un navigateur intégré à l'application, offrant une expérience fluide en affichant les pages web directement dans votre application sans changer d'app. Pour ouvrir les liens dans un navigateur externe à la place, passez `AdaptyWebPresentation.ExternalBrowser` à la méthode `CreateOnboardingView` : ```csharp showLineNumbers title="Unity" AdaptyUI.CreateOnboardingView( onboarding, AdaptyWebPresentation.ExternalBrowser, // default — InAppBrowser (view, error) => { if (error != null) { // handle the error return; } // present the onboarding view view.Present((presentError) => { if (presentError != null) { // handle the error } }); } ); ``` Options disponibles : - `AdaptyWebPresentation.InAppBrowser` - Ouvre les liens dans un navigateur intégré à l'application (par défaut) - `AdaptyWebPresentation.ExternalBrowser` - Ouvre les liens dans le navigateur externe de l'appareil --- # File: unity-handling-onboarding-events --- --- title: "Gérer les événements d'onboarding dans le SDK Unity" description: "Gérez les événements liés à l'onboarding dans Unity avec Adapty." --- :::warning **Les onboardings sont dépréciés dans le SDK v4 et seront supprimés dans une prochaine version.** Ils ne reçoivent plus de correctifs ni d'améliorations. Utilisez les [flows](unity-get-pb-paywalls) à la place : contrairement aux onboardings, qui s'exécutent dans une WebView, les flows s'affichent nativement sur l'appareil — offrant des animations plus fluides, un rendu natif cohérent, des temps de chargement plus rapides, et aucune dépendance à un runtime WebView. Consultez [Obtenir des flows & paywalls](unity-get-pb-paywalls) et [Afficher des flows & paywalls](unity-present-paywalls) pour commencer. ::: Avant de commencer, assurez-vous que : 1. Vous avez installé [le SDK Adapty Unity](sdk-installation-unity) version 3.14.0 ou ultérieure. 2. Vous avez [créé un onboarding](create-onboarding). 3. Vous avez ajouté l'onboarding à un [placement](placements). Les onboardings configurés avec le builder génèrent des événements auxquels votre application peut réagir. Découvrez ci-dessous comment gérer ces événements. Pour contrôler ou surveiller les processus qui se déroulent sur l'écran d'onboarding dans votre application Unity, implémentez l'interface `AdaptyOnboardingsEventsListener`. :::note Dans le SDK 4.0, les interfaces listener suivent la convention de préfixe C# `I-` : implémentez `IAdaptyOnboardingsEventsListener` plutôt que `AdaptyOnboardingsEventsListener`. Les méthodes restent inchangées. Consultez le [guide de migration](migration-to-unity-sdk-v4). ::: ## Actions personnalisées \{#custom-actions\} Dans le builder, vous pouvez ajouter une action **personnalisée** à un bouton et lui attribuer un identifiant.
Ensuite, vous pouvez utiliser cet ID dans votre code et le gérer comme une action personnalisée. Par exemple, si un utilisateur appuie sur un bouton personnalisé, comme **Login** ou **Allow notifications**, la méthode `OnboardingViewOnCustomAction` sera déclenchée avec le paramètre `actionId` correspondant à l'**Action ID** défini dans le builder. Vous pouvez créer vos propres IDs, comme "allowNotifications".
Pour gérer les événements d'onboarding, implémentez l'interface `AdaptyOnboardingsEventsListener` :
```csharp showLineNumbers title="Unity"
public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener
{
void Start()
{
Adapty.SetOnboardingsEventsListener(this);
}
public void OnboardingViewOnCustomAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
string actionId
)
{
if (actionId == "allowNotifications") {
// request notification permissions
}
}
public void OnboardingViewDidFailWithError(
AdaptyUIOnboardingView view,
AdaptyError error
)
{
// handle errors
}
// Implement other required interface methods (see examples below)
}
```
:::important
Notez que vous devez gérer ce qui se passe lorsqu'un utilisateur ferme l'onboarding. Par exemple, vous devez arrêter d'afficher l'onboarding lui-même.
:::
Implémentez la méthode `OnboardingViewOnCloseAction` dans votre classe :
```csharp showLineNumbers title="Unity"
public class OnboardingManager : MonoBehaviour, AdaptyOnboardingsEventsListener
{
public void OnboardingViewOnCloseAction(
AdaptyUIOnboardingView view,
AdaptyUIOnboardingMeta meta,
string actionId
)
{
view.Dismiss((error) => {
if (error != null) {
// handle the error
}
});
}
// ... other interface methods
}
```
Ce code d'erreur indique que l'utilisateur a annulé une demande de paiement.
Aucune action n'est requise, mais d'un point de vue logique métier, vous pouvez proposer une remise à votre utilisateur ou lui rappeler ultérieurement.
| | [paymentInvalid](https://developer.apple.com/documentation/storekit/skerror/code/paymentinvalid) | 3 | Cette erreur indique que l'un des paramètres de paiement n'a pas été reconnu par l'App Store. | | [paymentNotAllowed](https://developer.apple.com/documentation/storekit/skerror/code/paymentnotallowed) | 4 | Ce code d'erreur indique que l'utilisateur n'est pas autorisé à valider des paiements. | | [storeProductNotAvailable](https://developer.apple.com/documentation/storekit/skerror/code/storeproductnotavailable) | 5 | Ce code d'erreur indique que le produit demandé n'est pas disponible dans le store.L'[`identifiant`](https://developer.apple.com/documentation/storekit/skpaymentdiscount/identifier) de l'offre n'est pas valide. Par exemple, vous n'avez pas configuré d'offre avec cet identifiant dans l'App Store, ou vous avez révoqué l'offre.
Assurez-vous de configurer les offres souhaitées dans AppStore Connect et de passer un identifiant d'offre valide.
| | [invalidSignature](https://developer.apple.com/documentation/storekit/skerror/code/invalidsignature) | 12 | Ce code d'erreur indique que la signature dans une remise de paiement n'est pas valide. | | [missingOfferParams](https://developer.apple.com/documentation/storekit/skerror/code/missingofferparams) | 13 | Ce code d'erreur indique que des paramètres sont manquants dans une remise de paiement. | | [invalidOfferPrice](https://developer.apple.com/documentation/storekit/skerror/code/invalidofferprice/) | 14 | Ce code d'erreur indique que le prix que vous avez spécifié dans App Store Connect n'est plus valide. Les offres doivent toujours représenter un prix réduit. | ## Codes Android personnalisés \{#custom-android-codes\} | Erreur | Code | Solution | |-----|----|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | adaptyNotInitialized | 20 | Vous devez configurer correctement le SDK Adapty via la méthode `Adapty.activate`. Découvrez comment le faire [pour Unity](sdk-installation-unity#activate-adapty-module-of-adapty-sdk). | | productNotFound | 22 | Cette erreur indique que le produit demandé pour l'achat n'est pas disponible dans le store. | | invalidJson | 23 | Le JSON du paywall n'est pas valide. Corrigez-le dans l'Adapty Dashboard. Consultez la rubrique [Personnaliser le paywall avec Remote Config](customize-paywall-with-remote-config) pour savoir comment le corriger. | | currentSubscriptionToUpdateNotFoundInHistory | 24 | L'abonnement d'origine qui doit être renouvelé est introuvable. | | pendingPurchase | 25 | Cette erreur indique que l'état de l'achat est en attente plutôt que finalisé. Consultez la page [Gestion des transactions en attente](https://developer.android.com/google/play/billing/integrate#pending) dans la documentation Android Developer pour plus de détails. | | billingServiceTimeout | 97 | Cette erreur indique que la requête a atteint le délai d'attente maximum avant que Google Play puisse répondre. Cela peut être causé, par exemple, par un délai dans l'exécution de l'action demandée par l'appel à la bibliothèque Play Billing. | | featureNotSupported | 98 | La fonctionnalité demandée n'est pas prise en charge par le Play Store sur l'appareil actuel. | | billingServiceDisconnected | 99 | Cette erreur fatale indique que la connexion de l'application cliente au service Google Play Store via le `BillingClient` a été interrompue. | | billingServiceUnavailable | 102 | Cette erreur transitoire indique que le service Google Play Billing est actuellement indisponible. Dans la plupart des cas, cela signifie qu'il y a un problème de connexion réseau quelque part entre l'appareil client et les services Google Play Billing. | | billingUnavailable | 103 |Cette erreur indique qu'une erreur de facturation utilisateur s'est produite pendant le processus d'achat. Exemples de situations où cela peut se produire :
1\. L'application Play Store sur l'appareil de l'utilisateur est obsolète.
2. L'utilisateur se trouve dans un pays non pris en charge.
3. L'utilisateur est un utilisateur entreprise et son administrateur a désactivé les achats pour les utilisateurs.
4. Google Play ne peut pas débiter le moyen de paiement de l'utilisateur. Par exemple, la carte de crédit de l'utilisateur a peut-être expiré.
5. L'utilisateur n'est pas connecté à l'application Play Store.
| | developerError | 105 | Il s'agit d'une erreur fatale indiquant que vous utilisez une API de manière incorrecte. | | billingError | 106 | Il s'agit d'une erreur fatale indiquant un problème interne avec Google Play lui-même. | | itemAlreadyOwned | 107 | Le produit consommable a déjà été acheté. | | itemNotOwned | 108 | Cette erreur indique que l'action demandée sur l'article a échoué car | ## Codes StoreKit personnalisés \{#custom-storekit-codes\} | Erreur | Code | Solution | |-----|----|-----------| | noProductIDsFound | 1000 |Cette erreur indique qu'aucun des produits que vous avez demandés sur le paywall n'est disponible à l'achat dans l'App Store, même s'ils y sont répertoriés. Cette erreur peut parfois s'accompagner d'un avertissement `InvalidProductIdentifiers`. Si l'avertissement apparaît sans erreur, ignorez-le.
Si vous rencontrez cette erreur, suivez les étapes de la section [Correction de l'erreur Code-1000 `noProductIDsFound`](InvalidProductIdentifiers-unity).
| | productRequestFailed | 1002 |Impossible de récupérer les produits disponibles pour le moment. Raison possible :
- Aucun cache n'a encore été créé et il n'y a pas de connexion Internet en même temps.
| | cantMakePayments | 1003 | Les achats intégrés ne sont pas autorisés sur cet appareil. Consultez le [guide](cantMakePayments-unity) de dépannage. | | noPurchasesToRestore | 1004 | Cette erreur indique que Google Play n'a pas trouvé d'achat à restaurer. | | cantReadReceipt | 1005 |Aucun reçu valide n'est disponible sur l'appareil. Cela peut poser problème lors des tests en sandbox.
Aucune action n'est requise, mais d'un point de vue logique métier, vous pouvez proposer une remise à votre utilisateur ou lui rappeler ultérieurement.
| | productPurchaseFailed | 1006 | L'achat du produit a échoué. Cela encapsule une erreur StoreKit sous-jacente — lisez l'erreur encapsulée (ou activez les logs verbeux pour la voir dans la console) pour connaître la raison réelle. L'erreur encapsulée correspond généralement à l'un des codes StoreKit 0–14 du tableau ci-dessus — le plus souvent `paymentCancelled`, `paymentInvalid`, `paymentNotAllowed` ou `invalidOfferPrice`. Si vous ne pouvez pas identifier une raison précise, essayez un nouveau [profil sandbox](test-purchases-in-sandbox) ; si cela échoue encore, contactez le support Apple. | | refreshReceiptFailed | 1010 | Cette erreur indique que le reçu n'a pas été reçu. Applicable uniquement à StoreKit 1. | | receiveRestoredTransactionsFailed | 1011 | La restauration des achats a échoué. | ## Codes réseau personnalisés \{#custom-network-codes\} | Erreur | Code | Solution | |:---------------------|:-----|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | notActivated | 2002 | Le SDK Adapty n'est pas activé.
2. Cliquez sur le nom du groupe d'abonnements. Vos produits apparaîtront dans la section **Subscriptions**.
3. Assurez-vous que le produit que vous testez est marqué **Ready to Submit**.
4. Comparez l'identifiant du produit dans le tableau avec celui qui figure dans l'onglet [**Products**](https://app.adapty.io/products) de l'Adapty Dashboard. Si les identifiants ne correspondent pas, copiez l'identifiant du produit depuis le tableau et [créez un produit](create-product) avec cet identifiant dans l'Adapty Dashboard.
## Étape 3. Vérifier la disponibilité du produit \{#step-4-check-product-availability\}
1. Retournez dans **App Store Connect** et ouvrez la même section **Subscriptions**.
2. Cliquez sur le nom du groupe d'abonnements pour afficher vos produits.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à la section **Availability** et vérifiez que tous les pays et régions requis y sont bien listés.
## Étape 4. Vérifier les prix du produit \{#step-5-check-product-prices\}
1. De nouveau, rendez-vous dans la section **Monetization** → **Subscriptions** d'**App Store Connect**.
2. Cliquez sur le nom du groupe d'abonnements.
3. Sélectionnez le produit que vous testez.
4. Faites défiler jusqu'à **Subscription Pricing** et dépliez la section **Current Pricing for New Subscribers**.
5. Vérifiez que tous les prix requis sont bien listés.
## Étape 5. Vérifier le statut des apps payantes, le compte bancaire et les formulaires fiscaux \{#step-5-check-app-paid-status-bank-account-and-tax-forms-are-active\}
1. Sur la page d'accueil d'[**App Store Connect**](https://appstoreconnect.apple.com/), cliquez sur **Business**.
2. Sélectionnez le nom de votre entreprise.
3. Faites défiler vers le bas et vérifiez que votre **Paid Apps Agreement**, votre **Bank Account** et vos **Tax forms** affichent bien le statut **Active**.
En suivant ces étapes, vous devriez pouvoir résoudre l'avertissement `InvalidProductIdentifiers` et rendre vos produits disponibles dans le store.
## Étape 6. Recréer le produit s'il est bloqué \{#step-6-recreate-the-product-if-its-stuck\}
Les étapes 1 à 5 peuvent toutes passer avec succès — statut `Approved`, Bundle ID correspondant, clé API valide — et pourtant le SDK continue de retourner `1000 noProductIDsFound`. Dans ce cas, le produit est peut-être bloqué dans le registre d'Apple. Il arrive que le registre de produits d'Apple entre dans un état où un produit existe dans l'interface d'App Store Connect mais n'est pas exposé au chemin de recherche StoreKit.
Supprimez le produit dans App Store Connect et recréez-le avec le même identifiant. Attendez jusqu'à 24 heures après la recréation pour que la propagation soit effective.
---
# File: cantMakePayments-unity
---
---
title: "Correction de l'erreur Code-1003 cantMakePayment dans le SDK Unity"
description: "Résolvez l'erreur de paiement lors de la gestion des abonnements dans Adapty."
---
L'erreur 1003, `cantMakePayments`, indique que les achats intégrés ne peuvent pas être effectués sur cet appareil.
Si vous rencontrez l'erreur `cantMakePayments`, cela est généralement dû à l'une des raisons suivantes :
- Restrictions de l'appareil : L'erreur n'est pas liée à Adapty. Consultez les solutions ci-dessous.
- Configuration du mode Observateur : La méthode `makePurchase` et le mode Observateur ne peuvent pas être utilisés simultanément. Consultez la section ci-dessous.
## Problème : Restrictions de l'appareil \{#issue-device-restrictions\}
| Problème | Solution |
|--------------------------------|-------------------------------------------------------------------------------------------------------------|
| Restrictions Screen Time | Désactivez les restrictions d'achat intégré dans [Screen Time](https://support.apple.com/en-us/102470) |
| Compte suspendu | Contactez le support Apple pour résoudre les problèmes de compte |
| Restrictions régionales | Utilisez un compte App Store d'une région prise en charge |
## Problème : Utilisation simultanée du mode Observateur et de makePurchase \{#issue-using-both-observer-mode-and-makepurchase\}
Si vous utilisez `makePurchases` pour gérer les achats, vous n'avez pas besoin d'utiliser le mode Observateur. Le [mode Observateur](observer-vs-full-mode) n'est nécessaire que si vous implémentez vous-même la logique d'achat.
Ainsi, si vous utilisez `makePurchase`, vous pouvez supprimer en toute sécurité l'activation du mode Observateur dans le code d'initialisation du SDK.
---
# File: unity-sdk-migration-guides
---
---
title: "Guides de migration du SDK Unity"
description: "Guides de migration pour les versions du SDK Unity d'Adapty."
---
Cette page regroupe tous les guides de migration pour le SDK Unity d'Adapty. Choisissez la version vers laquelle vous souhaitez migrer pour obtenir des instructions détaillées :
- **[Migrer vers la v4.0 (bêta)](migration-to-unity-sdk-v4)**
- **[Migrer vers la v3.14](migration-to-unity-sdk-314)**
- **[Migrer vers la v3.4](migration-to-unity-sdk-34)**
- **[Migrer vers la v3.3](migration-to-unity330)**
- **[Migrer vers la v3.0](migration-to-unity-sdk-v3)**
---
# File: migration-to-unity-sdk-v4
---
---
title: "Migrer le SDK Unity Adapty vers la v. 4.0"
description: "Migrez vers le SDK Unity Adapty v4.0 (bêta) en remplaçant les API paywall par des API flow, compatibles avec Flow Builder et Paywall Builder."
---
Le SDK Unity Adapty 4.0 (bêta) introduit les flows et renomme les API paywall en conséquence. Les nouvelles API fonctionnent à la fois avec le nouveau Flow Builder et le Paywall Builder existant — aucune modification de configuration n'est requise côté Adapty Dashboard.
## Référence rapide \{#quick-reference\}
| v3 | v4 |
|---|---|
| `Adapty.GetPaywall(placementId, locale, ...)` | `Adapty.GetFlow(placementId, ...)` |
| `Adapty.GetPaywallForDefaultAudience(placementId, locale, ...)` | `Adapty.GetFlowForDefaultAudience(placementId, ...)` |
| `Adapty.GetPaywallProducts(paywall, ...)` | `Adapty.GetPaywallProducts(flow, ...)` |
| `Adapty.LogShowPaywall(paywall, ...)` | `Adapty.LogShowFlow(flow, ...)` |
| `AdaptyPaywall` | `AdaptyFlow` |
| `AdaptyUI.CreatePaywallView(paywall, ...)` | `AdaptyUI.CreateFlowView(flow, ...)` |
| `AdaptyUICreatePaywallViewParameters` | `AdaptyUICreateFlowViewParameters` |
| `AdaptyUIPaywallView` | `AdaptyUIFlowView` |
| `AdaptyUI.PresentPaywallView(view, ...)` / `DismissPaywallView(view, ...)` | `AdaptyUI.PresentFlowView(view, ...)` / `DismissFlowView(view, ...)` |
| `Adapty.SetPaywallsEventsListener(listener)` | `Adapty.SetFlowsEventsListener(listener)` |
| `AdaptyPaywallsEventsListener` | `IAdaptyFlowsEventsListener` |
| `AdaptyEventListener` | `IAdaptyEventListener` |
| `AdaptyOnboardingsEventsListener` | `IAdaptyOnboardingsEventsListener` |
| `PaywallViewDidPerformAction`, `PaywallViewDidAppear`, et autres callbacks `PaywallView...` | `FlowViewDidPerformAction`, `FlowViewDidAppear`, et autres callbacks `FlowView...` |
| `PaywallViewDidFailRendering` | `FlowViewDidReceiveError` |
| `Adapty.SetFallbackPaywalls(...)` (déprécié en v3) | supprimé — utilisez `Adapty.SetFallback(fileName, ...)` |
| `Builder.SetIDFACollectionDisabled(...)` (déprécié en v3) | supprimé — utilisez `Builder.SetAppleIDFACollectionDisabled(...)` |
| `paywall.Products` (une liste de `AdaptyProductReference`) | supprimé — utilisez `ProductIdentifiers` ou `VendorProductIds`, ou appelez `GetPaywallProducts(flow)` pour les produits complets |
| `AdaptyProductReference` | supprimé en tant que type public — voir [Modèle de données](#data-model) |
| `paywall.RemoteConfigString` | supprimé — utilisez `flow.RemoteConfig?.Data` |
`AdaptyPaywallProduct` garde son nom — les produits appartiennent toujours à un flow, et `GetPaywallProducts` garde également son nom, prenant désormais un `AdaptyFlow`. Les méthodes `GetFlow` et `GetFlowForDefaultAudience` ne prennent plus de paramètre `locale`. Les API d'achat et de profil (`MakePurchase`, `RestorePurchases`, `GetProfile`, `Identify`, `UpdateProfile`) et les fallbacks via `SetFallback` sont inchangés. Les méthodes onboarding fonctionnent toujours mais sont dépréciées — voir [Dépréciation de l'API Onboarding](#onboarding-api-deprecation). Certains comportements par défaut ont changé — voir [Changements de comportement par défaut](#default-behavior-changes).
## Installation \{#installation\}
La v4.0 est une pré-version, donc épinglez le tag bêta exact. Pour l'installer via le Unity Package Manager, ajoutez le tag à l'URL Git :
```
https://github.com/adaptyteam/AdaptySDK-Unity.git?path=/Packages/com.adapty.unity-sdk#4.0.0-beta.1
```
Si vous installez via le package Unity, téléchargez `adapty-unity-plugin-4.0.0-beta.1.unitypackage` depuis la [version 4.0.0-beta.1](https://github.com/adaptyteam/AdaptySDK-Unity/releases/tag/4.0.0-beta.1). Consultez [Installer le SDK Adapty](sdk-installation-unity#install-adapty-sdk) pour la configuration complète.
Deux changements de configuration de build sont introduits avec la v4 :
- **Les dépendances iOS passent à Swift Package Manager.** Le SDK iOS natif Adapty 4.0 est déclaré comme package Swift distant au lieu d'un pod CocoaPods. Mettez à jour l'[External Dependency Manager](https://github.com/googlesamples/unity-jar-resolver#getting-started) vers la version **1.2.188 ou ultérieure** — les versions antérieures ne prennent pas en charge les dépendances Swift Package Manager. Les étapes CocoaPods (`iOS Resolver -> Install Cocoapods`, ouverture de `Unity-iPhone.xcworkspace`) ne s'appliquent plus.
- **La cible de déploiement iOS doit être 15.0 ou supérieure.** Un nouveau validateur de build dans l'éditeur Unity bloque le build iOS si la cible est inférieure.
Les SDK natifs Adapty sous-jacents passent à la version 4.x sur les deux plateformes et sont résolus automatiquement — aucune autre modification de build n'est nécessaire.
## Récupération des flows \{#fetching-flows\}
### GetPaywall → GetFlow
Le type retourné passe de `AdaptyPaywall` à `AdaptyFlow`, et le paramètre `locale` est supprimé — lors du rendu d'un flow, la locale est résolue automatiquement ; pour les paywalls personnalisés, toutes les locales sont retournées dans `flow.RemoteConfigs` :
```diff showLineNumbers
- Adapty.GetPaywall("YOUR_PLACEMENT_ID", "en", (paywall, error) => {
+ Adapty.GetFlow("YOUR_PLACEMENT_ID", (flow, error) => {
if (error != null) {
// handle the error
return;
}
- // use the paywall
+ // use the flow
});
```
`GetPaywallForDefaultAudience` est renommé de la même façon :
```diff showLineNumbers
- Adapty.GetPaywallForDefaultAudience("YOUR_PLACEMENT_ID", "en", (paywall, error) => { /* ... */ });
+ Adapty.GetFlowForDefaultAudience("YOUR_PLACEMENT_ID", (flow, error) => { /* ... */ });
```
### GetPaywallProducts(paywall) → GetPaywallProducts(flow)
`GetPaywallProducts` conserve son nom mais prend désormais un `AdaptyFlow` :
```diff showLineNumbers
- Adapty.GetPaywallProducts(paywall, (products, error) => {
+ Adapty.GetPaywallProducts(flow, (products, error) => {
if (error != null) {
// handle the error
return;
}
// use the products
});
```
## Modèle de données \{#data-model\}
`GetFlow` retourne un `AdaptyFlow` au lieu d'un `AdaptyPaywall`, et la forme de l'objet a changé :
| Propriété v3 `AdaptyPaywall` | Propriété v4 `AdaptyFlow` | Action |
|---|---|---|
| `RemoteConfig` (unique, nullable) | `RemoteConfigs` (liste) | Un flow contient une Remote Config par langue configurée. Lisez celle qui correspond à l'utilisateur via `flow.RemoteConfigs`. Le raccourci `flow.RemoteConfig` renvoie la première entrée. |
| _(nouveau)_ | `Paywalls` (liste de `AdaptyFlowPaywall`) | Chaque entrée est une variation de paywall dans le flow, avec son propre `Name`, `VariationId` et `ProductIdentifiers`. Les méthodes de paywall web prennent un `AdaptyFlowPaywall` — voir [Méthodes de paywall web](#web-paywall-methods). |
| `ProductIdentifiers`, `VendorProductIds` | conservé | Sur `AdaptyFlow`, ces propriétés agrègent les produits de toutes les variations de paywall. Chaque variation expose également ses propres `ProductIdentifiers` et `VendorProductIds`. Pour récupérer les produits, continuez d'appeler `GetPaywallProducts(flow)`. |
| `HasViewConfiguration` | supprimé | Supprimez tout contrôle `HasViewConfiguration` de votre code — `CreateFlowView` renvoie une erreur à la place (voir [Affichage des flows](#displaying-flows)). |
| `Products` (liste de `AdaptyProductReference`) | supprimé | `AdaptyProductReference` n'est plus public, et avec lui les valeurs `PromotionalOfferId`, `WinBackOfferId` et `AndroidOfferId` qu'il portait. Utilisez `ProductIdentifiers` — une liste de `AdaptyProductIdentifier` avec `VendorProductId` et le `BasePlanId` réservé à Android (le `AndroidBasePlanId` de la v3) — ou appelez `GetPaywallProducts(flow)` quand vous avez besoin d'objets `AdaptyPaywallProduct` complets avec les prix et les offres. |
| `RemoteConfigString` | supprimé | Lisez la chaîne directement depuis la Remote Config : `flow.RemoteConfig?.Data`, ou l'entrée correspondante dans `flow.RemoteConfigs`. |
| _(nouveau)_ | `FlowVersionId` (nullable) | L'identifiant de version du flow, ou `null` s'il n'est pas disponible. |
`AdaptyPaywallProduct` gagne un champ supplémentaire : `FlowProductId`, l'identifiant du produit au sein du flow, qui est `null` pour les produits n'appartenant pas à un flow.
## Méthodes de paywall web \{#web-paywall-methods\}
`OpenWebPaywall` et `CreateWebPaywallUrl` conservent leurs noms, mais l'argument `paywall` accepte désormais un `AdaptyFlowPaywall` — l'une des variantes dans `flow.Paywalls`. Vous pouvez toujours passer un `AdaptyPaywallProduct` à la place :
```diff showLineNumbers
- Adapty.OpenWebPaywall(paywall, AdaptyWebPresentation.ExternalBrowser, (error) => { /* ... */ });
+ var flowPaywall = flow.Paywalls.FirstOrDefault();
+ if (flowPaywall != null) {
+ Adapty.OpenWebPaywall(flowPaywall, AdaptyWebPresentation.ExternalBrowser, (error) => { /* ... */ });
+ }
```
## Suivi des vues de flow \{#tracking-flow-views\}
### LogShowPaywall → LogShowFlow
`LogShowPaywall` est renommé en `LogShowFlow` et prend désormais un `AdaptyFlow`. L'événement est toujours enregistré pour la même variation, donc les métriques de funnel et de test A/B existantes continuent de fonctionner sans modifications du tableau de bord.
```diff showLineNumbers
- Adapty.LogShowPaywall(paywall, (error) => { /* ... */ });
+ Adapty.LogShowFlow(flow, (error) => { /* ... */ });
```
Comme dans la v3, vous n'avez pas besoin d'appeler cette méthode lors de l'affichage des flows ou des paywalls rendus par le [Flow Builder](adapty-flow-builder) ou le [Paywall Builder](adapty-paywall-builder) — Adapty suit automatiquement ces vues.
## Afficher des flows \{#displaying-flows\}
### CreatePaywallView → CreateFlowView
Renommez la méthode factory et passez l'`AdaptyFlow`. Le type de vue retourné est renommé de `AdaptyUIPaywallView` en `AdaptyUIFlowView`, mais ses méthodes (`Present`, `Dismiss`) restent inchangées, et l'objet de paramètres optionnels conserve les mêmes champs (`LoadTimeout`, `PreloadProducts`, `CustomTags`, `CustomTimers`, `CustomAssets`, `ProductPurchaseParameters`) sous le nouveau nom `AdaptyUICreateFlowViewParameters`, plus deux nouveaux — `Locale` et `EnableSafeAreaPaddings` :
```diff showLineNumbers
- AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
+ AdaptyUI.CreateFlowView(flow, parameters, (view, error) => {
if (error != null) {
// handle the error
return;
}
view.Present((error) => { /* handle the error */ });
});
```
`CreateFlowView` retourne une erreur si le flow n'a pas de vue configurée — cela remplace la vérification `HasViewConfiguration` de la v3 :
```diff showLineNumbers
- if (paywall.HasViewConfiguration) {
- AdaptyUI.CreatePaywallView(paywall, null, (view, error) => { /* ... */ });
- }
+ AdaptyUI.CreateFlowView(flow, (view, error) => {
+ if (error != null) {
+ // the flow has no view configured, or view creation failed
+ return;
+ }
+ view.Present((error) => { /* handle the error */ });
+ });
```
:::note
Une vue de flow est à usage unique : après avoir appelé `Dismiss`, la vue est détruite. Appelez donc à nouveau `CreateFlowView` pour afficher le flow une nouvelle fois.
:::
### Marges de zone sécurisée Android \{#android-safe-area-paddings\}
`AdaptyUICreateFlowViewParameters` ajoute `EnableSafeAreaPaddings`, qui contrôle les marges de zone sécurisée Android à l'exécution. Il est ignoré sur iOS et vaut `true` par défaut :
```csharp showLineNumbers
var parameters = new AdaptyUICreateFlowViewParameters()
.SetEnableSafeAreaPaddings(false);
```
## Gestion des événements \{#handling-events\}
Les interfaces de listener suivent désormais la convention C# avec préfixe `I` — il n'existe plus d'alias hérités : renommez `AdaptyEventListener` en `IAdaptyEventListener` et `AdaptyOnboardingsEventsListener` en `IAdaptyOnboardingsEventsListener` partout où vous les implémentez.
L'écouteur d'événements de flow est renommé de `AdaptyPaywallsEventsListener` en `IAdaptyFlowsEventsListener`, sa méthode d'enregistrement de `SetPaywallsEventsListener` en `SetFlowsEventsListener`, et ses callbacks remplacent le préfixe `PaywallView` par `FlowView`. Le corps des handlers existants ne nécessite aucune modification — il suffit de renommer l'interface et les méthodes :
```diff showLineNumbers
- public class MyListener : MonoBehaviour, AdaptyPaywallsEventsListener {
- public void PaywallViewDidFinishPurchase(
- AdaptyUIPaywallView view,
+ public class MyListener : MonoBehaviour, IAdaptyFlowsEventsListener {
+ public void FlowViewDidFinishPurchase(
+ AdaptyUIFlowView view,
AdaptyPaywallProduct product,
AdaptyPurchaseResult purchasedResult
) {
// custom logic after purchase
}
// ...
}
- Adapty.SetPaywallsEventsListener(myListener);
+ Adapty.SetFlowsEventsListener(myListener);
```
Un callback est renommé : `PaywallViewDidFailRendering` devient `FlowViewDidReceiveError`. Il se déclenche pour les mêmes erreurs de rendu qu'auparavant, plus d'autres erreurs d'exécution non liées aux achats :
```diff showLineNumbers
- public void PaywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) { }
+ public void FlowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) { }
```
Consultez [Gérer les événements de flow et de paywall](unity-handling-events) pour la liste complète des callbacks.
### Nouvelles API \{#new-apis\}
- `Adapty.SetObserverModeResolver(...)` avec un `IAdaptyUIObserverModeResolver` — permet de gérer les achats et restaurations initiés depuis des flows lorsque le SDK fonctionne en [mode Observer](implement-observer-mode-unity). Auparavant, cette fonctionnalité n'était disponible que dans les SDKs natifs iOS et Android. Voir [Présenter des flows en mode Observer](unity-present-flows-in-observer-mode).
- `Adapty.SetSystemRequestsHandler(...)` avec un `IAdaptyUISystemRequestsHandler` — réservé aux requêtes système issues d'un flow : demandes d'autorisation OS (`FlowViewDidAskPermission`) et demandes d'avis sur l'application (`FlowViewDidRequestAppReview`). Les flows ne déclenchent pas encore ces requêtes, vous n'avez donc pas besoin d'enregistrer un handler.
- `AdaptyUICreateFlowViewParameters.Locale` (à définir avec `SetLocale`) — affiche un flow ou un paywall avec une [localisation Builder](add-paywall-locale-in-adapty-paywall-builder) spécifique au lieu de celle qu'Adapty déduit de l'appareil. Un flow est localisé au moment de la création de sa vue, c'est donc le seul endroit où choisir sa localisation ; la vue créée indique la localisation avec laquelle elle a été construite dans `view.Locale`. Voir [Utiliser les localisations et les codes de locale](unity-localizations-and-locale-codes).
- Le nouveau callback `FlowViewDidReceiveAnalyticEvent` sur `IAdaptyFlowsEventsListener` est réservé aux événements analytiques personnalisés provenant d'un flow. Les flows n'émettent pas encore ces événements vers votre code, implémentez-le donc avec un corps vide.
- `AdaptyUI.OpenUrl(url, openIn, ...)` et `AdaptyUI.RequestAppReview(...)` — la gestion native derrière les actions `open_url` et les demandes d'avis sur l'application. Appelez `OpenUrl` depuis `FlowViewDidPerformAction` pour conserver le comportement URL par défaut ; `RequestAppReview` prend en charge la demande d'avis intégrée, que les flows ne déclenchent pas encore.
## Changements de comportement par défaut \{#default-behavior-changes\}
Ces changements ne provoquent pas d'erreurs de compilation, testez-les donc à l'exécution :
- **Finalisation d'achat** : en v3, la vue se fermait automatiquement après un achat réussi. En v4, **un flow reste ouvert après un achat ou une erreur jusqu'à ce que vous le fermiez** — le SDK n'applique aucun comportement par défaut. Appelez vous-même `view.Dismiss(...)` dans `FlowViewDidFinishPurchase` dès que l'utilisateur obtient l'accès.
- **Bouton retour Android** : le bouton retour système (ou le geste de retour) est transmis à `FlowViewDidPerformAction` sous la forme d'une action `SystemBack` et ne ferme plus le flow par lui-même — alignement avec iOS, où un flow ne peut pas être fermé par un geste système. Donnez aux utilisateurs un moyen de sortir explicite (un bouton **Close** ou une action `on_device_back`), ou fermez la vue vous-même lors du traitement de l'action.
- **Les vues sont à usage unique** : après `Dismiss`, la vue est détruite. Appelez à nouveau `CreateFlowView` pour présenter le flow une nouvelle fois.
- **Transactions en mode Observer** : `ReportTransaction` ne remonte plus d'erreur de décodage en cas de succès — en v3, la réponse de succès était mal analysée, si bien qu'un rapport réussi se terminait toujours avec une erreur.
## Dépréciation de l'API onboarding \{#onboarding-api-deprecation\}
L'ancienne API onboarding est dépréciée dans la v4.0 au profit du [Flow Builder](adapty-flow-builder). Elle fonctionne toujours, mais sera supprimée dans une prochaine version. Prévoyez donc la migration de vos onboardings vers le Flow Builder.
Symboles dépréciés : `GetOnboarding`, `GetOnboardingForDefaultAudience`, `AdaptyUI.CreateOnboardingView`, `AdaptyUI.PresentOnboardingView`, `AdaptyUI.DismissOnboardingView` et `Adapty.SetOnboardingsEventsListener`.
---
# File: migration-to-unity-sdk-314
---
---
title: "Migrer le SDK Adapty Unity vers la v3.14"
description: "Migrez vers le SDK Adapty Unity v3.14 pour de meilleures performances et de nouvelles fonctionnalités de monétisation."
---
Le SDK Adapty 3.14.0 est une version majeure qui apporte des améliorations nécessitant toutefois quelques étapes de migration de votre part :
1. Écouteur d'événements distinct pour les événements de paywall.
2. Renommer `AdaptyUI.CreateView` en `AdaptyUI.CreatePaywallView` et les méthodes associées.
3. Mettre à jour la méthode `MakePurchase` pour utiliser `AdaptyPurchaseParameters` à la place des paramètres individuels.
4. Remplacer `SetFallbackPaywalls` par la méthode `SetFallback`.
5. Mettre à jour l'accès aux propriétés du paywall pour utiliser `AdaptyPlacement`.
6. Mettre à jour l'accès à la configuration distante pour utiliser l'objet `AdaptyRemoteConfig`.
7. Remplacer `VendorProductIds` par `ProductIdentifiers` dans le modèle `AdaptyPaywall`.
8. Mettre à jour la politique de récupération de `GetPaywall` pour utiliser `AdaptyFetchPolicy`.
## Écouteur d'événements distinct pour les événements de paywall \{#separate-event-listener-for-paywall-events\}
Si vous affichez des paywalls conçus avec le [Paywall Builder](adapty-paywall-builder), les événements de vue de paywall utilisent désormais l'interface dédiée `AdaptyPaywallsEventsListener` et la méthode `SetPaywallsEventsListener`. L'interface principale `AdaptyEventListener` reste utilisée pour les mises à jour de profil et les détails d'installation.
```diff showLineNumbers
using UnityEngine;
using AdaptySDK;
public class AdaptyListener : MonoBehaviour,
- AdaptyEventListener {
+ AdaptyEventListener,
+ AdaptyPaywallsEventsListener {
void Start() {
Adapty.SetEventListener(this);
+ Adapty.SetPaywallsEventsListener(this);
}
// AdaptyEventListener methods
public void OnLoadLatestProfile(AdaptyProfile profile) { }
public void OnInstallationDetailsSuccess(AdaptyInstallationDetails details) { }
public void OnInstallationDetailsFail(AdaptyError error) { }
+ // AdaptyPaywallsEventsListener methods
+ // Implement paywall event handlers here
}
```
[En savoir plus sur la gestion des événements de paywall](unity-handling-events).
## Renommer les méthodes de création et de présentation de vue \{#rename-view-creation-and-presentation-methods\}
Les méthodes de création et de présentation de vue ont été renommées :
```diff showLineNumbers
using AdaptySDK;
- AdaptyUI.CreateView(paywall, parameters, (view, error) => {
+ AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
if (error != null) {
// handle the error
return;
}
- AdaptyUI.PresentView(view, (error) => {
+ AdaptyUI.PresentPaywallView(view, (error) => {
// handle the error
});
});
}
```
De même, la méthode de fermeture a été renommée :
```diff showLineNumbers
- AdaptyUI.DismissView(view, (error) => {
+ AdaptyUI.DismissPaywallView(view, (error) => {
// handle the error
});
```
## Mettre à jour la méthode MakePurchase \{#update-makepurchase-method\}
La méthode `MakePurchase` utilise désormais `AdaptyPurchaseParameters` à la place des arguments individuels `subscriptionUpdateParams` et `isOfferPersonalized`. Cela offre une meilleure sécurité de type et permet d'étendre plus facilement les paramètres d'achat à l'avenir.
```diff showLineNumbers
using AdaptySDK;
void MakePurchase(
AdaptyPaywallProduct product,
AdaptySubscriptionUpdateParameters subscriptionUpdate,
bool? isOfferPersonalized
) {
- Adapty.MakePurchase(product, subscriptionUpdate, isOfferPersonalized, (result, error) => {
+ var parameters = new AdaptyPurchaseParametersBuilder()
+ .SetSubscriptionUpdateParams(subscriptionUpdate)
+ .SetIsOfferPersonalized(isOfferPersonalized)
+ .Build();
+
+ Adapty.MakePurchase(product, parameters, (result, error) => {
switch (result.Type) {
case AdaptyPurchaseResultType.Pending:
// handle pending purchase
break;
case AdaptyPurchaseResultType.UserCancelled:
// handle purchase cancellation
break;
case AdaptyPurchaseResultType.Success:
var profile = result.Profile;
// handle successful purchase
break;
default:
break;
}
});
}
```
Si aucun paramètre supplémentaire n'est nécessaire, vous pouvez simplement utiliser :
```csharp showLineNumbers
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
Adapty.MakePurchase(product, (result, error) => {
// handle purchase result
});
}
```
## Mettre à jour la méthode de fallback \{#update-fallback-method\}
:::important
Lors de la mise à niveau vers le SDK Unity 3.14, vous devrez télécharger les nouveaux fichiers de fallback depuis l'Adapty Dashboard et remplacer ceux existants dans votre projet.
:::
La méthode de définition des fallbacks a été mise à jour. La méthode `SetFallbackPaywalls` a été renommée en `SetFallback` :
```diff showLineNumbers
using AdaptySDK;
void SetFallBackPaywalls() {
#if UNITY_IOS
var assetId = "adapty_fallback_ios.json";
#elif UNITY_ANDROID
var assetId = "adapty_fallback_android.json";
#else
var assetId = "";
#endif
- Adapty.SetFallbackPaywalls(assetId, (error) => {
+ Adapty.SetFallback(assetId, (error) => {
// handle the error
});
}
```
Consultez l'exemple de code final sur la page [Utiliser des paywalls de secours dans Unity](unity-use-fallback-paywalls).
## Mettre à jour l'accès aux propriétés du paywall \{#update-paywall-property-access\}
Les propriétés suivantes ont été déplacées de `AdaptyPaywall` vers `AdaptyPlacement` :
```diff showLineNumbers
using AdaptySDK;
void ProcessPaywall(AdaptyPaywall paywall) {
- var abTestName = paywall.ABTestName;
- var audienceName = paywall.AudienceName;
- var revision = paywall.Revision;
- var placementId = paywall.PlacementId;
+ var abTestName = paywall.Placement.ABTestName;
+ var audienceName = paywall.Placement.AudienceName;
+ var revision = paywall.Placement.Revision;
+ var placementId = paywall.Placement.Id;
}
```
## Mettre à jour l'accès à la configuration distante \{#update-remote-config-access\}
Les propriétés du Remote Config ont été restructurées dans un objet `AdaptyRemoteConfig` pour une meilleure organisation :
```diff showLineNumbers
using AdaptySDK;
void ProcessRemoteConfig(AdaptyPaywall paywall) {
- var remoteConfigString = paywall.RemoteConfigString;
- var locale = paywall.Locale;
- var remoteConfigDict = paywall.RemoteConfig;
+ var remoteConfigString = paywall.RemoteConfig.Data;
+ var locale = paywall.RemoteConfig.Locale;
+ var remoteConfigDict = paywall.RemoteConfig.Dictionary;
}
```
## Mettre à jour l'utilisation du modèle AdaptyPaywall \{#update-adapty-paywall-model-usage\}
La propriété `VendorProductIds` est désormais dépréciée au profit de `ProductIdentifiers`. La nouvelle propriété retourne des objets `AdaptyProductIdentifier` au lieu de simples chaînes de caractères, offrant une information produit mieux structurée.
```diff showLineNumbers
using AdaptySDK;
void ProcessPaywallProducts(AdaptyPaywall paywall) {
- var productIds = paywall.VendorProductIds;
- foreach (var vendorId in productIds) {
- // use vendorId
- }
+ var productIdentifiers = paywall.ProductIdentifiers;
+ foreach (var productId in productIdentifiers) {
+ var vendorId = productId.VendorProductId;
+ // use vendorId
+ }
}
```
L'objet `AdaptyProductIdentifier` donne accès à l'identifiant de produit du vendeur via la propriété `VendorProductId`, conservant la même fonctionnalité tout en offrant une meilleure structure pour les améliorations futures.
## Mettre à jour la politique de récupération de GetPaywall \{#update-getpaywall-fetch-policy\}
Le type du paramètre `fetchPolicy` dans la méthode `GetPaywall` a été modifié de `AdaptyPaywallFetchPolicy` en `AdaptyPlacementFetchPolicy`. Ce changement unifie l'utilisation de la politique de récupération dans l'ensemble du SDK.
```diff showLineNumbers
using AdaptySDK;
void GetPaywall(string placementId) {
- Adapty.GetPaywall(placementId, AdaptyPaywallFetchPolicy.ReloadRevalidatingCacheData, null, (paywall, error) => {
+ Adapty.GetPaywall(placementId, AdaptyPlacementFetchPolicy.ReloadRevalidatingCacheData, null, (paywall, error) => {
// handle the result
});
}
```
---
# File: migration-to-unity-sdk-34
---
---
title: "Migrer le SDK Adapty Unity vers v3.4"
description: "Migrez vers le SDK Adapty Unity v3.4 pour de meilleures performances et de nouvelles fonctionnalités de monétisation."
---
Le SDK Adapty 3.4.0 est une version majeure qui introduit des améliorations nécessitant des étapes de migration de votre côté.
## Mettre à jour les fichiers de paywall de secours \{#update-fallback-paywall-files\}
Mettez à jour vos fichiers de paywall de secours pour assurer la compatibilité avec la nouvelle version du SDK :
1. [Téléchargez les fichiers de paywall de secours mis à jour](fallback-paywalls) depuis l'Adapty Dashboard.
2. [Remplacez les paywalls de secours existants dans votre application mobile](unity-use-fallback-paywalls) par les nouveaux fichiers.
## Mettre à jour l'implémentation du mode Observateur \{#update-implementation-of-observer-mode\}
Si vous utilisez le mode Observateur, assurez-vous de mettre à jour son implémentation.
Auparavant, différentes méthodes étaient utilisées pour signaler les transactions à Adapty. Dans la nouvelle version, la méthode `reportTransaction` doit être utilisée de manière cohérente sur Android et iOS. Cette méthode signale explicitement chaque transaction à Adapty, garantissant qu'elle est reconnue. Si un paywall a été utilisé, transmettez l'ID de variation pour associer la transaction à celui-ci.
:::warning
**Ne sautez pas le signalement des transactions !**
Si vous n'appelez pas `reportTransaction`, Adapty ne reconnaîtra pas la transaction, elle n'apparaîtra pas dans les analyses et ne sera pas envoyée aux intégrations.
:::
```diff showLineNumbers
- #if UNITY_ANDROID && !UNITY_EDITOR
- Adapty.RestorePurchases((profile, error) => {
- // handle the error
- });
- #endif
Adapty.ReportTransaction(
"YOUR_TRANSACTION_ID",
"PAYWALL_VARIATION_ID", // optional
(error) => {
// handle the error
});
```
---
# File: migration-to-unity330
---
---
title: "Migrer le SDK Adapty Unity vers la v3.3"
description: "Migrez vers le SDK Adapty Unity v3.3 pour de meilleures performances et de nouvelles fonctionnalités de monétisation."
---
Le SDK Adapty 3.3.0 est une version majeure qui apporte des améliorations pouvant nécessiter quelques étapes de migration de votre côté.
1. Mettre à jour vers le SDK Adapty v3.3.x.
2. Plusieurs classes, propriétés et méthodes ont été renommées dans les modules Adapty et AdaptyUI du SDK Adapty.
3. Désormais, la méthode `SetLogLevel` accepte un callback en argument.
4. Désormais, la méthode `PresentCodeRedemptionSheet` accepte un callback en argument.
5. Modifier la façon dont la vue paywall est créée
6. Supprimer la méthode `GetProductsIntroductoryOfferEligibility`.
7. Enregistrer les paywalls de secours dans des fichiers séparés (un par plateforme) dans `Assets/StreamingAssets/` et transmettre les noms de fichiers à la méthode `SetFallbackPaywalls`.
8. Mettre à jour le processus d'achat
9. Mettre à jour la gestion des événements du Paywall Builder.
10. Mettre à jour la gestion des erreurs de paywall du Paywall Builder.
11. Mettre à jour les configurations d'intégration pour Adjust, Amplitude, AppMetrica, Appsflyer, Branch, Firebase et Google Analytics, Mixpanel, OneSignal, Pushwoosh.
13. Mettre à jour l'implémentation du mode Observer.
14. Mettre à jour l'initialisation du plugin Unity avec un appel explicite à `Activate`.
## Mettre à jour le SDK Adapty Unity vers la version 3.3.x \{#upgrade-adapty-unity-sdk-to-33x\}
Jusqu'à cette version, le SDK Adapty était le SDK principal et obligatoire pour le bon fonctionnement d'Adapty dans votre application, tandis que le SDK AdaptyUI était optionnel et ne devenait nécessaire que si vous utilisiez le Paywall Builder d'Adapty.
À partir de la version 3.3.0, le SDK AdaptyUI est déprécié et AdaptyUI est fusionné dans le SDK Adapty en tant que module. Suite à ces changements, vous devez supprimer AdaptyUISDK et réinstaller AdaptySDK.
1. Supprimez les dépendances de packages **AdaptySDK** et **AdaptyUISDK** de votre projet.
2. Supprimez les dossiers **AdaptySDK** et **AdaptyUISDK**.
3. Importez à nouveau le package AdaptySDK comme décrit sur la page [Installation et configuration du SDK Adapty pour Unity](sdk-installation-unity).
## Renommages \{#renamings\}
1. Renommages dans le module Adapty :
| Ancienne version | Nouvelle version |
| ------------------------- | ------------------------ |
| Adapty.sdkVersion | Adapty.SDKVersion |
| Adapty.LogLevel | AdaptyLogLevel |
| Adapty.Paywall | AdaptyPaywall |
| Adapty.PaywallFetchPolicy | AdaptyPaywallFetchPolicy |
| PaywallProduct | AdaptyPaywallProduct |
| Adapty.Profile | AdaptyProfile |
| Adapty.ProfileParameters | AdaptyProfileParameters |
| ProfileGender | AdaptyProfileGender |
| Error | AdaptyError |
2. Renommages dans le module AdaptyUI :
| Ancienne version | Nouvelle version |
| ------------------ | ------------------ |
| CreatePaywallView | CreateView |
| PresentPaywallView | PresentView |
| DismissPaywallView | DismissView |
| AdaptyUI.View | AdaptyUIView |
| AdaptyUI.Action | AdaptyUIUserAction |
## Modifier la méthode SetLogLevel \{#change-the-setloglevel-method\}
Désormais, la méthode `SetLogLevel` accepte un callback en argument.
```diff showLineNumbers
- Adapty.SetLogLevel(Adapty.LogLevel.Verbose);
+ Adapty.SetLogLevel(Adapty.LogLevel.Verbose, null); // or you can pass the callback to handle the possible error
```
## Modifier la méthode PresentCodeRedemptionSheet \{#change-the-presentcoderedemptionsheet-method\}
Désormais, la méthode `PresentCodeRedemptionSheet` accepte un callback en argument.
```diff showLineNumbers
- Adapty.PresentCodeRedemptionSheet();
+ Adapty.PresentCodeRedemptionSheet(null); // or you can pass the callback to handle the possible error
```
## Modifier la façon dont la vue paywall est créée \{#change-how-the-paywall-view-is-created\}
Pour un exemple de code complet, consultez [Récupérer la configuration de vue d'un paywall conçu avec le Paywall Builder](unity-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder).
```diff showLineNumbers
+ var parameters = new AdaptyUICreateViewParameters()
+ .SetPreloadProducts(true);
- AdaptyUI.CreatePaywallView(
+ AdaptyUI.CreateView(
paywall,
- preloadProducts: true,
+ parameters,
(view, error) => {
// use the view
});
```
## Supprimer la méthode GetProductsIntroductoryOfferEligibility \{#remove-the-getproductsintroductoryoffereligibility-method\}
Avant le SDK Adapty iOS 3.3.0, l'objet produit incluait toujours les offres, que l'utilisateur y soit éligible ou non. Vous deviez vérifier manuellement l'éligibilité avant d'utiliser l'offre.
Désormais, l'objet produit n'inclut une offre que si l'utilisateur est éligible. Vous n'avez donc plus besoin de vérifier l'éligibilité — si une offre est présente, l'utilisateur y est éligible.
## Mettre à jour la méthode de fourniture des paywalls de secours \{#update-method-for-providing-fallback-paywalls\}
Jusqu'à cette version, les paywalls de secours étaient transmis sous forme de JSON sérialisé. À partir de la v3.3.0, le mécanisme a changé :
1. Enregistrez les paywalls de secours dans des fichiers dans `/Assets/StreamingAssets/`, 1 fichier pour Android et un autre pour iOS.
2. Transmettez les noms de fichiers à la méthode `SetFallbackPaywalls`.
Votre code changera de la façon suivante :
```diff showLineNumbers
using AdaptySDK;
void SetFallBackPaywalls() {
+ #if UNITY_IOS
+ var assetId = "adapty_fallback_ios.json";
+ #elif UNITY_ANDROID
+ var assetId = "adapty_fallback_android.json";
+ #else
+ var assetId = "";
+ #endif
- Adapty.SetFallbackPaywalls("FALLBACK_PAYWALLS_JSON_STRING", (error) => {
+ Adapty.SetFallbackPaywalls(assetId, (error) => {
// handle the error
});
}
```
Consultez l'exemple de code final sur la page [Utiliser les paywalls de secours dans Unity](unity-use-fallback-paywalls).
## Mettre à jour le processus d'achat \{#update-making-purchase\}
Auparavant, les achats annulés et en attente étaient considérés comme des erreurs et retournaient respectivement les codes `PaymentCancelled` et `PendingPurchase`.
Une nouvelle classe `AdaptyPurchaseResultType` est désormais utilisée pour traiter les achats annulés, réussis et en attente. Mettez à jour le code d'achat de la façon suivante :
```diff showLineNumbers
using AdaptySDK;
void MakePurchase(AdaptyPaywallProduct product) {
- Adapty.MakePurchase(product, (profile, error) => {
- // handle successfull purchase
+ Adapty.MakePurchase(product, (result, error) => {
+ switch (result.Type) {
+ case AdaptyPurchaseResultType.Pending:
+ // handle pending purchase
+ break;
+ case AdaptyPurchaseResultType.UserCancelled:
+ // handle purchase cancellation
+ break;
+ case AdaptyPurchaseResultType.Success:
+ var profile = result.Profile;
+ // handle successful purchase
+ break;
+ default:
+ break;
}
});
}
```
Consultez l'exemple de code final sur la page [Effectuer des achats dans une application mobile](unity-making-purchases).
## Mettre à jour la gestion des événements du Paywall Builder \{#update-handling-of-paywall-builder-events\}
Les achats annulés et en attente ne sont plus considérés comme des erreurs ; tous ces cas sont traités via la méthode `PaywallViewDidFinishPurchase`.
1. Supprimez le traitement de l'événement d'achat annulé.
2. Mettez à jour la gestion de l'événement d'achat réussi de la façon suivante :
```diff showLineNumbers
- public void OnFinishPurchase(
- AdaptyUI.View view,
- Adapty.PaywallProduct product,
- Adapty.Profile profile
- ) { }
+ public void PaywallViewDidFinishPurchase(
+ AdaptyUIView view,
+ AdaptyPaywallProduct product,
+ AdaptyPurchaseResult purchasedResult
+ ) { }
```
3. Mettez à jour la gestion des actions :
```diff showLineNumbers
- public void OnPerformAction(
- AdaptyUI.View view,
- AdaptyUI.Action action
- ) {
+ public void PaywallViewDidPerformAction(
+ AdaptyUIView view,
+ AdaptyUIUserAction action
+ ) {
switch (action.Type) {
- case AdaptyUI.ActionType.Close:
+ case AdaptyUIUserActionType.Close:
view.Dismiss(null);
break;
- case AdaptyUI.ActionType.OpenUrl:
+ case AdaptyUIUserActionType.OpenUrl:
var urlString = action.Value;
if (urlString != null {
Application.OpenURL(urlString);
}
default:
// handle other events
break;
}
}
```
4. Mettez à jour la gestion du démarrage d'un achat :
```diff showLineNumbers
- public void OnSelectProduct(
- AdaptyUI.View view,
- Adapty.PaywallProduct product
- ) { }
+ public void PaywallViewDidSelectProduct(
+ AdaptyUIView view,
+ string productId
+ ) { }
```
5. Mettez à jour la gestion d'un achat échoué :
```diff showLineNumbers
- public void OnFailPurchase(
- AdaptyUI.View view,
- Adapty.PaywallProduct product,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailPurchase(
+ AdaptyUIView view,
+ AdaptyPaywallProduct product,
+ AdaptyError error
+ ) { }
```
6. Mettez à jour la gestion d'une restauration réussie :
```diff showLineNumbers
- public void OnFailRestore(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailRestore(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
Consultez l'exemple de code final sur la page [Gérer les événements du paywall](unity-handling-events).
## Mettre à jour la gestion des erreurs de paywall du Paywall Builder \{#update-handling-of-paywall-builder-paywall-errors\}
La gestion des erreurs a également changé. Mettez à jour votre code selon les indications ci-dessous.
1. Mettez à jour la gestion des erreurs de chargement des produits :
```diff showLineNumbers
- public void OnFailLoadingProducts(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailLoadingProducts(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
2. Mettez à jour la gestion des erreurs de rendu :
```diff showLineNumbers
- public void OnFailRendering(
- AdaptyUI.View view,
- Adapty.Error error
- ) { }
+ public void PaywallViewDidFailRendering(
+ AdaptyUIView view,
+ AdaptyError error
+ ) { }
```
## Mettre à jour la configuration du SDK d'intégration tierce \{#update-third-party-integration-sdk-configuration\}
À partir du SDK Adapty Unity 3.3.0, nous avons mis à jour l'API publique de la méthode `updateAttribution`. Auparavant, elle acceptait un dictionnaire `[AnyHashable: Any]`, vous permettant de passer directement des objets d'attribution de divers services. Désormais, elle requiert un `[String: any Sendable]`, vous devrez donc convertir les objets d'attribution avant de les transmettre.
Pour garantir le bon fonctionnement des intégrations avec le SDK Adapty Unity 3.3.0 et versions ultérieures, mettez à jour vos configurations SDK pour les intégrations suivantes comme décrit dans les sections ci-dessous.
### Adjust
Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la [configuration du SDK pour l'intégration Adjust](adjust#connect-your-app-to-adjust).
```diff showLineNumbers
- using static AdaptySDK.Adapty;
using AdaptySDK;
Adjust.GetAdid((adid) => {
- Adjust.GetAttribution((attribution) => {
- Dictionary