Trackily Docs

Centre de préférences des contacts

Au lieu de tout quitter, ton contact peut choisir ses listes, recevoir moins (au plus 1 e-mail par semaine ou par mois) ou faire une pause (30 ou 90 jours). Chaque e-mail porte un lien « Gérer mes préférences » à côté de « Se désinscrire ». Moins de désinscriptions, moins de plaintes.

Concept

Une page par adresse, sans connexion. Le lien du pied mène à /preferences/<jeton> : le jeton est celui du lien de désinscription d'une ligne d'abonné, et il désigne l'adresse. La page montre les listes actives où cette adresse est inscrite chez la même marque d'envoi que la liste du lien (même domaine d'adresse d'expéditeur effective : un contact d'une boutique ne découvre pas les listes d'une autre), avec une case par liste, et deux réglages qui valent pour l'adresse entière (toutes listes confondues). Elle ne montre jamais rien d'une autre adresse.

Le serveur rend le verdict. Les réglages sont appliqués au moment où chaque e-mail part : ni l'écran, ni toi n'avez quoi que ce soit à recalculer.

Ce que le contact voit

Partie Ce qu'elle fait
Vos listes Une case par liste active où l'adresse est inscrite, désinscrite (il peut s'y réinscrire) ou en attente de confirmation. Décocher = se désinscrire de cette liste. Recocher une liste à double opt-in envoie l'e-mail de confirmation habituel, avec un lien de confirmation neuf (au plus 3 par adresse et par 24 h depuis la page).
Recevoir moins Sans limite, au plus 1 e-mail par semaine, au plus 1 e-mail par mois.
Faire une pause Pause de 30 ou 90 jours (la date de fin s'affiche), ou reprendre maintenant.
Ne plus rien recevoir de ces listes Désinscrit l'adresse des listes montrées, comme le lien de désinscription : les e-mails déjà en file ne partent pas (ceux d'une commande non plus).

Jamais montrées : une liste où l'adresse a rebondi ou porté plainte, une liste nettoyée, inactive ou supprimée. Une adresse en suppression voit la page entièrement désactivée, avec la phrase qui l'explique : rien ne s'y règle.

On ne touche que ce qui a été montré. Le formulaire porte la liste des listes affichées : une liste que l'adresse a rejointe entre l'affichage et l'envoi du formulaire n'est pas touchée. La promesse « les e-mails liés à vos commandes arrivent toujours » n'est écrite que pour la pause et la fréquence. Sur une base où la migration v147 manque, seules les cases de listes sont proposées.

La page est autonome (aucun script, aucune ressource externe), lisible sur mobile, accessible au clavier et aux lecteurs d'écran, dans la langue de la liste du lien.

Ce que les réglages retiennent

E-mail Pause Fréquence
Envoi ponctuel (newsletter, promo) Sauté — skipped, motif pause_contact Sauté — frequence_contact
Étape de séquence sans commande (bienvenue, nurturing, relance de panier…) Reportée à la fin de la pause Reportée au premier moment permis
E-mail lié à une commande (post-achat, relance d'annulation) jamais retenu jamais retenu
Confirmation de double opt-in jamais retenue jamais retenue
  • La fréquence compte les e-mails partis ou en train de partir (sent, sending) pour l'adresse — jugée au moment où l'envoi est pris, sous un verrou par adresse : deux serveurs Trackily ne font jamais partir deux e-mails dans la même fenêtre —, toutes listes confondues, sur 7 jours glissants (« par semaine ») ou 30 jours (« par mois »). Seuls les e-mails soumis à la règle comptent : un e-mail de commande ne « consomme » pas la semaine du contact.
  • Une étape reportée reste en file, marquée (last_error = pause_contact ou frequence_contact) : aucune tentative n'est consommée, elle repart d'elle-même à la nouvelle échéance (et passe alors par toutes les règles habituelles : parcours, suppression…). La marque s'efface quand elle part.
  • La suite suit. Reporter une étape décale toute la suite de la séquence de cet abonné du même écart : l'espacement entre étapes est gardé, jamais une rafale à la fin d'une pause.
  • Un report se défait. Quand le contact (sa page) ou toi (admin, MCP) levez ou raccourcissez la pause, ou retirez la limite, les envois marqués reviennent à GREATEST(maintenant, nouvelle échéance), espacement gardé.
  • Un envoi ponctuel sauté ne repart pas : c'était une promo du moment, pas un rendez-vous.
  • Une adresse sans aucun réglage ne coûte rien au moteur : ses préférences sont lues dans la même requête que le reste de l'e-mail.

Le pied de chaque e-mail

Deux liens, dans la langue de la liste :

Langue (langue_contact) Liens
en (par défaut) Unsubscribe · Manage preferences
fr Se désinscrire · Gérer mes préférences
ar (de droite à gauche) إلغاء الاشتراك · إدارة تفضيلاتي

« Se désinscrire » reste le lien d'avant, inchangé : un clic quitte CETTE liste. L'en-tête List-Unsubscribe (le bouton de désinscription de Gmail, Outlook…) ne change pas. Ton message de désinscription personnalisé, s'il existe, reste affiché tel quel.

Dans tes modèles, la variable {{preferences_url}} donne le lien de la page (par exemple pour un bouton « Recevoir moins » dans une newsletter). Ce lien n'est jamais compté comme un clic.

Régler la langue d'une liste

Dans les réglages de la liste : Langue des e-mails pour les contacts (English / Français / العربية), avec l'aperçu du pied. Par MCP :

{ "name": "update_email_list", "arguments": { "id": 12, "langue_contact": "fr" } }

Les listes existantes restent en anglais tant que tu ne changes rien. langue_contact s'accepte aussi à la création d'une liste (POST /admin/api/email/lists), validée de la même façon (400 langue_invalide hors en, fr, ar).

Pour l'aperçu, GET /admin/api/email/preferences/textes rend les textes simples du pied dans les trois langues — { en: { recu, desinscrire, preferences }, fr, ar }, sans HTML, {liste} à la place du nom de la liste dans recu — et le détail d'une liste rend pieds_apercu, son pied dans chaque langue tel que le moteur l'ajoute.

Ce que tu vois dans l'admin

  • Chronologie d'un abonné : la phrase du serveur, par exemple « Préférences : en pause jusqu'au 12 novembre 2026, au plus 1 e-mail par semaine », avec Lever la pause et Retirer la limite (après confirmation). Chaque changement — du contact ou de toi — apparaît comme un événement preferences (avant / après) ; une désinscription faite depuis la page est un événement unsubscribe ordinaire (il compte dans le score).
  • Liste des abonnés : une étiquette « en pause » ou « limité » quand c'est le cas.

Tu peux lever une pause ou une limite à la demande du contact. Tu ne peux pas en imposer : c'est le choix du contact, depuis sa page.

Les formes que l'écran lit :

Où Forme
Chronologie d'un abonné preferences: { pause_jusqu_au, frequence, libelle } — libelle null quand rien n'est réglé
GET /admin/api/email/preferences/:email { email, pause_jusqu_au, frequence, listes: [{ list_id, name, status }], libelle, etiquette, etiquette_libelle, supprimee, mis_a_jour_at }
PUT /admin/api/email/preferences/:email corps partiel { pause_jusqu_au: null } et/ou { frequence: null } ; rend { ok, inchangees, preferences } (preferences = la lecture du GET) ; une valeur non nulle → 400 reglage_invalide
Chaque ligne de la liste des abonnés preferences_etiquette (en_pause | limite | null) et preferences_etiquette_libelle (« en pause », « limité »)

Sécurité

  • L'URL est l'autorisation, comme pour le lien de désinscription : qui détient le lien (un e-mail transféré compris) peut ouvrir la page et agir. Le formulaire porte un jeton signé par ton serveur (valable 24 h, lié au lien du contact) qui empêche seulement qu'un autre site fasse poster le navigateur du contact à son insu. Une page restée ouverte plus de 24 h demande simplement d'être rechargée.
  • Le lien de la page ne confirme pas un double opt-in : une réinscription crée un jeton de confirmation neuf, seul accepté par le lien de confirmation (les lignes plus anciennes, sans ce jeton, gardent leur ancien lien). L'inscription double opt-in ordinaire reçoit aussi ce jeton neuf.
  • Atomique : un enregistrement s'applique en une transaction — une panne en route n'applique rien.
  • Un geste, une pénalité : les désinscriptions d'un même enregistrement portent le même identifiant de geste ; le score ne retire ses points qu'une fois.
  • Limite de débit par IP : 60 ouvertures de page par minute, 20 enregistrements par 10 minutes.
  • Lien inconnu : la même page « Ce lien n'est plus valide » pour tous, sans rien révéler.
  • La page n'est jamais mise en cache, jamais indexée, n'envoie pas de référent et ne s'affiche pas dans un cadre.
  • Les événements preferences ne gardent ni l'IP ni le navigateur.

MCP

Outil Rôle
get_email_contact_footer_texts Les textes simples du pied dans les trois langues.
get_email_contact_preferences Les préférences d'une adresse : pause, fréquence, listes, phrase, étiquette.
update_email_contact_preferences Lève la pause (pause_jusqu_au: null) et/ou la limite (frequence: null) ; rend { ok, inchangees, preferences }. Tier 1.
update_email_list langue_contact : en, fr ou ar.

get_email_subscriber_timeline rend aussi preferences, et list_email_subscribers l'étiquette de chaque ligne (preferences_etiquette).

Voir aussi