Optimizely-kobling

Koble Optimizely Feature Experimentation til Brevo gjennom Tajo for å synkronisere eksperimentresultater, målrette kampanjer etter feature flag-segmenter og berike markedsføringsautomatiseringer med A/B-testdata og målgruppeinnsikt.

Oversikt

EgenskapVerdi
PlattformOptimizely
KategoriEksperimentering (Custom)
OppsettskompleksitetModerat
Offisiell integrasjonNei
Synkroniserte dataEksperimenter, målgrupper, hendelser, feature flags
AutentiseringsmetodePersonlig tilgangstoken / OAuth 2.0

Funksjoner

  • Eksperimentsynkronisering - Push A/B-testvariantstildelinger til Brevo-kontaktattributter
  • Målgruppemålretting - Bruk Optimizely-målgrupper til segmentering av Brevo-kampanjer
  • Konverteringssporing - Spor Optimizely-hendelser og mapp til Brevo-hendelsessporing
  • Feature flag-synkronisering - Segmenter kontakter etter aktiverte feature flags
  • Resultatrapportering - Synkroniser eksperimentresultater for etteranalyse av markedsføringskampanjer
  • Støtte for flere prosjekter - Koble flere Optimizely-prosjekter til én enkelt Tajo-instans

Forutsetninger

Før du begynner, sørg for at du har:

  1. En Optimizely Feature Experimentation-konto
  2. Et personlig tilgangstoken fra Optimizely App Settings
  3. En SDK-nøkkel for ditt Optimizely-miljø
  4. En Brevo-konto med API-tilgang
  5. En Tajo-konto med konnektor-rettigheter

Autentisering

Personlig tilgangstoken

Terminal window
# Generer på 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
// Alle REST API-forespørsler bruker Bearer-tokenautentisering
const headers = {
'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
};

SDK-autentisering

// For evaluering av feature flags, bruk SDK-et
const optimizelySDK = require('@optimizely/optimizely-sdk');
const optimizelyClient = optimizelySDK.createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY,
datafileOptions: {
autoUpdate: true,
updateInterval: 60000 // 1 minutt
}
});
await optimizelyClient.onReady();

Konfigurasjon

Grunnleggende oppsett

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 * * *" # Hver 2. time
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-endepunkter

EndepunktMetodeBeskrivelse
https://api.optimizely.com/v2/projectsGETList prosjekter
https://api.optimizely.com/v2/experimentsGETList eksperimenter
https://api.optimizely.com/v2/experiments/{id}GETHent eksperimentdetaljer
https://api.optimizely.com/v2/experiments/{id}/resultsGETHent eksperimentresultater
https://api.optimizely.com/v2/featuresGETList feature flags
https://api.optimizely.com/v2/features/{id}GETHent feature flag
https://api.optimizely.com/v2/audiencesGETList målgrupper
https://api.optimizely.com/v2/eventsGETList sporede hendelser
https://logx.optimizely.com/v1/eventsPOSTSpor hendelser (SDK-endepunkt)

Kodeeksempler

Initialiser kobling

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

Synkroniser eksperimentbeslutninger til Brevo

// Spor eksperimentbeslutninger og synkroniser til Brevo
const optimizelyClient = optimizelySDK.createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY
});
await optimizelyClient.onReady();
// Registrer en lytter for beslutningsvarsler
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()
}
});
}
}
}
);

Synkroniser eksperimentresultater

// Hent eksperimentresultater og synkroniser vinnende segmenter
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();
// Behandle varianter og oppdater kontaktsegmenter
for (const variation of results.metrics) {
const isWinner = variation.is_improvement && variation.statistical_significance >= 0.95;
if (isWinner) {
// Opprett et Brevo-segment for brukere i den vinnende varianten
console.log(`Winning variation: ${variation.variation_name}`);
}
}

Feature flag-basert segmentering

// Evaluer feature flags for brukersegmentering
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()
}
});
}

Ratebegrensninger

EndepunktGrenseMerknader
REST API50 forespørsler/minPer personlig tilgangstoken
Results API10 forespørsler/minHøyere latens, tyngre spørringer
SDK Event Dispatch10 000 hendelser/batchVia SDK-hendelsesprosessor
Datafile CDNUbegrensetMellomlagret med automatisk oppdatering

Results API-latens

Experiment Results API behandler store datasett og kan ta 30+ sekunder å svare. Bruk asynkron polling eller mellomlagring for å unngå å blokkere applikasjonen din.

Feilsøking

ProblemÅrsakLøsning
401 UnauthorizedToken utløpt/ugyldigRegenerer personlig tilgangstoken
SDK ikke klarDatafile ikke lastetVent på at onReady()-promise skal løses
Ingen beslutninger loggførtVarsler ikke registrertRegistrer lytter før beslutninger tas
Utdaterte feature flagsDatafile-cacheSett updateInterval for automatisk oppdatering
Manglende resultaterEksperiment ikke startetVerifiser at eksperimentstatus er “running”

Feilsøkingsmodus

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

Beste praksis

  1. Bruk SDK-et for beslutninger - Bruk SDK-et for sanntidsevaluering av flags, REST API for administrasjon
  2. Implementer hendelsesbatching - Batch SDK-hendelser for å redusere nettverkstrafikk
  3. Mellomlagre datafile - Aktiver auto-oppdatering med passende intervaller
  4. Synkroniser vinnende varianter - Etter at eksperimenter er avsluttet, oppdater kontaktsegmenter
  5. Bruk attributter for målretting - Send e-post og brukerattributter for målgruppetreff
  6. Overvåk eksperimentstatus - Synkroniser kun data fra pågående eller avsluttede eksperimenter

Sikkerhet

  • Personlige tilgangstokens - Bearer-tokenautentisering for REST API
  • SDK-nøkkelisolering - Separate SDK-nøkler per miljø (dev, staging, prod)
  • Tjenersideevaluering - Evaluer feature flags på tjenersiden for å hindre eksponering
  • Tokenrotasjon - Roter personlige tilgangstokens regelmessig
  • Minimale rettigheter - Bruk kun lese-tokens når skrivetilgang ikke er nødvendig
  • Kryptert transport - TLS 1.2+ for all API- og SDK-kommunikasjon

Relaterte ressurser

Subscribe to updates

developer-docs

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

auto-detect
AI-assistent

Hei! Spør meg om dokumentasjonen.