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
event.Items|firstaccède au premier produit abandonné- La condition sur
event.Valueadapte le CTA sans créer deux templates event.CheckoutURLredirige directement vers le checkout pré-rempli Shopify
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
- [ ] Tester avec un profil qui a toutes les propriétés renseignées
- [ ] Tester avec un profil qui n'a aucune propriété (vérifier les fallbacks)
- [ ] Prévisualiser en mode "preview with profile" sur 3 profils différents
- [ ] Vérifier le rendu mobile (les blocs conditionnels n'affectent pas le CSS mais peuvent créer des espaces vides)
- [ ] Activer le suivi des revenus sur le flow pour mesurer l'impact
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.
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 →