Optimizely Connector

Verbinde Optimizely Feature Experimentation über Tajo mit Brevo, um Experimentergebnisse zu synchronisieren, Kampagnen nach Feature-Flag-Segmenten auszurichten und Marketing-Automationen mit A/B-Test-Daten und Audience-Insights anzureichern.

Überblick

EigenschaftWert
PlattformOptimizely
KategorieExperimentation (Custom)
EinrichtungsaufwandMittel
Offizielle IntegrationNein
Synchronisierte DatenExperimente, Audiences, Events, Feature Flags
AuthentifizierungPersonal Access Token / OAuth 2.0

Funktionen

  • Experiment-Synchronisation - Übertrage A/B-Test-Variationszuweisungen an Brevo-Kontaktattribute
  • Audience-Targeting - Nutze Optimizely-Audiences für die Brevo-Kampagnensegmentierung
  • Conversion-Tracking - Tracke Optimizely-Events und mappe sie auf das Brevo-Event-Tracking
  • Feature-Flag-Synchronisation - Segmentiere Kontakte nach aktivierten Feature Flags
  • Ergebnis-Reporting - Synchronisiere Experimentergebnisse für nachgelagerte Analyse-Marketing-Kampagnen
  • Multi-Projekt-Support - Verbinde mehrere Optimizely-Projekte mit einer einzigen Tajo-Instanz

Voraussetzungen

Bevor du beginnst, stelle sicher, dass du Folgendes hast:

  1. Ein Optimizely-Feature-Experimentation-Konto
  2. Einen Personal Access Token aus den Optimizely App Settings
  3. Einen SDK-Schlüssel für deine Optimizely-Umgebung
  4. Ein Brevo-Konto mit API-Zugriff
  5. Ein Tajo-Konto mit Connector-Berechtigungen

Authentifizierung

Personal Access Token

Terminal window
# Generate at https://app.optimizely.com/v2/accountsettings/tokens
export OPTIMIZELY_ACCESS_TOKEN=your_personal_access_token
export OPTIMIZELY_SDK_KEY=your_sdk_key
export TAJO_API_KEY=your_tajo_api_key
export BREVO_API_KEY=your_brevo_api_key
// All REST API requests use Bearer token auth
const headers = {
'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
};

SDK-Authentifizierung

// For feature flag evaluation, use the SDK
const optimizelySDK = require('@optimizely/optimizely-sdk');
const optimizelyClient = optimizelySDK.createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY,
datafileOptions: {
autoUpdate: true,
updateInterval: 60000 // 1 minute
}
});
await optimizelyClient.onReady();

Konfiguration

Grundeinrichtung

connectors:
optimizely:
enabled: true
access_token: "${OPTIMIZELY_ACCESS_TOKEN}"
sdk_key: "${OPTIMIZELY_SDK_KEY}"
project_id: "12345678"
sync:
experiments: true
audiences: true
events: true
feature_flags: true
schedule: "0 */2 * * *" # Every 2 hours
mapping:
experiment_variation: EXPERIMENT_VARIATION
feature_flags: ENABLED_FEATURES
audience_segments: OPT_SEGMENTS

Feld-Mapping

field_mapping:
user_id: email
experiment_key: EXPERIMENT_NAME
variation_key: VARIATION_NAME
feature_key: FEATURE_FLAG
enabled: FEATURE_ENABLED
audience_name: AUDIENCE_SEGMENT
decision_timestamp: EXPERIMENT_DATE

API-Endpoints

EndpointMethodeBeschreibung
https://api.optimizely.com/v2/projectsGETProjekte auflisten
https://api.optimizely.com/v2/experimentsGETExperimente auflisten
https://api.optimizely.com/v2/experiments/{id}GETExperimentdetails abrufen
https://api.optimizely.com/v2/experiments/{id}/resultsGETExperimentergebnisse abrufen
https://api.optimizely.com/v2/featuresGETFeature Flags auflisten
https://api.optimizely.com/v2/features/{id}GETFeature Flag abrufen
https://api.optimizely.com/v2/audiencesGETAudiences auflisten
https://api.optimizely.com/v2/eventsGETGetrackte Events auflisten
https://logx.optimizely.com/v1/eventsPOSTEvents tracken (SDK-Endpoint)

Code-Beispiele

Connector initialisieren

import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({
apiKey: process.env.TAJO_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY
});
await tajo.connectors.connect('optimizely', {
accessToken: process.env.OPTIMIZELY_ACCESS_TOKEN,
sdkKey: process.env.OPTIMIZELY_SDK_KEY,
projectId: '12345678'
});

Experiment-Entscheidungen mit Brevo synchronisieren

// Track experiment decisions and sync to Brevo
const optimizelyClient = optimizelySDK.createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY
});
await optimizelyClient.onReady();
// Register a decision notification listener
optimizelyClient.notificationCenter.addNotificationListener(
optimizelySDK.enums.NOTIFICATION_TYPES.DECISION,
async (decisionObject) => {
const { type, userId, attributes, decisionInfo } = decisionObject;
if (type === 'feature' || type === 'ab-test') {
const email = attributes.email;
if (email) {
await tajo.contacts.update(email, {
attributes: {
EXPERIMENT_NAME: decisionInfo.experimentKey || decisionInfo.featureKey,
VARIATION_NAME: decisionInfo.variationKey,
FEATURE_ENABLED: decisionInfo.featureEnabled || false,
EXPERIMENT_DATE: new Date().toISOString()
}
});
}
}
}
);

Experimentergebnisse synchronisieren

// Fetch experiment results and sync winning segments
const resultsResponse = await fetch(
`https://api.optimizely.com/v2/experiments/${experimentId}/results`,
{
headers: {
'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`
}
}
);
const results = await resultsResponse.json();
// Process variations and update contact segments
for (const variation of results.metrics) {
const isWinner = variation.is_improvement && variation.statistical_significance >= 0.95;
if (isWinner) {
// Create a Brevo segment for users in the winning variation
console.log(`Winning variation: ${variation.variation_name}`);
}
}

Feature-Flag-basierte Segmentierung

// Evaluate feature flags for user segmentation
async function syncFeatureFlags(userEmail, userId) {
const features = ['new_checkout', 'loyalty_program', 'ai_recommendations'];
const enabledFeatures = [];
for (const feature of features) {
const user = optimizelyClient.createUserContext(userId, {
email: userEmail
});
const decision = user.decide(feature);
if (decision.enabled) {
enabledFeatures.push(feature);
}
}
await tajo.contacts.update(userEmail, {
attributes: {
ENABLED_FEATURES: enabledFeatures.join(', '),
FEATURE_FLAGS_SYNCED: new Date().toISOString()
}
});
}

Rate Limits

EndpointLimitHinweise
REST API50 Anfr./MinPro Personal Access Token
Results API10 Anfr./MinHöhere Latenz, aufwendigere Queries
SDK Event Dispatch10.000 Events/BatchÜber den SDK-Event-Prozessor
Datafile CDNUnbegrenztGecacht mit Auto-Updates

Latenz der Results API

Die Experiment Results API verarbeitet große Datensätze und kann über 30 Sekunden für eine Antwort benötigen. Nutze asynchrones Polling oder Caching, um dein Programm nicht zu blockieren.

Fehlerbehebung

ProblemUrsacheLösung
401 UnauthorizedToken abgelaufen/ungültigPersonal Access Token neu generieren
SDK nicht bereitDatafile nicht geladenAuf onReady()-Promise warten
Keine Decisions geloggtNotification nicht registriertListener vor Decisions registrieren
Veraltete Feature FlagsDatafile-CacheupdateInterval für Auto-Refresh setzen
Fehlende ErgebnisseExperiment nicht gestartetStatus des Experiments auf “running” prüfen

Debug-Modus

connectors:
optimizely:
debug: true
log_level: verbose
log_decisions: true
log_events: true

Best Practices

  1. SDK für Decisions nutzen - Nutze das SDK für Echtzeit-Flag-Evaluation, die REST-API fürs Management
  2. Event-Batching implementieren - Bündle SDK-Events, um Netzwerk-Overhead zu reduzieren
  3. Datafile cachen - Aktiviere Auto-Update mit passenden Intervallen
  4. Gewinner-Variationen synchronisieren - Aktualisiere Kontaktsegmente nach Experiment-Abschluss
  5. Attribute fürs Targeting nutzen - Übergib E-Mail und User-Attribute für das Audience-Matching
  6. Experimentstatus überwachen - Synchronisiere nur Daten aus laufenden oder abgeschlossenen Experimenten

Sicherheit

  • Personal Access Tokens - Bearer-Token-Authentifizierung für die REST-API
  • SDK-Schlüssel-Isolation - Separate SDK-Schlüssel pro Umgebung (Dev, Staging, Prod)
  • Serverseitige Evaluation - Evaluiere Feature Flags serverseitig, um Offenlegung zu vermeiden
  • Token-Rotation - Rotiere Personal Access Tokens regelmäßig
  • Minimale Berechtigungen - Nutze Read-only-Tokens, wenn kein Schreibzugriff nötig ist
  • Verschlüsselter Transport - TLS 1.2+ für alle API- und SDK-Kommunikationen

Verwandte Ressourcen

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AI-Assistent

Hallo! Fragen Sie mich alles über die Dokumentation.