Optimizely konektor
Prepoj Optimizely Feature Experimentation s Brevo cez Tajo na synchronizáciu výsledkov experimentov, cielenie kampaní podľa segmentov feature flags a obohacovanie marketingových automatizácií o dáta A/B testov a poznatky o publikách.
Prehľad
| Vlastnosť | Hodnota |
|---|---|
| Platforma | Optimizely |
| Kategória | Experimentovanie (Vlastná) |
| Zložitosť nastavenia | Stredná |
| Oficiálna integrácia | Nie |
| Synchronizované dáta | Experimenty, Publiká, Udalosti, Feature Flags |
| Metóda autentifikácie | Personal Access Token / OAuth 2.0 |
Funkcie
- Synchronizácia experimentov - Odosielaj priradenia variantov A/B testov do atribútov kontaktov Brevo
- Cielenie publík - Použi publiká Optimizely pre segmentáciu kampaní Brevo
- Sledovanie konverzií - Sleduj udalosti Optimizely a namapuj na sledovanie udalostí Brevo
- Synchronizácia feature flags - Segmentuj kontakty podľa povolených feature flags
- Reportovanie výsledkov - Synchronizuj výsledky experimentov pre post-analytické marketingové kampane
- Podpora viacerých projektov - Prepoj viacero projektov Optimizely s jednou inštanciou Tajo
Predpoklady
Predtým, než začneš, uisti sa, že máš:
- Účet Optimizely Feature Experimentation
- Personal Access Token z Optimizely App Settings
- SDK kľúč pre tvoje Optimizely prostredie
- Brevo účet s API prístupom
- Tajo účet s oprávneniami pre konektory
Autentifikácia
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'};Autentifikácia 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();Konfigurácia
Základné nastavenie
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_SEGMENTSMapovanie polí
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 endpointy
| Endpoint | Metóda | Popis |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Zoznam projektov |
https://api.optimizely.com/v2/experiments | GET | Zoznam experimentov |
https://api.optimizely.com/v2/experiments/{id} | GET | Detaily experimentu |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Výsledky experimentu |
https://api.optimizely.com/v2/features | GET | Zoznam feature flags |
https://api.optimizely.com/v2/features/{id} | GET | Detaily feature flag |
https://api.optimizely.com/v2/audiences | GET | Zoznam publík |
https://api.optimizely.com/v2/events | GET | Zoznam sledovaných udalostí |
https://logx.optimizely.com/v1/events | POST | Sledovanie udalostí (SDK endpoint) |
Ukážky kódu
Inicializácia 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'});Synchronizácia rozhodnutí experimentov do 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() } }); } } });Synchronizácia výsledkov experimentov
// 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}`); }}Segmentácia na základe feature flags
// 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() } });}Obmedzenia rýchlosti
| Endpoint | Limit | Poznámky |
|---|---|---|
| REST API | 50 požiadaviek/min | Na personal access token |
| Results API | 10 požiadaviek/min | Vyššia latencia, ťažšie dopyty |
| SDK Event Dispatch | 10 000 udalostí/dávka | Cez SDK event processor |
| Datafile CDN | Neobmedzene | Kešovaný s automatickými aktualizáciami |
Latencia Results API
Experiment Results API spracúva veľké datasety a môže trvať 30+ sekúnd na odpoveď. Použi asynchrónny polling alebo kešovanie na vyhnutie sa blokovaniu aplikácie.
Riešenie problémov
| Problém | Príčina | Riešenie |
|---|---|---|
| 401 Unauthorized | Token vypršal/neplatný | Znovu vygeneruj Personal Access Token |
| SDK nie je pripravený | Datafile nie je načítaný | Počkaj na vyriešenie prísľubu onReady() |
| Žiadne zaznamenané rozhodnutia | Listener nie je zaregistrovaný | Zaregistruj listener pred vykonávaním rozhodnutí |
| Zastarané feature flags | Keš datafile | Nastav updateInterval pre automatickú obnovu |
| Chýbajúce výsledky | Experiment nie je spustený | Overte, že stav experimentu je “running” |
Debug režim
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueOdporúčané postupy
- Použi SDK pre rozhodnutia - Použi SDK pre vyhodnotenie flags v reálnom čase, REST API pre správu
- Implementuj dávkovanie udalostí - Dávkuj SDK udalosti na zníženie sieťovej réžie
- Kešuj datafile - Povol automatickú aktualizáciu s príslušnými intervalmi
- Synchronizuj víťazné varianty - Po ukončení experimentov aktualizuj segmenty kontaktov
- Použi atribúty pre cielenie - Odovzdávaj e-mail a atribúty používateľa pre zhodu s publikom
- Sleduj stav experimentu - Synchronizuj iba dáta z bežiacich alebo ukončených experimentov
Bezpečnosť
- Personal Access Tokens - Bearer token autentifikácia pre REST API
- Izolácia SDK kľúčov - Samostatné SDK kľúče na prostredie (dev, staging, prod)
- Vyhodnotenie na strane servera - Vyhodnocuj feature flags na strane servera na predchádzanie expozícii
- Rotácia tokenov - Pravidelne rotuj Personal Access Tokens
- Minimálne oprávnenia - Použi read-only tokeny, keď write prístup nie je potrebný
- Šifrovaný transport - TLS 1.2+ pre všetku API a SDK komunikáciu