Trackily Docs

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) ou une (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