Skip to main content
Rufen Sie ein Experiment und seine Ergebnisse mit der Automation API ab, wandeln Sie sie in Notion-Seiteneigenschaften um und schreiben Sie den Datensatz mit einem einzigen Python-Skript per Upsert in eine Notion-Datenbank.

Ziel

Dieses Tutorial beschreibt Schritt für Schritt, wie das Skript kameleoon_to_notion.py funktioniert. Anhand einer Kameleoon-Experiment-ID und einer Notion-Datenbank-ID ruft das Skript die Experimentmetadaten und die statistischen Ergebnisse ab, ermittelt die leistungsstärkste Variation, bildet die Daten auf eine Notion-Datenbank Experiments ab und schreibt den Datensatz zurück nach Notion. Ein erneuter Lauf des Skripts für dasselbe Experiment aktualisiert die bestehende Seite, statt ein Duplikat zu erstellen. Die Schritte 1–5 verwenden denselben Ablauf für Anfrage und Abfrage wie das Airtable-Export-Tutorial; nur das Ziel ändert sich.
Die API von Notion verfügt über keinen nativen Upsert. Das Skript emuliert einen: Es fragt die Data Source der Datenbank nach einer Seite ab, deren Titel dem Namen des Experiments entspricht, aktualisiert diese Seite bei einem Treffer oder erstellt andernfalls eine neue. Dieses Tutorial richtet sich an die Notion-API-Version 2025-09-03, die jede Datenbank um eine oder mehrere Data Sources organisiert.

Voraussetzungen

  • Kameleoon-API-Anmeldedaten. Die Automation API erfordert ein Access Token. Das Skript ruft dieses programmgesteuert anhand einer client_id und eines client_secret über den client_credentials-Grant ab. Siehe Access Token abrufen.
  • Ein internes Notion-Integrationstoken. Erstellen Sie eine Integration unter notion.so/my-integrations und kopieren Sie deren Token.
  • Eine Notion-Datenbank mit dem Schema Experiments und den folgenden Eigenschaften: Experiment Name (title), Status (select), Start date (date), End date (date), Notes (rich text), Actual (number), Probability (select) und Result (select).
  • Die Notion-Datenbank-ID. Öffnen Sie die Datenbank als vollständige Seite (die ID ist die 32-stellige Zeichenkette in der URL, vor dem View-Parameter ?v=).
  • Python 3.9+ mit der Bibliothek requests (pip install requests).
Teilen Sie die Datenbank mit Ihrer Integration, sonst gibt jede Anfrage object_not_found zurück. Öffnen Sie die Datenbank, gehen Sie zu ••• → Connections → Add connections, und wählen Sie Ihre Integration aus.
Speichern Sie alle Anmeldedaten in Umgebungsvariablen. Codieren Sie Geheimnisse niemals fest im Skript.
Das Tutorial verwendet das Beispielexperiment Product Page Redesign (ID 188308) mit zwei Variationen zusätzlich zur Originalversion: Redesign 1 (ID 828220) und Redesign 2 (ID 828221).

1. Bei der Automation API authentifizieren

Endpoint: Rufen Sie ein Access Token ab, indem Sie eine POST-Anfrage an den Token-Endpoint senden.
Beispiel:
Antwort:
Der zurückgegebene access_token wird als Bearer-Token bei jeder weiteren Anfrage an die Automation API gesendet. Access Tokens sind standardmäßig 2 Stunden lang gültig.

2. Das Experiment abrufen

Endpoint: Rufen Sie die Experimentmetadaten ab, indem Sie eine GET-Anfrage an den Endpoint Get an experiment senden.
Beispiel:
Antwort (gekürzt):
Das Skript liest name, status, dateStarted, dateEnded und description für die Notion-Seite sowie mainGoalId, um die Ergebnisanfrage im nächsten Schritt einzugrenzen.
Die API gibt mainGoalId standardmäßig zurück, sodass das Skript keinen optionalFields-Parameter benötigt, um sie zu lesen. Die Automation API veröffentlicht kein festes Enum für das Feld status, und die Token können sich weiterentwickeln. Schritt 7 vergleicht status ohne Berücksichtigung der Groß-/Kleinschreibung, sodass Unterschiede in der Schreibweise zwischen Konten das Mapping nicht beeinträchtigen.

3. Die Ergebnisse des Experiments anfordern

Endpoint: Lösen Sie die Erstellung des Ergebnisberichts aus, indem Sie eine POST-Anfrage an den Endpoint Request experiment’s results senden.
Beispiel:
Antwort:
Kameleoon erstellt den Bericht asynchron. Der Endpoint gibt einen dataCode zurück, der im nächsten Schritt zum Abfragen des Ergebnisses verwendet wird.
Dieses Skript erfordert bayesian: true und setzt sequentialTesting: false. bayesian und sequentialTesting sind alternative Methoden zur Berechnung der Signifikanz, und dieses Tutorial gibt die Bayesianische Erfolgswahrscheinlichkeit aus. Bei aktiviertem Bayesian-Modus trägt der Wert reliability des Berichts die Bayesianische Erfolgswahrscheinlichkeit (die Wahrscheinlichkeit, dass eine Variation die Referenz übertrifft), die das Skript auf die Eigenschaft Probability abbildet. Gleichen Sie den Wert mit demselben Bericht in der Kameleoon-App ab, wenn Ihr Konto eine andere Standardstatistikmethode verwendet.

4. Die Ergebnisse abfragen

Endpoint: Rufen Sie den Bericht ab, indem Sie GET-Anfragen an den Endpoint Poll results senden, bis er bereit ist.
Der status der Antwort lautet WAITING, solange der Bericht berechnet wird, READY, sobald die Daten verfügbar sind, oder ERROR beziehungsweise TIMEOUT bei einem Fehler. Wenn der Status ERROR oder TIMEOUT lautet, enthält die Antwort ein errorDescription-Feld auf oberster Ebene. Das Skript fragt in einem festen Intervall ab, bis der Status READY lautet. Beispiel:
Antwort (gekürzt):

5. Die leistungsstärkste Variation auswählen

Die Ergebnisse enthalten unter variationData einen Eintrag pro Variation sowie die Zeile _reference für die Originalseite. Für jede Variation liegen die Metriken für das angeforderte Ziel unter breakdownData._reference.generalData.goalsData[goalId]. Das Skript überspringt den Eintrag _reference, liest für jede Variation improvementRate und reliability (die Bayesianische Erfolgswahrscheinlichkeit) und wählt die Variation mit der höchsten Verbesserungsrate als leistungsstärkste aus. Enthält das goalsData einer Variation die angeforderte Goal-ID nicht, greift das Skript auf das vorhandene Goal zurück, welches auch immer das ist; da Schritt 3 die Anfrage bereits auf ein einzelnes Goal über goalsIds beschränkt, gibt es bei diesem Fallback normalerweise nichts anderes zur Auswahl. Die später abgebildete Eigenschaft Result erfasst, ob diese Variation eine ausreichend hohe Erfolgswahrscheinlichkeit bei einer positiven Verbesserung erreicht hat, um als echter Gewinner zu zählen. Beispiel:
Im Beispiel erreichen beide Variationen eine Bayesianische Erfolgswahrscheinlichkeit von 100 %, aber Redesign 1 (828220) zeigt eine Verbesserung von +211,48 % gegenüber -43,33 % bei Redesign 2. Redesign 1 ist daher die leistungsstärkste Variation und, mit einer Wahrscheinlichkeit über 95 % und einer positiven Verbesserung, ein echter Gewinner.

6. Die Notion-Data-Source auflösen

Seit Version 2025-09-03 ist eine Notion-Datenbank ein Container für eine oder mehrere Data Sources, und Seiten-Schreibvorgänge sowie Abfragen zielen auf eine Data-Source-ID statt auf die Datenbank-ID. Die beiden IDs sind nicht austauschbar. Endpoint: Rufen Sie die Datenbank ab, um ihre Data Sources zu ermitteln, indem Sie eine GET-Anfrage an den Endpoint Retrieve a database senden.
Jede Notion-Anfrage sendet das Integrationstoken als Bearer-Token sowie den Header Notion-Version. Beispiel:
Antwort (gekürzt):
Das Skript verwendet die erste Data Source. Wenn Ihre Datenbank mehrere bereitstellt, wählen Sie diejenige aus, deren Schema den Experiments-Eigenschaften entspricht.

7. Die Daten auf Notion-Eigenschaften abbilden

Das Skript wandelt die Experimentmetadaten und die Metriken der leistungsstärksten Variation in Notion-Eigenschaftswerte um. Jeder Eigenschaftstyp hat seine eigene JSON-Struktur. Das Skript lässt leere Werte aus, sodass bestehende Eigenschaftswerte bei einer Aktualisierung niemals mit leeren Werten überschrieben werden. Notion erstellt fehlende Select-Optionen automatisch, aber die Eigenschaften selbst müssen bereits mit den korrekten Typen im Schema der Data Source vorhanden sein. Beispiel:
Notion erlaubt nur eine Title-Eigenschaft pro Data Source. Das Skript verwendet die Eigenschaft mit dem Namen Experiment Name als Upsert-Schlüssel; wenn Ihre Title-Eigenschaft einen anderen Namen hat, benennen Sie sie hier und im Abfragefilter in Schritt 8 entsprechend um.

8. Die Seite per Upsert in Notion schreiben

Notion verfügt über keinen Upsert-Endpoint, daher fragt das Skript die Data Source nach einer Seite ab, deren Experiment Name übereinstimmt, und aktualisiert diese Seite oder erstellt eine neue. Suchen: Fragen Sie die Data Source mit einem Title-Filter über den Endpoint Query a data source ab.
Erstellen: Fügen Sie über den Endpoint Create a page eine Seite hinzu, deren übergeordnetes Element die Data Source ist.
Aktualisieren: Überschreiben Sie die Eigenschaften der gefundenen Seite über den Endpoint Update page properties.
Beispiel:
Antwort (gekürzt):

9. Das Skript ausführen

Übergeben Sie die Experiment-ID und die Notion-Datenbank-ID als Argumente:
Das Skript gibt jeden Schritt aus: die Authentifizierung, das abgerufene Experiment, die leistungsstärkste Variation, die aufgelöste Data Source, die zugeordneten Eigenschaften sowie, ob die Notion-Seite erstellt oder aktualisiert wurde.

Anpassungshinweise

  • Status-Mapping befindet sich in der Konstante STATUS_MAP, die anhand der von der API zurückgegebenen Status-Token indiziert ist und ohne Berücksichtigung der Groß-/Kleinschreibung abgeglichen wird. Passen Sie die Zielwerte an, wenn Ihre Status-Optionen von Running / Implementing / Completed / Defunct abweichen, und bestätigen Sie die Token, die Ihr Konto zurückgibt, mit einer einzelnen GET /experiments/{experimentId}-Anfrage.
  • Probability wird aus der gemessenen Bayesianischen Erfolgswahrscheinlichkeit abgebildet, wofür bayesian: true in der Ergebnisanfrage erforderlich ist. Wenn Ihre Eigenschaft Probability stattdessen eine manuell eingetragene Schätzung vor dem Experiment ist, entfernen Sie den Probability-Block aus build_notion_properties.
  • Zielauswahl verwendet die mainGoalId des Experiments. Um über ein anderes Ziel zu berichten, übergeben Sie dessen ID an request_results und pick_best_variation.
  • Upsert-Schlüssel. Der Titelabgleich erfolgt exakt, sodass Unterschiede bei Groß-/Kleinschreibung oder Leerzeichen in Experiment Name eine neue Seite erstellen, statt die bestehende zu aktualisieren. Da der Ablauf aus Suchen und anschließendem Schreiben nicht atomar ist, vermeiden Sie es, zwei Exporte für dasselbe Experiment gleichzeitig auszuführen.
  • API-Version. Das Skript legt Notion-Version: 2025-09-03 fest. Wenn Sie der Datenbank später eine zweite Data Source hinzufügen, aktualisieren Sie get_data_source_id, damit die richtige anhand ihres Namens ausgewählt wird.
  • Rate Limits. Die Automation API erlaubt bis zu 50 Anfragen pro 10 Sekunden und 1.000 pro Stunde; die Notion API erlaubt im Durchschnitt etwa 3 Anfragen pro Sekunde. Wenn Sie viele Experimente in Batches verarbeiten, cachen Sie Tokens und fügen Sie eine Drosselung hinzu.