[deliver]
Article Deliver · 2026-06-04 · Charlotte Rodrigues

API Klaviyo : envoyer des events depuis votre stack

À notre avis, la majorité des guides Klaviyo partent du principe que votre stack technique est Shopify ou WooCommerce. Vous installez le plugin, vous activez la connexion native, tout remonte automatiquement. Mais si vous avez une application SaaS, une plateforme custom, un système de fidélité maison, ou même un checkout développé en interne, cette logique ne s'applique plus.

Pour ces cas, Klaviyo expose une API qui permet d'envoyer des events depuis votre propre backend, de profiler vos utilisateurs avec des propriétés custom, et de déclencher des flows depuis votre propre backend. C'est précisément ce que cet article couvre : les fondamentaux techniques pour intégrer Klaviyo dans une stack non standard.


TL;DR


API Klaviyo : les fondamentaux

Authentification : clé privée vs clé publique

Klaviyo distingue deux types de clés, et la confusion entre les deux est la première source d'erreurs sur les intégrations custom.

La clé privée (Private API Key) commence par pk_. D'après le guide d'authentification, elle permet de lire et d'écrire des données dans votre compte, dans la limite des scopes de la clé (par exemple events:write pour créer des events). Cette clé ne doit jamais être exposée côté client. Elle s'utilise dans le header HTTP de chaque requête :

Authorization: Klaviyo-API-Key pk_xxxxxxxxxxxxxxxxxxxx

La clé publique (Public API Key ou Site ID) est à 6 caractères alphanumériques. Elle est conçue pour les appels depuis le navigateur via Klaviyo.js. Selon le même guide, elle ne permet pas d'accéder aux données sécurisées de votre compte et peut être partagée.

Pour retrouver vos clés : Settings, puis API keys (rôle Owner, Admin ou Manager requis).

Endpoints principaux

L'API est accessible à la base URL https://a.klaviyo.com/api/. Les endpoints les plus utiles pour une intégration custom :

Endpoint Méthode Usage
/api/events/ POST Envoyer un event custom
/api/profiles/ et /api/profiles/{id} POST / PATCH Créer ou mettre à jour un profil
/api/lists/{id}/relationships/profiles POST Ajouter un profil à une liste
/api/metric-aggregates/ POST Agréger des métriques

Chaque requête doit inclure le header de révision de l'API :

revision: YYYY-MM-DD

Ce header sélectionne une révision du schéma. Utilisez une révision encore supportée et testée par votre intégration, puis planifiez sa mise à jour à partir de la documentation officielle Klaviyo.

Rate limits

Klaviyo publie des limites propres à chaque endpoint, avec une fenêtre burst d'1 seconde et une fenêtre steady d'1 minute (guide des limites de débit). Au moment de la relecture, la page Create Event indique 350/s en burst et 3 500/min en steady : consultez-la à l'implémentation. Klaviyo retourne un 429 Too Many Requests en cas de dépassement, avec un header Retry-After indiquant le délai d'attente.

Pour les intégrations à fort volume (ex : event batch lors d'un import ou d'une migration), l'endpoint Bulk Create Events (/api/event-bulk-create-jobs) accepte jusqu'à 1 000 events et 5 Mo par requête (burst 10/s, steady 150/min au moment de la relecture). Pour rejouer des events historiques, Klaviyo propose un champ booléen backfill: true : l'event est enregistré et visible dans les métriques et la segmentation, mais ne déclenche pas de flow.


Envoyer un event custom : payload et exemples de code

Structure de la payload

Le corps d'un event est un objet JSON data avec type et attributes, comme dans les exemples de la vue d'ensemble de l'API Events. Voici une structure minimale :

{
  "data": {
    "type": "event",
    "attributes": {
      "metric": {
        "data": {
          "type": "metric",
          "attributes": {
            "name": "Completed Onboarding Step"
          }
        }
      },
      "profile": {
        "data": {
          "type": "profile",
          "attributes": {
            "email": "user@votre-domaine.com"
          }
        }
      },
      "properties": {
        "step_name": "profil complété",
        "plan": "pro",
        "nb_jours_depuis_inscription": 3
      },
      "time": "2026-06-04T10:00:00+00:00",
      "value": 0
    }
  }
}

Champs importants :

Exemple Python

import requests
import json

KLAVIYO_API_KEY = "pk_votre_cle_privee"
BASE_URL = "https://a.klaviyo.com/api"

headers = {
    "Authorization": f"Klaviyo-API-Key {KLAVIYO_API_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "revision": "2026-10-15"
}

payload = {
    "data": {
        "type": "event",
        "attributes": {
            "metric": {
                "data": {
                    "type": "metric",
                    "attributes": {
                        "name": "Completed Onboarding Step"
                    }
                }
            },
            "profile": {
                "data": {
                    "type": "profile",
                    "attributes": {
                        "email": "user@votre-domaine.com",
                        "first_name": "Alice",
                        "properties": {
                            "plan": "pro"
                        }
                    }
                }
            },
            "properties": {
                "step_name": "profil complété",
                "nb_jours_depuis_inscription": 3
            }
        }
    }
}

response = requests.post(
    f"{BASE_URL}/events/",
    headers=headers,
    data=json.dumps(payload)
)

if response.status_code == 202:
    print("Event accepté pour traitement")
else:
    print(f"Erreur {response.status_code} : {response.text}")

Une réponse 202 Accepted indique que l'event a été validé et soumis au traitement, sans garantir que le traitement est terminé.

Exemple JavaScript (Node.js)

const axios = require('axios');

const KLAVIYO_API_KEY = 'pk_votre_cle_privee';

const payload = {
  data: {
    type: 'event',
    attributes: {
      metric: {
        data: {
          type: 'metric',
          attributes: { name: 'Completed Onboarding Step' }
        }
      },
      profile: {
        data: {
          type: 'profile',
          attributes: { email: 'user@votre-domaine.com' }
        }
      },
      properties: {
        step_name: 'profil complété',
        plan: 'pro'
      }
    }
  }
};

axios.post('https://a.klaviyo.com/api/events/', payload, {
  headers: {
    'Authorization': `Klaviyo-API-Key ${KLAVIYO_API_KEY}`,
    'Content-Type': 'application/json',
    'revision': '2026-10-15'
  }
})
.then(res => console.log('Event accepté, status:', res.status))
.catch(err => console.error('Erreur:', err.response?.data));

Exemple cURL

curl -X POST https://a.klaviyo.com/api/events/ \
  -H "Authorization: Klaviyo-API-Key pk_votre_cle_privee" \
  -H "Content-Type: application/json" \
  -H "revision: 2026-10-15" \
  -d '{
    "data": {
      "type": "event",
      "attributes": {
        "metric": {
          "data": {
            "type": "metric",
            "attributes": { "name": "Completed Onboarding Step" }
          }
        },
        "profile": {
          "data": {
            "type": "profile",
            "attributes": { "email": "user@votre-domaine.com" }
          }
        },
        "properties": { "step_name": "profil complété" }
      }
    }
  }'

Klaviyo.js vs API server-side : quand utiliser quoi

Les deux mécanismes ne s'opposent pas : ils se complètent. Comprendre leurs périmètres respectifs évite les doublons d'events et les erreurs d'authentification.

Klaviyo.js (frontend)

Klaviyo.js est un snippet JavaScript chargé dans le navigateur. Il utilise votre clé publique (Site ID) et expose deux méthodes principales :

Quand l'utiliser : pour les events qui se produisent dans le navigateur. Exemple : "Viewed Product", "Started Checkout", "Clicked CTA".

Limitations : pas d'accès aux données sécurisées, et, à notre avis, dépendance au JavaScript côté client (ad-blockers, consentement).

API server-side (backend)

L'API avec clé privée est la solution pour tout ce qui se passe côté serveur : actions post-paiement, events liés à des changements d'état dans votre base de données, intégrations avec des systèmes tiers (ERP, CRM, plateforme de fidélité).

Quand l'utiliser :
- Events déclenchés par des actions backend : confirmation de commande, upgrade de plan, activation d'une feature.
- Données sensibles à ne pas exposer au navigateur (valeur d'achat, segment interne).
- Ingestion batch ou migration de données historiques.
- Environnements sans navigateur : scripts d'import, jobs CRON.

Règle simple, à notre avis : si l'event nécessite votre clé privée ou des données que vous ne voulez pas exposer au client, c'est du server-side. Sinon, Klaviyo.js peut suffire.


Webhooks sortants depuis Klaviyo (Flow Webhook action)

À notre avis, la confusion est fréquente sur ce que "webhook Klaviyo" signifie selon le sens de l'échange.

Klaviyo reçoit des events : via l'API /api/events/. C'est ce qu'on vient de décrire. Klaviyo est ici le récepteur.

Klaviyo envoie des données vers votre système : c'est possible via l'action "Webhook" disponible dans les Flows (article d'aide). Klaviyo est alors l'émetteur : il envoie une requête HTTP POST vers votre endpoint à chaque fois qu'un profil atteint ce noeud du flow.

Configurer un webhook sortant dans un Flow

  1. Dans la barre latérale du flow builder, glissez l'action "Webhook" dans votre Flow (guide développeur).
  2. Renseignez l'URL de votre endpoint (HTTPS obligatoire, sans certificat auto-signé ni redirection).
  3. Définissez les headers si nécessaire (ex : un token d'authentification pour votre API).
  4. Rédigez le corps du message en JSON (seul format pris en charge) ; un panneau permet de copier les variables du profil ou de l'event déclencheur. Les webhooks de flow n'exécutent que des requêtes POST, et la double authentification est requise.

La payload que Klaviyo envoie est du JSON que vous composez dans l'interface. Cela vous permet de notifier votre backend lorsqu'un utilisateur entre dans un segment ou atteint l'action dans un flow.

Exemples d'usage :
- Notifier votre CRM quand un lead télécharge un lead magnet et entre dans la séquence de nurturing.
- Déclencher un ticket support automatique si un client entre dans un flow "churned".
- Envoyer les données d'un client à un outil de courrier postal après un Placed Order (exemple cité par Klaviyo).


Cas d'usage concrets

SaaS : onboarding progressif

Un SaaS avec un onboarding en 5 étapes peut envoyer un event Completed Onboarding Step à chaque étape complétée, avec une propriété step_number et step_name. Klaviyo déclenche un flow différent selon le step atteint : félicitations, nudge si l'étape suivante n'est pas complétée après 48h, offre de démonstration si l'utilisateur bloque à l'étape 3.

La valeur de cette approche : Klaviyo gère la logique de communication, votre backend n'a qu'à envoyer l'event. Pas de logique d'emailing dans votre code.

DTC : events custom hors Shopify

Une marque DTC avec une plateforme de commande custom peut envoyer ses propres events, par exemple : Subscription Activated, Product Personalized, Gift Message Added. Une fois envoyés, ces events peuvent servir à segmenter et à déclencher des flows, comme n'importe quel event reçu par l'API.

Pour les custom properties sur les profils, voir notre article sur les propriétés custom Klaviyo qui couvre la gestion des champs profil enrichis.

Programme de fidélité

Un système de points maison envoie un event Points Earned avec points_added et total_points à chaque achat. Klaviyo peut déclencher des emails de célébration à chaque palier (500 points, 1 000 points), segmenter les VIP, et envoyer des rappels d'expiration de points.

Le webhook sortant de Klaviyo peut en retour notifier votre système de fidélité depuis un flow déclenché par un event (par exemple Placed Order). Klaviyo précise qu'on ne peut pas déclencher un flow à partir des ouvertures d'email, et ne prend pas en charge l'événement Received Email comme déclencheur de flow.


Erreurs fréquentes et debugging

401 Unauthorized

Le guide des codes décrit le 401 comme une requête sans information d'authentification ; le guide d'authentification indique de son côté qu'un 400 signale une clé API invalide ou absente. Une cause possible, à notre avis : la clé publique (Site ID) utilisée à la place de la clé privée. Vérifiez que votre header Authorization commence bien par Klaviyo-API-Key pk_....

400 Bad Request

Le guide des codes indique un paramètre requis manquant ou invalide. Causes possibles :
- Un header revision qui n'est pas une révision valide (la politique de versions exige une révision valide).
- À notre avis, un champ mal structuré dans la payload JSON (ex : metric directement à la racine au lieu d'être dans attributes).
- Aucun identifiant de profil valide : un email de moins de 100 caractères, ou un téléphone au format E.164 (une requête avec seulement un téléphone invalide est rejetée).

Lisez attentivement le corps de la réponse d'erreur : Klaviyo retourne un tableau errors dont les champs title et detail décrivent la cause de l'échec.

202 reçu mais l'event n'apparaît pas dans Klaviyo

Le 202 signifie que l'event est en file de traitement, pas qu'il est déjà visible. D'après la vue d'ensemble de l'API Events, les events sont créés de façon asynchrone et l'affichage peut prendre jusqu'à quelques minutes. Si l'event n'apparaît toujours pas :
- Vérifiez dans la liste des métriques de Klaviyo que le nom de la métrique correspond exactement.
- Contrôlez que l'email du profil n'est pas en @example.com ou @test.com : ces events reçoivent un 202 puis sont supprimés en silence.
- Vérifiez que le unique_id n'est pas déjà utilisé pour ce profil et cette métrique (Klaviyo dédoublonne sur profil, métrique et unique_id) et que l'identifiant de profil est correct.
- Vérifiez les logs de votre endpoint : assurez-vous que la requête a bien été envoyée.

Events dupliqués

Si vous envoyez un event depuis le frontend (Klaviyo.js) et depuis votre backend pour la même action, à notre avis Klaviyo créera deux events distincts, sauf s'ils partagent profil, métrique et unique_id. Définissez clairement quel mécanisme est responsable de quel event et documentez-le. À notre avis, les doublons faussent les métriques et peuvent déclencher des flows en double.

Metric names incohérents

À notre avis, Order Completed, order_completed et OrderCompleted risquent de devenir trois métriques différentes (Klaviyo crée une métrique quand le nom n'en correspond à aucune). Standardisez vos noms d'events dès le départ et documentez-les dans un registre partagé avec votre équipe technique. À notre avis, un changement de nom d'event peut casser les flows et segments qui en dépendent.


Pour aller plus loin

Si votre intégration est complexe (migration de données historiques, système multi-marques, architecture microservices), notre équipe peut auditer votre setup et vous accompagner. Contactez l'agence Deliver pour en discuter.

Provenance et vérification

Contrôle du 2026-11-03, pages rouvertes en HTML brut converti en texte puis lues. Référence Create Event (endpoint, burst 350/s et steady 3500/m, scope events:write, sens du 202, header revision). Vue d'ensemble de l'API Events (idempotence unique_id, dédoublonnage sur profil, métrique et unique_id, backfill, abandon silencieux des adresses de test, 400 propriétés par event, 1 000 events et 5 Mo en bulk, délai de quelques minutes après un 202). Guide des limites de débit (fenêtres burst et steady, Retry-After, codes de statut, tableau des limites d'events). Politique de versions (révisions .pre en bêta). Guide d'authentification (clés privées pk_, clé publique de 6 caractères, OAuth). Guide de l'API JavaScript (identify et track). Article d'aide et guide développeur sur l'action webhook des flows (POST seul, URL HTTPS, corps JSON, déclencheurs de flow, double authentification, nouvelles tentatives, en-tête X-Klaviyo-Flow-ID). Références Create Profile, Update Profile, Add Profiles to List et Query Metric Aggregates ouvertes pour confirmer les chemins du tableau des endpoints.

Sources contrôlées le
Relu par
Claude (relecture IA, documentation développeur Klaviyo rouverte et lue le 2026-11-03)
Assistance IA
Oui
Sources
  1. developers.klaviyo.com/en/reference/create_event
  2. developers.klaviyo.com/en/reference/events_api_overview
  3. developers.klaviyo.com/en/reference/bulk_create_events
  4. developers.klaviyo.com/en/docs/rate_limits_and_error_handling
  5. developers.klaviyo.com/en/docs/api_versioning_and_deprecation_policy
  6. developers.klaviyo.com/en/docs/authenticate_
  7. developers.klaviyo.com/en/docs/javascript_api
  8. help.klaviyo.com/hc/en-us/articles/4534329515931
  9. developers.klaviyo.com/en/docs/how_to_add_a_webhook_action_to_a_flow
  10. developers.klaviyo.com/en/reference/create_profile
  11. developers.klaviyo.com/en/reference/update_profile
  12. developers.klaviyo.com/en/reference/create_list_relationships
  13. developers.klaviyo.com/en/reference/query_metric_aggregates
CR
Charlotte Rodrigues · CRM Lead, Deliver. Une question sur cet article ? charlotte@agence-deliver.com

Besoin d'appliquer ça à votre stack ?

30 minutes avec Charlotte. On audit votre setup CRM en direct, on chiffre l'opportunité, vous repartez avec un plan d'attaque.

Réserver 30 minutes →