v3.4.1 ✨ Dernière
📅 06 mars 2026
[3.4.1] - 2026-03-06
### 🔒 Délai de renvoi configurable, corrections JS & traductions
#### 🇫🇷 Français
##### 🔒 Délai minimum avant renvoi au même contact — Configurable
- **Nouveau** : le délai de protection contre le renvoi d'une automation au même contact n'est plus codé en dur (7 jours).
- **Global** : un réglage global "Délai minimum avant renvoi au même contact" est disponible dans les paramètres du plugin (valeur + unité : minutes / heures / jours / mois).
- **Par automation** : chaque automation peut activer un override individuel via une case "Personnaliser pour cette automation", avec sa propre valeur et unité, qui écrase le défaut global.
- **0 = toujours renvoyer** : mettre 0 désactive complètement la protection pour cette automation.
- **Unités disponibles** : minutes, heures, jours, mois.
##### 🔁 Exclusion mutuelle Répétition / Délai de renvoi
- **Comportement** : le bloc "Délai minimum avant renvoi" se masque automatiquement lorsque la répétition automatique (`repeat_days > 0`) est activée — les deux mécanismes sont incompatibles.
- **Note explicative** ajoutée dans le bloc Répétition : _"Le délai de répétition remplace le délai minimum de renvoi — les deux ne s'appliquent pas en même temps."_
##### 🐛 Correctif JS — Bloc cooloff non visible quand repeat = 0
- **Bug** : le script JavaScript qui synchronise la visibilité du bloc cooloff s'exécutait avant que l'input `letAutoRepeatDays` soit présent dans le DOM → `getElementById` retournait `null` → listener jamais attaché → le bloc restait caché.
- **Correctif** : script déplacé après le bloc Répétition dans le HTML.
##### 🌐 Traductions — Nouvelles chaînes
- Toutes les nouvelles chaînes ajoutées au `.pot` et traduites en anglais dans `en_US.po` : _Délai minimum avant renvoi_, _Personnaliser pour cette automation_, _Défaut global_, _Minute(s)_, _Heure(s)_, _Jour(s)_, _Mois_, _toujours renvoyer_, etc.
- **Correctif workflow de compilation** : le script `compile-mo-plural.php` est désormais permanent dans `ORIGINAL/languages/` et doit être exécuté **avant** l'obfuscation (le `.mo` compilé est ensuite copié dans l'output par l'obfuscateur).
- **Nettoyage `.po`** : suppression de 44 entrées obsolètes (`#~`) corrompues (emojis encodés en séquences hex ASCII par un vieux outil gettext).
#### 🇬🇧 English
##### 🔒 Minimum Resend Delay — Configurable
- **New**: the cool-off period preventing an automation from being resent to the same contact is no longer hardcoded (was 7 days).
- **Global setting**: a "Minimum delay before resending to the same contact" section is now available in the plugin settings (value + unit: minutes / hours / days / months).
- **Per-automation override**: each automation can enable its own override via a "Customize for this automation" checkbox, with its own value and unit, which takes priority over the global default.
- **0 = always resend**: setting 0 completely disables the protection for that automation.
- **Available units**: minutes, hours, days, months.
##### 🔁 Mutual Exclusion: Repeat vs. Resend Delay
- **Behaviour**: the "Minimum resend delay" block is automatically hidden when automatic repeat (`repeat_days > 0`) is enabled — both mechanisms are mutually exclusive.
- **Explanatory note** added inside the Repeat block: _"The repeat delay replaces the minimum resend delay — both do not apply at the same time."_
##### 🐛 JS Fix — Cooloff block not visible when repeat = 0
- **Bug**: the JavaScript synchronising the cooloff block visibility ran before the `letAutoRepeatDays` input existed in the DOM → `getElementById` returned `null` → listener never attached → block remained hidden.
- **Fix**: script moved to after the Repeat block in the HTML.
##### 🌐 Translations — New strings
- All new strings added to `.pot` and translated to English in `en_US.po`: _Minimum delay before resending_, _Customize for this automation_, _Global default_, _Minute(s)_, _Hour(s)_, _Day(s)_, _Month(s)_, _always resend_, etc.
- **Compilation workflow fix**: `compile-mo-plural.php` is now permanently placed in `ORIGINAL/languages/` and must be run **before** obfuscation (the compiled `.mo` is then copied into the output by the obfuscator).
- **`.po` cleanup**: removed 44 obsolete (`#~`) corrupted entries (emojis encoded as hex ASCII sequences by an old gettext tool).
---
v3.4.0
📅 05 mars 2026
[3.4.0] - 2026-03-05
### 🐛 Corrections & Améliorations UX — 2026-03-05
#### 🇫🇷 Français
##### 📋 Shortcode `[let_optin]` non enregistré — Correctif critique
- **Bug** : le shortcode `[let_optin id="X"]` s'affichait en texte brut au lieu de rendre le formulaire.
- **Cause** : `init_optin_forms()` était appelée depuis le hook `init` à priorité 20, puis elle tentait d'enregistrer le shortcode via `add_action('init', ..., 10)`. La priorité 10 étant déjà passée, le shortcode ne s'enregistrait jamais.
- **Correctif** : `LET_Optin_Forms::register_shortcode()` est maintenant appelé directement dans `init_optin_forms()`, sans passer par `add_action`.
##### 🔒 Détection de conflits de triggers popup — Mode responsive
- **Bug** : les avertissements de conflits de triggers (⚠ utilisé par popup #X) n'apparaissaient pas dans l'éditeur de formulaire en mode **Responsive CSS**.
- **Cause** : `$popup_conflicts` était calculé à l'intérieur du bloc ``. En mode responsive, ce bloc était sauté et la variable restait indéfinie.
- **Correctif** : calcul de `$popup_conflicts` déplacé avant tout bloc conditionnel, disponible pour les deux modes (Visual Builder et Responsive CSS).
##### 📧 Campagnes Marketing — Masquage des campagnes de type Automation
- **Comportement** : les campagnes créées automatiquement par les automations (type `automation`) s'affichaient dans la liste des Campagnes Marketing avec un bouton "Modifier" qui ouvrait la mauvaise page.
- **Correctif** : le type `automation` est maintenant exclu de la requête SQL via le paramètre `type_not_in`. Ces campagnes restent visibles uniquement dans leur section dédiée (Marketing → Automations).
- **Technique** : ajout du paramètre `type_not_in` (tableau) à la méthode `LET_Marketing_Campaigns::query()`.
##### 📧 Campagnes Marketing — Flux de sauvegarde et bouton Envoyer
- **Avant** : après la sauvegarde d'un brouillon, l'utilisateur restait sur la même page sans feedback clair, et il n'y avait aucun bouton "Envoyer" visible.
- **Correctif — Redirection** : après toute sauvegarde (nouvelle campagne ou modification), redirection automatique vers la liste des campagnes avec un message flash vert "✅ Campagne enregistrée !" (disparaît après 3 secondes).
- **Correctif — Bouton Envoyer** : ajout d'un bouton 📤 vert "Envoyer la campagne" dans la colonne Actions de la liste, visible uniquement pour les campagnes au statut **Brouillon**. Un clic déclenche une confirmation puis appelle l'action AJAX `let_mkt_send_campaign`.
##### 🛒 Panier abandonné — Clarification de la hiérarchie des délais
- Ajout d'une note explicative dans l'automation : **"Ce délai remplace le seuil global (X min) des paramètres. Si 0 ou vide, le seuil global s'applique."**
- Ajout d'une note dans les paramètres globaux : **"Valeur de secours uniquement — chaque automation peut définir son propre délai en heures qui remplace cette valeur."**
- Traductions anglaises ajoutées pour ces deux nouvelles chaînes.
#### 🇬🇧 English
##### 📋 `[let_optin]` Shortcode Not Registered — Critical Fix
- **Bug**: the `[let_optin id="X"]` shortcode was displaying as raw text instead of rendering the form.
- **Root cause**: `init_optin_forms()` was called from the `init` hook at priority 20, and then attempted to register the shortcode via `add_action('init', ..., 10)`. Since priority 10 had already passed, the shortcode was never registered.
- **Fix**: `LET_Optin_Forms::register_shortcode()` is now called directly inside `init_optin_forms()`, bypassing `add_action`.
##### 🔒 Popup Trigger Conflict Detection — Responsive Mode
- **Bug**: trigger conflict warnings (⚠ used by popup #X) did not appear in the form editor when in **Responsive CSS** mode.
- **Root cause**: `$popup_conflicts` was computed inside the `` block. In responsive mode, this block was skipped and the variable remained undefined.
- **Fix**: `$popup_conflicts` calculation moved before any conditional block, making it available in both modes (Visual Builder and Responsive CSS).
##### 📧 Marketing Campaigns — Hide Automation-type Campaigns
- **Behaviour**: campaigns automatically created by automations (type `automation`) were appearing in the Marketing Campaigns list with a "Edit" button pointing to the wrong page.
- **Fix**: type `automation` is now excluded from the SQL query via the `type_not_in` parameter. These campaigns remain visible only in their dedicated section (Marketing → Automations).
- **Technical**: added `type_not_in` (array) parameter to `LET_Marketing_Campaigns::query()`.
##### 📧 Marketing Campaigns — Save Flow & Send Button
- **Before**: after saving a draft, the user stayed on the same page with no clear feedback, and there was no visible "Send" button.
- **Fix — Redirect**: after any save (new campaign or edit), automatic redirect to the campaigns list with a green flash message "✅ Campagne enregistrée!" (disappears after 3 seconds).
- **Fix — Send Button**: added a green 📤 "Send Campaign" button in the Actions column of the list, visible only for campaigns with **Draft** status. A click triggers a confirmation then calls the `let_mkt_send_campaign` AJAX action.
##### 🛒 Abandoned Cart — Delay Hierarchy Clarification
- Added explanatory note in the automation: **"This delay overrides the global threshold (X min) from settings. If 0 or empty, the global threshold applies."**
- Added note in global settings: **"Fallback value only — each automation can define its own delay in hours which overrides this value."**
- English translations added for both new strings.
v3.3.0
📅 04 mars 2026
[3.3.0] - 2026-03-04
### 📦 Woo Emails Visuels — Variables enrichies (patch 2026-03-04)
#### 🇫🇷 Français
- **Nouvelles variables produits** dans tous les templates commande WooCommerce :
- `{product_list}` — liste texte "Produit × qté — prix" (un par ligne)
- `{product_names}` — noms des produits séparés par une virgule
- `{product_count}` — nombre total d'articles commandés
- **Nouvelles variables coupons / remises** :
- `{coupon_codes}` — code(s) coupon utilisé(s) sur la commande
- `{discount_amount}` — montant total de la remise (formaté WooCommerce)
- **Nouvelles variables montants détaillés** :
- `{order_subtotal}` — sous-total HT avant remises/frais
- `{order_shipping}` — frais de livraison
- `{order_tax}` — montant total des taxes
- `{order_discount}` — remise totale commande
- **Nouvelles variables commande** :
- `{order_status}` — statut lisible (ex : "En cours de traitement")
- `{order_url}` — lien "Voir la commande" dans Mon Compte
- **Nouvelles variables client** :
- `{billing_first_name}` — prénom de facturation
- `{billing_last_name}` — nom de facturation
- Toutes ces variables sont disponibles dans le panneau **Variables** du builder Unlayer WooCommerce et remplacées automatiquement lors de l'envoi
#### 🇬🇧 English
- **New product variables** for all WooCommerce order email templates:
- `{product_list}` — text list "Product × qty — price" (one per line)
- `{product_names}` — comma-separated product names
- `{product_count}` — total number of items ordered
- **New coupon / discount variables**:
- `{coupon_codes}` — coupon code(s) used on the order
- `{discount_amount}` — total discount amount (WooCommerce formatted)
- **New detailed amount variables**:
- `{order_subtotal}` — subtotal before discounts/fees
- `{order_shipping}` — shipping cost
- `{order_tax}` — total tax amount
- `{order_discount}` — total order discount
- **New order variables**:
- `{order_status}` — human-readable status (e.g. "Processing")
- `{order_url}` — "View order" link in My Account
- **New customer variables**:
- `{billing_first_name}` — billing first name
- `{billing_last_name}` — billing last name
- All variables are listed in the Unlayer WooCommerce builder **Variables** panel and auto-replaced on send
---
### 📦 Woo Emails Visuels (Unlayer) — 2026-03-04
#### 🇫🇷 Français
- **Nouveau sous-menu "📦 Woo Emails Visuels"** dans l'administration (visible uniquement si WooCommerce est actif) : page dédiée à la création de templates email Unlayer pour les **13 types d'emails transactionnels WooCommerce** (nouvelle commande, traitement, terminée, annulée, remboursée, facture, note commande, échec paiement, attente, réinitialisation mot de passe, nouveau compte…), **distinct** du builder Listeo et du builder Campagnes Marketing
- **Remplacement automatique du template CSS WooCommerce natif** : quand un template Unlayer est activé pour un type d'email donné, WooCommerce utilise ce design à la place de son propre template CSS — via le filtre `woocommerce_mail_content`. Le template CSS WooCommerce reprend la main si aucun template Unlayer n'est actif (non-destructif)
- **Placeholder spécial `{woo_order_content}`** : insérez ce placeholder dans un bloc HTML Unlayer pour y injecter le contenu HTML natif WooCommerce (tableau des articles, détail de la commande, lien reset, confirmation compte…) — remplacé dynamiquement lors de l'envoi
- **Variables dynamiques complètes** pour les emails commande : `{order_number}`, `{order_total}`, `{order_subtotal}`, `{order_date}`, `{order_status}`, `{order_url}`, `{order_shipping}`, `{order_tax}`, `{order_discount}`, `{coupon_codes}`, `{discount_amount}`, `{product_list}`, `{product_names}`, `{product_count}`, `{customer_name}`, `{customer_email}`, `{billing_first_name}`, `{billing_last_name}`, `{billing_address}`, `{shipping_address}`, `{payment_method}`, `{payment_url}`, `{refund_amount}`, `{customer_note}`, `{site_name}`, `{site_url}`
- **Variables dynamiques pour emails compte** : `{username}`, `{set_password_url}`, `{reset_url}` — extraites depuis l'objet `WC_Email` complet (4ème argument du filtre `woocommerce_email_headers`) incluant `reset_key`, `set_password_url`, `user_login`
- **Capture correcte de l'objet `WC_Email`** : `add_filter('woocommerce_email_headers', ..., 1, 4)` — 4 arguments nécessaires pour recevoir `$this` (l'instance `WC_Email`) en plus de `$headers`, `$email_id`, `$object`
- **6 templates pro pré-conçus** : Nouvelle Commande (violet), En Traitement (bleu), Commande Terminée (vert), Commande Annulée (rouge), Remboursée (émeraude), Nouveau Compte (violet foncé) — tous utilisent `{woo_order_content}` + les variables commande
- **Builder Unlayer drag & drop** : topbar avec Nom, Sujet, Type d'email (dropdown 13 types avec icône + couleur), destinataire affiché en lecture seule (fixé par le type), panneau Variables latéral avec section spéciale `{woo_order_content}` en haut
- **Activation/désactivation par type** : un seul template actif par `email_id` — badge "✅ Actif" visible — activation en 1 clic désactive automatiquement le précédent
- **Toutes les opérations CRUD** : créer, éditer, dupliquer, activer, désactiver, supprimer — 5 handlers AJAX sécurisés (`let_woo_save_tpl`, `let_woo_get_tpl`, `let_woo_delete_tpl`, `let_woo_duplicate_tpl`, `let_woo_activate_tpl`)
- **Nouvelle table DB** `{prefix}let_woo_email_templates` : créée automatiquement à l'activation du plugin (dbDelta), clé primaire `email_id` (un seul template actif par type WooCommerce)
#### 🇬🇧 English
- **New "📦 Woo Emails Visuels" submenu** in the admin (visible only if WooCommerce is active): dedicated page for creating Unlayer email templates for **13 WooCommerce transactional email types** (new order, processing, completed, cancelled, refunded, invoice, order note, payment failure, on hold, password reset, new account…), **separate** from the Listeo builder and Marketing Campaigns builder
- **Automatic WooCommerce native CSS template override**: when an Unlayer template is activated for a given email type, WooCommerce uses that design instead of its own CSS template — via the `woocommerce_mail_content` filter. The WooCommerce CSS template takes over again if no Unlayer template is active (non-destructive)
- **Special placeholder `{woo_order_content}`**: insert this placeholder in an Unlayer HTML block to inject the native WooCommerce HTML content (order items table, order details, reset link, account confirmation…) — dynamically replaced at send time
- **Complete dynamic variables** for order emails: `{order_number}`, `{order_total}`, `{order_subtotal}`, `{order_date}`, `{order_status}`, `{order_url}`, `{order_shipping}`, `{order_tax}`, `{order_discount}`, `{coupon_codes}`, `{discount_amount}`, `{product_list}`, `{product_names}`, `{product_count}`, `{customer_name}`, `{customer_email}`, `{billing_first_name}`, `{billing_last_name}`, `{billing_address}`, `{shipping_address}`, `{payment_method}`, `{payment_url}`, `{refund_amount}`, `{customer_note}`, `{site_name}`, `{site_url}`
- **Dynamic variables for account emails**: `{username}`, `{set_password_url}`, `{reset_url}` — extracted from the full `WC_Email` object (4th argument of the `woocommerce_email_headers` filter) including `reset_key`, `set_password_url`, `user_login`
- **Correct `WC_Email` object capture**: `add_filter('woocommerce_email_headers', ..., 1, 4)` — 4 arguments required to receive `$this` (the `WC_Email` instance) alongside `$headers`, `$email_id`, `$object`
- **6 professional pre-designed templates**: New Order (purple), Processing (blue), Completed (green), Cancelled (red), Refunded (emerald), New Account (dark purple) — all use `{woo_order_content}` + order variables
- **Unlayer drag & drop builder**: topbar with Name, Subject, Email Type (dropdown with 13 types, icon + color), recipient displayed read-only (fixed by type), Variables side panel with special `{woo_order_content}` section at the top
- **Activation/deactivation per type**: only one active template per `email_id` — "✅ Active" badge visible — one-click activation automatically deactivates the previous one
- **Full CRUD operations**: create, edit, duplicate, activate, deactivate, delete — 5 secure AJAX handlers (`let_woo_save_tpl`, `let_woo_get_tpl`, `let_woo_delete_tpl`, `let_woo_duplicate_tpl`, `let_woo_activate_tpl`)
- **New DB table** `{prefix}let_woo_email_templates`: automatically created on plugin activation (dbDelta), primary key `email_id` (one active template per WooCommerce type)
---
## [3.3.0] - 2026-03-04
### 🎨 Designs Visuels Listeo (Unlayer) — 2026-03-04 (patch)
#### 🇫🇷 Français
- **Nouveau sous-menu "🎨 Designs Visuels"** sous "Templates Listeo" : page dédiée à la création de templates email Unlayer pour les emails transactionnels Listeo (réservation, paiement, bienvenue, etc.), **distinct** du Visual Builder Marketing (campagnes)
- **8 templates professionnels pré-conçus** : Réservation Confirmée (vert), Réservation en attente (orange), Réservation Annulée (rouge), Paiement Confirmé (bleu), Demande de Paiement (bleu foncé), Email de Bienvenue (violet), Rappel de Réservation (cyan), Invitation Avis (ambre)
- **Builder Unlayer drag & drop** : topbar avec Nom, Sujet, Type d'email (dropdown complet des 20+ types) et Destinataire (Client / Prestataire / Admin)
- **Panneau "Variables"** latéral (toggle) : liste toutes les variables disponibles pour le type sélectionné (`{booking_id}`, `{client_name}`, `{listing_name}`, `{booking_date}`, `{total_amount}`, etc.), clic pour copier
- **Activation/désactivation par type+destinataire** : un seul template actif à la fois — badge "✅ Actif" visible sur la carte — activation en 1 clic qui désactive automatiquement le précédent
- **Remplacement automatique du CSS natif** : quand un template Unlayer est actif, `generate_email_html()` l'utilise en priorité (variables `{xxx}` remplacées), sinon repasse sur le template CSS existant (non-destructif)
- **Toutes les opérations CRUD** : créer, éditer, dupliquer, activer, désactiver, supprimer — via AJAX sécurisé (nonce `let_admin_nonce`)
- **Nouvelle table DB** `{prefix}let_listeo_email_templates` : créée automatiquement à l'ouverture de la page (dbDelta)
- **Traductions** : 80+ nouvelles chaînes ajoutées à `en_US.po` recompilé (1 921 entrées)
#### 🇬🇧 English
- **New "🎨 Visual Designs" submenu** under "Listeo Templates": dedicated page for creating Unlayer email templates for Listeo transactional emails (booking, payment, welcome, etc.), **separate** from the Marketing Visual Builder (campaigns)
- **8 professional pre-designed templates**: Booking Confirmed (green), Booking Pending (orange), Booking Cancelled (red), Payment Confirmed (blue), Payment Request (dark blue), Welcome Email (purple), Booking Reminder (cyan), Review Invitation (amber)
- **Unlayer drag & drop builder**: topbar with Name, Subject, Email Type (full dropdown with 20+ types) and Recipient (Client / Provider / Admin)
- **"Variables" side panel** (toggle): lists all available variables for the selected type (`{booking_id}`, `{client_name}`, `{listing_name}`, `{booking_date}`, `{total_amount}`, etc.), click to copy
- **Activation/deactivation per type+recipient**: only one active template at a time — "✅ Active" badge visible on the card — one-click activation that automatically deactivates the previous one
- **Automatic CSS template override**: when an Unlayer template is active, `generate_email_html()` uses it as a priority (variables `{xxx}` replaced), otherwise falls back to the existing CSS template (non-destructive)
- **Full CRUD operations**: create, edit, duplicate, activate, deactivate, delete — via secure AJAX (nonce `let_admin_nonce`)
- **New DB table** `{prefix}let_listeo_email_templates`: automatically created on page open (dbDelta)
- **Translations**: 80+ new strings added to `en_US.po`, recompiled (1,921 entries)
---
### 💬 Système Popup — 2026-03-04 (patch)
#### 🇫🇷 Français
- **Nouveau mode d'affichage "Popup" :** chaque formulaire (Responsive CSS ou Visual Builder) peut désormais être configuré en mode **Popup automatique** (overlay plein écran) au lieu d'être intégré via shortcode
- **Bouton "+ New Popup" dans la liste :** ouvre un modal dédié proposant "Popup Responsive CSS" ou "Popup Visual Builder"
- **Badge Type dans la liste :** chaque formulaire affiche maintenant un badge coloré `💬 Popup` (rose) ou `📋 Shortcode` (bleu), plus une colonne d'info (déclencheur · fréquence · pages ciblées)
- **Section "Mode d'affichage" dans l'éditeur :** deux boutons cliquables pour basculer entre Shortcode et Popup automatique — disponible dans les deux modes (Responsive et Visual Builder)
- **Déclencheurs configurables :** Délai (X secondes), Immédiatement, Défilement (X% de page), Intention de sortie (exit intent)
- **Fréquence d'affichage :** 1×/session, 1×/jour, 1× total (localStorage), ou à chaque chargement
- **Ciblage de pages :** Toutes les pages ou sélection de pages spécifiques via multi-select
- **Design overlay :** largeur max, couleur de fond, opacité, animation (fondu / zoom élastique / glissement)
- **Injection automatique via `wp_footer` :** les popups actifs s'injectent dans le footer, avec le CSS/JS chargé uniquement si nécessaire
- **Fermeture :** bouton ×, clic sur le fond, touche ESC
- **Traductions :** toutes les nouvelles chaînes ajoutées dans `en_US.po` (Popup, Déclencheur, Fréquence, Animation, etc.) — recompilation → 1 865 entrées
#### 🇬🇧 English
- **New "Popup" display mode:** every form (Responsive CSS or Visual Builder) can now be configured as an **automatic popup** (fullscreen overlay) instead of being embedded via shortcode
- **"+ New Popup" button in the list:** opens a dedicated modal offering "Popup Responsive CSS" or "Popup Visual Builder"
- **Type badge in the list:** each form now shows a colored badge `💬 Popup` (pink) or `📋 Shortcode` (blue), plus an info column (trigger · frequency · targeted pages)
- **"Display Mode" section in the editor:** two clickable buttons to switch between Shortcode and Automatic Popup — available in both modes (Responsive and Visual Builder)
- **Configurable triggers:** Delay (X seconds), Immediately, Scroll (X% of page), Exit intent
- **Display frequency:** 1×/session, 1×/day, 1× total (localStorage), or on every page load
- **Page targeting:** All pages or specific page selection via multi-select
- **Overlay design:** max width, background color, opacity, animation (fade / elastic zoom / slide)
- **Automatic injection via `wp_footer`:** active popups are injected in the footer, with CSS/JS loaded only when needed
- **Close:** × button, backdrop click, ESC key
- **Translations:** all new strings added to `en_US.po` (Popup, Trigger, Frequency, Animation, etc.) — recompiled → 1,865 entries
---
### 🎨 Visual Builder Upgrades & UX — 2026-03-04 (patch)
#### 🇫🇷 Français
- **Aperçu live dans la sidebar :** l'activation d'un champ (prénom, nom, RGPD) met à jour l'aperçu du formulaire en temps réel dans la sidebar du Visual Builder
- **Mise à jour automatique du canvas Unlayer :** dès qu'un paramètre change dans la sidebar, le bloc formulaire déjà placé dans Unlayer se met à jour automatiquement — plus besoin de recopier-coller
- **Nouveau format de bloc formulaire :** le bouton "Copier bloc Formulaire" copie désormais le vrai HTML visuel du formulaire (avec les champs configurés visibles), encadré par des marqueurs `` fiables pour l'injection côté serveur
- **Injection PHP robuste :** remplacement du regex fragile (div imbriqué) par un système en deux étapes — marqueurs commentaire en priorité, puis fallback récursif pour les anciens formulaires
- **10 templates pro Unlayer :** Ocean Wave, Sunset Glow, Midnight Gold, Forest Fresh, Rose Quartz, Tech Violet, Corporate Pro, Warm Espresso, Bold Mono, Aurora — avec photos Unsplash, gradients et typographies premium. Chargement en un clic avec mise à jour automatique des champs sidebar
- **Barre de templates rétractable :** bouton ▲/▼ pour masquer/afficher la grille de templates
- **Traductions anglaises complètes :** 21 chaînes manquantes ajoutées dans `en_US.po` dont `📋 Newsletter Forms` (l'emoji dans le msgid empêchait la correspondance). Recompilation → 1 809 entrées
#### 🇬🇧 English
- **Live sidebar preview:** enabling a field (first name, last name, GDPR) instantly updates the form preview in the Visual Builder sidebar
- **Auto-update Unlayer canvas:** when any sidebar setting changes, the form block already placed in Unlayer updates automatically — no need to re-copy/paste
- **New form block format:** "Copy Form Block" now copies the actual visual HTML (with configured fields visible), wrapped in reliable `` injection markers
- **Robust PHP injection:** replaced fragile nested-div regex with a two-step system — comment markers first, then recursive fallback for legacy forms
- **10 pro Unlayer starter templates:** Ocean Wave, Sunset Glow, Midnight Gold, Forest Fresh, Rose Quartz, Tech Violet, Corporate Pro, Warm Espresso, Bold Mono, Aurora — with Unsplash photos, gradients and premium typography. One-click load with automatic sidebar field sync
- **Collapsible template bar:** ▲/▼ button to show/hide the template grid
- **Complete English translations:** 21 missing strings added to `en_US.po` including `📋 Newsletter Forms` (the emoji in the msgid was preventing the match). Recompiled → 1,809 entries
---
### ✨ Formulaires d'abonnement Optin par shortcode / Optin Subscription Forms via Shortcode
#### 🇫🇷 Français
##### Nouvelle fonctionnalité : Formulaires d'abonnement personnalisés avec shortcode
Les administrateurs peuvent maintenant créer des formulaires d'inscription à la newsletter entièrement personnalisables et les intégrer n'importe où sur le site via un shortcode.
**Fonctionnalités clés :**
- **Shortcode flexible :** `[let_optin id="X"]` ou `[let_optin slug="mon-formulaire"]`
- **6 templates de design pro :**
- `minimal` — Fond blanc, sobre et épuré
- `modern` — Arrondi, bouton dégradé, ombre douce
- `gradient` — Fond dégradé coloré, texte blanc
- `card` — Carte avec barre de couleur et ombre
- `dark` — Fond sombre (mode nuit), accent coloré
- `glass` — Glassmorphisme sur fond dégradé
- **Personnalisation complète :** titre, sous-titre, texte du bouton, couleurs (principale, secondaire, fond, texte, bouton)
- **Champs optionnels :** prénom et/ou nom, chacun configurable comme obligatoire
- **Système anti-doublon :** si l'email est déjà inscrit, message personnalisé "déjà abonné" ; si précédemment désinscrit, réinscription automatique
- **Case RGPD optionnelle :** consentement personnalisable avec texte configurable
- **Intégration module Marketing :** les contacts s'ajoutent automatiquement à `wp_let_mkt_contacts` et peuvent être assignés à une liste ciblée
- **Redirection post-inscription :** URL de redirection optionnelle après soumission réussie
- **Aperçu en direct** dans l'éditeur admin, se mettant à jour à chaque modification
- **Fallback sans module marketing :** les inscriptions sont stockées en option WP si le module marketing est désactivé
- **Table dédiée :** `wp_let_optin_forms` avec migration automatique via `dbDelta`
**Fichiers créés :**
- `includes/class-optin-forms.php` — Classe principale (DB, CRUD, shortcode, AJAX)
- `templates/optin-forms-page.php` — Page admin liste des formulaires
- `templates/optin-form-edit-page.php` — Éditeur admin avec aperçu live
- `assets/css/optin-forms.css` — Styles frontend des 6 templates
- `assets/js/optin-forms.js` — Script frontend (soumission AJAX)
**Modifications :**
- `listeo-email-template.php` — Chargement de la classe, menu admin "📋 Formulaires Optin", handlers AJAX, création table à l'activation
- Version : `3.2.1` → `3.3.0`
---
#### 🇬🇧 English
##### New Feature: Customizable Optin Subscription Forms with Shortcode
Administrators can now create fully customizable newsletter signup forms and embed them anywhere on the site using a shortcode.
**Key features:**
- **Flexible shortcode:** `[let_optin id="X"]` or `[let_optin slug="my-form"]`
- **6 pro design templates:** minimal, modern, gradient, card, dark, glass
- **Full customization:** title, subtitle, button text, colors
- **Optional fields:** first name and/or last name, each configurable as required
- **Anti-duplicate system:** duplicate email shows custom "already subscribed" message; previously unsubscribed contacts are automatically re-subscribed
- **Optional GDPR checkbox** with configurable consent text
- **Marketing module integration:** contacts saved to `wp_let_mkt_contacts`, optionally added to a target list
- **Post-signup redirect:** optional URL redirect after successful submission
- **Live preview** in admin editor
- **Fallback without marketing module:** subscriptions stored as WP options
- **Dedicated DB table:** `wp_let_optin_forms` with automatic migration
---
v3.2.1
📅 03 mars 2026
[3.2.1] - 2026-03-03
### ✨ Marketing Automations — Répétition automatique / Automatic repeat
#### 🇫🇷 Français
##### Nouvelle fonctionnalité : Répétition automatique des automations événementielles
Les automations basées sur des événements (Listeo, WooCommerce, WordPress) peuvent maintenant **se répéter automatiquement** après un délai configurable, sans créer une nouvelle automation.
**Champ "Répéter tous les X jours" :**
- Un nouveau champ dans l'éditeur d'automation permet de configurer un intervalle de répétition (en jours). Valeur `0` = désactivé (comportement précédent).
- Un champ **"Maximum de répétitions"** limite le nombre total d'envois par contact (`0` = illimité).
- La section est masquée automatiquement pour les triggers récurrents (daily/weekly/monthly) qui ont leur propre planification.
**Fonctionnement technique :**
- Au premier déclenchement de l'événement, l'email est envoyé normalement.
- Un nouveau cron (`check_repeat_triggers`, toutes les 15 min) détecte les contacts dont le dernier envoi pour cette automation dépasse l'intervalle configuré et les ré-enfile en queue.
- Déduplication intégrée : un contact ayant une entrée `pending` existante n'est jamais doublonné.
- `repeat_max` stoppe l'envoi une fois le nombre maximum d'envois atteint.
**Indicateur visuel dans la liste :**
- Badge `🔁 Xj. ×N` affiché à côté du nom de l'automation si la répétition est configurée.
- Bloc statistique "🔁 Répétitions" affichant le nombre de ré-envois effectués et le ratio contacts × envois.
**Migration DB automatique :**
- Deux nouvelles colonnes `repeat_days` et `repeat_max` ajoutées à la table `wp_let_mkt_automations`.
- `maybe_upgrade()` appelé au `admin_init` — `dbDelta()` applique la migration sans perte de données lors de chaque mise à jour.
---
##### Nouvelle fonctionnalité : Historique des répétitions (bouton 🔁)
Un bouton **🔁** (bleu) apparaît dans la colonne Actions de chaque automation dont la répétition est configurée.
**Modal "Historique des répétitions" :**
- Affiche un tableau chronologique de tous les cycles d'envoi : envoi initial (🚀) + chaque répétition (🔁 #1, #2…).
- Colonnes : Cycle, Date, Total, Envoyés, Ouverts (%), Cliqués (%), Échecs, En attente.
- Taux d'ouverture et de clic calculés automatiquement par cycle.
---
##### Correction : Déduplication dans `fire_trigger()`
- Avant cette version, `fire_trigger()` n'avait aucune déduplication — un contact pouvait recevoir plusieurs emails si l'événement se déclenchait rapidement plusieurs fois.
- Ajout d'une vérification `pending` : si un contact a déjà une entrée en attente pour cette automation, le nouvel envoi est ignoré.
- En mode répétition (`repeat_days > 0`) : l'envoi est également ignoré si le dernier envoi date de moins de `repeat_days` jours.
---
##### Corrections de cohérence : Triggers récurrents
- **Bug timezone** : `is_recurring_due()` utilisait `gmdate()` (UTC) au lieu de l'heure locale WordPress → l'automation à "08:00" se déclenchait à l'heure UTC. Corrigé avec `current_time('timestamp')` + `wp_date()`.
- **Bug HPOS** : les conditions `woo_orders`, `woo_revenue`, `woo_pending_orders` et `no_order_since` requêtaient `wp_posts WHERE post_type='shop_order'` — incompatible avec WooCommerce HPOS (table `wp_wc_orders`). Toutes corrigées via `wc_get_orders()`.
- **Bug `__IDX__` fantôme** : le template HTML caché des conditions envoyait une condition fantôme avec la clé `__IDX__` lors de la sauvegarde. Filtrée dans `save()` avant l'encodage JSON.
---
#### 🇬🇧 English
##### New feature: Automatic repeat for event-based automations
Event-based automations (Listeo, WooCommerce, WordPress) can now **automatically repeat** after a configurable interval, without creating a new automation.
**"Repeat every X days" field:**
- A new field in the automation editor sets the repeat interval (in days). Value `0` = disabled (previous behaviour).
- A **"Maximum repeats"** field limits the total number of sends per contact (`0` = unlimited).
- The section is automatically hidden for recurring triggers (daily/weekly/monthly) which have their own schedule.
**How it works:**
- On the first event trigger, the email is sent as usual.
- A new cron (`check_repeat_triggers`, every 15 min) finds contacts whose last send for this automation exceeds the configured interval and re-queues them.
- Built-in deduplication: a contact with an existing `pending` entry is never duplicated.
- `repeat_max` stops sending once the maximum number of sends per contact is reached.
**Visual indicator in list:**
- `🔁 Xd. ×N` badge displayed next to the automation name when repeat is configured.
- "🔁 Repeats" stat block showing the number of repeat sends completed and the contacts × sends ratio.
**Automatic DB migration:**
- Two new columns `repeat_days` and `repeat_max` added to `wp_let_mkt_automations`.
- `maybe_upgrade()` called on `admin_init` — `dbDelta()` applies the migration without data loss on every update.
---
##### New feature: Repeat history modal (🔁 button)
A **🔁** button (blue) appears in the Actions column for any automation with repeat configured.
**"Repeat history" modal:**
- Displays a chronological table of all send cycles: initial send (🚀) + each repeat (🔁 #1, #2…).
- Columns: Cycle, Date, Total, Sent, Opened (%), Clicked (%), Failures, Pending.
- Open and click rates calculated automatically per cycle.
---
##### Fix: Deduplication in `fire_trigger()`
- Previously, `fire_trigger()` had no deduplication — a contact could receive multiple emails if the event fired rapidly in succession.
- Added `pending` check: if a contact already has a pending queue entry for this automation, the new send is skipped.
- In repeat mode (`repeat_days > 0`): the send is also skipped if the last send was less than `repeat_days` days ago.
---
##### Recurring trigger consistency fixes
- **Timezone bug**: `is_recurring_due()` used `gmdate()` (UTC) instead of the local WordPress time → an automation set to "08:00" fired at UTC 08:00. Fixed using `current_time('timestamp')` + `wp_date()`.
- **HPOS bug**: the conditions `woo_orders`, `woo_revenue`, `woo_pending_orders` and `no_order_since` queried `wp_posts WHERE post_type='shop_order'` — incompatible with WooCommerce HPOS (`wp_wc_orders` table). All fixed via `wc_get_orders()`.
- **`__IDX__` phantom condition**: the hidden HTML template for conditions submitted a phantom condition with key `__IDX__` on save. Now filtered in `save()` before JSON encoding.
---
### 🐛 Marketing Campaigns — Compatibility & reliability fixes
#### Fixed: WP Mail SMTP compatibility for campaign sending
- The queue processor now reads the WP Mail SMTP configuration (`wp_mail_smtp` option) before setting the `From:` header.
- If WP Mail SMTP forces both the From name and From email (`from_email_force` + `from_name_force`), no `From:` header is injected — the SMTP plugin handles it entirely, preventing authentication failures.
- If only one field is forced, the forced value is used; the other field falls back to the marketing plugin settings, then to site defaults.
- This fix applies to `wp_mail`, SES, SendGrid, Mailgun, and API fallback paths.
#### Fixed: Campaign status stuck at "In Progress" after all sends fail
- `finalize_campaigns()` now correctly sets the campaign status to `'failed'` (red badge) when `stats_sent = 0` and `stats_failed > 0`, instead of misleadingly marking it as `'sent'`.
#### Added: "Failed" status badge (red) in campaigns list
- Campaigns where all sends failed now display a red **Echec** badge instead of a green **Envoye** badge.
#### Added: Failed count display in "Sent" column
- When a campaign has failed deliveries, the number of failures is shown in red below the sent count.
#### Added: Retry button (↺) for campaigns with failures
- A retry button appears in the actions column for any campaign that has failed queue items.
- Clicking it resets the failed queue entries back to `pending` (attempts = 0) and puts the campaign back to `sending` so the next cron run re-attempts delivery.
---
v3.2.0
📅 03 mars 2026
[3.2.0] - 2026-03-02
### 🔗 Intégration LPP — Abonnements automatiques compatibles Listeo Prepaid Booking
#### 🇫🇷 Français
##### 📅 Listeo Booking Subscription — Compatibilité complète LPP (Prepaid Booking for Listeo)
Le module **Listeo Booking Subscription** est maintenant pleinement compatible avec le plugin **Prepaid Booking for Listeo (LPP)**.
**Format de données LPP géré :**
- LPP fire ses hooks avec le format `array( 'email' => '...', 'booking' => array(...) )` — l'email est au niveau racine, les données de réservation sont imbriquées sous la clé `'booking'`
- La méthode `optin_listeo_booking()` résout maintenant correctement l'email, le prénom et le nom depuis ce format
- Fallback automatique : si `first_name`/`last_name` sont absents, le système les récupère depuis le compte WordPress de l'utilisateur
**Nouveaux hooks LPP supportés :**
- `lpp_cash_booking_confirmed` — déclenché quand un vendeur accepte une réservation Cash via LPP → abonnement automatique du client
- `listeo_mail_to_user_waiting_approval` — réservation en attente (paiement Stripe/PayPal effectué, vendeur doit approuver)
- `listeo_mail_to_user_instant_approval` — réservation instantanée confirmée (paiement Stripe/PayPal)
- `listeo_mail_to_user_paid` — paiement complet reçu
**Résolution des données pour réservations Cash LPP :**
- Lecture du champ `comment` (JSON) de la table `bookings_calendar` pour extraire email/prénom/nom
- Fallback sur le `user_id` de la réservation si le JSON ne contient pas l'email
- Fallback final sur le compte WordPress de l'utilisateur
**Paramètres admin (inchangés, déjà présents) :**
- `User Signup Optin Settings` — inscription automatique lors d'un nouvel enregistrement WordPress
- `WP User Role Based List Mapping` — assignation de liste selon le rôle WordPress
- `Comment Form Subscription Settings` — abonnement depuis le formulaire de commentaires
- `WooCommerce Checkout Subscription Field` — case à cocher + auto-remplissage au checkout WooCommerce
- `Listeo Booking Subscription` — abonnement automatique lors de la confirmation de réservation Listeo (attente, instantanée, payée), avec dropdown de sélection de liste
- `Abandoned Cart Settings` — tracking panier abandonné WooCommerce avec configuration complète
#### 🇬🇧 English
##### 📅 Listeo Booking Subscription — Full LPP (Prepaid Booking for Listeo) Compatibility
The **Listeo Booking Subscription** module is now fully compatible with the **Prepaid Booking for Listeo (LPP)** plugin.
**LPP data format handled:**
- LPP fires its hooks with the format `array( 'email' => '...', 'booking' => array(...) )` — email at root level, booking data nested under the `'booking'` key
- `optin_listeo_booking()` now correctly resolves email, first_name, last_name from this format
- Automatic fallback: if first_name/last_name are missing, the system fetches them from the user's WordPress account
**New LPP hooks supported:**
- `lpp_cash_booking_confirmed` — fired when a vendor accepts a Cash booking via LPP → auto-subscribe the customer
- `listeo_mail_to_user_waiting_approval` — booking pending vendor approval (Stripe/PayPal paid)
- `listeo_mail_to_user_instant_approval` — instant booking confirmed (Stripe/PayPal paid)
- `listeo_mail_to_user_paid` — full payment received
---
### ⚡ Automatisations — Panier abandonné + 15 triggers + 13 conditions d'envoi
---
#### 🇫🇷 Français
##### 🛒 Nouveau trigger : Panier abandonné WooCommerce
Inspiré du module `AbandonCart` de FluentCRM Pro, le trigger **"WooCommerce : Panier abandonné"** permet de relancer automatiquement les clients qui ont ajouté des produits au panier sans finaliser leur commande.
**Comment ça fonctionne :**
- Le hook `woocommerce_add_to_cart` enregistre la date/heure d'ajout au panier dans le `user_meta` (`_let_mkt_cart_at`) pour tout utilisateur connecté
- Le hook `woocommerce_checkout_order_processed` supprime ce marqueur dès qu'une commande est passée
- Le WP-Cron (toutes les 15 min) détecte les utilisateurs dont le panier est inactif depuis X heure(s) sans commande
- L'email de relance est envoyé une seule fois (délai anti-doublon de 7 jours)
- Configuration : délai d'inactivité en **heures** (ex. : 1h, 2h, 24h)
- ⚠️ Fonctionne uniquement pour les utilisateurs **connectés**
**Template email pro "Panier abandonné" inclus** :
- Bandeau amber/doré avec emoji panier
- Bloc produits abandonnés (visuel)
- Code promo intégré (ex. : `RETOUR10`)
- 3 icônes de réassurance (paiement sécurisé, livraison rapide, retours gratuits)
- CTA principal "Finaliser ma commande →"
- Entièrement traduit (FR + EN)
##### ⚡ 15 Triggers d'automatisation (était 7)
**Triggers WordPress**
- `WordPress : Nouvel utilisateur` *(renommé + clarification)*
- `WordPress : Connexion utilisateur` *(nouveau)*
**Triggers WooCommerce**
- `WooCommerce : Commande annulée` *(nouveau)*
- `WooCommerce : Commande remboursée` *(nouveau)*
- `WooCommerce : Panier abandonné` *(nouveau — voir ci-dessus)*
**Triggers Listeo** (+6)
- `Listeo : Nouvelle annonce soumise`
- `Listeo : Annonce publiée` *(nouveau)*
- `Listeo : Annonce expirée` *(nouveau)*
- `Listeo : Réservation annulée` *(nouveau)*
- `Listeo : Paiement réservation reçu` *(nouveau)*
- `Listeo : Nouvel avis publié` *(nouveau)*
- `Listeo : Nouveau message reçu` *(nouveau)*
**Triggers récurrents** *(nouveau)*
- `Récurrent : Tous les jours` — heure d'envoi configurable
- `Récurrent : Toutes les semaines` — jour de la semaine + heure
- `Récurrent : Tous les mois` — jour du mois (1-28) + heure
##### 🎯 Conditions d'envoi récurrentes (optionnelles) — 13 types
L'email n'est envoyé que si **TOUTES** les conditions sont remplies. Sans condition → envoi toujours effectué.
**Contenu publié**
- Article publié dans les X derniers jours
- Page publiée dans les X derniers jours
**Listeo**
- Annonce Listeo publiée dans les X derniers jours
- Réservations Listeo ≥ N dans les X derniers jours
- **Annonces Listeo actives ≥ N** *(nouveau)*
**WooCommerce**
- Produit WooCommerce publié dans les X derniers jours
- Commandes WooCommerce ≥ N dans les X derniers jours
- Chiffre d'affaires WooCommerce ≥ X€ dans les X derniers jours
- **Produit en stock bas (stock ≤ N)** *(nouveau)* — au moins 1 produit sous le seuil
- **Commandes en attente ≥ N** *(nouveau)* — commandes `wc-pending`
- **Aucune commande dans les X derniers jours** *(nouveau)* — idéal pour réengagement
- **Paniers abandonnés ≥ N dans les X derniers jours** *(nouveau)*
**Utilisateurs**
- Nouveaux utilisateurs ≥ N dans les X derniers jours
- Nombre total d'abonnés ≥ N
- Interface dynamique : les champs (jours / nombre / montant) s'affichent automatiquement selon le type de condition
- Logic `ET` entre toutes les conditions
##### 👥 Destinataires récurrents enrichis
- Tous les abonnés
- Clients WooCommerce
- Vendeurs Listeo / Clients Listeo
- **Listes personnalisées** — toutes les listes marketing créées dans le plugin
##### 🌐 Traductions
- +75 nouvelles chaînes (.pot, en_US.po → 1437 entrées, fr_FR.po → 1233 entrées, .mo)
- Template panier abandonné traduit (FR + EN)
- Tous les triggers et labels UI traduits
- Corrections : triggers WooCommerce/Listeo qui s'affichaient en français sur un site anglais
---
#### 🇬🇧 English
##### 🛒 New Trigger: WooCommerce Abandoned Cart
Inspired by FluentCRM Pro's `AbandonCart` module, the **"WooCommerce: Abandoned Cart"** trigger automatically re-engages customers who added products to their cart without completing checkout.
**How it works:**
- The `woocommerce_add_to_cart` hook records the cart timestamp in `user_meta` (`_let_mkt_cart_at`) for logged-in users
- The `woocommerce_checkout_order_processed` hook clears the marker when an order is placed
- WP-Cron (every 15 min) detects users whose cart has been idle for X hour(s) with no purchase
- Recovery email is sent once (7-day deduplication delay)
- Configuration: inactivity delay in **hours** (e.g. 1h, 2h, 24h)
- ⚠️ Works for **logged-in users** only
**Included professional "Abandoned Cart" email template:**
- Amber/gold banner with cart emoji and urgency label
- Abandoned products block (visual placeholder)
- Built-in promo code (e.g. `RETOUR10`)
- 3 trust icons (secure payment, fast delivery, free returns)
- Main CTA "Complete my order →"
- Fully translated (FR + EN)
##### ⚡ 15 Automation Triggers (was 7)
**WordPress triggers**
- `WordPress: New user` *(renamed)*
- `WordPress: User login` *(new)*
**WooCommerce triggers**
- `WooCommerce: Order cancelled` *(new)*
- `WooCommerce: Order refunded` *(new)*
- `WooCommerce: Abandoned cart` *(new — see above)*
**Listeo triggers** (+6)
- `Listeo: New listing submitted`
- `Listeo: Listing published` *(new)*
- `Listeo: Listing expired` *(new)*
- `Listeo: Booking cancelled` *(new)*
- `Listeo: Booking payment received` *(new)*
- `Listeo: New review published` *(new)*
- `Listeo: New message received` *(new)*
**Recurring triggers** *(new)*
- `Recurring: Every day` — configurable send time
- `Recurring: Every week` — day of week + time
- `Recurring: Every month` — day of month (1-28) + time
##### 🎯 Optional Recurring Sending Conditions — 13 Types
Email is only sent if **ALL** conditions pass. No conditions → always sent at scheduled time.
**Published content**
- Post published in the last X days
- Page published in the last X days
**Listeo**
- Listeo listing published in the last X days
- Listeo bookings ≥ N in the last X days
- **Active Listeo listings ≥ N** *(new)*
**WooCommerce**
- WooCommerce product published in the last X days
- WooCommerce orders ≥ N in the last X days
- WooCommerce revenue ≥ X in the last X days
- **Low stock product (stock ≤ N)** *(new)* — at least 1 product below threshold
- **Pending orders ≥ N** *(new)* — `wc-pending` orders
- **No order in the last X days** *(new)* — ideal for re-engagement campaigns
- **Abandoned carts ≥ N in the last X days** *(new)*
**Users**
- New users ≥ N in the last X days
- Total subscribers ≥ N
- Dynamic UI: fields (days / count / amount) automatically appear based on condition type
- `AND` logic between all conditions
##### 👥 Enriched Recurring Recipients
- All subscribers
- WooCommerce customers
- Listeo vendors / Listeo clients
- **Custom lists** — all marketing lists created in the plugin
##### 🌐 Translations
- +75 new strings (.pot, en_US.po → 1437 entries, fr_FR.po → 1233 entries, .mo)
- Abandoned cart template fully translated (FR + EN)
- All triggers and UI labels translated
- Fix: WooCommerce/Listeo triggers were displaying French text on English sites
---
## [3.1.0] - 2026-02-08
### 📨 Complete Marketing Mail Module + Visual Builder + Error Log
---
#### 🇫🇷 Français
##### 📨 Module Mail Marketing complet
**📊 Dashboard Marketing**
- Nouveau tableau de bord marketing avec KPI en temps réel
- Graphique d'activité des 30 derniers jours (Chart.js)
- Répartition des sources de contacts (WordPress, WooCommerce, Listeo, CSV, Manuel)
- Activité récente : envois, ouvertures, clics, échecs, désabonnements
- Accès rapide : nouvelle campagne, contacts, automatisations
**👥 Gestion des contacts**
- Base de contacts avec statuts (abonné, désabonné)
- Synchronisation automatique WordPress/WooCommerce/Listeo
- Import CSV avec mapping automatique des colonnes
- Export CSV de tous les contacts
- Tags personnalisés par contact
- Filtrage par statut, source, liste, recherche textuelle
- Pagination complète
**📋 Listes de contacts**
- Listes statiques : ajout/suppression manuelle de contacts
- Listes dynamiques : segmentation automatique par règles (source, tags, date)
- Comptage automatique des contacts par liste
- Gestion CRUD complète depuis la page Contacts
**📧 Campagnes email**
- Éditeur WYSIWYG WordPress complet avec variables dynamiques
- Types : manuelle, programmée (date/heure)
- Ciblage : tous les contacts, clients WooCommerce, vendeurs Listeo, clients Listeo, liste personnalisée
- Prévisualisation en direct dans un iframe
- Email de test avant envoi
- Duplication de campagnes
- Statuts : brouillon, programmé, en cours, envoyé
- Template email professionnel avec couleurs indépendantes de WooCommerce
**⚡ Automatisations**
- Déclencheurs WordPress : nouvel utilisateur
- Déclencheurs WooCommerce : nouvelle commande, commande terminée, nouveau client, client inactif
- Déclencheurs Listeo : nouvelle annonce, nouvelle réservation, réservation confirmée
- Déclencheurs temporels : X jours après inscription
- Délai configurable (minutes, heures, jours)
- Activation/désactivation individuelle
- Compteur d'exécutions et date de dernière exécution
**📬 File d'attente d'envoi**
- Envoi par batch via WP-Cron (chaque minute)
- Taille de batch configurable (défaut 25)
- Délai entre emails configurable
- Limite d'emails par heure (rate limiting)
- Système de retry (3 tentatives max)
- Finalisation automatique des campagnes
**🔌 API d'envoi externe**
- wp_mail par défaut (compatible WP Mail SMTP et plugins SMTP)
- SendGrid API v3
- Mailgun API
- Amazon SES (via SMTP)
- Fallback automatique vers wp_mail en cas d'échec API
**📈 Tracking complet**
- Pixel d'ouverture 1x1 transparent avec vérification HMAC
- Redirect de clics avec journalisation de l'URL
- Comptage unique des ouvertures et clics par contact
- Lien de désabonnement sécurisé (HMAC)
- Page de désabonnement élégante
- Nettoyage automatique des anciens logs (configurable, défaut 90 jours)
**⚙️ Paramètres marketing**
- Section dédiée dans la page Paramètres
- Nom et email de l'expéditeur
- Batch size, délai entre emails, limite par heure
- Choix de l'API d'envoi (wp_mail, SendGrid, Mailgun, SES)
- Clé API et endpoint configurables
- Conservation des logs paramétrable
**🗄️ Base de données**
- 9 tables au total : contacts, lists, list_contacts, campaigns, queue, logs, automations, email_templates, email_logs
- Colonnes ajoutées : `design_html` (campaigns), `email_design_html` (automations)
- Création automatique à l'activation via dbDelta
- Index optimisés pour les requêtes fréquentes
**📋 Menu admin**
- 5 nouveaux sous-menus : Marketing, Campagnes, Contacts, Automatisations, Visual Builder
- Sous-menu 🔴 Rapport erreurs sous Email Templates
- Affichés uniquement si le module est activé
##### 🎨 Visual Email Builder (Unlayer)
- Intégration de l'éditeur drag & drop Unlayer dans une page dédiée (Marketing → Visual Builder)
- Création et gestion de templates visuels : colonnes, images, boutons, texte, séparateurs
- Sauvegarde du JSON Unlayer + HTML exporté en base de données (table `email_templates`)
- Application d'un template visuel à une campagne ou une automatisation en 1 clic
- Bannière de confirmation "Template visuel chargé" avec bouton "Retirer"
- Les `` CSS sont stripés dans TinyMCE (affichage correct) mais conservés pour l'envoi réel
- Support des variables de personnalisation (`{{prenom}}`, `{{email}}`, etc.) dans les templates visuels
##### 📋 15 Templates de campagne prêts à l'emploi
- **5 templates originaux** : Newsletter, Lancement produit, Promotion, Événement, Bienvenue
- **10 nouveaux templates PRO** :
- 📣 Annonce (grande nouvelle, mise à jour)
- 💫 Réactivation (win-back, clients inactifs)
- 🙏 Merci (post-achat, fidélisation)
- ⭐ Sondage (avis client, feedback)
- 🎄 Saisonnier (fêtes, offre spéciale)
- 🎥 Webinaire (formation, live, inscription)
- 👑 VIP / Fidélité (récompense, offre exclusive)
- 🖼️ Portfolio (services, réalisations)
- ⚠️ Urgence (alerte, délai critique)
- 🤝 Parrainage (invitation, bonus ami)
- Affichage en cards visuels avec mini-mockup email, disponibles dans campagnes ET automatisations
- Contenu HTML dynamique avec images, boutons colorés, CTA, liens de désabonnement
##### 🔴 Rapport d'erreurs email (Error Log)
- Nouvelle page d'administration : Email Templates → 🔴 Rapport erreurs
- Journalisation en temps réel de tous les envois : Listeo, WooCommerce, Marketing
- Informations enregistrées : destinataire, sujet, source, niveau, message d'erreur, timestamp
- Niveaux de log : `success`, `error`, `warning`, `info`
- Filtrage avancé : par niveau, par source, par mot-clé (recherche textuelle)
- Purge automatique après 2 000 entrées pour éviter la surcharge BDD
- Erreurs des APIs externes (Mailgun, SendGrid, SES) capturées avec message HTTP complet
- Header de page aligné sur le style des autres pages admin du plugin
##### 🎨 Couleur de l'en-tête marketing
- Nouvelle option `let_mkt_header_color` (défaut : `#7c3aed`) indépendante de WooCommerce
- Color picker intégré directement dans l'éditeur de campagne et d'automatisation
- Bouton "Enregistrer la couleur" avec feedback visuel immédiat
- Sauvegarde via AJAX sans rechargement de page
##### ✉️ Corrections et améliorations diverses
- Fix : toggles destinataires WooCommerce (Clients / Administrateur) maintenant fonctionnels
- Fix : emails WooCommerce pour réservations Listeo utilisent bien le template personnalisé
- Fix : compatibilité avec le plugin `listeo-paiement-prealable` pour les mails WooCommerce
- Fix : suppression des doublons d'emails lors d'une réservation Listeo + WooCommerce
- Fix : texte et liens (footer, nom du site) rendus blancs dans les templates Midnight et Neon
- Fix : traduction du menu "🔴 Rapport erreurs" et du sous-titre de la page
- Fix : CSS `` ne s'affiche plus comme bloc texte dans TinyMCE (templates visuels)
- Amélioration : prévisualisation des modifications en temps réel (sans sauvegarde) pour les templates Listeo
- Amélioration : bouton "Envoyer un test" retiré du bas de page (déjà présent dans la colonne droite)
- Amélioration : bouton "Prévisualiser" ajouté dans l'éditeur d'automatisations
**🌐 Traductions**
- +250 nouvelles chaînes (total > 1 100)
- Toutes les nouvelles fonctionnalités traduites : Visual Builder, Rapport erreurs, templates PRO, couleur en-tête
- Fichiers .pot, .po (fr_FR, en_US) et .mo mis à jour
---
#### 🇬🇧 English
##### 📨 Complete Email Marketing Module
**📊 Marketing Dashboard**
- New marketing dashboard with real-time KPIs
- 30-day activity chart (Chart.js)
- Contact source breakdown (WordPress, WooCommerce, Listeo, CSV, Manual)
- Recent activity: sends, opens, clicks, failures, unsubscribes
- Quick access: new campaign, contacts, automations
**👥 Contact Management**
- Contact base with statuses (subscribed, unsubscribed)
- Automatic sync WordPress/WooCommerce/Listeo
- CSV import with automatic column mapping
- CSV export of all contacts
- Custom tags per contact
- Filter by status, source, list, text search
- Full pagination
**📋 Contact Lists**
- Static lists: manual add/remove contacts
- Dynamic lists: automatic segmentation by rules (source, tags, date)
- Automatic contact count per list
- Full CRUD management from the Contacts page
**📧 Email Campaigns**
- Full WordPress WYSIWYG editor with dynamic variables
- Types: manual, scheduled (date/time)
- Targeting: all contacts, WooCommerce customers, Listeo vendors, Listeo clients, custom list
- Live preview in an iframe
- Test email before sending
- Campaign duplication
- Statuses: draft, scheduled, sending, sent
- Professional email template with colors independent of WooCommerce
**⚡ Automations**
- WordPress triggers: new user
- WooCommerce triggers: new order, completed order, new customer, inactive customer
- Listeo triggers: new listing, new booking, confirmed booking
- Time-based triggers: X days after registration
- Configurable delay (minutes, hours, days)
- Individual enable/disable
- Execution counter and last execution date
**📬 Send Queue**
- Batch sending via WP-Cron (every minute)
- Configurable batch size (default 25)
- Configurable delay between emails
- Hourly email limit (rate limiting)
- Retry system (max 3 attempts)
- Automatic campaign completion
**🔌 External Sending API**
- wp_mail by default (compatible with WP Mail SMTP and SMTP plugins)
- SendGrid API v3
- Mailgun API
- Amazon SES (via SMTP)
- Automatic fallback to wp_mail on API failure
**📈 Full Tracking**
- 1x1 transparent open pixel with HMAC verification
- Click redirect with URL logging
- Unique open and click counting per contact
- Secure unsubscribe link (HMAC)
- Elegant unsubscribe page
- Automatic old log cleanup (configurable, default 90 days)
**⚙️ Marketing Settings**
- Dedicated section in the Settings page
- Sender name and email
- Batch size, delay between emails, hourly limit
- Sending API choice (wp_mail, SendGrid, Mailgun, SES)
- Configurable API key and endpoint
- Log retention configurable
**🗄️ Database**
- 9 tables total: contacts, lists, list_contacts, campaigns, queue, logs, automations, email_templates, email_logs
- New columns: `design_html` (campaigns), `email_design_html` (automations)
- Automatic creation on plugin activation via dbDelta
- Optimised indexes for frequent queries
**📋 Admin Menu**
- 5 new submenus: Marketing, Campaigns, Contacts, Automations, Visual Builder
- 🔴 Error Report submenu under Email Templates
- Only shown if the module is enabled
##### 🎨 Visual Email Builder (Unlayer)
- Integration of the Unlayer drag & drop editor in a dedicated page (Marketing → Visual Builder)
- Create and manage visual templates: columns, images, buttons, text, dividers
- Save Unlayer JSON + exported HTML to database (table `email_templates`)
- Apply a visual template to a campaign or automation in 1 click
- Confirmation banner "Visual template loaded" with "Remove" button
- `` CSS tags are stripped in TinyMCE (correct display) but preserved for actual sending
- Support for personalisation variables (`{{prenom}}`, `{{email}}`, etc.) in visual templates
##### 📋 15 Ready-to-use Campaign Templates
- **5 original templates**: Newsletter, Product Launch, Promotion, Event, Welcome
- **10 new PRO templates**:
- 📣 Announcement (big news, update)
- 💫 Re-engagement (win-back, inactive customers)
- 🙏 Thank You (post-purchase, loyalty)
- ⭐ Survey (customer review, feedback)
- 🎄 Seasonal (holidays, special offer)
- 🎥 Webinar (training, live event, registration)
- 👑 VIP / Loyalty (reward, exclusive offer)
- 🖼️ Portfolio (services, achievements)
- ⚠️ Urgency (alert, critical deadline)
- 🤝 Referral (invitation, friend bonus)
- Displayed as visual cards with mini email mockups, available in both campaigns AND automations
- Dynamic HTML content with images, colored buttons, CTAs, unsubscribe links
##### 🔴 Email Error Report (Error Log)
- New admin page: Email Templates → 🔴 Error Report
- Real-time logging of all sends: Listeo, WooCommerce, Marketing
- Recorded information: recipient, subject, source, level, error message, timestamp
- Log levels: `success`, `error`, `warning`, `info`
- Advanced filtering: by level, by source, by keyword (text search)
- Automatic purge after 2,000 entries to prevent database overload
- External API errors (Mailgun, SendGrid, SES) captured with full HTTP error message
- Page header aligned with the style of other admin pages
##### 🎨 Marketing Header Colour
- New `let_mkt_header_color` option (default: `#7c3aed`) independent of WooCommerce
- Colour picker integrated directly in the campaign and automation editor
- "Save colour" button with immediate visual feedback
- AJAX save without page reload
##### ✉️ Bug Fixes & Improvements
- Fix: WooCommerce recipient toggles (Customers / Store Administrator) now functional
- Fix: WooCommerce emails for Listeo bookings now correctly use the custom template
- Fix: compatibility with `listeo-paiement-prealable` plugin for WooCommerce emails
- Fix: eliminated duplicate emails when a Listeo booking + WooCommerce order occurs
- Fix: text and links (footer, site name) rendered white in Midnight and Neon templates
- Fix: translation of the "🔴 Error Report" menu item and page subtitle
- Fix: CSS `` block no longer displays as visible text in TinyMCE (visual templates)
- Improvement: live preview of changes without saving for Listeo templates
- Improvement: "Send test" button removed from bottom of page (already in right column)
- Improvement: "Preview" button added to the automations editor
**🌐 Translations**
- +250 new strings (total > 1,100)
- All new features translated: Visual Builder, Error Report, PRO templates, header colour
- .pot, .po (fr_FR, en_US) and .mo files updated
---
## [3.0.0] - 2026-02-08
### 🚀 Major Update — Multi-Platform WooCommerce
---
#### 🇫🇷 Français
##### 🛒 Compatibilité WooCommerce complète
- Le plugin fonctionne désormais avec WooCommerce **sans Listeo Core**
- Compatible Listeo seul, WooCommerce seul, ou les deux simultanément
- Listeo Core n'est plus une dépendance obligatoire
- Nouvelle vérification : au moins Listeo Core OU WooCommerce requis
##### 🛒 13 templates d'emails WooCommerce
- 3 emails admin : Nouvelle commande, Commande annulée, Commande échouée
- 10 emails client : En attente, En cours, Terminée, Remboursée, Facture, Note, Annulée, Paiement échoué, Réinitialisation mot de passe, Nouveau compte
- Interception via `woocommerce_mail_content` avec template professionnel
- Filtres personnalisés sur les sujets et headings
- Variables disponibles : `{order_number}`, `{order_total}`, `{customer_name}`, `{order_date}`, `{site_name}`
##### 📊 Nouveau Tableau de bord
- Première page du menu admin (remplace l'ancienne page Paramètres comme page d'accueil)
- Statut des intégrations : Listeo Core, WooCommerce, Licence (avec badges actif/inactif)
- Liste de 10 plugins Costa compatibles avec statut d'installation
- Liens rapides vers Paramètres, Templates Listeo, Templates Woo, Documentation, Licence
##### 📋 Nouveau menu "Templates Woo"
- Page admin dédiée pour personnaliser les 13 emails WooCommerce
- Groupés par catégorie : Admin/Boutique et Client
- Pour chaque email : activation/désactivation, sujet personnalisé, prévisualisation
- Envoi d'emails de test WooCommerce
- Liste des variables WooCommerce disponibles
##### ⚙️ Paramètres mis à jour
- Section Activation séparée : toggle Listeo + toggle WooCommerce
- Nouvelle section "Destinataires WooCommerce" (conditionnelle si WC actif)
- Destinataires WC : Client et Administrateur boutique
##### 🏷️ Renommage du plugin
- Ancien nom : "Email Template for Listeo"
- Nouveau nom : "Email Template for Listeo & WooCommerce"
**🌐 Traductions**
- 747 chaînes traduisibles (+150 nouvelles chaînes pour WooCommerce, Tableau de bord, Documentation)
- Fichiers .pot, .po (en_US + fr_FR) et .mo régénérés
---
#### 🇬🇧 English
##### 🛒 Full WooCommerce compatibility
- Plugin now works with WooCommerce **without Listeo Core**
- Compatible with Listeo only, WooCommerce only, or both simultaneously
- Listeo Core is no longer a mandatory dependency
- New check: at least Listeo Core OR WooCommerce required
##### 🛒 13 WooCommerce email templates
- 3 admin emails: New order, Cancelled order, Failed order
- 10 customer emails: Pending, Processing, Completed, Refunded, Invoice, Customer note, Cancelled, Failed payment, Password reset, New account
- Interception via `woocommerce_mail_content` with professional template
- Custom filters on subjects and headings
- Available variables: `{order_number}`, `{order_total}`, `{customer_name}`, `{order_date}`, `{site_name}`
##### 📊 New Dashboard
- First page of the admin menu (replaces the old Settings page as the homepage)
- Integration status: Listeo Core, WooCommerce, Licence (with active/inactive badges)
- List of 10 compatible Costa plugins with installation status
- Quick links to Settings, Listeo Templates, Woo Templates, Documentation, Licence
##### 📋 New "Woo Templates" menu
- Dedicated admin page to customise the 13 WooCommerce emails
- Grouped by category: Admin/Store and Customer
- Per email: enable/disable, custom subject, preview
- WooCommerce test email sending
- List of available WooCommerce variables
##### ⚙️ Updated Settings
- Separate Activation section: Listeo toggle + WooCommerce toggle
- New "WooCommerce Recipients" section (conditional if WC active)
- WC recipients: Customer and Store Administrator
##### 🏷️ Plugin rename
- Old name: "Email Template for Listeo"
- New name: "Email Template for Listeo & WooCommerce"
**🌐 Translations**
- 747 translatable strings (+150 new strings for WooCommerce, Dashboard, Documentation)
- .pot, .po (en_US + fr_FR) and .mo files regenerated
---
## [2.0.0] - 2026-02-08
### 🚀 Major Update — 29 Listeo Emails
---
#### 🇫🇷 Français
##### 📋 29 types d'emails Listeo (était 8)
- 6 catégories : Annonces, Réservations, Revendications, Communication, Utilisateurs, Autres
- Annonces : soumission, nouvelle (admin), publication, expiration, expiration proche
- Réservations : attente, confirmation instantanée, gratuite, cash, annulation, paiement, rappels, remboursement
- Revendications : approuvée, rejetée, en attente, complétée, demande admin
- Communication : nouvelle conversation, nouveau message
- Utilisateurs : bienvenue, OTP
- Autres : invitation Zoom, notification d'avis
##### 🔌 Dépendances simplifiées
- Seul Listeo Core reste obligatoire
- WooCommerce, Prepaid Booking, Cancellation Policy, Reject Refund : tous optionnels
- Détection automatique des plugins Costa installés
##### 🚫 Désactivation automatique complète de Listeo Core
- 27 `remove_action()` pour intercepter TOUS les emails Listeo Core
- Couvre : annonces, réservations, revendications, messages, utilisateurs, avis
- Priorités correspondant exactement à celles de Listeo Core
##### 🔍 Vérification avancée des emails Listeo
- 22 options Listeo Core vérifiées (regroupées par catégorie)
- Vérification runtime avec `has_action()` pour confirmer la désactivation
- Lien direct vers les paramètres Listeo Core
**🌐 Traductions**
- 627 chaînes traduisibles
- Fichiers .pot, .po (en_US + fr_FR) et .mo
---
#### 🇬🇧 English
##### 📋 29 Listeo email types (was 8)
- 6 categories: Listings, Bookings, Claims, Communication, Users, Others
- Listings: submission, new (admin), published, expired, expiring soon
- Bookings: pending, instant confirmation, free, cash, cancellation, payment, reminders, refund
- Claims: approved, rejected, pending, completed, admin request
- Communication: new conversation, new message
- Users: welcome, OTP
- Others: Zoom invitation, review notification
##### 🔌 Simplified dependencies
- Only Listeo Core remains mandatory
- WooCommerce, Prepaid Booking, Cancellation Policy, Reject Refund: all optional
- Automatic detection of installed Costa plugins
##### 🚫 Full automatic deactivation of Listeo Core emails
- 27 `remove_action()` calls to intercept ALL Listeo Core emails
- Covers: listings, bookings, claims, messages, users, reviews
- Priorities matching exactly those of Listeo Core
##### 🔍 Advanced Listeo email verification
- 22 Listeo Core options checked (grouped by category)
- Runtime verification with `has_action()` to confirm deactivation
- Direct link to Listeo Core settings
**🌐 Translations**
- 627 translatable strings
- .pot, .po (en_US + fr_FR) and .mo files
---
## [1.1.1] - 2026-01-17
### 🌐 Loco Translate Compatibility & Translations
---
#### 🇫🇷 Français
##### 🔍 Détection dynamique des langues
- La liste des langues dans les paramètres scanne automatiquement les fichiers `.mo`
- Détection dans le dossier `languages/` du plugin
- Détection dans le dossier global WordPress (`wp-content/languages/plugins/`)
- Nouvelles langues ajoutées avec Loco Translate apparaissent automatiquement
##### 📂 Chargement multi-emplacements
- Vérifie d'abord le dossier global Loco Translate
- Puis le dossier du plugin
- Compatible avec le système WordPress standard
##### 📝 Documentation
- Nouvelle section "Traductions & Loco Translate" ajoutée à la documentation (Section 8)
- Instructions détaillées pour ajouter de nouvelles langues
- Explication de la structure des fichiers de traduction
---
#### 🇬🇧 English
##### 🔍 Dynamic language detection
- The language list in settings automatically scans `.mo` files
- Detection in the plugin's `languages/` folder
- Detection in the global WordPress folder (`wp-content/languages/plugins/`)
- New languages added via Loco Translate appear automatically
##### 📂 Multi-location loading
- Checks the global Loco Translate folder first
- Then the plugin folder
- Compatible with the standard WordPress system
##### 📝 Documentation
- New "Translations & Loco Translate" section added to documentation (Section 8)
- Detailed instructions for adding new languages
- Explanation of the translation file structure
---
v1.10
📅 04 janvier 2026
## [1.1.0] - Janvier 2026
🆕 Nouvelles fonctionnalités
**💰 Variables Acompte (Deposit System)**
- `{deposit_amount}` - Montant de l'acompte payé
- `{balance_amount}` - Montant du solde restant
- `{balance_status}` - Statut du solde (Payé / En attente)
- `{balance_due_date}` - Date d'échéance du solde
**💳 Variable Méthode de Paiement**
- `{payment_method}` - Méthode de paiement utilisée
- Carte bancaire (Stripe)
- PayPal
- WiPay
- Espèces (Cash)
🔧 Améliorations
- Fonction `prepare_booking_data()` améliorée avec détection automatique de la méthode de paiement
- Détection intelligente depuis les métadonnées WooCommerce et LPP
- Labels traduits pour chaque méthode de paiement (FR/EN)
- Données de test mises à jour avec exemples d'acompte
📚 Documentation
- Nouvelle section "Variables Acompte & Paiement" dans la documentation
- Affichage visuel des nouvelles variables avec codes couleurs
- Descriptions détaillées pour chaque placeholder
🌍 Traductions
- Ajout des traductions anglaises pour toutes les nouvelles fonctionnalités
- "Credit card (Stripe)", "PayPal", "WiPay", "Cash"
- "Deposit amount", "Balance amount", "Balance status", etc.
---
## [1.0.0] - Décembre 2025
🎉 Version initiale
**📧 Templates d'emails personnalisables**
- 8 types d'emails différents (confirmation, annulation, rejet, etc.)
- Templates pour client, vendeur et admin
- Design moderne et responsive
**🎨 Personnalisation visuelle**
- Couleur primaire configurable
- Logo personnalisable (via WooCommerce)
- Header et footer stylisés
**✏️ Variables dynamiques**
- `{booking_id}` - Numéro de réservation
- `{listing_name}` - Nom du listing
- `{client_name}` - Nom du client
- `{vendor_name}` - Nom du vendeur
- `{booking_date}` - Date de réservation
- `{booking_time}` - Heure de réservation
- `{total_amount}` - Montant total
- `{site_name}` - Nom du site
**👁️ Prévisualisation et test**
- Aperçu en temps réel des emails
- Envoi d'emails de test
- Données de prévisualisation réalistes
**🛒 Intégration WooCommerce**
- Utilise les paramètres email WooCommerce
- Nom d'expéditeur, adresse email, logo
- Couleurs et styles cohérents
**🔗 Intégrations**
- Compatible Listeo Core
- Compatible WooCommerce
- Compatible Prepaid Booking for Listeo
- Compatible Reject Refund for Listeo
- Compatible Cancellation Policy for Listeo
**🌍 Multilingue**
- Support complet français et anglais
- Fichiers de traduction .po/.mo inclus
**🔒 Sécurité**
- Système de licence premium
- Validation des données
---
**Auteur :** Costel BWATA
**Site :** https://costaplugin.com