Contacts & consentement
Une liste que vous pouvez défendre, pas seulement une liste que vous possédez
N'importe qui peut détenir dix mille adresses e-mail. La question qui compte — celle qu'un régulateur, un fournisseur et votre propre conscience posent chacun en des termes légèrement différents — c'est d'où vient chacune d'elles et sur quelle base vous pouvez leur écrire. ClickSomo en fait un fait enregistré plutôt que quelque chose que vous devriez reconstituer.
L'identité, c'est l'adresse e-mail
Un contact par adresse et par projet, garanti par la base de données plutôt que par l'espoir. Les adresses sont normalisées à l'écriture, jamais à la lecture — normaliser à la lecture, c'est une contrainte décorative qui laisse entrer Anna@ et anna@ toutes les deux.
Les numéros de téléphone sont stockés en E.164 quand ils existent, mais un numéro de téléphone est un attribut, pas une identité. Il n'y a pas de graphe de résolution d'identité, pas de protocole de fusion ni de piste d'audit des fusions, car chaque contact ici arrive par un canal qui possède déjà une adresse : un import, un formulaire, une inscription, ou votre propre code.
Le nom est stocké en entier
display_name est conservé exactement tel qu'il a été fourni et n'est jamais découpé en parties. Le découpage des noms est une usine à bugs — « van der Berg », « Kim Min-jun », les noms uniques, les titres, et toutes les conventions d'ordre qui ne sont pas anglo-saxonnes — et un mauvais découpage apparaît dans une balise de fusion sous la forme « Cher van, », ce qui est pire qu'aucune personnalisation du tout.
Les parties structurées n'existent que pour les sources qui les fournissent déjà séparées. Rien ne les dérive. Et un nom saisi par la personne elle-même n'est jamais écrasé par un CSV ultérieur qui a observé autre chose, car la règle du dernier qui écrit gagne laisse l'import le plus négligé l'emporter.
- 1IdentitéE-mail, normalisé. Unique au sein du projet.
- 2NomStocké en entier.
first_nameest dérivé au moment du rendu, jamais stocké. - 3AttributsCe que vous voulez, en JSON. Les vôtres, et interpolables en
attrs.*. - 4Étiquettes et listesLes étiquettes sont des entités de premier ordre et vivent dans un seul magasin ; les listes sont une appartenance explicite.
- 5ConsentementUne ligne par canal, avec une base légale et ses preuves.
- 6ÉvénementsUn journal en ajout seul de tout ce que cette personne a fait. La table sur laquelle repose le produit.
- ×JamaisPas de mot de passe, pas de hachage, pas de session, pas de clé API. Une colonne qui authentifie quelqu'un serait un incident, pas une fonctionnalité.
Limité au tenant et au projet, les deux
Le registre des consentements
L'absence n'est pas une permission
Une ligne par contact et par canal — e-mail, SMS, courrier, push — portant chacune un état, une base légale, une source, les preuves, les horodatages et la juridiction. Un contact sans ligne de base pour un canal ne peut rien recevoir sur ce canal. Pas « est signalé ». Ne peut pas.
consent
La personne a activement demandé. Une soumission de formulaire avec la preuve conservée, un double opt-in, une case qu'elle a cochée elle-même. C'est la base la plus solide et la seule qu'un formulaire puisse produire.
legitimate_interest
Le mieux qu'un import CSV puisse atteindre. Un tableur ne peut pas se souvenir que quelqu'un a accepté quelque chose, donc il n'est jamais autorisé à le prétendre — et recharger le même fichier ne l'améliore pas.
contract
Vous leur écrivez en raison de quelque chose à laquelle vous êtes tous deux partie. Le rappel de service, l'avis de renouvellement, la chose qu'ils seraient contrariés de ne pas recevoir.
Avant l'envoi d'une campagne, vous voyez la répartition des bases de son audience : combien de ces personnes ont demandé, combien vous contactez au titre de l'intérêt légitime, et combien sont là en vertu d'un contrat. C'est un chiffre qui a arrêté plus de mauvais envois que n'importe quel bandeau d'avertissement jamais écrit.
Pourquoi c'est plus strict qu'il ne le faut pour vous : il ne s'agit pas vraiment de vous. La réputation d'envoi en masse est une ressource partagée, et une seule liste négligée empoisonne le puits pour tous ceux qui envoient depuis la même infrastructure. Les taux de plaintes et de rebonds par tenant sont surveillés, et un compte dont les taux dépassent le seuil est bridé ici — avant qu'un fournisseur ne le fasse pour tout le monde d'un coup.

Derrière chaque ligne de la liste, quelqu'un a dit oui.
Quatre voies d'entrée
Chaque route vers votre liste, c'est vous, agissant sur vos propres données
Il n'existe ni voie d'ingestion par jeton de service, ni produit frère qui écrirait discrètement dans vos contacts. Si vous voulez quelqu'un sur une liste, l'une de ces quatre voies l'y a placé.
Import CSV
Mappé colonne par colonne, normalisé à l'écriture, vérifié MX afin que les domaines morts ou mal saisis soient détectés avant un rebond définitif, et déposé avec une base que vous définissez explicitement. L'import reçoit un identifiant, et chaque contact qu'il a créé y renvoie.
Un formulaire ClickSomo
Rendu à partir du même document que tout le reste, avec validation, un pot de miel et une limite de débit. Une soumission est la seule voie qui peut légitimement produire consent, car c'est la seule où la personne est présente.
Une page que vous avez créée dans dash-b
Le concepteur du tableau de bord publie des pages ; un formulaire sur l'une d'elles envoie ici avec vos propres identifiants. Même validation, même gestion du consentement, aucune seconde intégration à maintenir.
L'API publique
POST /v1/contacts avec votre propre jeton, sémantique d'upsert, clé d'idempotence respectée. Votre application sait déjà qui s'est inscrit ; c'est le chemin le plus court de ce fait vers un tunnel.
Les segments sont un prédicat, compilé
Un segment est un arbre de prédicats enregistré sur les champs de contact, les attributs, les étiquettes, l'appartenance aux listes et le comportement, compilé en SQL et mis en cache avec un décompte. Les opérateurs sont les habituels — égal, différent, dans, pas dans, commence par, se termine par, contient, est défini, n'est pas défini — combinés avec et, ou et non à la profondeur dont vous avez besoin.
Prévisualisez-le avant de l'utiliser. Le point de terminaison renvoie de vrais contacts, ainsi « qui s'y trouve réellement » est une question à laquelle vous répondez en regardant plutôt qu'en envoyant pour le découvrir.
Les segments jouent ensuite un double rôle : comme audience d'une campagne, comme condition d'une branche de tunnel et comme déclencheur à part entière — segment_enter démarre une exécution dès que quelqu'un devient éligible.
- 1Étiquette
tags contains "regular" - 2Attribut
attrs.total_orders >= 3— votre champ, votre nom pour lui. - 3ComportementAucun événement
order.paidau cours des 90 derniers jours. - 4ConsentementUne base e-mail exploitable. Les contacts qui n'en ont pas ne sont pas comptés, car ils n'auraient de toute façon pas pu recevoir d'envoi.
- iAperçu412 contacts, listés. Recomptés à l'envoi, car un segment est une question et non un instantané.
Compilé en SQLDécompte en cache, réponse en direct
La suppression, et quand elle est vérifiée
Les suppressions sont propres au projet et globales : rebonds définitifs, plaintes, désabonnements, saisies manuelles et adresses de rôle. Elles sont vérifiées au moment de l'envoi, puis à nouveau au sein du service d'envoi lui-même.
Ce second mot fait tout le travail. Un tunnel avec une attente de trois jours offre une fenêtre de trois jours pendant laquelle quelqu'un peut se désabonner, et un système qui a vérifié la suppression au moment de la mise en file enverra quand même le message. Vérifier à l'envoi, c'est la différence entre honorer un désabonnement et l'enregistrer.
L'effacement fonctionne de la même manière : une demande de suppression retire le contact et l'historique de ses messages ici, et atteint chaque service frère détenant une copie par la même voie interne que le reste de la famille utilise. Il y a un seul endroit où demander et une seule chose qui se produit.