Passer à la documentation

SDK Web

Le SDK Web Kixo suit automatiquement les clics, les vues de page, les sessions, les erreurs, la profondeur de défilement, les Web Vitals, les rage clicks, les dead clicks et les données de carte de chaleur avec une intégration en une ligne. Le suivi des requêtes réseau est disponible en option. Distribué sous forme de module ES natif, il fonctionne dans les navigateurs modernes.

Installation

Balise script (CDN)

Ajoutez l’extrait avant la balise fermante </head>. Notez le type="module" : il est obligatoire, car le SDK est un module ES. La relecture de session est séparée dans un chunk d’enregistrement aligné sur la version, chargé uniquement après l’activation de la relecture ; le bundle de base reste donc léger tant que la relecture est désactivée.

html
<script
  type="module"
  src="https://cdn.kixo.io/kixo.min.js?project_id=YOUR_PROJECT_ID&api_key=YOUR_API_KEY">
</script>

Remarque

Le SDK lit project_id et api_key dans l’URL du script, puis s’initialise. Pour configurer les options dans le code applicatif, retirez les paramètres de l’URL et appelez plutôt Kixo.init({...}) ; l’objet global Kixo est disponible une fois le module chargé.

html
<script type="module" src="https://cdn.kixo.io/kixo.min.js"></script>
<script type="module">
  Kixo.init({
    projectId: 'YOUR_PROJECT_ID',
    apiKey:    'YOUR_API_KEY',
  });
</script>

npm

À utiliser si vous préférez configurer les options dans le code applicatif plutôt que via l’URL du script. Cette intégration expose la même API Kixo que l’intégration CDN.

bash
npm install @kixo.io/web
js
import Kixo from '@kixo.io/web';

Kixo.init({
  projectId: 'YOUR_PROJECT_ID',
  apiKey: 'YOUR_API_KEY',
});

Plateformes no-code

Si vous créez avec un builder propulsé par AI comme Lovable, Bolt, v0 ou Replit, collez l’extrait avec balise script directement dans le chat de l’outil ou dans ses réglages d’injection de code. La plupart de ces builders permettent d’ajouter des scripts dans le <head> de votre site.

Configuration

L’intégration en deux lignes utilise les valeurs analytiques locales par défaut ci-dessous. Le suivi des requêtes reste facultatif. Le replay de session est volontairement absent de Kixo.init() : son activation, son échantillonnage, ses paramètres de confidentialité, sa durée et ses paramètres de capture proviennent uniquement du dashboard du projet.

js
Kixo.init({
  projectId: 'YOUR_PROJECT_ID',     // required
  apiKey:    'YOUR_API_KEY',         // required

  // Per-tracker toggles — all default to true except network.
  autoTrack: {
    pageViews:   true,
    clicks:      true,
    scrollDepth: true,
    sessions:    true,
    forms:       true,
    network:     false,     // opt in only when you need request telemetry
    errors:      true,
    performance: true,
    rageClicks:  true,
    deadClicks:  true,
  },

  // Heatmap recording (clicks + scroll on by default; mouse-move opt-in).
  heatmap: {
    enabled: true,
    clicks:  true,
    moves:   false,
    scroll:  true,
  },

});

Remarque

Les paramètres Configuration définie au niveau du projet. du Dashboard peuvent désactiver les traceurs d’analyse locaux. La relecture, elle, n’a aucun indicateur local d’activation : configurez-la dans Settings → Session replay, et le SDK appliquera la dernière politique du projet lors du prochain rafraîchissement de configuration.

Événements suivis automatiquement

Avec la configuration par défaut, Kixo collecte automatiquement les événements suivants, sans code supplémentaire :

  • page_view — chaque navigation (chargement initial + changements de route SPA)
  • session_start / session_end
  • click — tous les clics sur les éléments correspondant au sélecteur
  • scroll_depth — seuils à 25 / 50 / 75 / 100 %
  • rage_click — clics répétés sur le même élément
  • dead_click — clics sur des éléments non interactifs
  • error — exceptions JavaScript non interceptées + rejets de promesses
  • performance — métriques de chargement de page et Web Vitals (LCP, FCP, FID, CLS, INP, TTFB)
  • network_request — chronométrage des requêtes, si le suivi réseau est activé
  • heatmap_click / scroll — données de carte thermique

Consultez la liste complète dans Référence des événements.

Événements personnalisés

Kixo.track()

Envoyer un événement personnalisé avec des propriétés facultatives.

js
Kixo.track('purchase_completed', {
  product_id: 'SKU-123',
  amount: 49.99,
  currency: 'USD',
});

Helpers d’événements typés

Surcouche de Kixo.track() pour les événements que Kixo reconnaît par leur nom (purchase, signup, subscribe_start, trial_start, cancel, upgrade, activation, share, invite). Ces helpers typés apportent une validation des propriétés à la compilation et une source unique pour les noms de clés ; le détecteur d’événements standard du backend fait une correspondance exacte.

js
Kixo.trackPurchase({ amount: 49.99, currency: 'USD', productId: 'pro_yearly' });

Kixo.trackSubscriptionStart({
  plan: 'pro',
  amount: 9.99,
  currency: 'USD',
  interval: 'month',
});

Kixo.trackSignup({ method: 'google' });
Kixo.trackTrialStart({ plan: 'pro', days: 14 });
Kixo.trackCancel({ plan: 'pro', reason: 'too_expensive' });
Kixo.trackUpgrade({ fromPlan: 'free', toPlan: 'pro' });
Kixo.trackActivation({ event: 'first_post_published' });
Kixo.trackShare({ channel: 'twitter', contentId: 'post_123' });
Kixo.trackInvite({ channel: 'email', recipientCount: 5 });

Kixo.identify()

Associez l’appareil actuel à un utilisateur connu. Les clés de propriété standard réservées portent le préfixe $ (convention Mixpanel), ce qui les distingue de vos propres attributs personnalisés et les fait remonter dans les colonnes de profil du dashboard — voir le Catalogue des propriétés standard ci-dessous pour la liste complète des 37 clés.

js
Kixo.identify('user_123', {
  $email:  'jane@example.com',     // identity
  $name:   'Jane Doe',              // identity
  $plan:   'pro',                   // subscription pack
  $lifetime_orders: 12,             // e-commerce pack
  signup_source: 'twitter_ad',      // custom trait
});

Kixo.setUserProperty() — marquer un utilisateur pour la segmentation

Ajoutez à l’utilisateur actuel des attributs clé/valeur arbitraires. Les valeurs peuvent être des chaînes, des nombres ou des booléens — la forme booléenne est le moyen le plus simple de étiquette un utilisateur pour le cibler ensuite dans des segments, des campagnes e-mail ou des requêtes de chat.

js
// Tag a user as subscribed — instant segment "Subscribed users"
Kixo.setUserProperty('subscribe', true);

// Mark a VIP — used in campaign targeting + chat ("show me VIPs")
Kixo.setUserProperty('vip', true);

// Numeric and string values work too
Kixo.setUserProperty('plan_tier', 'enterprise');
Kixo.setUserProperty('lifetime_orders', 42);

// Bulk-set
Kixo.setUserProperties({ subscribe: true, plan_tier: 'enterprise' });

Les propriétés sont conservées dans localStorage entre les rechargements et ajoutées automatiquement aux événements suivants. Vous pouvez les utiliser dans le chat avec des prompts comme "créer une campagne e-mail pour les utilisateurs dont subscribe vaut true" : Kixo crée alors automatiquement un segment et prépare le modèle. Elles sont effacées lors de Kixo.reset().

Kixo.group()

Associez l’utilisateur à une entreprise ou à une organisation.

js
Kixo.group('company_456', {
  name: 'Acme Inc',
  plan: 'enterprise',
});

Kixo.reset()

Efface l’identité, les super-propriétés et la file persistée. Appelez cette méthode à la déconnexion pour éviter que les événements suivants soient attribués à l’utilisateur précédent.

js
Kixo.reset();

Catalogue des propriétés standard

Les clés de propriété réservées portent le préfixe $, ce qui les isole de vos attributs personnalisés. Le catalogue de Kixo couvre 37 clés réparties en 3 packs universels (identité, géolocalisation, cycle de vie) et 5 packs métier B2B (abonnement, e-commerce, médias, marketplace, fidélité). Définissez uniquement celles qui s’appliquent à votre produit : le dashboard s’adapte et n’affiche que les packs que vous renseignez.

Identité

Toujours pertinent. Définit les colonnes d’en-tête du profil.

CléTypeDescription
$emailchaîne de caractèresAdresse e-mail principale, souvent utilisée comme clé de rapprochement d’identité.
$phonechaîne de caractèresNuméro de téléphone au format E.164.
$namechaîne de caractèresNom d’affichage complet.
$first_namechaîne de caractèresPrénom.
$last_namechaîne de caractèresNom de famille.
$avatar_urlchaîne de caractèresURL complète de l’image d’avatar de l’utilisateur.

Géographie

Contexte géographique.

CléTypeDescription
$countrychaîne de caractèresCode pays ISO 3166.
$citychaîne de caractèresNom de la ville.
$regionchaîne de caractèresÉtat ou province.
$timezonechaîne de caractèresZone IANA telle que America/Los_Angeles.
$languagechaîne de caractèresTag IETF tel que en ou ru-RU.
$localechaîne de caractèresIdentifiant de langue complet.

Cycle de vie

À quel moment les avons-nous vus ?

CléTypeDescription
$createdISO8601Date d’inscription ou de création du compte.
$last_seenISO8601Date du dernier engagement.

Abonnement

À renseigner si votre produit propose des offres.

CléTypeDescription
$planchaîne de caractèresSlug du palier — free, pro, enterprise.
$subscription_statuschaîne de caractèresactive / trial / cancelled / past_due.
$trial_endsISO8601Date d’expiration de l’essai en cours.
$mrrnombreRevenu mensuel récurrent dans la devise du compte.
$subscription_startedISO8601Date de début de l’abonnement en cours.

E-commerce

À renseigner si vous vendez des produits.

CléTypeDescription
$lifetime_ordersnombreNombre de commandes finalisées.
$lifetime_revenuenombreDépenses totales.
$aovnombreValeur moyenne des commandes.
$last_purchaseISO8601Dernier achat réussi.
$first_purchaseISO8601Premier achat réussi.
$cart_abandoned_countnombreNombre total d’abandons de panier.

Médias

À renseigner si vous publiez du contenu.

CléTypeDescription
$content_tierchaîne de caractèresfree / premium / paid.
$subscribed_categoriesChaîne CSV ou tableauCatégories suivies par l’utilisateur.
$watch_time_totalnombreTemps de visionnage cumulé en secondes.
$last_playedISO8601Dernier démarrage de lecture.

Marketplace

À renseigner si votre produit est une plateforme à deux versants.

CléTypeDescription
$seller_tierchaîne de caractèresSlug du palier côté vendeur.
$buyer_tierchaîne de caractèresSlug du niveau côté acheteur.
$listings_countnombreAnnonces actives appartenant à l’utilisateur.
$reviews_countnombreAvis reçus par l’utilisateur.
$verifiedbooléenStatut KYC.

Fidélité

À renseigner pour les programmes d’engagement et de récompenses.

CléTypeDescription
$loyalty_pointsnombreSolde actuel des points échangeables.
$vip_levelchaîne de caractèresSlug du palier VIP.
$referral_countnombreParrainages réussis attribués à cet utilisateur.

Conseil

Vous ne trouvez pas votre cas ? Utilisez des clés simples pour les attributs personnalisés. Elles apparaissent dans le panneau Custom Traits du dashboard sans encombrer les colonnes de profil. Les 5 ensembles sectoriels ci-dessus reflètent les structures B2B les plus courantes — la terminologie propre à chaque client (par ex. shipping_plan) doit rester en clé simple.

Super-propriétés

Paires clé/valeur propres à la session, ajoutées automatiquement à chaque événement sortant. Contrairement aux attributs identify(), qui décrivent l’identité, les super-propriétés décrivent le contexte de la session : variante A/B active, variante de build, feature flags activés, référence d’affiliation. Elles sont conservées dans localStorage entre les rechargements, puis effacées lors de reset(). En cas de collision de clé, les properties définies sur l’événement dans track() priment toujours.

js
Kixo.setSuperProperty('build_flavor', 'beta');
Kixo.setSuperProperties({ ab_variant: 'B', referrer_campaign: 'autumn-launch' });

// Sugar for A/B tracking — keys as 'experiment_<id>' so backend
// can run direct WHERE filters on experiment analysis.
Kixo.setExperimentVariant('checkout_v2', 'variant_a');

Kixo.unsetSuperProperty('build_flavor');
Kixo.clearSuperProperties();

Cartes de chaleur

L’enregistrement des cartes thermiques est activé par défaut : clics et profondeur de défilement, tous deux échantillonnés à 100 %. Le suivi des mouvements de souris est optionnel (volumétrie élevée ; activez-le page par page si utile).

js
Kixo.init({
  projectId: 'YOUR_PROJECT_ID',
  apiKey:    'YOUR_API_KEY',
  heatmap:   { moves: true },  // turn on full-resolution mouse-move
});

Replay de session

Le replay de session enregistre un instantané du DOM via rrweb ainsi qu’un flux de mutations, afin que le dashboard puisse reconstruire la page sous forme de session navigable avec sa chronologie d’événements. Il s’agit d’une reconstruction du DOM, et non d’un enregistrement vidéo de l’écran. Replay est désactivé par défaut. Activez-le pour le projet dans Dashboard → Settings → Relecture de session ; aucune modification du code de l’application n’est nécessaire. Une fois activé, l’enregistreur est chargé depuis un chunk séparé de version correspondante.

Remarque

Le dashboard fait foi. Définissez-y Enable replay, Mask inputs, la durée maximale et les contrôles avancés de capture. captureOnCellular est stocké dans la même politique de projet pour iOS et Android ; les navigateurs n’exposent pas de signal fiable pour distinguer le Wi‑Fi du réseau cellulaire, donc le SDK Web signale cette restriction propre au natif puis l’ignore.

Ce qui est masqué

Replay est conçu pour pouvoir être activé en toute sécurité. Trois couches protègent les contenus sensibles, toutes activées par défaut :

  • Le masquage des champs est défini au niveau du projet — tant que le paramètre Masquer les champs de saisie du Dashboard est activé (par défaut), les caractères saisis sont remplacés par des astérisques avant de quitter le navigateur. Désactivez-le uniquement pour un besoin précis et peu sensible ; les champs d’identité, d’authentification et de paiement restent masqués.
  • L’attribut data-kixo-mask masque un élément et tout son sous-arbre. Ajoutez-le à tout conteneur susceptible de contenir des données personnelles ou confidentielles ; la relecture affiche un espace réservé, sans le texte ni le contenu DOM de ce sous-arbre.
    html
    <div data-kixo-mask>
      <!-- payment fields, account numbers, private messages… -->
      <!-- captured as a blank placeholder, never as pixels -->
    </div>
  • Les champs sensibles sont toujours masqués — les champs qui ressemblent à un mot de passe, un numéro de carte, un CVV, un SSN, un secret ou un token (d’après leur type, name, id ou autocomplete) sont masqués même si le paramètre Masquer les champs de saisie du projet est désactivé. Le texte visible et les attributs DOM sérialisés passent aussi par le filtre PII de Kixo avant l’envoi.

Collecte de données

Le SDK collecte les traceurs activés dans votre intégration et dans les paramètres du projet, ainsi que les événements et propriétés envoyés par votre application.

Destination des enregistrements

Le SDK compresse les événements rrweb avec gzip en segments de taille bornée, demande à Kixo une URL d’envoi signée limitée au projet, puis envoie directement ces segments vers le stockage du replay. Ouvrez la session reconstruite dans Replay → Sessions : elle renvoie vers la trace analytique de cette même session.

Remarque

Replay dépend de votre offre. Le nombre de sessions capturées et conservées dépend de votre offre ; sur les offres inférieures, Kixo enregistre tout de même des métadonnées de session légers pour que la session apparaisse dans vos listes et vos analyses.

Feature flags

Vérifiez les valeurs des flags à l’exécution avec Kixo.getFeatureFlag().

js
const variant = Kixo.getFeatureFlag('new_checkout');

if (variant === 'enabled') {
  showNewCheckout();
} else {
  showLegacyCheckout();
}

Envoi et comportement hors ligne

Le SDK met les événements en file d’attente localement, les envoie par lots et réessaie les échecs temporaires avec temporisation exponentielle. Si la collecte est suspendue dans les paramètres du projet, les nouveaux événements ne sont plus envoyés tant qu’elle n’est pas réactivée.

Diagnostic

Instantané d’état en lecture seule, utile dans les outils de développement pour comprendre pourquoi les événements ne remontent pas.

js
const diag = Kixo.diagnostics();
console.log(diag);