---
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.<br/>Format : <ul><li>**profile_id** : (UUID) ID Adapty</li><li>**customer_user_id** : (String) Customer User ID si fourni</li></ul> |
| **user_agent** | String | User-agent du navigateur de l'appareil. |
| **user_attributes** | JSON | Donné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). <br/>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"}`). <br/>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. <br/>Inclus si **Send User Attributes** est activé dans les [paramètres du Webhook](https://app.adapty.io/integrations/customwebhook). <p>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.</p> |

:::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        | <p>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`.</p><p>Présent dans les types d'événements suivants :</p>`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        | <p>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.</p><p>En l'absence d'extension, `original_transaction_id` correspond à store_transaction_id.</p>                             |
| **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**. <br/>Si vous définissez des [transactions de store personnalisées](api-adapty/operations/setTransaction) via l'API côté serveur, la valeur du paramètre **store** est utilisée.                                                                       |
| **store_country**             | String        | Pays transmis par le store.                                                                                                                                                                                                                                                                                                                                      |
| **store_offer_category**      | String        | Catégorie d'offre appliquée. Valeurs possibles : `introductory`, `promotional`, `winback`.                                                                                                                                                                                                                                                                       |
| **store_offer_discount_type** | String        | Type d'offre appliqué. Valeurs possibles : `free_trial`, `pay_as_you_go` et `pay_up_front`.                                                                                                                                                                                                                                                                      |
| **store_offer_number_of_periods** | Integer   | Nombre 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_at**   | ISO 8601 date | Date d'expiration de l'abonnement. Généralement dans le futur.                                                                                                                                                                                                                                                                                                   |
| **transaction_id**            | String        | Identifiant unique d'une transaction.                                                                                                                                                                                                                                                                                                                            |
| **trial_duration**            | String        | Duré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_id**              | UUID          | ID unique du paywall sur lequel l'achat a été effectué.                                                                                                                                                                                                                                                                                                          |
| **vendor_product_id**         | String        | <p>ID du produit dans l'Apple App Store, le Google Play Store ou Stripe.</p><p>Si l'accès a été accordé sans transaction réelle dans un store, `vendor_product_id` prendra l'une des valeurs suivantes :</p><ul><li>`adapty_server_side_product` — accordé via l'[API côté serveur](api-adapty/operations/grantAccessLevel).</li><li>`adapty_dashboard_product` — [accordé manuellement](give-access-level-to-specific-customer) dans l'Adapty Dashboard.</li><li>`adapty_promotion` — héritage.</li></ul> |

#### Propriétés d'événement supplémentaires pour les taxes et revenus \{#additional-tax-and-revenue-event-properties\}

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](webhook-event-types-and-fields#for-most-event-types), 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`

| Field                 | Type  | Description                                                  |
| :-------------------- | :---- | :----------------------------------------------------------- |
| **net_revenue_local** | Float | Revenu net (revenu après déduction d'Apple/Google et des taxes) en devise locale. |
| **net_revenue_usd**   | Float | Revenu net (revenu après déduction d'Apple/Google et des taxes) en USD. |
| **proceeds_local**    | Float | Prix du produit après déduction d'Apple/Google en devise locale. |
| **proceeds_usd**      | Float | Prix du produit après déduction d'Apple/Google.              |
| **tax_amount_local**  | Float | Montant des taxes déduit en devise locale.                   |
| **tax_amount_usd**    | Float | Montant 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.

<details>
<summary>Exemple de payload (cliquer pour développer)</summary>

```json title="Json" showLineNumbers
{
  "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
}
```

</details>

#### Pour l'événement Access Level Updated \{#for-access-level-updated-event\}

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](general#6-sharing-paid-access-between-user-accounts), l'événement **access level updated** sera envoyé pour tous les profils partageant le niveau d'accès.

:::tip
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é                          | Type          | Description                                                  |
| ---------------------------------- | ------------- | ------------------------------------------------------------ |
| **ab_test_name**                   | String        | Nom du test A/B dont est issue la transaction.               |
| **access_level_id**                | String        | L'ID du niveau d'accès.                                      |
| **activated_at**                   | ISO 8601 date | Date et heure de la dernière activation de l'accès.          |
| **active_introductory_offer_type** | String        | Type d'offre de lancement appliquée. Valeurs possibles : `free_trial`, `pay_as_you_go` et `pay_up_front`. |
| **active_promotional_offer_id**    | String        | ID de l'offre promotionnelle tel qu'indiqué dans la section Product de l'Adapty Dashboard |
| **active_promotional_offer_type**  | String        | Type d'offre promotionnelle appliquée. Valeurs possibles : `free_trial`, `pay_as_you_go` et `pay_up_front`. |
| **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. |
| **billing_issue_detected_at**      | ISO 8601 date | Date et heure du problème de facturation.                    |
| **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`. |
| **cohort_name**                    | String        | Nom de l'audience à laquelle appartient le profil.           |
| **currency**                       | String        | Devise locale (USD par défaut).                              |
| **developer_id**                   | String        | L'ID du placement dont est issue la transaction.             |
| **environment**                    | String        | Valeurs possibles : `Sandbox` ou `Production`.               |
| **event_datetime**                 | ISO 8601 date | Date et heure de l'événement.                                |
| **expires_at**                     | ISO 8601 date | Date et heure d'expiration de l'accès.                       |
| **is_active**                      | Boolean       | Indique si le niveau d'accès est actif.                      |
| **is_in_grace_period**             | Boolean       | Indique si le profil est en délai de grâce.                  |
| **is_lifetime**                    | Boolean       | Indique si le niveau d'accès est à vie.                      |
| **is_refund**                      | Boolean       | Indique si la transaction est un remboursement.              |
| **original_purchase_date**         | ISO 8601 date | Pour 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_id**        | String        | <p>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.</p><p>En l'absence d'extensions, `original_transaction_id` correspond à store_transaction_id.</p>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**. <br/>Si vous configurez des [transactions de store personnalisées](api-adapty/operations/setTransaction) via l'API serveur, la valeur du paramètre **store** est utilisée. |
| **store_country**                  | String        | Pays transmis à Adapty par le store.                         |
| **subscription_expires_at**        | ISO 8601 date | Date d'expiration de l'abonnement.                           |
| **transaction_id**                 | String        | Identifiant unique d'une transaction.                        |
| **trial_duration**                 | String        | Durée de la période d'essai en jours (ex. : « 7 days »).    |
| **variation_id**                   | UUID          | Identifiant d'une variante, utilisé pour attribuer les achats à ce paywall. |
| **vendor_product_id**              | String        | <p>ID du produit dans le store (Apple/Google/Stripe).</p><p>Si l'accès a été accordé sans transaction réelle dans un store, `vendor_product_id` sera l'une des valeurs suivantes :</p><ul><li>`adapty_server_side_product` — accordé via l'[API serveur](api-adapty/operations/grantAccessLevel).</li><li>`adapty_dashboard_product` — [accordé manuellement](give-access-level-to-specific-customer) dans l'Adapty Dashboard.</li><li>`adapty_promotion` — héritage.</li></ul> |
| **will_renew**                     | Boolean       | Indique si le niveau d'accès payant sera renouvelé.          |

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