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
| Svojstvo | Vrednost |
|---|---|
| Platforma | Optimizely |
| Kategorija | Eksperimentisanje (Prilagođeno) |
| Složenost podešavanja | Srednje |
| Zvanična integracija | Ne |
| Sinhronizovani podaci | Eksperimenti, Publike, Događaji, Feature Flags |
| Metod autentifikacije | Personal 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š:
- Optimizely Feature Experimentation nalog
- Personal Access Token iz Optimizely App Settings
- SDK ključ za svoju Optimizely okolinu
- Brevo nalog sa API pristupom
- Tajo nalog sa dozvolama konektora
Autentifikacija
Personal Access Token
# Generate at 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// All REST API requests use Bearer token authconst headers = { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`, 'Content-Type': 'application/json'};SDK autentifikacija
// For feature flag evaluation, use the SDKconst 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_SEGMENTSMapiranje 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_DATEAPI endpointi
| Endpoint | Metoda | Opis |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Listanje projekata |
https://api.optimizely.com/v2/experiments | GET | Listanje eksperimenata |
https://api.optimizely.com/v2/experiments/{id} | GET | Dohvatanje detalja eksperimenta |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Dohvatanje rezultata eksperimenta |
https://api.optimizely.com/v2/features | GET | Listanje feature flag-ova |
https://api.optimizely.com/v2/features/{id} | GET | Dohvatanje feature flag-a |
https://api.optimizely.com/v2/audiences | GET | Listanje publike |
https://api.optimizely.com/v2/events | GET | Listanje praćenih događaja |
https://logx.optimizely.com/v1/events | POST | Prać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 Brevoconst optimizelyClient = optimizelySDK.createInstance({ sdkKey: process.env.OPTIMIZELY_SDK_KEY});
await optimizelyClient.onReady();
// Register a decision notification listeneroptimizelyClient.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 segmentsconst 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 segmentsfor (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 segmentationasync 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
| Endpoint | Limit | Napomene |
|---|---|---|
| REST API | 50 zahteva/min | Po personal access tokenu |
| Results API | 10 zahteva/min | Veća latencija, teži upiti |
| SDK Event Dispatch | 10.000 događaja/batch | Putem SDK event processora |
| Datafile CDN | Neograničeno | Keš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
| Problem | Uzrok | Rešenje |
|---|---|---|
| 401 Unauthorized | Token istekao/nevažeći | Regeneriši Personal Access Token |
| SDK nije spreman | Datafile nije učitan | Sačekaj da se onReady() promise reši |
| Odluke nisu logovane | Notification nije registrovan | Registruj listener pre donošenja odluka |
| Zastareli feature flag-ovi | Keš datafile-a | Postavi updateInterval za automatsko osvežavanje |
| Nedostaju rezultati | Eksperiment nije pokrenut | Proveri da je status eksperimenta “running” |
Debug režim
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueNajbolje prakse
- Koristi SDK za odluke - Koristi SDK za evaluaciju flag-ova u realnom vremenu, REST API za upravljanje
- Implementiraj grupiranje događaja - Grupiši SDK događaje da smanjiš mrežno opterećenje
- Keširaj datafile - Omogući automatsko ažuriranje sa odgovarajućim intervalima
- Sinhronizuj pobedničke varijacije - Nakon završetka eksperimenata, ažuriraj segmente kontakata
- Koristi atribute za ciljanje - Prosledi email i korisničke atribute za podudaranje publike
- 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