> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Personnaliser avec les Custom Events

> Utilisez les propriétés des Custom Events pour personnaliser les messages Journey avec la syntaxe Liquid. Découvrez comment les événements sont stockés, accessibles et rendus dans les modèles push, e-mail et SMS.

Les [Custom Events](./custom-events) vous permettent de personnaliser les messages Journey en utilisant les propriétés d'événement (noms de produits, prix, URLs, tableaux, etc.).

Les propriétés d'événement ne sont disponibles dans les modèles que si l'événement :

* Déclenche l'entrée dans le Journey, ou
* Correspond à une condition **Wait Until** à l'intérieur du Journey

Les propriétés d'événement stockées sont accessibles via la [syntaxe Liquid](./using-liquid-syntax).

***

## Comment fonctionne la personnalisation avec les Custom Events

Ajoutez des propriétés d'événement à vos messages Journey en suivant ces étapes :

<Steps>
  <Step title="Envoyer un Custom Event avec des propriétés">
    Exemple de payload [Custom Events](./custom-events) :

    ```json JSON theme={null}
    {
      "name": "purchase",
      "properties": {
        "item": "Blue Sweater",
        "price": "29.99",
        "order status": "pending",
        "details": [
          {
            "manufacturer": "Company A",
            "model": "1234567890"
          },
          {
            "manufacturer": "Company B",
            "model": "9876543210"
          }
        ]
      },
      "external_id": "user_12345",
      "timestamp": "2025-10-21T19:09:32.263Z",
    }
    ```
  </Step>

  <Step title="Référencer les propriétés d'événement dans vos modèles de messages Journey">
    Utilisez la [syntaxe Liquid](./using-liquid-syntax) pour accéder aux propriétés d'événement.

    ### Modèles d'accès Liquid courants

    | Ce que vous voulez                 | Liquid                                                                | Résultat                       |
    | ---------------------------------- | --------------------------------------------------------------------- | ------------------------------ |
    | Nom de l'événement                 | `{{ journey.first_event.name }}`                                      | `purchase`                     |
    | Propriété                          | `{{ journey.first_event.properties.item }}`                           | `Blue Sweater`                 |
    | Propriétés imbriquées              | `{{ journey.first_event.properties.details.first.manufacturer }}`     | `Company A`                    |
    | Propriété avec caractères spéciaux | `{{ journey.last_event.properties["order status"] }}`                 | `pending`                      |
    | Horodatage                         | `{{ journey.last_event.timestamp \| date: "%B %d, %Y at %I:%M %p" }}` | `October 21, 2025 at 07:09 PM` |

    #### Modèles d'accès Liquid imbriqués

    Vous pouvez également accéder aux propriétés imbriquées en utilisant la notation par point et par crochets :

    ```liquid Liquid theme={null}
    {{ journey.first_event.properties.details.first.manufacturer }} = Company A
    {{ journey.first_event.properties.details.last.manufacturer }} = Company B
    {{ journey.first_event.properties.details[0].manufacturer }} = Company A
    {{ journey.first_event.properties.details[1].manufacturer }} = Company B
    ```

    <Warning>
      Un Liquid invalide ou des propriétés manquantes s'affichent comme des chaînes vides. Les messages sont tout de même envoyés. Utilisez les [filtres par défaut](./using-liquid-syntax#default) pour définir une valeur de remplacement.
    </Warning>
  </Step>

  <Step title="Créer un Journey">
    Configurez le Journey pour utiliser le Custom Event comme règle d'entrée et/ou condition Wait Until.

    * Consultez les [paramètres des Journeys](./journeys-settings) pour les règles d'entrée.
    * Consultez les [actions des Journeys](./journeys-actions) pour les conditions Wait Until.

    Ajoutez des nœuds de message avec les modèles.
  </Step>
</Steps>

### Règles de stockage des propriétés d'événement

* Vous pouvez utiliser plusieurs événements dans votre Journey en combinant les règles d'entrée et les étapes Wait Until.
* Maximum : **100 propriétés d'événement stockées par utilisateur et par instance de Journey** (les plus anciennes sont supprimées).
* Les propriétés d'événement sont stockées **par utilisateur, par instance de Journey**.
* Les événements envoyés avant l'entrée ne sont pas accessibles.
* Les propriétés d'événement sont effacées lorsque l'utilisateur quitte le Journey.

<Warning>
  Les événements stockés dans un Journey ne peuvent pas être accessibles depuis un autre Journey.
</Warning>

***

## Référence Liquid des Custom Events

Utilisez ces objets pour accéder aux événements stockés à l'intérieur du Journey.

<ParamField body="journey.first_event">
  Le premier événement stocké pour cette instance de Journey.

  * Si vous utilisez une **règle d'entrée par Custom Event**, il s'agit de l'événement qui a déclenché l'entrée dans le Journey.
  * Si vous n'utilisez pas de règle d'entrée par Custom Event, il s'agit du premier événement stocké correspondant à une condition Wait Until.

  ```liquid Liquid theme={null}
  Thanks for purchasing {{ journey.first_event.properties.item | default: "your item" }}!
  ```
</ParamField>

<ParamField body="journey.last_event">
  L'événement stocké le plus récent pour cette instance de Journey.

  * Si un seul événement est stocké, `first_event` et `last_event` renvoient la même chose.

  ```liquid Liquid theme={null}
  Your most recent purchase was {{ journey.last_event.properties.item | default: "made" }}!
  ```
</ParamField>

<ParamField body="journey.event.EVENT_NAME">
  L'événement stocké le plus récent portant un nom spécifique.

  * Remplacez `EVENT_NAME` par le nom de votre événement (par exemple, `purchase`).
  * Si le même nom d'événement est utilisé plusieurs fois, ceci renvoie l'instance la plus récente.

  ```liquid Liquid theme={null}
  {% assign event = journey.event.purchase %}
  ```

  Si le nom de votre événement contient des espaces ou des caractères spéciaux, utilisez la [notation par crochets](https://shopify.dev/docs/api/liquid/basics#referencing-handles).

  **Exemple d'événement :** `"name": "order status"`

  ```liquid Liquid theme={null}
  {% assign event = journey.event["order status"] %}
  ```
</ParamField>

<ParamField body="journey.all_events" type="array">
  Tous les événements stockés pour cette instance de Journey, dans l'ordre où ils ont été stockés.

  * Utilisez les [boucles for](./using-liquid-syntax#for-loops) pour les parcourir.

  ```liquid Liquid theme={null}
  {% for event in journey.all_events %}
  • {{ event.properties.item | default: "Item" }} — ${{ event.properties.price | default: "0.00" }}
  {% endfor %}
  ```

  * `journey.first_event` est un raccourci pour `journey.all_events[0]`.
  * `journey.last_event` est un raccourci pour l'événement le plus récent du tableau.
</ParamField>

***

## Exemple : Modèles de panier abandonné utilisant les Custom Events

Cet exemple montre comment personnaliser les messages de panier abandonné en utilisant les Custom Events. Il s'appuie sur le [tutoriel Panier abandonné](./abandoned-cart).

**Exemple de jeu de Custom Events :**

```json JSON theme={null}
{
  "events": [
    {
      "name": "cart_abandoned",
      "properties": {
        "cart_url": "https://yourdomain.com/username/cart",
        "cart": [
          {
            "product_name": "24 Pack of Acorns",
            "product_image": "https://i.imgur.com/ssPCfbC.png",
            "product_price": "$12.99",
            "product_quantity": "1"
          },
          {
            "product_name": "Fancy Sweater",
            "product_image": "https://i.imgur.com/8QWTfV4.png",
            "product_price": "$9.99",
            "product_quantity": "1"
          }
        ]
      },
      "external_id": "ID_OF_THE_USER"
    }
  ]
}
```

### Modèle d'e-mail

Cet exemple montre comment créer un modèle d'e-mail qui affiche :

* Le nombre d'articles dans le panier
* Chaque produit avec son image, son nom, sa quantité et son prix à l'aide d'une boucle for
* Un bouton qui renvoie vers l'URL unique du panier du client

<Frame caption="Exemple de modèle d'e-mail de panier abandonné">
  <img src="https://mintcdn.com/onesignal/KSCNwSpBCNSQ8xdF/images/docs/fd61543-Screenshot_2023-08-28_at_10.52.05_AM.png?fit=max&auto=format&n=KSCNwSpBCNSQ8xdF&q=85&s=4128b15d8d53d69c6626e129eee538fa" width="693" height="1477" data-path="images/docs/fd61543-Screenshot_2023-08-28_at_10.52.05_AM.png" />
</Frame>

<Steps>
  <Step title="Créer le modèle d'e-mail">
    Accédez à **Messages > Templates > New Email Template** et ouvrez l'éditeur glisser-déposer.
  </Step>

  <Step title="Ajouter la structure de mise en page">
    Créez cinq lignes :

    * Lignes 1, 2 et 4 : une colonne avec un bloc **Paragraph**
    * Ligne 3 : quatre colonnes avec **HTML | Paragraph | Paragraph | Paragraph**
    * Ligne 5 : une colonne avec un bloc **Button**

    <Frame caption="Modèle d'e-mail de départ pour panier abandonné">
      <img src="https://mintcdn.com/onesignal/v-hm59YoewwF90UX/images/email/starter-template-abandoned-cart.png?fit=max&auto=format&n=v-hm59YoewwF90UX&q=85&s=551e9ec4618f64fdc0b6ab610a537c48" width="2968" height="2124" data-path="images/email/starter-template-abandoned-cart.png" />
    </Frame>
  </Step>

  <Step title="Afficher le nombre d'articles">
    Dans la ligne 1, ajoutez :

    ```liquid Liquid theme={null}
    We're holding onto {{journey.first_event.properties.cart.size}} items in your cart, but don't wait too long!
    ```

    Pour une meilleure grammaire, vous pourriez utiliser une condition pour dire « 1 article » vs « 2 articles », mais pour les e-mails de panier abandonné, le pluriel est généralement acceptable.

    ```liquid Liquid theme={null}
    {% assign cart = message.custom_data.cart %}
    {% assign item_count = cart.size | plus: 0 %}
    {% if item_count == 1 %}
    We're holding onto {{item_count}} item in your cart, but don't wait too long, other squirrels are getting ahead!
    {% endif %}
    {% if item_count > 1 %}
    We're holding onto {{item_count}} items in your cart, but don't wait too long, other squirrels are getting ahead!
    {% endif %}
    ```
  </Step>

  <Step title="Démarrer la boucle for">
    Utilisez une [boucle for](./using-liquid-syntax#for-loops) pour répéter la ligne d'affichage du produit pour chaque article du panier.

    Dans la ligne 2 (début de la boucle), ajoutez :

    ```liquid Liquid theme={null}
    {% for product in journey.first_event.properties.cart %}
    ```

    **Ce que cela fait :**

    * Commence une boucle qui parcourt chaque objet dans le tableau `cart`
    * Crée une variable temporaire `product` représentant l'article courant
    * Tout ce qui se trouve entre `{% for %}` et `{% endfor %}` se répète une fois par article du panier
    * Vous pouvez nommer `product` comme vous le souhaitez (par exemple, `item`, `cartItem`) — restez simplement cohérent

    <Warning>
      Placement de la boucle for : Assurez-vous que la syntaxe `{% for %}` se trouve dans sa propre ligne de bloc Text. Ne la placez pas à l'intérieur d'une ligne multi-colonnes avec d'autre contenu, car cela peut casser le rendu de l'e-mail dans certains clients.
    </Warning>
  </Step>

  <Step title="Afficher les détails du produit">
    Cette ligne à 4 colonnes affiche l'image, le nom, la quantité et le prix. Comme elle se trouve à l'intérieur de la boucle, elle se répète pour chaque article du panier.

    Dans la ligne 3 (détails du produit), configurez :

    **Colonne 1 - Bloc HTML** (image du produit) :

    ```html theme={null}
    <img src="{{product.product_image}}" alt="Product image" style="max-width:100%;" />
    ```

    **Colonnes 2 à 4 - Blocs texte** (nom du produit, quantité, prix) :

    * Colonne 2 : `{{product.product_name}}`
    * Colonne 3 : `{{product.product_quantity}}`
    * Colonne 4 : `{{product.product_price}}`

    **Comment fonctionne la boucle :**

    * À la première itération, `product` = premier objet du tableau cart
    * `{{product.product_image}}` récupère l'image du premier article
    * À la deuxième itération, `product` = deuxième objet
    * La ligne se répète automatiquement pour tous les articles du panier

    <Warning>
      **Correspondance des noms de champs :** Les clés comme `product_image` doivent correspondre exactement à votre payload d'événement (sensible à la casse). Les non-correspondances s'affichent comme des chaînes vides.
    </Warning>
  </Step>

  <Step title="Terminer la boucle for">
    Fermez la boucle pour marquer l'endroit où la répétition s'arrête.

    Dans la ligne 4 (fin de la boucle), ajoutez :

    ```liquid Liquid theme={null}
    {% endfor %}
    ```

    <Note>
      Chaque `{% for %}` doit avoir un `{% endfor %}` correspondant. L'absence de celui-ci cassera le rendu de l'e-mail.
    </Note>
  </Step>

  <Step title="Ajouter le bouton d'URL du panier">
    Dans le bloc **Button** de la ligne 5, définissez l'URL d'action sur :

    ```liquid Liquid theme={null}
    {{journey.first_event.properties.cart_url}}
    ```

    <Frame caption="Modèle d'e-mail de base terminé pour panier abandonné sans mise en forme">
      <img src="https://mintcdn.com/onesignal/v-hm59YoewwF90UX/images/email/finished-template-abandoned-cart-custom-event.png?fit=max&auto=format&n=v-hm59YoewwF90UX&q=85&s=67217e202cc57ca4039e0b34d2501f15" width="2968" height="1716" data-path="images/email/finished-template-abandoned-cart-custom-event.png" />
    </Frame>
  </Step>

  <Step title="Tester le modèle">
    * Ajoutez le modèle à un Journey vierge et définissez la règle d'entrée sur un Custom Event.
    * Activez le Journey et entrez-y vous-même via l'API Custom Event.
    * Vérifiez que les données s'affichent correctement.

    <Check>Terminé ! Vous pouvez maintenant appliquer votre propre mise en forme au modèle. Consultez [Concevoir des e-mails avec le glisser-déposer](./design-emails-with-drag-and-drop).</Check>
  </Step>
</Steps>

### Modèle push

Les notifications push ont un espace limité, affichez donc un seul article et mentionnez le nombre total.

**Champ du message :**

Affichez l'article et le nombre avec une grammaire correcte en utilisant les [instructions conditionnelles](./using-liquid-syntax#if-elsif-else).

```liquid Liquid theme={null}
{% assign cart = journey.first_event.properties.cart %}
{% assign item_count = cart.size | plus: 0 %}
{% if item_count == 1 %}
You left {{cart.first.product_name}} in your cart.
{% endif %}
{% if item_count == 2 %}
You left {{cart.first.product_name}} and {{item_count | minus: 1}} more item in your cart.
{% endif %}
{% if item_count > 2 %}
You left {{cart.first.product_name}} and {{item_count | minus: 1}} more items in your cart.
{% endif %}
```

**Champ de l'image :**

```liquid Liquid theme={null}
{{journey.first_event.properties.cart.first.product_image | default: "https://i.imgur.com/ssPCfbC.png"}}
```

**Champ de l'URL de lancement :**

```liquid Liquid theme={null}
{{journey.first_event.properties.cart_url | default: "https://yourdomain.com/cart"}}
```

Envoyez-vous une notification push de test en l'ajoutant au Journey de test et en y entrant vous-même via un autre appel à l'API Custom Event. Vous devriez voir apparaître une notification similaire à celle-ci :

<Frame caption="Exemple de modèle push de panier abandonné">
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/d0db985-Screenshot_2023-08-28_at_9.30.23_AM.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=6cf03ce9b622ba399656f2b14fb055f3" width="688" height="656" data-path="images/docs/d0db985-Screenshot_2023-08-28_at_9.30.23_AM.png" />
</Frame>

<Check>Terminé ! Vous pouvez maintenant créer d'autres modèles et les utiliser dans le [Journey de panier abandonné](./abandoned-cart).</Check>

***

## Dépannage et bonnes pratiques

**Erreurs courantes :**

| Erreur                                      | Pourquoi cela échoue                 | Syntaxe correcte                               |
| ------------------------------------------- | ------------------------------------ | ---------------------------------------------- |
| `{{ journey.first_event.item }}`            | `.properties` manquant               | `{{ journey.first_event.properties.item }}`    |
| `{{ journey.event.purchase.item }}`         | `.properties` manquant               | `{{ journey.event.purchase.properties.item }}` |
| `{{ journey.first_event.properties.Item }}` | Mauvaise casse (devrait être `item`) | `{{ journey.first_event.properties.item }}`    |
| `{{ event.properties.item }}`               | Préfixe `journey.` manquant          | `{{ journey.first_event.properties.item }}`    |

**Bonnes pratiques :**

* Testez toujours les modèles avant la mise en production
* Utilisez les [filtres par défaut](./using-liquid-syntax#default) pour les propriétés optionnelles
* Validez que le schéma de l'événement correspond aux attentes du modèle

***

## Pages associées

<Columns cols={2}>
  <Card title="Personnalisation des messages" href="./message-personalization" icon="sparkles">
    Aperçu de toutes les options de personnalisation dans OneSignal, y compris quand utiliser les Custom Events par rapport aux autres méthodes.
  </Card>

  <Card title="Custom Events" href="./custom-events" icon="bolt">
    Guide complet pour implémenter et envoyer des Custom Events via SDK ou API.
  </Card>

  <Card title="Aperçu des Journeys" href="./journeys-overview" icon="route">
    Apprenez à créer des workflows de messagerie automatisés avec des déclencheurs, des conditions et des actions.
  </Card>

  <Card title="Paramètres des Journeys" href="./journeys-settings" icon="gear">
    Configurez les règles d'entrée déclenchées par événement et le comportement du Journey.
  </Card>

  <Card title="Actions Wait Until" href="./journeys-actions#wait-until" icon="clock">
    Utilisez les nœuds Wait Until pour stocker des événements supplémentaires pendant la progression du Journey.
  </Card>

  <Card title="Utiliser la syntaxe Liquid" href="./using-liquid-syntax" icon="droplet">
    Référence complète Liquid avec filtres, conditions, boucles et manipulation de chaînes.
  </Card>

  <Card title="Templates" href="./templates" icon="file">
    Créez et gérez des modèles de messages réutilisables pour les utiliser dans les Journeys.
  </Card>
</Columns>

<Info>
  Besoin d'aide ?

  Discutez avec notre équipe d'assistance ou envoyez un e-mail à `support@onesignal.com`

  Veuillez inclure :

  * Les détails du problème que vous rencontrez et les étapes de reproduction si disponibles
  * Votre OneSignal App ID
  * L'External ID ou le Subscription ID le cas échéant
  * L'URL du message que vous avez testé dans le OneSignal Dashboard le cas échéant
  * Tous les [journaux ou messages d'erreur](/docs/en/capturing-a-debug-log) pertinents

  Nous serons ravis de vous aider !
</Info>

***
