Types d'événements et champs des webhooks

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

Vous pouvez envoyer tous les types d’événements à votre webhook ou n’en choisir que certains. Consultez nos Flux d’événements 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. 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énementDescription
subscription_startedDéclenché lorsqu’un utilisateur active un abonnement payant sans période d’essai, c’est-à-dire qu’il est facturé immédiatement.
subscription_renewedSe 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_cancelledUn 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_reactivatedDéclenché lorsqu’un utilisateur réactive le renouvellement automatique de son abonnement.
subscription_expiredDé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_pausedSe produit lorsqu’un utilisateur active la mise en pause de l’abonnement (Android uniquement).
subscription_deferredDéclenché lorsqu’un achat d’abonnement est différé, 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_purchaseTout achat sans abonnement, tel qu’un accès à vie ou des produits consommables comme des pièces dans un jeu.
trial_startedDéclenché lorsqu’un utilisateur active un abonnement d’essai.
trial_convertedSe 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_cancelledUn 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_reactivatedSe produit lorsqu’un utilisateur réactive le renouvellement automatique de son abonnement pendant la période d’essai.
trial_expiredDéclenché lorsqu’un essai se termine sans conversion en abonnement.
entered_grace_periodSe 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_detectedDéclenché lorsqu’un problème de facturation survient lors d’une tentative de débit (par exemple, solde de carte insuffisant).
subscription_refundedDéclenché lorsqu’un abonnement est remboursé (par exemple, par le support Apple).
non_subscription_purchase_refundedDéclenché lorsqu’un achat sans abonnement est remboursé.
access_level_updatedSe produit lorsque le niveau d’accès d’un utilisateur est mis à jour.

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

Adapty vous enverra uniquement les événements que vous avez sélectionnés dans la section Events names de la page Integrations -> Webhooks.

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 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 :

{
  "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

Les paramètres d’événement sont identiques pour tous les types d’événements.

ChampTypeDescription
advertising_idUUIDAdvertising ID (Android uniquement).
attributionsJSONDonnées d’attribution. Inclus si Send Attribution est activé dans les paramètres du Webhook.
customer_user_idStringID 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. 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.
emailStringE-mail de l’utilisateur si vous l’avez défini via la méthode updateProfile 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_versionIntegerVersion de l’API Adapty (actuelle : 1).
event_datetimeISO 8601L’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 (ex. : 2020-07-10T15:00:00.000000+0000). Voir la note ci-dessous sur l’ordre des événements.
event_propertiesJSONPropriétés de l’événement.
event_typeStringNom de l’événement au format Adapty. Consultez les types d’événements Webhook pour la liste complète.
idfaUUIDAdvertising ID (Apple uniquement). IDFA dans le profil sur l’Adapty Dashboard. Peut être null si indisponible en raison de restrictions de suivi, du mode enfant ou des paramètres de confidentialité.
idfvUUIDIdentifier for Vendors (IDFV), unique par développeur. IDFV dans le profil sur l’Adapty Dashboard.
integration_idsJSONIDs 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_tokenJSONToken d’achat Play Store, inclus si Send Play Store purchase token est activé dans les paramètres du Webhook.
profile_idUUIDID 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.
profile_install_datetimeISO 8601Horodatage d’installation au format ISO 8601 (ex. : 2020-07-10T15:00:00.000000+0000).
profiles_sharing_access_levelJSONListe des utilisateurs partageant le niveau d’accès, à 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.
Format :
  • profile_id : (UUID) ID Adapty
  • customer_user_id : (String) Customer User ID si fourni
user_agentStringUser-agent du navigateur de l’appareil.
user_attributesJSONDonnées personnalisées que vous pouvez définir pour enrichir les profils utilisateurs avec des informations propres à l’application. Généralement utilisées pour suivre les préférences (ex. : thème, langue) ou des indicateurs comportementaux (onboarding terminé, utilisation de fonctionnalités).
Formatées sous forme de paires clé-valeur où les clés sont des chaînes et les valeurs peuvent être des chaînes ou des nombres (ex. : {"Favourite_color": "Violet", "Pet_name": "Fluffy"}).
Vous pouvez définir des attributs personnalisés manuellement dans l’Adapty Dashboard pour des profils individuels, par programmation via la méthode updateProfile du SDK Adapty, ou via l’API server-side lors de la création/mise à jour de profils.
Inclus si Send User Attributes est activé dans les paramètres du Webhook.

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.

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

Pour envoyer les données d’attribution, activez l’option Send Attribution sur la page Integrations -> Webhooks. Si vous avez activé l’envoi des données d’attribution et configuré des intégrations d’attribution, 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.

{
  "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 champType de champDescription
ad_setStringEnsemble d’annonces d’attribution.
statusStringPeut être organic, non_organic, ou unknown.
channelStringNom du canal marketing.
ad_groupStringGroupe d’annonces d’attribution.
campaignStringNom de la campagne marketing.
creativeStringMot-clé créatif d’attribution.
created_atISO 8601 dateDate et heure de création de l’enregistrement d’attribution.
network_user_idStringID attribué à l’utilisateur par la source d’attribution.

ID d’intégration

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

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.

FieldTypeDescription
product_idStringL’identifiant unique du produit (SKU) acheté sur le Play Store.
purchase_tokenStringUn token généré par Google Play pour identifier de manière unique cette transaction d’achat.
is_subscriptionBooleanIndique si le produit acheté est un abonnement (true) ou un achat unique (false).

Propriétés des événements

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 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, car elles sont spécifiques à certains types d’événements seulement.

Pour la plupart des types d’événements

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.

Adapty convertit les autres devises en USD au taux de change de 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.

ChampTypeDescription
ab_test_nameStringNom du test A/B Adapty dont est issue la transaction.
ab_test_revisionIntegerRévision du test A/B dont est issue la transaction.
base_plan_idStringID du plan de base dans le Google Play Store ou ID de prix dans Stripe.
cancellation_reasonString

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_nameStringNom de l’audience qui a déterminé quel paywall a été affiché à l’utilisateur.
consecutive_paymentsIntegerNombre de périodes durant lesquelles l’utilisateur est abonné sans interruption. Inclut la période en cours.
currencyStringDevise locale.
developer_idStringID du placement dont est issue la transaction.
discount_amount_localFloatLa 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_usdFloatValeur de discount_amount_local en USD.
environmentStringValeurs possibles : Sandbox ou Production.
event_datetimeISO 8601 dateDate et heure de l’événement. Identique à la valeur au niveau racine de l’événement.
original_price_localFloatPrix 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_usdFloatIdentique à original_price_local, en USD.
original_purchase_dateISO 8601 datePour 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_idString

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_nameStringNom du paywall dont est issue la transaction.
paywall_revisionStringRévision du paywall dont est issue la transaction. La valeur par défaut est 1.
price_localFloatMontant facturé pour la transaction avant la commission Apple/Google, en devise locale. null pour les essais gratuits, rien n’étant facturé.
price_usdFloatMontant facturé pour la transaction avant la commission Apple/Google, en USD. null pour les essais gratuits, rien n’étant facturé.
profile_countryStringDéterminé par Adapty, sur la base de l’IP du profil.
profile_event_idUUIDID d’événement unique pouvant être utilisé pour la déduplication.
profile_has_access_levelBooleanBooléen indiquant si le profil dispose d’un niveau d’accès actif.
profile_idUUIDID de profil généré par Adapty. Identique à la valeur au niveau racine de l’événement.
profile_ip_addressStringIP 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.
profile_total_revenue_usdFloatRevenus totaux du profil, remboursements déduits.
promotional_offer_idStringID Adapty de l’offre promotionnelle utilisée. Cet ID est défini lors de la création de l’offre dans le tableau de bord.
purchase_dateISO 8601 dateDate et heure de l’achat du produit.
rate_after_first_yearBooleanBoolé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 pour plus de détails.
storeStringStore où le produit a été acheté. Valeurs standard : app_store, play_store, stripe, paddle.
Si vous définissez des transactions de store personnalisées via l’API côté serveur, la valeur du paramètre store est utilisée.
store_countryStringPays transmis par le store.
store_offer_categoryStringCatégorie d’offre appliquée. Valeurs possibles : introductory, promotional, winback.
store_offer_discount_typeStringType d’offre appliqué. Valeurs possibles : free_trial, pay_as_you_go et pay_up_front.
store_offer_number_of_periodsIntegerNombre de périodes de facturation de base remisées par l’offre (1 ou plus). Présent uniquement lorsqu’une offre est appliquée. null pour les offres App Store avec paiement anticipé et lorsque le store ne communique pas la durée de l’offre.
subscription_expires_atISO 8601 dateDate d’expiration de l’abonnement. Généralement dans le futur.
transaction_idStringIdentifiant unique d’une transaction.
trial_durationStringDurée de la période d’essai en jours. Transmise au format « days », par exemple « 7 days ». Présent uniquement pour les types d’événements liés aux essais : trial_started, trial_converted, trial_cancelled.
variation_idUUIDID unique du paywall sur lequel l’achat a été effectué.
vendor_product_idString

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 :

Propriétés d’événement supplémentaires pour les taxes et revenus

Les propriétés d’événement liées aux taxes et aux revenus ci-dessous sont des champs supplémentaires qui s’appliquent uniquement à certains types d’événements. Cela signifie que les types d’événements listés incluent les Propriétés d’événement pour la plupart des types d’événements, ainsi que les champs supplémentaires listés ci-dessous.

Types d’événements ayant les propriétés d’événement de taxes et revenus :

  • subscription_renewed
  • subscription_initial_purchase (également appelé subscription_started — même événement)
  • subscription_refunded
  • non_subscription_purchase
FieldTypeDescription
net_revenue_localFloatRevenu net (revenu après déduction d’Apple/Google et des taxes) en devise locale.
net_revenue_usdFloatRevenu net (revenu après déduction d’Apple/Google et des taxes) en USD.
proceeds_localFloatPrix du produit après déduction d’Apple/Google en devise locale.
proceeds_usdFloatPrix du produit après déduction d’Apple/Google.
tax_amount_localFloatMontant des taxes déduit en devise locale.
tax_amount_usdFloatMontant des taxes déduit en USD.

Exemple de payload non_subscription_purchase

non_subscription_purchase suit la même structure que les événements d’abonnement, mais reflète un achat unique ou consommable. Les champs propres aux abonnements ne s’appliquent pas : cancellation_reason, will_renew, is_in_grace_period, is_refund, is_lifetime et trial_duration sont absents. subscription_expires_at est présent mais vaut null. Les champs de taxes et de revenus (net_revenue_*, proceeds_*, tax_amount_*) sont inclus.

Exemple de payload (cliquer pour développer)
{
  "profile_id": "00000000-0000-0000-0000-000000000000",
  "customer_user_id": "UserIdInYourSystem",
  "event_type": "non_subscription_purchase",
  "event_datetime": "2000-01-31T00:00:00.000000+0000",
  "event_properties": {
    "store": "app_store",
    "currency": "USD",
    "price_usd": 4.99,
    "price_local": 4.99,
    "original_price_usd": 4.99,
    "original_price_local": 4.99,
    "discount_amount_usd": 0,
    "discount_amount_local": 0,
    "proceeds_usd": 4.2415,
    "proceeds_local": 4.2415,
    "net_revenue_usd": 4.2415,
    "net_revenue_local": 4.2415,
    "tax_amount_usd": 0,
    "tax_amount_local": 0,
    "profile_id": "00000000-0000-0000-0000-000000000000",
    "environment": "Production",
    "vendor_product_id": "100coins",
    "transaction_id": "0000000000000000",
    "original_transaction_id": "0000000000000000",
    "purchase_date": "2024-11-15T10:45:36.181000+0000",
    "original_purchase_date": "2024-11-15T10:45:36.181000+0000",
    "subscription_expires_at": null,
    "store_country": "US",
    "profile_country": "US",
    "profile_ip_address": "10.10.1.1",
    "profile_has_access_level": false,
    "profile_total_revenue_usd": 4.99,
    "consecutive_payments": 1,
    "rate_after_first_year": false,
    "profile_event_id": "00000000-0000-0000-0000-000000000000"
  },
  "event_api_version": 1
}

Pour l’événement Access Level Updated

L’événement Access Level Updated est un événement webhook spécifique, généré uniquement lorsque l’intégration Webhook est active et que ce type d’événement est activé. S’il est activé, il est envoyé au Webhook configuré et apparaît dans l’Event Feed. S’il n’est pas activé, l’événement ne sera pas créé.

Si vous avez activé le partage des niveaux d’accès, l’événement access level updated sera envoyé pour tous les profils partageant le niveau d’accès.

Utilisez cet événement pour mettre à jour le niveau d’accès de l’utilisateur dans votre base de données, accorder ou révoquer les fonctionnalités premium sur votre backend, et synchroniser les accès sur tous les appareils ou plateformes.

PropriétéTypeDescription
ab_test_nameStringNom du test A/B dont est issue la transaction.
access_level_idStringL’ID du niveau d’accès.
activated_atISO 8601 dateDate et heure de la dernière activation de l’accès.
active_introductory_offer_typeStringType d’offre de lancement appliquée. Valeurs possibles : free_trial, pay_as_you_go et pay_up_front.
active_promotional_offer_idStringID de l’offre promotionnelle tel qu’indiqué dans la section Product de l’Adapty Dashboard
active_promotional_offer_typeStringType d’offre promotionnelle appliquée. Valeurs possibles : free_trial, pay_as_you_go et pay_up_front.
base_plan_idStringID du plan de base dans le Google Play Store ou ID de prix dans Stripe.
billing_issue_detected_atISO 8601 dateDate et heure du problème de facturation.
cancellation_reasonStringRaisons possibles d’annulation : voluntarily_cancelled, billing_error, price_increase, product_was_not_available, refund, cancelled_by_developer, new_subscription_replace, upgraded, unknown, adapty_revoked.
cohort_nameStringNom de l’audience à laquelle appartient le profil.
currencyStringDevise locale (USD par défaut).
developer_idStringL’ID du placement dont est issue la transaction.
environmentStringValeurs possibles : Sandbox ou Production.
event_datetimeISO 8601 dateDate et heure de l’événement.
expires_atISO 8601 dateDate et heure d’expiration de l’accès.
is_activeBooleanIndique si le niveau d’accès est actif.
is_in_grace_periodBooleanIndique si le profil est en délai de grâce.
is_lifetimeBooleanIndique si le niveau d’accès est à vie.
is_refundBooleanIndique si la transaction est un remboursement.
original_purchase_dateISO 8601 datePour les abonnements récurrents, l’achat original est la première transaction de la chaîne, dont l’ID (appelé ID de transaction original) relie la chaîne de renouvellements ; les transactions suivantes en sont des extensions. La date d’achat original correspond à la date et l’heure de cette première transaction.
original_transaction_idString

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_nameStringNom du paywall dont est issue la transaction.
paywall_revisionStringRévision du paywall dont est issue la transaction. La valeur par défaut est 1.
profile_countryStringDéterminé par Adapty, d’après l’IP du profil.
profile_event_idUUIDID d’événement unique pouvant être utilisé pour la déduplication.
profile_has_access_levelBooleanIndique si le profil dispose d’un niveau d’accès actif.
profile_idUUIDID de profil utilisateur interne Adapty.
profile_ip_addressStringIP 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.
profile_total_revenue_usdFloatRevenus totaux du profil, remboursements inclus.
purchase_dateISO 8601 dateDate et heure de l’achat du produit.
renewed_atISO 8601 dateDate et heure de renouvellement de l’accès.
starts_atISO 8601 dateDate et heure de début du niveau d’accès.
storeStringStore où le produit a été acheté. Valeurs standard : app_store, play_store, stripe, paddle.
Si vous configurez des transactions de store personnalisées via l’API serveur, la valeur du paramètre store est utilisée.
store_countryStringPays transmis à Adapty par le store.
subscription_expires_atISO 8601 dateDate d’expiration de l’abonnement.
transaction_idStringIdentifiant unique d’une transaction.
trial_durationStringDurée de la période d’essai en jours (ex. : « 7 days »).
variation_idUUIDIdentifiant d’une variante, utilisé pour attribuer les achats à ce paywall.
vendor_product_idString

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 :

  • adapty_server_side_product — accordé via l’API serveur.
  • adapty_dashboard_productaccordé manuellement dans l’Adapty Dashboard.
  • adapty_promotion — héritage.
will_renewBooleanIndique si le niveau d’accès payant sera renouvelé.

Notez que cette structure peut évoluer dans le temps — de nouvelles données pouvant être introduites par nous ou par les tiers avec lesquels nous travaillons. Assurez-vous que votre code qui la traite est suffisamment robuste et repose sur des champs spécifiques plutôt que sur la structure entière.