INOCAMPAGNE est le module marketing de CONTROL : profils unifiés, consentement par marque, audiences, campagnes email et scénarios automatisés. Ce guide-ci ne couvre qu'une chose : poser un formulaire d'inscription sur un site, pour que les gens qui veulent recevoir vos emails puissent le dire.
Les guides par stack (HTML, Next.js, WordPress) reprennent les mêmes étapes avec les détails propres à chacun.
inocampagne.js
<script>
<div>
Authorization
POST /subscribe
/news/{marque}/inscription
La règle qui compte : la clé publique vit dans le HTML du site, elle est donc lisible par tout le monde — c'est le contrôle du domaine d'origine qui la protège. La clé secrète, elle, ne doit jamais apparaître dans une page ni dans une URL (le serveur la refuse si elle arrive par l'URL).
CONTROL → INOCAMPAGNE → Collecte → votre marque → Configurer et récupérer le code.
Vous y trouvez le snippet complet, prêt à coller :
<script src="https://messagerie.inovertix.com/inocampagne.js" data-marque="INOCMP_PUB_votre_cle_publique" data-endpoint="https://messagerie.inovertix.com/api/inocampagne/public" defer></script> <!-- Là où le formulaire doit apparaître : --> <div data-inocampagne-form></div>
Le <div> fait partie du snippet. L'oublier est l'erreur la plus fréquente : le script se charge, aucune erreur n'apparaît, et rien ne s'affiche.
Onglet Domaines autorisés de la même fenêtre. Ajoutez le domaine du site : soraparfume.com suffit (le schéma https:// est ajouté tout seul).
soraparfume.com
https://
Les domaines que CONTROL connaît déjà pour cette marque (via ses sites INOTRACK et INODESK) sont proposés en un clic. Utilisez-les : ressaisir un domaine à la main, c'est fabriquer une faute de frappe, et une origine mal orthographiée produit un refus que le navigateur avale en silence.
Une liste vide refuse tout. C'est volontaire : une marque dont on a oublié de déclarer le domaine doit échouer visiblement, pas ouvrir son formulaire à n'importe quel site.
Dans le pied de page du site pour la balise <script>, et là où vous voulez le formulaire pour le <div>. Voir le guide de votre stack.
Ouvrez la page, inscrivez votre propre adresse, puis dans CONTROL : INOCAMPAGNE → Profils → recherchez votre email. Vous devez voir le profil, sa provenance « Formulaire /news » et son consentement opt-in pour la marque.
Si la marque est en double opt-in, vous recevez d'abord un email de confirmation : le statut reste inconnu jusqu'au clic. C'est le but du dispositif — quelqu'un qui saisit l'adresse d'un tiers ne l'abonne pas.
inconnu
Onglet Mini-popup. Désactivée par défaut, et volontairement bridée :
déclenchée au scroll (55 % par défaut), pas à l'arrivée — quelqu'un qui n'a rien lu n'a aucune raison de s'inscrire, et une popup d'entrée n'est qu'une porte fermée ;
prefers-reduced-motion
Un site peut refuser la popup avec data-popup="off" sur sa balise de script. Il peut restreindre, jamais élargir : c'est la marque qui décide d'afficher.
data-popup="off"
Il fait : un formulaire (prénom + email + bouton + mention de consentement), rendu dans un shadow DOM — aucune règle CSS de votre site ne peut le déformer, aucune des nôtres ne peut fuir chez vous. Poids sur le fil : ≈ 5,5 Ko compressé.
Il ne fait pas : de suivi, de cookie, d'analytics. La mesure d'audience, c'est inotrack.js ; le support, c'est inodesk.js. Chaque script fait une chose.
inotrack.js
inodesk.js
Échec toujours silencieux. Le script s'exécute sur le site d'un client : il ne doit jamais y provoquer d'erreur visible ni retarder une page. Un endpoint injoignable, une clé révoquée, un navigateur sans shadow DOM : rien ne s'affiche, rien ne casse.
newsletter_optin
Si le site a déjà un formulaire INODESK, vous n'avez pas besoin d'un second formulaire pour collecter des inscriptions : ajoutez au formulaire une case à cocher dont la clé est exactement newsletter_optin.
Cochée, elle passe le contact en opt_in pour la marque du site, avec pour preuve l'identifiant de la soumission et sa date. Non cochée ou absente : rien ne change — un formulaire de contact n'est pas un consentement.
opt_in
C'est la façon la plus économique d'alimenter la base : le formulaire existe déjà, il suffit d'une case.
Base : https://messagerie.inovertix.com/api/inocampagne/public
https://messagerie.inovertix.com/api/inocampagne/public
{ "email": "client@exemple.com", "first_name": "Awa", "phone": "+22890000001", "source_url": "https://soraparfume.com/nouveautes" }
Réponse 202 dans tous les cas :
202
{ "accepted": true, "double_opt_in": false, "message": "Merci, votre inscription est enregistrée." }
Pourquoi toujours 202 ? Une inscription répond exactement pareil que l'adresse soit déjà connue, inconnue, désinscrite ou supprimée. Sans cela, votre formulaire devient un oracle : « cette personne est-elle cliente de cette marque ? ». Le seul refus possible est un 422 sur un email syntaxiquement invalide — c'est une information sur la saisie du visiteur, pas sur notre base.
422
GET /config
L'habillage du formulaire (nom, logo, couleur, libellés, mention de consentement, réglages de la popup). C'est ce qui permet au script de rester léger : il ne contient aucun texte de marque, il les demande.
GET /ping
Le test d'installation. Rend {"ok": true, "brand": "Sora Parfume"} : de quoi confirmer qu'on a branché la bonne clé, et rien de plus.
{"ok": true, "brand": "Sora Parfume"}
La clé publique voyage dans l'URL (?k=…) et le corps part en text/plain. Ce n'est pas une facilité : un en-tête personnalisé rendrait la requête « non simple » et déclencherait un préflight OPTIONS avant chaque appel. Avec ce transport, l'envoi reste une requête simple — zéro aller-retour supplémentaire sur votre site.
?k=…
text/plain
OPTIONS
Les intégrations qui préfèrent application/json ou l'en-tête X-Inocampagne-Key fonctionnent aussi : le CORS par marque les couvre.
application/json
X-Inocampagne-Key
C'est le même transport qu'inotrack.js et inodesk.js. Si vous en avez branché un, vous connaissez déjà celui-ci.
Deux signaux, les deux les plus fiables, et aucun qui puisse écarter un humain de bonne foi :
Honeypot — un champ rendu par le script, hors écran, hors tabulation, hors lecteurs d'écran. Aucun humain ne le remplit ; les robots naïfs le remplissent tous ;
Piège temporel — le script envoie l'horodatage d'affichage du formulaire. Un envoi en moins de deux secondes vient d'un robot. Absent (intégration maison, JS désactivé) : on ne conclut rien.
Une soumission suspecte reçoit 202 et n'est simplement pas enregistrée. Un robot qui reçoit une erreur recommence en changeant un paramètre ; un robot qui reçoit 202 croit avoir réussi et s'en va. Et un faux positif sur un vrai visiteur ne lui affiche pas une accusation.
Par-dessus : un débit de 20 inscriptions par minute et par marque, plus une limite par IP.
<div data-inocampagne-form>
403 origin_not_allowed
www.
401 malformed_api_key
401 wrong_module_key
401 revoked_api_key
401 secret_key_in_url
localStorage
Le diagnostic est la première chose à essayer. Il rend exactement le même verdict que le serveur — c'est le même code qui répond aux deux — et il nomme les quatre refus au lieu d'un « clé invalide » unique.
L'inscription pose un consentement pour une marque, pas « un abonné ». C'est ce qui permet à un même contact d'être opt-in chez SORA et inconnu chez Mes Gadgets.
Ensuite, rien ne part automatiquement — sauf si un scénario de bienvenue est actif pour la marque (CONTROL → INOCAMPAGNE → Scénarios). Et quoi qu'il arrive, chaque email porte son lien de désinscription, en un clic, valable indéfiniment.