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_idet d’unclient_secretgrâce au grantclient_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), etResult(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).
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 :
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 :
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 :
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 :
5. Sélectionner la variation la plus performante
Les résultats contiennent une entrée par variation sousvariationData, 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 :
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 version2025-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.
Bearer, ainsi que l’en-tête Notion-Version.
Exemple :
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 dontExperiment 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.
9. Exécuter le script
Transmettez l’ID de l’expérience ainsi que l’ID de base de données Notion en arguments :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 deRunning/Implementing/Completed/Defunct, et confirmez les tokens que votre compte retourne avec un simpleGET /experiments/{experimentId}. - Probability se mappe à partir de la probabilité de succès bayésienne mesurée, ce qui nécessite
bayesian: truesur 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 blocProbabilitydebuild_notion_properties. - La sélection de l’objectif utilise le
mainGoalIdde l’expérience. Pour établir un rapport sur un objectif différent, transmettez son ID àrequest_resultset àpick_best_variation. - Clé d’upsert. La correspondance de titre est exacte, donc des différences de casse ou d’espacement dans
Experiment Namecré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 à jourget_data_source_idpour 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.