Centre de préférences : page publique opt-in/opt-out
Le centre de préférences est une page publique où un contact gère ses propres opt-ins par canal, ses sujets d’abonnement, sa fréquence de message et (si vous l’activez) dépose une demande de suppression de données — pas de compte, pas de connexion. Chaque contact y accède via un lien signé : l’URL porte un jeton HMAC-SHA256 (v1.<payload>.<signature>) qui expire après 30 jours, de sorte que la page reste en libre-service mais limitée à un seul contact dans une seule organisation.
La surface des points d’accès résumée vit aussi dans Barrières d’envoi ; ce guide est le parcours complet : chaque champ de configuration, où placer le lien, ce que renvoie l’API de la page publique et quelles surfaces de conformité un opt-out ou opt-in écrit.
Tous les points d’accès ci-dessous sont racinés à https://api.orbit.devotel.io/api/v1/compliance.
Original anglais : Preference center: the public opt-in/opt-out page.
Le centre de préférences est un contrôle appartenant au locataire : vous choisissez les canaux, les sujets et le branding, et votre organisation détient la preuve de consentement. Orbit exploite la plateforme ; la décision de consentement appartient au contact. Ce guide n’est pas un avis juridique — confirmez vos obligations avec votre conseiller juridique.
1. Configurer une fois : POST/GET /preference-center
Définissez la configuration avecPOST /preference-center (clé API propriétaire/administrateur). Le point d’accès fait un upsert de la configuration dans les paramètres de votre organisation et renvoie l’objet enregistré — relancez-le pour mettre à jour. GET /preference-center lit la configuration actuelle ; avant la configuration, elle renvoie enabled: false avec un message d’indication.
Champs de configuration
Chaque champ est validé côté serveur — un POST rejeté renvoie422 avec des problèmes au niveau du champ (field, message) pour identifier celui qui a échoué.
Sujets d’abonnement
Un sujet est un groupe nommé — Bulletin d’information, Mises à jour de produit, Alertes de facturation — qu’un contact active ou désactive sans toucher à tout le canal. Lesid de sujets doivent être uniques et correspondre au modèle slug ([a-z0-9][a-z0-9_-]{0,63}) ; chaque entrée a :
name(1–120 caractères) — le nom affiché sur la page.description(optionnel, ≤500) — une ligne de contexte affichée à côté de la bascule.defaultOptIn(défautfalse) — comment un contact sans préférence enregistrée est traité.archived(optionnel) — les sujets archivés restent dans la piste d’audit mais n’apparaissent plus sur la page.
http(s) sont rejetées d’emblée, et les id de sujets dupliqués échouent avec « Les id de sujets doivent être uniques » plutôt qu’en écrasant silencieusement.
2. Créer un lien par contact
Une fois configuré, générez un lien pour un contact à la fois avecPOST /preference-center/link :
link — une URL de la forme ${DEVOTEL_WEB_URL}/preferences?token=v1…. Points à noter :
- Le lien cible la page hébergée, pas le point d’accès JSON. Copiez-le tel quel dans vos gabarits de pied de page/expéditeur ; la page elle-même récupère le point d’accès aux données en arrière-plan.
- TTL de 30 jours. Ensuite, le jeton se vérifie comme expiré et le contact doit demander un nouveau lien (en créer un nouveau prend un appel API).
- La page est indépendante de la locale au moment de la création. L’application web résout une redirection tout en conservant la requête
?token=, vous n’avez donc pas à deviner la locale du contact.
Où le placer
- Pied de page e-mail (principal). Ajoutez le lien généré (ou la variante courte tracée utilisée par votre expéditeur) dans la zone de désinscription des gabarits marketing.
- Secours SMS / WhatsApp. Lorsque le message n’a pas de bloc de pied de page, ajoutez le lien en ligne :
{optOutMessage}: {link}. L’assistant qui construit les corps sortants accepte un lien court pré-créé, de sorte que votre clic de désinscription reçoit toujours l’attribution normale des clics. - Retour opt-in piloté par suppression. Lorsqu’un contact se ré-opt-in via un autre flux, vous pouvez lui donner un lien frais pour qu’il obtienne la même page en libre-service.
3. La page publique à jeton
La page hébergée lit et écrit via deux points d’accès non authentifiés protégés par le jeton signé :GET /preferences/:token— renvoie la charge utile de la page.PUT /preferences/:token— applique les mises à jour.
400 INVALID_TOKEN ; les jetons expirés ou falsifiés renvoient 401 TOKEN_EXPIRED avec « Veuillez demander un nouveau lien. »
Réponse GET
La charge utile regroupe l’état actuel du contact et la configuration de l’organisation :consentHistory est la piste d’audit opt-in/opt-out la plus récente du contact, plafonnée à 20 lignes, tirée du même registre de consentement que vos opérateurs voient dans le tableau de bord.
Corps de requête PUT
channelPreferences— carte partielle autorisée (Zod enregistrement partiel) ; au moins un canal requis.frequencyPreference— optionnel, l’un deall,important_only,weekly_digest,monthly_digest.topicPreferences— carte{ topicId: opted_in | opted_out }optionnelle validée par rapport à vos sujets configurés ; les id inconnus sont ignorés.requestDataDeletion— définit une demande de suppression GDPR à côté de l’opt-out (voir section 6).
4. Comment les mises à jour circulent
Un opt-in/opt-out écrit ici n’est pas seulement un drapeau UI — les mêmes quatre surfaces de conformité qu’un mot-clé STOP écrit sont mises à jour :- Registre de consentement. Une ligne
consent_recordspar canal (ou par sujet) est ajoutée avecsource: preference_center— votre piste d’audit de charge de la preuve GDPR Article 7. - Liste de suppression. Sur tout canal opt-out, le téléphone/e-mail canonique du contact est inséré avec le scope
all— un bloc intercanal que chaque porte d’envoi lit. - Clôture STOP. Une clôture de chemin rapide Redis est mise en place à l’opt-out (et supprimée lors d’un retour opt-in complet), de sorte que les lots de campagnes en vol voient le changement avant que la suppression de base de données plus lente ne se propage.
- Journal d’audit.
compliance.preference_center_updatedest enregistré lorsque vous modifiez la configuration, et les événements opt-in/out au niveau du contact sont capturés dans le registre de consentement.
opted_in) révoque les lignes de suppression actives pour le téléphone du contact et supprime la clôture STOP, tandis que le registre de consentement gagne l’entrée inversée.
Sujet vs. canal. Un opt-out au niveau du canal l’emporte toujours — une bascule de sujet réduit le consentement dans les canaux que le contact accepte toujours. Les id de sujets inconnus dans un PUT sont ignorés plutôt que persistés, de sorte qu’un formulaire obsolète ne peut pas écrire des clés d’attribut arbitraires.
5. Sémantique de la bascule de suppression GDPR
LorsqueshowGdprDelete est activé et que le contact coche requestDataDeletion: true dans le PUT, l’API enregistre une demande de suppression GDPR héritée — une ligne pending marquée pour votre processus de suppression de données — à côté de l’opt-out. Cette marque est intentionnelle : la bascule de suppression du centre de préférences marque le contact, elle ne lance pas la pipeline DSAR suivie.
6. La tester
Deux exemples curl élaborés que vous pouvez coller dans un script de fumée : Enregistrer la configuration :201 avec la configuration enregistrée reflétée.
Créer un lien et exercer les points d’accès publics :
updated: true plus les préférences appliquées et, lorsque demandé, une entrée gdprRequest.
Échecs courants à vérifier : 400 INVALID_TOKEN (jeton mal formé), 401 TOKEN_EXPIRED (TTL dépassé ou incohérence de signature — créez un nouveau lien), 422 VALIDATION_ERROR (problèmes au niveau du champ dans la configuration ou le corps de mise à jour) et 404 NOT_FOUND lorsque le centre de préférences est désactivé ou que l’id du contact n’existe pas.
Liens connexes
- Barrières d’envoi et gardes pré-envoi — où vit le résumé du centre de préférences aux côtés des heures de silence, de l’arrêt d’urgence et des limitations.
- Opt-Out & Listes de suppression — comment le scope
allet les importations CSV en vrac se rapportent à cette surface. - Gestion du consentement — l’API côté opérateur qui stocke le même registre de consentement.
- Référence DSAR — la pipeline d’effacement suivie dans laquelle router les demandes
requestDataDeletion.