Optimizely Connector

Forbind Optimizely Feature Experimentation med Brevo via Tajo for at synkronisere eksperimentresultater, målrette kampagner efter feature flag-segmenter og berige marketingautomatiseringer med A/B-testdata og målgruppeindsigter.

Oversigt

EgenskabVærdi
PlatformOptimizely
KategoriEksperimentering (brugerdefineret)
OpsætningskompleksitetMellem
Officiel integrationNej
Synkroniserede dataEksperimenter, målgrupper, hændelser, feature flags
AutentifikationsmetodePersonal Access Token / OAuth 2.0

Funktioner

  • Eksperimentsynkronisering - Push A/B-testvariationstildelinger til Brevo-kontaktattributter
  • Målgruppemålretning - Brug Optimizely-målgrupper til segmentering af Brevo-kampagner
  • Konverteringsssporing - Spor Optimizely-hændelser, og kortlæg dem til Brevo-hændelsessporing
  • Feature flag-synkronisering - Segmentér kontakter efter aktiverede feature flags
  • Resultatrapportering - Synkronisér eksperimentresultater til marketingkampagner efter analyse
  • Multi-projekt-understøttelse - Forbind flere Optimizely-projekter til én Tajo-instans

Forudsætninger

Før du begynder, skal du sikre dig, at du har:

  1. En Optimizely Feature Experimentation-konto
  2. Et Personal Access Token fra Optimizely App Settings
  3. En SDK-nøgle til dit Optimizely-miljø
  4. En Brevo-konto med API-adgang
  5. En Tajo-konto med connector-tilladelser

Autentifikation

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-autentifikation

// 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

Grundlæggende opsætning

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

Feltmapping

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

EndpointMetodeBeskrivelse
https://api.optimizely.com/v2/projectsGETVis projekter
https://api.optimizely.com/v2/experimentsGETVis eksperimenter
https://api.optimizely.com/v2/experiments/{id}GETHent eksperimentdetaljer
https://api.optimizely.com/v2/experiments/{id}/resultsGETHent eksperimentresultater
https://api.optimizely.com/v2/featuresGETVis feature flags
https://api.optimizely.com/v2/features/{id}GETHent feature flag
https://api.optimizely.com/v2/audiencesGETVis målgrupper
https://api.optimizely.com/v2/eventsGETVis sporede hændelser
https://logx.optimizely.com/v1/eventsPOSTSpor hændelser (SDK-endpoint)

Kodeeksempler

Initialisér connector

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'
});

Synkronisér eksperimentbeslutninger til Brevo

// 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()
}
});
}
}
}
);

Synkronisér eksperimentresultater

// 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-baseret segmentering

// 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

EndpointGrænseNoter
REST API50 req/min.Pr. personal access token
Results API10 req/min.Højere latens, tungere forespørgsler
SDK Event Dispatch10.000 hændelser/batchVia SDK event processor
Datafile CDNUbegrænsetCachet med auto-opdateringer

Latens for Results API

Experiment Results API behandler store datasæt og kan tage 30+ sekunder at svare. Brug asynkron polling eller caching for at undgå at blokere din applikation.

Fejlfinding

ProblemÅrsagLøsning
401 UnauthorizedToken udløbet/ugyldigtRegenerér Personal Access Token
SDK ikke klarDatafile ikke indlæstVent på, at onReady()-promise bliver resolved
Ingen beslutninger loggetNotifikation ikke registreretRegistrér listener, før du træffer beslutninger
Forældede feature flagsDatafile-cacheIndstil updateInterval for auto-opdatering
Manglende resultaterEksperiment ikke startetVerificér, at eksperimentstatus er “running”

Debug-tilstand

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

Bedste praksis

  1. Brug SDK’et til beslutninger - Brug SDK’et til realtidsflagevaluering, REST API til administration
  2. Implementér event-batching - Batch SDK-hændelser for at reducere netværksoverhead
  3. Cache datafilen - Aktivér auto-opdatering med passende intervaller
  4. Synkronisér vindende variationer - Når eksperimenter slutter, opdatér kontaktsegmenter
  5. Brug attributter til målretning - Pass e-mail og brugerattributter til målgruppematch
  6. Overvåg eksperimentstatus - Synkronisér kun data fra kørende eller afsluttede eksperimenter

Sikkerhed

  • Personal Access Tokens - Bearer-token-autentifikation til REST API
  • SDK-nøgleisolation - Separate SDK-nøgler pr. miljø (dev, staging, prod)
  • Server-side-evaluering - Evaluér feature flags server-side for at undgå eksponering
  • Tokenrotation - Rotér Personal Access Tokens regelmæssigt
  • Minimale tilladelser - Brug read-only-tokens, når skriveadgang ikke er nødvendig
  • Krypteret transport - TLS 1.2+ til al API- og SDK-kommunikation

Relaterede ressourcer

Subscribe to updates

developer-docs

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

auto-detect
AI-assistent

Hej! Spørg mig om dokumentationen.