Optimizely konektor

Poveži Optimizely Feature Experimentation sa Brevo putem Tajo za sinhronizaciju rezultata eksperimenata, ciljanje kampanja po feature flag segmentima i obogaćivanje marketing automatizacija podacima o A/B testiranju i uvidima o publici.

Pregled

SvojstvoVrednost
PlatformaOptimizely
KategorijaEksperimentisanje (Prilagođeno)
Složenost podešavanjaSrednje
Zvanična integracijaNe
Sinhronizovani podaciEksperimenti, Publike, Događaji, Feature Flags
Metod autentifikacijePersonal Access Token / OAuth 2.0

Karakteristike

  • Sinhronizacija eksperimenta - Prosleđivanje dodela varijacija A/B testa u Brevo atribute kontakta
  • Ciljanje publike - Korišćenje Optimizely publike za Brevo segmentaciju kampanje
  • Praćenje konverzija - Praćenje Optimizely događaja i mapiranje na Brevo praćenje događaja
  • Sinhronizacija feature flag-ova - Segmentacija kontakata prema omogućenim feature flag-ovima
  • Izveštavanje o rezultatima - Sinhronizacija rezultata eksperimenta za post-analitičke marketing kampanje
  • Podrška za više projekata - Povezivanje više Optimizely projekata sa jednom Tajo instancom

Preduslovi

Pre nego što započneš, proveri da imaš:

  1. Optimizely Feature Experimentation nalog
  2. Personal Access Token iz Optimizely App Settings
  3. SDK ključ za svoju Optimizely okolinu
  4. Brevo nalog sa API pristupom
  5. Tajo nalog sa dozvolama konektora

Autentifikacija

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 autentifikacija

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

Konfiguracija

Osnovno podešavanje

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

Mapiranje polja

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 endpointi

EndpointMetodaOpis
https://api.optimizely.com/v2/projectsGETListanje projekata
https://api.optimizely.com/v2/experimentsGETListanje eksperimenata
https://api.optimizely.com/v2/experiments/{id}GETDohvatanje detalja eksperimenta
https://api.optimizely.com/v2/experiments/{id}/resultsGETDohvatanje rezultata eksperimenta
https://api.optimizely.com/v2/featuresGETListanje feature flag-ova
https://api.optimizely.com/v2/features/{id}GETDohvatanje feature flag-a
https://api.optimizely.com/v2/audiencesGETListanje publike
https://api.optimizely.com/v2/eventsGETListanje praćenih događaja
https://logx.optimizely.com/v1/eventsPOSTPraćenje događaja (SDK endpoint)

Primeri koda

Inicijalizacija konektora

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

Sinhronizacija odluka eksperimenta sa 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()
}
});
}
}
}
);

Sinhronizacija rezultata eksperimenta

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

Segmentacija zasnovana na feature flag-u

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

Ograničenja brzine

EndpointLimitNapomene
REST API50 zahteva/minPo personal access tokenu
Results API10 zahteva/minVeća latencija, teži upiti
SDK Event Dispatch10.000 događaja/batchPutem SDK event processora
Datafile CDNNeograničenoKeširano sa automatskim ažuriranjima

Latencija Results API-ja

Experiment Results API obrađuje velike skupove podataka i može trajati 30+ sekundi za odgovor. Koristi asinhrono ispitivanje ili keširanje da izbjegneš blokiranje aplikacije.

Rešavanje problema

ProblemUzrokRešenje
401 UnauthorizedToken istekao/nevažećiRegeneriši Personal Access Token
SDK nije spremanDatafile nije učitanSačekaj da se onReady() promise reši
Odluke nisu logovaneNotification nije registrovanRegistruj listener pre donošenja odluka
Zastareli feature flag-oviKeš datafile-aPostavi updateInterval za automatsko osvežavanje
Nedostaju rezultatiEksperiment nije pokrenutProveri da je status eksperimenta “running”

Debug režim

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

Najbolje prakse

  1. Koristi SDK za odluke - Koristi SDK za evaluaciju flag-ova u realnom vremenu, REST API za upravljanje
  2. Implementiraj grupiranje događaja - Grupiši SDK događaje da smanjiš mrežno opterećenje
  3. Keširaj datafile - Omogući automatsko ažuriranje sa odgovarajućim intervalima
  4. Sinhronizuj pobedničke varijacije - Nakon završetka eksperimenata, ažuriraj segmente kontakata
  5. Koristi atribute za ciljanje - Prosledi email i korisničke atribute za podudaranje publike
  6. Prati status eksperimenta - Sinhronizuj samo podatke iz pokrenutih ili završenih eksperimenata

Bezbednost

  • Personal Access Tokens - Bearer token autentifikacija za REST API
  • Izolacija SDK ključa - Odvojeni SDK ključevi po okolini (dev, staging, prod)
  • Server-side evaluacija - Evaluiraj feature flag-ove na server strani da sprečiš izlaganje
  • Rotacija tokena - Periodično rotiraj Personal Access Tokens
  • Minimalne dozvole - Koristi read-only tokene kada write pristup nije potreban
  • Enkriptovani transport - TLS 1.2+ za svu API i SDK komunikaciju

Povezani resursi

Subscribe to updates

developer-docs

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

auto-detect
AI асистент

Здраво! Питајте ме о документацији.