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
| Egenskap | Verdi |
|---|---|
| Plattform | Optimizely |
| Kategori | Eksperimentering (Custom) |
| Oppsettskompleksitet | Moderat |
| Offisiell integrasjon | Nei |
| Synkroniserte data | Eksperimenter, målgrupper, hendelser, feature flags |
| Autentiseringsmetode | Personlig 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:
- En Optimizely Feature Experimentation-konto
- Et personlig tilgangstoken fra Optimizely App Settings
- En SDK-nøkkel for ditt Optimizely-miljø
- En Brevo-konto med API-tilgang
- En Tajo-konto med konnektor-rettigheter
Autentisering
Personlig tilgangstoken
# Generer på https://app.optimizely.com/v2/accountsettings/tokensexport OPTIMIZELY_ACCESS_TOKEN=your_personal_access_tokenexport OPTIMIZELY_SDK_KEY=your_sdk_keyexport TAJO_API_KEY=your_tajo_api_keyexport BREVO_API_KEY=your_brevo_api_key// Alle REST API-forespørsler bruker Bearer-tokenautentiseringconst headers = { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`, 'Content-Type': 'application/json'};SDK-autentisering
// For evaluering av feature flags, bruk SDK-etconst 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_SEGMENTSFeltmapping
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_DATEAPI-endepunkter
| Endepunkt | Metode | Beskrivelse |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | List prosjekter |
https://api.optimizely.com/v2/experiments | GET | List eksperimenter |
https://api.optimizely.com/v2/experiments/{id} | GET | Hent eksperimentdetaljer |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Hent eksperimentresultater |
https://api.optimizely.com/v2/features | GET | List feature flags |
https://api.optimizely.com/v2/features/{id} | GET | Hent feature flag |
https://api.optimizely.com/v2/audiences | GET | List målgrupper |
https://api.optimizely.com/v2/events | GET | List sporede hendelser |
https://logx.optimizely.com/v1/events | POST | Spor 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 Brevoconst optimizelyClient = optimizelySDK.createInstance({ sdkKey: process.env.OPTIMIZELY_SDK_KEY});
await optimizelyClient.onReady();
// Registrer en lytter for beslutningsvarsleroptimizelyClient.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 segmenterconst 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 kontaktsegmenterfor (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 brukersegmenteringasync 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
| Endepunkt | Grense | Merknader |
|---|---|---|
| REST API | 50 forespørsler/min | Per personlig tilgangstoken |
| Results API | 10 forespørsler/min | Høyere latens, tyngre spørringer |
| SDK Event Dispatch | 10 000 hendelser/batch | Via SDK-hendelsesprosessor |
| Datafile CDN | Ubegrenset | Mellomlagret 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 | Årsak | Løsning |
|---|---|---|
| 401 Unauthorized | Token utløpt/ugyldig | Regenerer personlig tilgangstoken |
| SDK ikke klar | Datafile ikke lastet | Vent på at onReady()-promise skal løses |
| Ingen beslutninger loggført | Varsler ikke registrert | Registrer lytter før beslutninger tas |
| Utdaterte feature flags | Datafile-cache | Sett updateInterval for automatisk oppdatering |
| Manglende resultater | Eksperiment ikke startet | Verifiser at eksperimentstatus er “running” |
Feilsøkingsmodus
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueBeste praksis
- Bruk SDK-et for beslutninger - Bruk SDK-et for sanntidsevaluering av flags, REST API for administrasjon
- Implementer hendelsesbatching - Batch SDK-hendelser for å redusere nettverkstrafikk
- Mellomlagre datafile - Aktiver auto-oppdatering med passende intervaller
- Synkroniser vinnende varianter - Etter at eksperimenter er avsluttet, oppdater kontaktsegmenter
- Bruk attributter for målretting - Send e-post og brukerattributter for målgruppetreff
- 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