Optimizely Connector
Poveži Optimizely Feature Experimentation z Brevo prek Tajo za sinhronizacijo rezultatov eksperimentov, ciljanje kampanj po segmentih zastavic funkcij in obogatitev marketinških avtomatizacij s podatki A/B testov in vpogledi v občinstvo.
Pregled
| Lastnost | Vrednost |
|---|---|
| Platforma | Optimizely |
| Kategorija | Eksperimentiranje (po meri) |
| Zahtevnost nastavitve | Srednja |
| Uradna integracija | Ne |
| Sinhronizirani podatki | Eksperimenti, občinstvo, dogodki, zastavice funkcij |
| Metoda avtentikacije | Personal Access Token / OAuth 2.0 |
Funkcionalnosti
- Sinhronizacija eksperimentov – potiski dodelitev variant A/B testov v atribute stikov Brevo
- Ciljanje občinstva – za segmentacijo kampanj Brevo uporabi občinstvo Optimizely
- Sledenje konverzijam – sledi événementom Optimizely in jih preslikaj na sledenje dogodkov Brevo
- Sinhronizacija zastavic funkcij – segmentiraj stike glede na omogočene zastavice funkcij
- Poročanje o rezultatih – sinhronizacija rezultatov eksperimentov za marketinške kampanje po analizi
- Podpora za več projektov – poveži več projektov Optimizely z eno instanco Tajo
Predpogoji
Preden začneš, se prepričaj, da imaš:
- Račun Optimizely Feature Experimentation
- Personal Access Token iz Nastavitev aplikacije Optimizely
- SDK ključ za okolje Optimizely
- Brevo račun z dostopom do API
- Tajo račun z dovoljenji za konektorje
Avtentikacija
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'};Avtentikacija SDK
// 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
Osnovna nastavitev
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_SEGMENTSPreslikava polj
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_DATEKončne točke API
| Končna točka | Metoda | Opis |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Seznam projektov |
https://api.optimizely.com/v2/experiments | GET | Seznam eksperimentov |
https://api.optimizely.com/v2/experiments/{id} | GET | Pridobi podrobnosti eksperimenta |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Pridobi rezultate eksperimenta |
https://api.optimizely.com/v2/features | GET | Seznam zastavic funkcij |
https://api.optimizely.com/v2/features/{id} | GET | Pridobi zastavico funkcije |
https://api.optimizely.com/v2/audiences | GET | Seznam občinstev |
https://api.optimizely.com/v2/events | GET | Seznam sledenih événements |
https://logx.optimizely.com/v1/events | POST | Sledi événementom (končna točka SDK) |
Primeri kode
Inicializacija konektorja
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 odločitev eksperimentov z 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 rezultatov eksperimentov
// 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 na osnovi zastavic funkcij
// 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() } });}Omejitve hitrosti
| Končna točka | Omejitev | Opombe |
|---|---|---|
| REST API | 50 zahtevkov/min | Na Personal Access Token |
| Results API | 10 zahtevkov/min | Višja zakasnitev, zahtevnejše poizvedbe |
| Pošiljanje événements SDK | 10.000 événements/paket | Prek procesorja événements SDK |
| Datafile CDN | Neomejeno | Predpomnjeno s samodejnimi posodobitvami |
Zakasnitev Results API
Experiment Results API obdeluje velike nabore podatkov in se lahko odzove po 30+ sekundah. Za izogibanje blokiranju aplikacije uporabi asinhrono anketiranje ali predpomnjenje.
Odpravljanje težav
| Težava | Vzrok | Rešitev |
|---|---|---|
| 401 Unauthorized | Žeton potekel/neveljaven | Obnovi Personal Access Token |
| SDK ni pripravljen | Datafile ni naložen | Počakaj, da se reši obljuba onReady() |
| Odločitve niso zabeležene | Poslušalec ni registriran | Registriraj poslušalca pred sprejemanjem odločitev |
| Zastarele zastavice funkcij | Predpomnilnik datafile | Nastavi updateInterval za samodejno osvežitev |
| Manjkajo rezultati | Eksperiment ni zagnan | Preveri, ali je status eksperimenta “running” |
Način odpravljanja napak
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueNajboljše prakse
- Uporabi SDK za odločitve – za ocenjevanje zastavic v realnem času SDK, REST API za upravljanje
- Implementiraj paketiranje événements – paketni événements SDK za zmanjšanje omrežnih stroškov
- Predpomni datafile – omogoči samodejno posodabljanje z ustreznimi intervali
- Sinhronizacija zmagovalnih variant – po zaključku eksperimentov posodobi segmente stikov
- Za ciljanje uporabi atribute – za ujemanje občinstva posreduj e-mail in atribute uporabnika
- Spremljaj status eksperimentov – sinhronizacija podatkov samo iz tekočih ali zaključenih eksperimentov
Varnost
- Personal Access Tokens – avtentikacija z žetonom prinosnika za REST API
- Izolacija SDK ključev – ločeni SDK ključi na okolje (razvoj, testno, produkcijsko)
- Ocenjevanje na strani strežnika – ocenjuj zastavice funkcij na strani strežnika, da preprečiš izpostavljenost
- Rotacija žetonov – periodično menjaj Personal Access Tokens
- Minimalna dovoljenja – kadar pisni dostop ni potreben, uporabi žetone samo za branje
- Šifrirani prenos – TLS 1.2+ za vse komunikacije API in SDK