[deliver] by make sense
Article Deliver · 2026-05-24 · Charlotte Rodrigues

Dynamic content Klaviyo : blocks conditionnels, variables, personnalisation 1-to-1

TL;DR : Le dynamic content Klaviyo transforme un email générique en message personnalisé grâce aux event properties, profile properties, blocs conditionnels et au catalog. Un seul template peut afficher un produit abandonné, adapter l'offre selon le CLV ou masquer une section selon la langue du contact. Ce guide couvre toute la mécanique : syntaxe Jinja-like, logique conditionnelle, intégration catalog, et trois cas d'usage complets pour welcome flow, abandonment et win-back.


1. Pourquoi le dynamic content change la donne en email marketing

L'email personnalisé génère en moyenne 6x plus de transactions que l'email statique (Experian). Pourtant, la majorité des e-commerçants se contentent de {{ first_name }} dans l'objet. Klaviyo offre un moteur de templating bien plus puissant, inspiré du langage Jinja2, qui permet de conditionner l'affichage de n'importe quel bloc selon des données profile ou événement.

La promesse concrète : un seul flow welcome peut afficher un message différent selon la source d'acquisition, l'intérêt déclaré lors de l'inscription, la langue ou le pays. Zéro duplication de flow, zéro fragmentation de reporting.

Lire aussi : Méthode complète Klaviyo pour maximiser vos revenus email


2. Les deux sources de données dynamiques dans Klaviyo

Avant de coder quoi que ce soit, il faut comprendre d'où viennent les données que Klaviyo peut injecter dans un email.

2.1 Profile properties

Ce sont les attributs stockés sur le profil du contact : prénom, ville, langue, date de naissance, segment RFM, score CLV, etc. Ils sont permanents (jusqu'à écrasement) et accessibles dans tous les emails envoyés à ce profil.

Syntaxe d'accès dans l'éditeur HTML/Jinja :

{{ person.first_name }}
{{ person|lookup:'city' }}
{{ person|lookup:'preferred_category' }}

2.2 Event properties

Ce sont les attributs attachés à un événement spécifique : produit ajouté au panier, page produit consultée, commande passée. Ils ne sont disponibles que dans les flows déclenchés par cet événement.

Syntaxe :

{{ event.ProductName }}
{{ event.Value }}
{{ event.Categories|first }}
{{ event.Items|first|lookup:'ProductName' }}

Pour les flows abandonment panier, event.Items contient un tableau des produits. Pour accéder au premier article :

{% for item in event.Items %}
  {{ item.ProductName }} - {{ item.Price }} €
{% endfor %}
Source Durée de vie Cas d'usage Syntaxe
Profile property Permanente Segmentation, personnalisation long terme {{ person|lookup:'...' }}
Event property Liée à l'event Abandonment, post-achat, browse abandon {{ event.PropertyName }}
Catalog (feed) Synchronisée Reco produit dynamique {{ catalog.items }}
Predicted (IA) Recalculée CLV, churn, next order {{ person.predictive_grade }}

3. Blocks conditionnels : afficher ou masquer du contenu

3.1 Syntaxe de base {% if %}

La structure conditionnelle Klaviyo suit la syntaxe Jinja2 :

{% if person|lookup:'gender' == 'F' %}
  Découvrez notre nouvelle collection femme.
{% elif person|lookup:'gender' == 'M' %}
  Découvrez notre nouvelle collection homme.
{% else %}
  Découvrez nos nouvelles collections.
{% endif %}

Les opérateurs disponibles : ==, !=, >, <, >=, <=, in, not in.

3.2 Blocks conditionnels dans le drag-and-drop editor

Dans l'éditeur visuel Klaviyo, chaque bloc (image, texte, bouton) dispose d'un champ "Show this block if..." dans le panneau de droite. C'est l'interface no-code pour les conditions simples.

Exemple : afficher une bannière "Bienvenue VIP" uniquement si person.vip_tier == 'gold'.

Pour les logiques complexes ou les boucles, il faut basculer sur le HTML block ou l'éditeur HTML complet.

3.3 Opérateurs de filtre utiles

{{ person|lookup:'first_name'|default:'Client' }}
{{ event.Value|floatformat:2 }} €
{{ person|lookup:'last_order_date'|date:'d/m/Y' }}
{{ event.Items|length }}

Le filtre |default est critique : si la propriété est vide, il évite d'afficher une variable vide dans l'email.


4. Variables Jinja-like : toute la syntaxe utile

4.1 Déclaration de variables locales

{% set prenom = person|lookup:'first_name'|default:'vous' %}
{% set panier_total = event.Value|floatformat:2 %}

Bonjour {{ prenom }}, votre panier de {{ panier_total }} € vous attend.

4.2 Accès aux objets imbriqués

Les événements Klaviyo (surtout ceux issus de Shopify ou WooCommerce) contiennent des objets imbriqués. Pour accéder à une propriété d'objet imbriqué :

{{ event.Items|first|lookup:'ImageURL' }}
{{ event.ExtraAttributes|lookup:'color' }}

4.3 Filtres mathématiques et de comparaison

{% if event.Value >= 100 %}
  Vous bénéficiez de la livraison gratuite.
{% endif %}

{% if person|lookup:'total_orders'|add:0 >= 5 %}
  Merci pour votre fidélité, client premium.
{% endif %}

Le filtre |add:0 convertit une string en integer pour les comparaisons numériques.

Filtre Usage Exemple
\|default:'X' Valeur de fallback {{ name\|default:'Client' }}
\|floatformat:2 Formater les décimales {{ price\|floatformat:2 }}
\|date:'d/m/Y' Formater les dates {{ date\|date:'d/m/Y' }}
\|first Premier élément d'un tableau {{ items\|first }}
\|length Taille d'un tableau {{ items\|length }}
\|upper Majuscules {{ name\|upper }}
\|add:0 Conversion string > int {{ count\|add:0 }}
\|lookup:'key' Accès à une clé d'objet {{ obj\|lookup:'color' }}

5. Personnalisation produit avec le catalog Klaviyo

5.1 Connecter un catalog

Un catalog Klaviyo est un feed produit synchronisé (Shopify sync natif, ou feed JSON/CSV custom). Il permet d'afficher des recommandations produits dynamiques sans envoyer les données dans l'événement.

Dans Klaviyo : Catalogs > Product Feed > connecter via Shopify ou uploader un feed.

5.2 Afficher un produit depuis le catalog

Dans un template email :

{% for item in catalog|recommended_items:person:4 %}
  <img src="{{ item.ImageURL }}" />
  <p>{{ item.Title }}</p>
  <p>{{ item.Price }} €</p>
  <a href="{{ item.URL }}">Voir le produit</a>
{% endfor %}

Le bloc recommended_items utilise l'historique d'achat et de navigation du profil pour choisir les 4 produits les plus pertinents.

5.3 Afficher le produit abandonné depuis l'event

Pour un abandonment panier, on préfère afficher exactement le produit de l'événement :

{% set product = event.Items|first %}
<img src="{{ product.ImageURL }}" width="200" />
<h3>{{ product.ProductName }}</h3>
<p>{{ product.Quantity }} x {{ product.ItemPrice }} €</p>
<a href="{{ product.ProductURL }}">Reprendre ma commande</a>

Lire aussi : Flow abandon panier Klaviyo : structure et optimisation


6. Cas d'usage 1 : welcome flow segmenté par interest

Contexte

Un e-commerçant beauté collecte l'intérêt déclaré à l'inscription ("skincare", "makeup", "haircare"). La propriété signup_interest est stockée sur le profil.

Structure du flow

Flow trigger : "Subscribed to list" > Delay 10 min > Email 1

Dans le template email, un seul email couvre les 3 segments :

{% if person|lookup:'signup_interest' == 'skincare' %}
  <img src="https://cdn.brand.com/banner-skincare.jpg" />
  <h2>Votre routine skincare commence ici</h2>
  <p>Découvrez nos soins les plus populaires pour prendre soin de votre peau.</p>
{% elif person|lookup:'signup_interest' == 'makeup' %}
  <img src="https://cdn.brand.com/banner-makeup.jpg" />
  <h2>Sublimez votre look avec notre sélection makeup</h2>
  <p>Des formules longue tenue pensées pour toutes les carnations.</p>
{% else %}
  <img src="https://cdn.brand.com/banner-default.jpg" />
  <h2>Bienvenue dans l'univers de la beauté responsable</h2>
  <p>Explorez toutes nos gammes et trouvez celle qui vous correspond.</p>
{% endif %}

Résultat

Un flow unique, un reporting consolidé, et une expérience personnalisée. Sans dynamic content, il faudrait 3 branches de flow et 3 templates distincts.

Lire aussi : Welcome flow Klaviyo : la structure optimale


7. Cas d'usage 2 : abandonment panier avec dynamic product

Contexte

Un e-commerçant mode veut afficher le produit exact abandonné, adapter le CTA selon le montant du panier, et proposer la livraison gratuite si le panier est supérieur à 80 euros.

Template email

Bonjour {{ person.first_name|default:'vous' }},

Vous avez laissé quelque chose derrière vous.

{% set product = event.Items|first %}
<img src="{{ product.ImageURL }}" />
<strong>{{ product.ProductName }}</strong>
Taille : {{ product.ExtraAttributes|lookup:'size'|default:'N/A' }}
Prix : {{ product.ItemPrice }} €

{% if event.Value >= 80 %}
  Bonne nouvelle : la livraison est offerte pour votre commande.
  <a href="{{ event.CheckoutURL }}">Finaliser avec livraison offerte</a>
{% else %}
  {% set manque = 80|add:0 - event.Value|add:0 %}
  Plus que {{ manque }} € pour bénéficier de la livraison gratuite.
  <a href="{{ event.CheckoutURL }}">Finaliser ma commande</a>
{% endif %}

Points clés


8. Cas d'usage 3 : win-back avec offre basée sur le CLV

Contexte

Un e-commerçant veut relancer les clients inactifs (90+ jours sans achat) avec une offre différente selon leur CLV historique : 10% pour les clients standards, 15% + cadeau pour les clients premium.

Segmentation préalable

Créer deux propriétés de profil :
- clv_tier : "premium" (CLV > 300 euros) ou "standard"
- last_order_days : calculé via segment ou flow post-achat

Template win-back

{% if person|lookup:'clv_tier' == 'premium' %}
  <h2>Vous nous manquez, {{ person.first_name|default:'client fidèle' }}.</h2>
  <p>Pour vous remercier de votre fidélité, nous vous offrons 15% de réduction + un échantillon offert avec votre prochaine commande.</p>
  <p>Code : <strong>RETOUR15</strong></p>
  <a href="https://store.com/?utm_source=klaviyo&utm_campaign=winback_premium">Je reviens</a>
{% else %}
  <h2>Ca fait un moment qu'on ne vous a pas vu.</h2>
  <p>Voici 10% de réduction pour votre prochaine commande.</p>
  <p>Code : <strong>RETOUR10</strong></p>
  <a href="https://store.com/?utm_source=klaviyo&utm_campaign=winback_standard">Je reviens</a>
{% endif %}

Benchmark résultat

Segment Taux de clic Taux de conversion CA généré
Template générique (avant) 2,1% 0,8% base 100
Dynamic content CLV-based 3,6% 1,4% +75%

Lire aussi : VIP Klaviyo : identifier et activer vos meilleurs clients | RFM email : segmentation avancée


9. Erreurs courantes et comment les éviter

Erreur Cause Correction
Variable vide dans l'email Propriété manquante sans fallback Toujours ajouter \|default:'valeur'
Boucle qui plante Tableau vide dans event.Items Entourer de {% if event.Items %}
Comparaison numérique fausse String vs integer Utiliser \|add:0 pour convertir
Image manquante ImageURL null dans le catalog Ajouter une image de fallback conditionnelle
Condition toujours vraie Casse différente (Skincare vs skincare) Normaliser à l'entrée ou utiliser \|lower

10. Checklist avant de publier un template dynamic

Lire aussi : Segmentation Klaviyo : tous les segments qu'il faut créer | Lifecycle marketing : générer 35% de CA par email


FAQ

Le dynamic content Klaviyo est-il disponible sur tous les plans ?
Oui. La syntaxe Jinja-like et les blocs conditionnels sont disponibles sur tous les plans Klaviyo, y compris le plan gratuit. Les recommendations catalog nécessitent un plan payant avec le module Reviews/Recommendations activé.

Puis-je tester plusieurs variantes dynamic dans un A/B test ?
Oui. Klaviyo permet de créer des variantes A/B sur un email de flow. Chaque variante peut avoir sa propre logique conditionnelle. L'A/B test sur le sujet peut se combiner avec du dynamic content dans le corps.

Quelle est la différence entre un bloc conditionnel et un conditional split dans un flow ?
Le conditional split divise le flow en branches distinctes (les contacts ne repassent pas par l'autre branche). Le bloc conditionnel adapte le contenu d'un seul email selon le profil au moment de l'envoi. Pour des expériences légèrement différentes, préférer le bloc conditionnel. Pour des séquences radicalement différentes, utiliser le split.

Les event properties sont-elles disponibles dans les campagnes (hors flow) ?
Non. Les event properties sont uniquement disponibles dans les flows déclenchés par un événement. Dans une campagne, seules les profile properties sont accessibles.

Comment déboguer une variable qui n'affiche rien ?
Utiliser la prévisualisation Klaviyo avec un profil réel. En mode HTML, ajouter temporairement {{ person|pprint }} pour afficher toutes les propriétés du profil, et {{ event|pprint }} pour l'événement.

Le dynamic content ralentit-il l'envoi des emails ?
Non. Le rendu est fait côté serveur Klaviyo avant l'envoi. Il n'y a aucun impact sur la délivrabilité ni sur la vitesse d'envoi.

Peut-on utiliser des conditions sur des dates ?
Oui. Exemple : {% if person|lookup:'birthday_month' == 'mai' %}. Pour comparer des timestamps, utiliser les filtres |date pour normaliser le format avant comparaison.


Charlotte Rodrigues, CRM Lead chez Deliver by Make Sense

Vous voulez intégrer le dynamic content Klaviyo dans vos flows et multiplier vos conversions ? Réservez un appel avec notre équipe.

CR
Charlotte Rodrigues · CRM Lead, Deliver by Make Sense. Une question sur cet article ? charlotte@agence-deliver.com

Besoin d'appliquer ça à votre stack ?

30 minutes avec Charlotte. On audit votre setup CRM en direct, on chiffre l'opportunité, vous repartez avec un plan d'attaque.

Réserver 30 minutes →