Skip to main content
Récupérez une expérience et ses résultats avec l’Automation API, transformez-les en propriétés de page Notion, et upsertez l’enregistrement dans une base de données Notion à l’aide d’un seul script Python.

Objectif

Ce tutoriel décrit, étape par étape, le fonctionnement du script kameleoon_to_notion.py. À partir d’un ID d’expérience Kameleoon et d’un ID de base de données Notion, le script récupère les métadonnées de l’expérience et ses résultats statistiques, détermine la variation la plus performante, mappe les données sur une base de données Notion Experiments, et écrit l’enregistrement dans Notion. Réexécuter le script pour la même expérience met à jour la page existante au lieu d’en créer un doublon. Les étapes 1 à 5 réutilisent le même flux de demande et d’interrogation que le tutoriel d’export vers Airtable : seule la destination change.
L’API de Notion ne dispose pas d’upsert natif. Le script en simule un : il interroge la source de données de la base de données pour trouver une page dont le titre correspond au nom de l’expérience, puis met à jour cette page si elle existe ou en crée une nouvelle sinon. Ce tutoriel cible la version 2025-09-03 de l’API Notion, qui organise chaque base de données autour d’une ou plusieurs sources de données.

Prérequis

  • Identifiants API Kameleoon. L’Automation API nécessite un access token. Le script en obtient un de manière programmatique à partir d’un client_id et d’un client_secret grâce au grant client_credentials. Consultez Obtenir un access token.
  • Un token d’intégration interne Notion. Créez une intégration sur notion.so/my-integrations et copiez son token.
  • Une base de données Notion avec un schéma Experiments et les propriétés suivantes : Experiment Name (title), Status (select), Start date (date), End date (date), Notes (rich text), Actual (number), Probability (select), et Result (select).
  • L’ID de base de données Notion. Ouvrez la base de données en pleine page (l’ID est la chaîne de 32 caractères dans son URL, avant le paramètre de vue ?v=).
  • Python 3.9 ou supérieur avec la bibliothèque requests (pip install requests).
Partagez la base de données avec votre intégration, sinon chaque requête retourne object_not_found. Ouvrez la base de données, allez dans ••• → Connections → Add connections, et sélectionnez votre intégration.
Stockez tous les identifiants dans des variables d’environnement. N’écrivez jamais les secrets en dur dans le script.
Le tutoriel utilise l’expérience d’exemple Product Page Redesign (ID 188308), avec deux variations en plus de l’originale : Redesign 1 (ID 828220) et Redesign 2 (ID 828221).

1. S’authentifier auprès de l’Automation API

Endpoint : obtenez un access token en envoyant une requête POST à l’endpoint de token.
Exemple :
Réponse :
L’access_token retourné est envoyé en tant que token Bearer pour chaque requête suivante à l’Automation API. Les access tokens sont valides 2 heures par défaut.

2. Récupérer l’expérience

Endpoint : récupérez les métadonnées de l’expérience en envoyant une requête GET à l’endpoint Get an experiment.
Exemple :
Réponse (abrégée) :
Le script lit name, status, dateStarted, dateEnded, et description pour la page Notion, ainsi que mainGoalId pour restreindre la requête de résultats à l’étape suivante.
L’API retourne mainGoalId par défaut, le script n’a donc pas besoin d’un paramètre optionalFields pour le lire. L’Automation API ne publie pas d’énumération fixe pour le champ status, et les tokens peuvent évoluer. L’étape 7 fait correspondre status sans distinction de casse, si bien que les différences de casse entre comptes ne cassent pas le mapping.

3. Demander les résultats de l’expérience

Endpoint : déclenchez la génération du rapport de résultats en envoyant une requête POST à l’endpoint Request experiment’s results.
Exemple :
Réponse :
Kameleoon génère le rapport de manière asynchrone. L’endpoint retourne un dataCode utilisé pour interroger le résultat à l’étape suivante.
Ce script nécessite bayesian: true et définit sequentialTesting: false. bayesian et sequentialTesting sont des méthodes alternatives de calcul de la significativité, et ce tutoriel rapporte la probabilité de succès bayésienne. Avec Bayesian activé, la valeur reliability du rapport porte la probabilité de succès bayésienne (la probabilité qu’une variation batte la référence), que le script mappe sur la propriété Probability. Confirmez cette valeur par rapport au même rapport dans l’application Kameleoon si votre compte utilise une méthode statistique par défaut différente.

4. Interroger les résultats

Endpoint : récupérez le rapport en envoyant des requêtes GET à l’endpoint Poll results jusqu’à ce qu’il soit prêt.
Le status de la réponse est WAITING pendant que le rapport est en cours de calcul, READY quand les données sont disponibles, ou ERROR / TIMEOUT en cas d’échec. Quand le statut est ERROR ou TIMEOUT, la réponse inclut un errorDescription de premier niveau. Le script interroge à intervalle fixe jusqu’à ce que le statut soit READY. Exemple :
Réponse (abrégée) :

5. Sélectionner la variation la plus performante

Les résultats contiennent une entrée par variation sous variationData, ainsi que la ligne _reference pour la page originale. Pour chaque variation, les métriques de l’objectif demandé se trouvent sous breakdownData._reference.generalData.goalsData[goalId]. Le script ignore l’entrée _reference, lit l’improvementRate et la reliability (la probabilité de succès bayésienne) de chaque variation, et sélectionne comme meilleure performance la variation ayant le taux d’amélioration le plus élevé. Si le goalsData d’une variation ne contient pas l’ID d’objectif demandé, le script se rabat sur l’objectif présent, quel qu’il soit ; comme l’étape 3 restreint déjà la demande à un seul objectif via goalsIds, ce repli n’a normalement rien d’autre à sélectionner. La propriété Result mappée plus loin indique si cette variation a atteint une probabilité de succès suffisamment élevée avec un uplift positif pour être considérée comme une véritable victoire. Exemple :
Dans l’exemple, les deux variations atteignent une probabilité de succès bayésienne de 100 %, mais Redesign 1 (828220) affiche une amélioration de +211,48 % contre -43,33 % pour Redesign 2. Redesign 1 est donc la variation la plus performante et, avec une probabilité supérieure à 95 % et un uplift positif, une véritable gagnante.

6. Résoudre la source de données Notion

Depuis la version 2025-09-03, une base de données Notion est un conteneur pour une ou plusieurs sources de données, et les écritures et requêtes de pages ciblent un ID de source de données plutôt que l’ID de base de données. Les deux ID ne sont pas interchangeables. Endpoint : récupérez la base de données pour découvrir ses sources de données en envoyant une requête GET à l’endpoint Retrieve a database.
Chaque requête Notion envoie le token d’intégration en tant que token Bearer, ainsi que l’en-tête Notion-Version. Exemple :
Réponse (abrégée) :
Le script utilise la première source de données. Si votre base de données en expose plusieurs, choisissez celle dont le schéma correspond aux propriétés Experiments.

7. Mapper les données aux propriétés Notion

Le script transforme les métadonnées de l’expérience et les métriques de la variation la plus performante en valeurs de propriétés Notion. Chaque type de propriété a sa propre structure JSON. Le script omet les valeurs vides afin que les valeurs de propriétés existantes ne soient jamais écrasées par des valeurs vides lors d’une mise à jour. Notion crée automatiquement toute option select manquante, mais les propriétés elles-mêmes doivent déjà exister dans le schéma de la source de données avec les types corrects. Exemple :
Notion n’autorise qu’une seule propriété de titre par source de données. Le script indexe l’upsert sur la propriété nommée Experiment Name ; si votre propriété de titre porte un nom différent, renommez-la ici et dans le filtre de requête à l’étape 8.

8. Upserter la page dans Notion

Notion n’a pas d’endpoint d’upsert, le script interroge donc la source de données pour trouver une page dont Experiment Name correspond, puis la met à jour ou en crée une nouvelle. Rechercher : interrogez la source de données avec un filtre de titre à l’aide de l’endpoint Query a data source.
Créer : ajoutez une page rattachée à la source de données à l’aide de l’endpoint Create a page.
Mettre à jour : écrasez les propriétés de la page correspondante à l’aide de l’endpoint Update page properties.
Exemple :
Réponse (abrégée) :

9. Exécuter le script

Transmettez l’ID de l’expérience ainsi que l’ID de base de données Notion en arguments :
Le script affiche chaque étape : l’authentification, l’expérience récupérée, la variation la plus performante, la source de données résolue, les propriétés mappées, et si la page Notion a été créée ou mise à jour.

Notes de personnalisation

  • Le mapping de statut se trouve dans la constante STATUS_MAP, indexée sur les tokens de statut retournés par l’API et comparée sans distinction de casse. Ajustez les valeurs cibles si vos options Status diffèrent de Running / Implementing / Completed / Defunct, et confirmez les tokens que votre compte retourne avec un simple GET /experiments/{experimentId}.
  • Probability se mappe à partir de la probabilité de succès bayésienne mesurée, ce qui nécessite bayesian: true sur la requête de résultats. Si votre propriété Probability est plutôt une estimation pré-expérience que vous saisissez manuellement, supprimez le bloc Probability de build_notion_properties.
  • La sélection de l’objectif utilise le mainGoalId de l’expérience. Pour établir un rapport sur un objectif différent, transmettez son ID à request_results et à pick_best_variation.
  • Clé d’upsert. La correspondance de titre est exacte, donc des différences de casse ou d’espacement dans Experiment Name créent une nouvelle page au lieu de mettre à jour celle existante. Le flux de recherche puis d’écriture n’étant pas atomique, évitez d’exécuter deux exports simultanés pour la même expérience.
  • Version de l’API. Le script fixe Notion-Version: 2025-09-03. Si vous ajoutez ultérieurement une deuxième source de données à la base de données, mettez à jour get_data_source_id pour sélectionner la bonne par son nom.
  • Limites de débit. L’Automation API autorise jusqu’à 50 requêtes par 10 secondes et 1 000 par heure ; l’API Notion tolère en moyenne environ 3 requêtes par seconde. Si vous traitez de nombreuses expériences en lot, mettez les tokens en cache et ajoutez une limitation de débit.