Email Marketing
Trackily embarque un ESP complet : listes, autoresponders (sequences), envois ponctuels (newsletters, promos) et segments dynamiques, serveurs SMTP, suppression, opt-in / double opt-in, tracking opens/clicks, Send-Time Optimization, et déclencheurs basés sur tes conversions affiliées. Aucun Mailchimp / Klaviyo à payer en parallèle.

Concept
L'email marketing dans Trackily n'est pas un add-on bricolé : c'est un sous-système qui partage la même DB, le même worker, les mêmes tokens MCP et les mêmes scopes que le reste de l'app. Tu manipules les mêmes notions qu'un Mailchimp — liste, subscriber, sequence, step, send — mais avec deux singularités qu'un ESP classique ne peut pas offrir :
- Conversion → enrollment automatique. Quand un postback affiliate
/postbackarrive pour une offre donnée, Trackily peut auto-enrôler l'acheteur dans une liste, qui démarre alors la sequence par défaut (thank-you, cross-sell, ascension). Un ESP classique ne voit jamais tes postbacks. - Landing → liste binding natif. Chaque landing peut être liée à une liste : toute soumission de formulaire enrôle automatiquement, sans ZapierMake/webhook intermédiaire.
Pourquoi c'est intégré
L'argument commercial est simple : tu te débarrasses d'une dépendance externe à 30-200$/mois, tu gardes toutes tes data first-party, et tu peux automatiser des flows que personne d'autre ne peut faire (parce que personne d'autre n'a accès à tes postbacks réseau ni à tes leads issus de prelanders).
L'argument technique est plus subtil : le moteur d'email réutilise la même infrastructure de scheduling que le reste de Trackily. Le email_sends.scheduled_at est lu par le même cron tick que tes campaigns, ton automizer et tes flows. Pas de queue Redis à déployer, pas de worker séparé à monitorer.
Architecture en une image
┌────────────────────────────────────────────────────────┐
│ EMAIL SUBSYSTEM │
└────────────────────────────────────────────────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ email_ │───▶│ email_ │───▶│ email_ │───▶│ email_ │
│ smtp_ │ │ lists │ │ sequences │ │ sequence_ │
│ servers │ │ │ │ │ │ steps │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
▲ ▲ │
│ │ ▼
│ ┌─────────────┐ ┌─────────────┐
│ │ email_ │ ◀───── schedule ─────│ email_ │
│ │ subscribers│ │ sends │
│ └─────────────┘ └─────────────┘
│ ▲ │
│ │ ▼
┌─────────────┐ │ ┌─────────────┐
│ email_ │ │ │ email_ │
│ suppression│──────────┘ │ events │
└─────────────┘ (block list, │ (open/click)│
cross-list, └─────────────┘
bounces +
complaints)
Les 5 tables racines
| Table | Rôle |
|---|---|
email_smtp_servers |
Relais SMTP (Mailgun, SendGrid, Postmark, SES, Gmail). Quotas, From/Reply-To, mot de passe chiffré AES-256-GCM via SECRETS_MASTER_KEY. |
email_lists |
Liste d'abonnés. Réglages opt-in, tracking, sequence par défaut, override From/Reply-To. |
email_subscribers |
Abonnés. UNIQUE (list_id, lower(email)) empêche les doublons par liste. Status : subscribed, pending_confirm, unsubscribed, complained, bounced, nettoye (v142 — retirée par un nettoyage, jamais envoyée). |
email_sequences + email_sequence_steps |
Autoresponders : suite ordonnée de steps déclenchés N minutes/heures/jours après l'enrollment. |
email_sends |
Audit log de TOUT message queué/envoyé. Sert aussi de dedup gate (impossible d'envoyer deux fois le même step au même subscriber). |
email_events |
Opens, clicks, unsubscribes, bounces, complaints. BIGSERIAL — peut grossir vite. |
email_segments |
v140 — audiences décrites par des conditions à liste blanche (« a cliqué ces 30 jours », « pays = MA »), recalculées à chaque lecture. |
email_broadcasts |
v140 — envois ponctuels : un contenu, une audience (segment ou listes), un statut ; l'audience est figée au lancement. Leurs e-mails sont des email_sends portant broadcast_id. |
email_suppression |
Blocklist GLOBALE (cross-list). Un hard bounce ou une complaint passe ici, et plus jamais aucune liste ne pourra ré-enroller cet email. |
email_retours |
v141 — le journal des retours reçus (rebonds différés, plaintes, avis ignorés ou illisibles) : type, adresse, envoi rattaché, effet. Gardé 180 jours. |
email_nettoyages + email_nettoyage_lignes |
v142 — les analyses « Nettoyer la liste » (statut, progression, motifs appliqués) et leurs seules lignes à motif ; suppression_posee borne l'annulation à ce que le nettoyage a posé. |
email_scores |
v144 — le score de chaque adresse (lower(email)) : score, chaleur, détail des points, recalculé par lots dans le tick. |
email_preferences |
v147 — les préférences qu'une adresse règle sur sa page publique : pause (fin) et fréquence (1 par semaine ou par mois). Une ligne seulement quand le contact règle quelque chose. |
email_etiquettes + email_contact_etiquettes |
v149 — les étiquettes : le catalogue (nom, couleur, « depuis un formulaire ») et qui porte quoi, par adresse (lower(email)). email_etiquettes_regles et email_etiquettes_curseur : les règles automatiques et le curseur de leur passage dans le tick. |
visites_pages + email_contact_visiteurs |
v150 — les visites du site : une page vue par ligne (chemin sans requête, type, ressource) sur les domaines où le suivi est activé avec consentement, et le rattachement d'un visiteur à UNE adresse (clic dans un e-mail, formulaire, commande). 13 mois. |
email_smtp_debit |
v151 — le débit d'envoi : le seau à jetons de chaque serveur SMTP (jetons, dernier remplissage, dernier freinage du fournisseur), partagé entre conteneurs. Les réglages vivent sur email_smtp_servers (debit_minute, connexions_max) ; email_sends.transport_appele_at date l'appel au serveur SMTP (reprise des envois interrompus). |
email_formulaires + email_formulaires_versions + email_formulaires_jours |
v152 — les formulaires d'inscription autonomes (page /form/<slug>, extraits iframe et HTML pur) : réglages, versions du texte de consentement, compteurs journaliers sans identité (vues, envois, inscriptions, suspects). |
Le flow nominal
- Tu crées un serveur SMTP (Mailgun, SES…) dans
Settings → Email — SMTPou via MCPcreate_email_smtp_server. - Tu crées une liste et tu la lies à ce SMTP (
create_email_list). - Tu crées une sequence sur la liste (
create_email_sequence) — la première sequence (cible « commande active ») devient automatiquement ladefault_sequencede la liste. Une sequence peut aussi cibler les commandes annulées (cible_commande: 'annulee', relance avec code promo) ; et une étape inscrite par un achat est sautée si la commande est annulée (Sequences, section « Cible »). - Tu ajoutes des steps (
add_email_sequence_step) : subject, preheader, body_html, body_text, delay_days/hours/minutes depuis l'enrollment. - Tu enrolles des subscribers — manuellement (
enroll_email_subscriber), via le binding landing→liste, ou via un trigger conversion. - Le worker tourne en continu : pour chaque subscriber actif, il calcule les steps "dus maintenant" et insère des
email_sendsàstatus='queued'. - À chaque tick (toutes les 60 s), le worker prend les sends queued dus, route via le SMTP de la liste, met à jour
status='sent', et stocke lemessage_idretourné par le MTA. Depuis la v151, chaque serveur part à son débit (60 e-mails par minute et 3 envois simultanés par défaut, jusqu'à 2 000 par minute) : la file repasse toutes les 5 s tant qu'il reste des envois dus, les envois partent en parallèle, jamais deux fois (Débit d'envoi). Il applique les deux plafonds du serveur, celui du jour (jour UTC) et celui de l'heure (fenêtre glissante d'une heure) : plafond atteint, l'envoi attend sans consommer de tentative. Un serveur désactivé ou une liste sans SMTP retient l'envoi jusqu'à 24 h après son échéance, puis il échoue ensmtp_indisponible(détails : SMTP Servers). - Quand un destinataire ouvre / clique, un pixel ou un redirect signé loggue dans
email_events(le lien/k/porte un HMAC de l'envoi et de l'URL : seul un lien signé redirige ; un lien modifié, ou un ancien lien d'avant la signature, affiche une page « Vous quittez … » à cliquer — jamais de redirection ouverte). Les refus immédiats du serveur SMTP sont captés à l'envoi ; les rebonds différés et les plaintes arrivent par la porte des retours (webhooks Brevo, Mailgun, Postmark, SendGrid, SES, ou avis bruts d'un serveur maison) — à condition de l'avoir branchée. - Rebond dur (immédiat ou différé) ou plainte = ajout automatique à
email_suppression→ plus jamais réémis vers cet email, depuis n'importe quelle liste. Une erreur du serveur (identifiant, connexion, relais refusé, IP sur liste noire) n'est jamais un rebond.
Où ça se trouve dans l'admin
L'accordéon Email Marketing dans la sidebar regroupe les pages :
- Lists — créer, éditer, soft-delete. Voir les subscribers d'une liste, le compteur, les sequences attachées.
- Sequences — visual builder de l'autoresponder. Reorder, preview, send-test.
- Envois ponctuels — écrire un e-mail une fois et l'envoyer à une audience, maintenant ou à une date ; verdict, progression et statistiques de chaque envoi (Envois ponctuels).
- Segments — décrire une audience par des conditions, avec le compte en direct (Segments).
- Score des contacts — la répartition froid / tiède / chaud, les plus chauds et le réglage, en tête de la page Segments (Score des contacts).
- Serveurs SMTP — gérer les relais, lire le verdict « Peut envoyer ? » de chacun (capacité restante du jour et de l'heure), vérifier la connexion sans envoyer d'e-mail, ou envoyer un e-mail d'essai. « Brancher les retours » donne les URL secrètes des webhooks (Retours) ; le tiroir d'un serveur montre ses retours sur 7 jours.
- Sends Log — audit des emails (queued / sending / sent / failed / bounced). Filtre par status, liste, email.
- Formulaires — les formulaires d'inscription autonomes : construire, prévisualiser, publier (lien, extrait iframe, extrait HTML pur), vues / inscriptions / taux sur 30 jours (Formulaires d'inscription).
- Suppression — view-only de la blocklist globale + ajout manuel via UI ou MCP, et le journal des retours reçus.
Les conversion triggers ne vivent pas dans la sidebar : ils se configurent depuis la page MCP Autopilot ou la page Email — Lists (sous l'onglet "Triggers" d'une liste donnée).
Variables de templating
Dans subject, preheader, et body_html, ces placeholders sont rendus au moment de l'envoi :
{{first_name}}— premier mot duname, ou la partie avant@de l'email{{name}}—email_subscribers.name{{email}}— adresse{{country}}— country code ISO{{custom.X}}— n'importe quel champ deemail_subscribers.custom_fieldsJSONB{{unsubscribe_url}}— lien one-click (auto-injecté en footer + dansList-Unsubscribeheader){{preferences_url}}— la page de préférences de l'adresse (auto-injectée en footer, « Gérer mes préférences ») ; jamais comptée comme un clic{{list_name}}— nom de la liste{{bloc.nom}}— un bloc dynamique de l'envoi ou de l'étape (dansbody_htmletbody_textseulement) : la première variante dont les conditions conviennent au contact, sinon le contenu par défaut ; les variables ci-dessus marchent dedans
Voir aussi
- Lists — gestion des listes, opt-in modes, GDPR
- Sequences — builder d'autoresponder, exemple de welcome series
- Envois ponctuels — newsletter, promo, annonce : un e-mail, une audience, une date
- Segments — les conditions d'une audience qui se tient à jour seule
- Éditeur visuel — composer un e-mail sans écrire de HTML (blocs, modèles de départ, HTML compatible messageries), pour les envois ponctuels et les étapes de séquence
- Score des contacts — qui est chaud : un score par adresse sur 90 jours glissants, froid / tiède / chaud, utilisable dans les segments et les parcours
- Contenu dynamique — un seul e-mail, des passages différents selon le contact (client ou nouveau, pays, score…) : blocs à variantes, aperçu « voir comme », statistiques par variante
- Étiquettes des contacts — ranger les contacts avec tes mots (« vip », « salon-casablanca »), à la main, en masse, depuis un formulaire ou par des règles ; utilisables dans les segments, les parcours et le contenu dynamique
- Visites du site par contact — ce qu'un contact a regardé sur tes pages (landings, vitrine, funnels), avec consentement ; dans sa chronologie, les segments, les parcours, le contenu dynamique et les règles d'étiquettes
- Centre de préférences — le contact choisit ses listes, reçoit moins (1 par semaine ou par mois) ou fait une pause au lieu de tout quitter ; pied d'e-mail en anglais, français ou arabe
- SMTP — Mailgun, SendGrid, Postmark, SES, Gmail
- Débit d'envoi — combien d'e-mails partent par minute, serveur par serveur (60 par défaut, jusqu'à 2 000), ses risques, des exemples de réglage
- Suppression — pourquoi c'est critique pour la réputation
- Retours — brancher les rebonds différés et les plaintes (Brevo, Mailgun, Postmark, SendGrid, SES, Postfix)
- Nettoyer une liste — retirer avant d'envoyer, sans rien envoyer : syntaxe, fautes de frappe, jetables, DNS ; annulable 30 jours
- Formulaires d'inscription — un formulaire autonome sur une page hébergée ou collé sur n'importe quel site (iframe, HTML pur) : double opt-in, consentement versionné et prouvé, étiquettes, anti-abus sans CAPTCHA, réponse identique pour tous
- Automations — landing→liste, post-purchase, abandoned cart, conversion triggers
- Magic Link — passwordless auth pour les clients
- MCP Autopilot — pilote toutes ces tables depuis Claude / Cursor