Segments
Un segment, c'est une audience décrite par des conditions : « a cliqué ces 30 jours », « a acheté », « pays = MA ». Il se tient à jour tout seul — un nouvel abonné qui remplit les conditions y entre, sans rien refaire — et tu le réutilises d'un envoi ponctuel à l'autre.
Concept
Un segment a :
- des listes ciblées (
list_ids) — vide = toutes les listes actives ; - un mode (
match) :toutes(toutes les conditions, ET) ouune(au moins une, OU) ; - des conditions — aucune condition = toute l'audience des listes ciblées.
Quelles que soient les conditions, un segment ne contient que des abonnés subscribed d'une liste active et non supprimée, absents de la suppression. Une adresse présente sur plusieurs listes n'est comptée qu'une fois, sur la liste au plus petit identifiant.
Les conditions jugent l'adresse, pas une ligne. Trackily choisit d'abord la ligne retenue de chaque adresse (la liste ciblée au plus petit identifiant), puis les conditions d'activité — inscrit, ouverture, clic, envoi_ponctuel, conversion, activite — regardent toutes les inscriptions de cette adresse, sur toutes les listes : quelqu'un qui a ouvert un e-mail de la liste A n'est pas « sans ouverture » parce qu'il est aussi sur la liste B. inscrit lit sa première inscription, activite sa dernière activité, score et chaleur le score de l'adresse, etiquette les étiquettes de l'adresse, visite les pages vues de tous ses appareils rattachés. pays, source et champ_perso lisent la ligne retenue. Le nombre affiché par l'aperçu est exactement celui qui partira au lancement.
Le nombre de contacts que l'écran affiche est celui du serveur, recalculé à chaque lecture : un segment n'est jamais une photo. La photo, c'est l'envoi ponctuel qui la prend, au moment de son lancement.
Les conditions
Une condition s'écrit { "champ": "...", "op": "...", "jours": N, "valeur": ..., "cle": "..." }. jours est un entier de 1 à 3 650.
| Champ | Opérateurs | Valeur | Ce que ça teste |
|---|---|---|---|
inscrit |
depuis_moins_de, depuis_plus_de |
jours |
la date d'inscription |
ouverture |
a_ouvert, n_a_pas_ouvert |
jours |
une ouverture d'e-mail dans les N derniers jours |
clic |
a_clique, n_a_pas_clique |
jours |
un clic dans les N derniers jours |
envoi_ponctuel |
a_recu, a_ouvert, a_clique, n_a_pas_ouvert, n_a_pas_clique |
valeur = id de l'envoi |
la réaction à un envoi précis ; n_a_pas_ouvert = l'a reçu et ne l'a pas ouvert (relancer les non-ouvreurs) |
pays |
est, n_est_pas |
valeur = codes ISO (["MA", "FR"]) |
le pays de l'abonné ; sans pays connu, il « n'est pas » MA |
source |
est, n_est_pas |
valeur = sources |
la source d'inscription (casse ignorée) |
champ_perso |
egal, different, contient, existe, n_existe_pas |
cle + valeur texte |
un champ personnalisé (casse ignorée) ; existe = renseigné et non vide |
achat |
a_achete, n_a_jamais_achete |
jours et valeur = id de boutique, facultatifs |
une commande payée, ni annulée ni remboursée, à cette adresse |
conversion |
a_converti, n_a_pas_converti |
valeur = id d'offre et jours, facultatifs |
une conversion approuvée reliée au lead de l'abonné |
activite |
depuis_moins_de, depuis_plus_de |
jours |
la dernière activité (ouverture, clic) ; depuis_plus_de compte aussi celui qui n'a jamais rien fait depuis son inscription |
score |
superieur_ou_egal, inferieur_a |
valeur = un entier |
le score de l'adresse (90 jours glissants) ; une adresse pas encore notée vaut 0 |
chaleur |
est |
valeur = froid, tiede ou chaud |
la chaleur du score ; une adresse pas encore notée est froid |
etiquette |
a, n_a_pas |
valeur = ids d'étiquettes ([3, 7]) |
les étiquettes de l'adresse : a = au moins une, n_a_pas = aucune ; un id inexistant est refusé |
visite |
a_visite, n_a_pas_visite |
valeur = { "type": "produit", "ressource_id": 12 } ou { "type": "landing", "texte": "caftan" }, jours facultatif (30 par défaut, 1 à 395) |
les pages vues par les appareils rattachés à l'adresse : un type de page (landing, produit, collection, panier, checkout, funnel, autre), et facultativement une ressource précise (landing, produit, étape de funnel) ou un morceau du chemin (sans casse) ; proposé seulement quand la v150 est appliquée |
Le catalogue complet — libellés français, valeurs proposées (pays et sources présents, clés de champs personnalisés, envois terminés, boutiques, offres) — se lit sur GET /admin/api/email/segments/champs ou avec l'outil MCP get_email_segment_fields. L'écran ne propose que ce catalogue.
Exemples
Relancer ceux qui n'ont pas ouvert la promo n° 12, au Maroc seulement :
{
"name": "Promo 12 — non-ouvreurs MA",
"list_ids": [3],
"match": "toutes",
"conditions": [
{ "champ": "envoi_ponctuel", "op": "n_a_pas_ouvert", "valeur": 12 },
{ "champ": "pays", "op": "est", "valeur": ["MA"] }
]
}
Les clients actifs, ou ceux qui ont cliqué ce mois-ci :
{ "match": "une", "conditions": [
{ "champ": "achat", "op": "a_achete", "jours": 90 },
{ "champ": "clic", "op": "a_clique", "jours": 30 }
] }
Sécurité : les conditions ne sont jamais du SQL
Chaque condition est vérifiée contre une liste blanche (champ, opérateur, forme de la valeur) puis traduite en SQL paramétré : les valeurs que tu saisis partent toujours en paramètres, jamais collées dans la requête. Une clé de champ personnalisé ne peut contenir que des lettres, chiffres, _, . et - (64 caractères au plus). Un champ ou un opérateur inconnu, une valeur mal formée → refus 400 condition_invalide qui nomme la condition fautive (« Condition n° 2 : … »). Un segment compte 30 conditions au plus.
Dans l'admin
Email Marketing → Segments : la liste des segments (listes, nombre de contacts, nombre d'envois qui les utilisent), et le constructeur : listes ciblées, « toutes / au moins une », lignes de conditions (champ → opérateur → valeur), et le compte en direct avec les 20 premiers contacts.
Supprimer un segment
La suppression est douce (le segment disparaît des listes, les envois passés gardent leur audience figée). Elle est refusée (409 segment_utilise, qui nomme l'envoi) tant qu'un envoi programmé ou en cours s'en sert : déprogramme ou annule l'envoi d'abord. La modification aussi : un segment sous un envoi programmé ou en cours ne change pas — l'audience annoncée est celle qui part. Un brouillon qui le cible ne bloque pas : il perdra son audience, et sa programmation sera refusée (audience_vide) tant que tu n'en auras pas choisi une autre.
Les refus de cette page : condition_invalide (400, nomme la condition), requete_invalide (400, nom manquant, liste inconnue), introuvable (404), segment_utilise (409).
Via MCP
| Outil | Tier | Rôle |
|---|---|---|
get_email_segment_fields |
lecture | le catalogue des conditions |
preview_email_segment |
lecture | compter une audience sans l'enregistrer (total, par liste, 20 premiers) |
list_email_segments, get_email_segment |
lecture | liste (detail: true ajoute total et utilise_par_n) et détail |
create_email_segment, update_email_segment |
T1 | créer, modifier en partie |
delete_email_segment |
T2 | supprimer (aperçu + jeton de confirmation) |
API (admin)
Sous /admin/api, lecture landings:read, écriture landings:write :
GET /email/segments/champs · POST /email/segments/apercu { list_ids, match, conditions } · GET /email/segments (?detail=1 ajoute à chaque segment total, son nombre de contacts actuel, et utilise_par_n, le nombre d'envois non supprimés qui le ciblent ; 50 par page, ?page=) · GET /email/segments/:id · POST /email/segments · PUT /email/segments/:id · DELETE /email/segments/:id.
Voir aussi
- Envois ponctuels — envoyer à un segment
- Lists — les abonnés et leurs statuts
- Suppression — toujours exclue d'un segment
- Score des contacts — cibler qui est chaud, repérer les inactifs
- Étiquettes des contacts — cibler « vip », « salon-casablanca »…
- Visites du site par contact — cibler « a vu le produit X ces 7 jours sans acheter »