Optimizely Konektor
Povežite Optimizely Feature Experimentation s Brevom putem Taja kako biste sinkronizirali rezultate eksperimenata, ciljali kampanje prema segmentima feature zastavica i obogatili marketinške automatizacije s A/B test podacima i uvidima publike.
Pregled
| Svojstvo | Vrijednost |
|---|---|
| Platforma | Optimizely |
| Kategorija | Eksperimentiranje (Prilagođeno) |
| Složenost postavljanja | Srednje |
| Službena integracija | Ne |
| Sinkronizirani podaci | Eksperimenti, Publike, Događaji, Feature zastavice |
| Metoda autentifikacije | Personal Access Token / OAuth 2.0 |
Značajke
- Sinkronizacija eksperimenata - Guranje dodjela varijanti A/B testova na Brevo atribute kontakata
- Ciljanje publike - Koristite Optimizely publike za Brevo segmentaciju kampanja
- Praćenje konverzija - Pratite Optimizely događaje i mapirajte na Brevo praćenje događaja
- Sinkronizacija feature zastavica - Segmentirajte kontakte prema omogućenim feature zastavicama
- Izvješćivanje o rezultatima - Sinkronizirajte rezultate eksperimenata za post-analitičke marketinške kampanje
- Podrška za više projekata - Povežite više Optimizely projekata s jednom Tajo instancom
Preduvjeti
Prije nego što počnete, osigurajte da imate:
- Optimizely Feature Experimentation račun
- Personal Access Token iz Optimizely App Postavke
- SDK ključ za vaše Optimizely okruženje
- Brevo račun s API pristupom
- Tajo račun s dozvolama konektora
Autentifikacija
Personal Access Token
# Generirajte na 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// Svi REST API zahtjevi koriste Bearer token autentifikacijuconst headers = { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`, 'Content-Type': 'application/json'};SDK autentifikacija
// Za evaluaciju feature zastavica, koristite SDKconst optimizelySDK = require('@optimizely/optimizely-sdk');
const optimizelyClient = optimizelySDK.createInstance({ sdkKey: process.env.OPTIMIZELY_SDK_KEY, datafileOptions: { autoUpdate: true, updateInterval: 60000 // 1 minuta }});
await optimizelyClient.onReady();Konfiguracija
Osnovna konfiguracija
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 * * *" # Svakih 2 sata
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 krajnje točke
| Krajnja točka | Metoda | Opis |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Popis projekata |
https://api.optimizely.com/v2/experiments | GET | Popis eksperimenata |
https://api.optimizely.com/v2/experiments/{id} | GET | Detalji eksperimenta |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Rezultati eksperimenta |
https://api.optimizely.com/v2/features | GET | Popis feature zastavica |
https://api.optimizely.com/v2/features/{id} | GET | Detalji feature zastavice |
https://api.optimizely.com/v2/audiences | GET | Popis publike |
https://api.optimizely.com/v2/events | GET | Popis praćenih događaja |
https://logx.optimizely.com/v1/events | POST | Praćenje događaja (SDK krajnja točka) |
Primjeri 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'});Sinkronizacija odluka eksperimenta s Brevom
// Praćenje odluka eksperimenta i sinkronizacija s Brevomconst optimizelyClient = optimizelySDK.createInstance({ sdkKey: process.env.OPTIMIZELY_SDK_KEY});
await optimizelyClient.onReady();
// Registracija slušatelja obavijesti o odlukamaoptimizelyClient.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() } }); } } });Sinkronizacija rezultata eksperimenta
// Dohvaćanje rezultata eksperimenta i sinkronizacija pobjedničkih segmenataconst resultsResponse = await fetch( `https://api.optimizely.com/v2/experiments/${experimentId}/results`, { headers: { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}` } });
const results = await resultsResponse.json();
// Obrada varijanti i ažuriranje segmenata kontakatafor (const variation of results.metrics) { const isWinner = variation.is_improvement && variation.statistical_significance >= 0.95;
if (isWinner) { // Stvaranje Brevo segmenta za korisnike u pobjedničkoj varijanti console.log(`Pobjednička varijanta: ${variation.variation_name}`); }}Segmentacija temeljena na feature zastavicama
// Evaluacija feature zastavica za korisničku segmentacijuasync 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
| Krajnja točka | Ograničenje | Napomene |
|---|---|---|
| REST API | 50 zah./min | Po personal access tokenu |
| Results API | 10 zah./min | Veća latencija, teži upiti |
| SDK isporuka događaja | 10.000 događaja/serija | Putem SDK procesora događaja |
| Datafile CDN | Neograničeno | Predmemorirano s automatskim ažuriranjima |
Latencija Results API-ja
Experiment Results API obrađuje velike skupove podataka i može trebati 30+ sekundi za odgovor. Koristite asinkrono anketiranje ili predmemoriranje kako biste izbjegli blokiranje vaše aplikacije.
Rješavanje problema
| Problem | Uzrok | Rješenje |
|---|---|---|
| 401 Unauthorized | Token istekao/nevažeći | Regenerirajte Personal Access Token |
| SDK nije spreman | Datafile nije učitan | Pričekajte da se razriješi obećanje onReady() |
| Nisu zabilježene odluke | Obavijest nije registrirana | Registrirajte slušatelja prije donošenja odluka |
| Zastarjele feature zastavice | Predmemorija datafile-a | Postavite updateInterval za automatsko osvježavanje |
| Nedostaju rezultati | Eksperiment nije pokrenut | Provjerite je li status eksperimenta “running” |
Način otklanjanja grešaka
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: truePreporučene prakse
- Koristite SDK za odluke - Koristite SDK za evaluaciju zastavica u stvarnom vremenu, REST API za upravljanje
- Implementirajte skupno slanje događaja - Skupni SDK događaji za smanjenje mrežnog opterećenja
- Predmemorirajte datafile - Omogućite automatsko ažuriranje s odgovarajućim intervalima
- Sinkronizirajte pobjedničke varijante - Nakon zaključivanja eksperimenata, ažurirajte segmente kontakata
- Koristite atribute za ciljanje - Proslijedite e-mail i korisničke atribute za podudaranje publike
- Pratite status eksperimenta - Sinkronizirajte samo podatke iz pokrenutih ili zaključenih eksperimenata
Sigurnost
- Personal Access Tokeni - Bearer token autentifikacija za REST API
- Izolacija SDK ključa - Zasebni SDK ključevi po okruženju (razvoj, testiranje, produkcija)
- Evaluacija na strani servera - Evaluirajte feature zastavice na strani servera kako biste spriječili izlaganje
- Rotacija tokena - Periodično rotirajte Personal Access Tokene
- Minimalne dozvole - Koristite tokene samo za čitanje kada write pristup nije potreban
- Šifrirani transport - TLS 1.2+ za sve API i SDK komunikacije