Conector Optimizely
Conectați Optimizely Feature Experimentation la Brevo prin Tajo pentru a sincroniza rezultatele experimentelor, a targeta campanii după segmentele de fanioane de funcționalități și a îmbogăți automatizările de marketing cu date din testele A/B și informații despre audiență.
Prezentare generală
| Proprietate | Valoare |
|---|---|
| Platformă | Optimizely |
| Categorie | Experimentare (Personalizat) |
| Complexitate configurare | Medie |
| Integrare oficială | Nu |
| Date sincronizate | Experimente, Audiențe, Evenimente, Fanioane de funcționalități |
| Metodă de autentificare | Token de acces personal / OAuth 2.0 |
Funcționalități
- Sincronizare experimente - Transmiteți atribuirile variațiilor testelor A/B la atributele de contact Brevo
- Targetare audiență - Utilizați audiențele Optimizely pentru segmentarea campaniilor Brevo
- Urmărire conversii - Urmăriți evenimentele Optimizely și mapați-le la urmărirea evenimentelor Brevo
- Sincronizare fanioane funcționalități - Segmentați contactele după fanioanele de funcționalități activate
- Raportare rezultate - Sincronizați rezultatele experimentelor pentru campanii de marketing post-analiză
- Suport multi-proiect - Conectați mai multe proiecte Optimizely la o singură instanță Tajo
Cerințe preliminare
Înainte de a începe, asigurați-vă că aveți:
- Un cont Optimizely Feature Experimentation
- Un Token de acces personal din Optimizely App Settings
- O cheie SDK pentru mediul Optimizely
- Un cont Brevo cu acces API
- Un cont Tajo cu permisiuni de conector
Autentificare
Token de acces personal
# 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'};Autentificare 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();Configurare
Configurare de bază
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_SEGMENTSMapare câmpuri
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_DATEPuncte finale API
| Punct final | Metodă | Descriere |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Listează proiectele |
https://api.optimizely.com/v2/experiments | GET | Listează experimentele |
https://api.optimizely.com/v2/experiments/{id} | GET | Obține detalii experiment |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Obține rezultatele experimentului |
https://api.optimizely.com/v2/features | GET | Listează fanioanele de funcționalități |
https://api.optimizely.com/v2/features/{id} | GET | Obține fanionul de funcționalitate |
https://api.optimizely.com/v2/audiences | GET | Listează audiențele |
https://api.optimizely.com/v2/events | GET | Listează evenimentele urmărite |
https://logx.optimizely.com/v1/events | POST | Urmărește evenimente (punct final SDK) |
Exemple de cod
Inițializare conector
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'});Sincronizare decizii experiment cu 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() } }); } } });Sincronizare rezultate experiment
// 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}`); }}Segmentare bazată pe fanioane de funcționalități
// 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() } });}Limite de rată
| Punct final | Limită | Note |
|---|---|---|
| REST API | 50 cereri/min | Per token de acces personal |
| Results API | 10 cereri/min | Latență mai mare, interogări mai grele |
| Expediere evenimente SDK | 10.000 evenimente/lot | Prin procesorul de evenimente SDK |
| CDN fișier date | Nelimitat | Stocat în cache cu actualizări automate |
Latența Results API
Experiment Results API procesează seturi de date mari și poate dura 30+ secunde pentru a răspunde. Utilizați interogare asincronă sau stocare în cache pentru a evita blocarea aplicației.
Depanare
| Problemă | Cauză | Soluție |
|---|---|---|
| 401 Neautorizat | Token expirat/invalid | Regenerați Tokenul de acces personal |
| SDK nepregatit | Fișier date neîncărcat | Așteptați rezolvarea promisiunii onReady() |
| Nicio decizie înregistrată | Notificare neînregistrată | Înregistrați listener înainte de a lua decizii |
| Fanioane de funcționalități deprecate | Cache fișier date | Setați updateInterval pentru reîmprospătare automată |
| Rezultate lipsă | Experimentul nu a început | Verificați că statusul experimentului este “running” |
Modul de depanare
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueBune practici
- Utilizați SDK-ul pentru decizii - Utilizați SDK-ul pentru evaluarea fanionelor în timp real, REST API pentru management
- Implementați gruparea evenimentelor - Grupați evenimentele SDK pentru a reduce sarcina rețelei
- Stocați în cache fișierul date - Activați actualizarea automată cu intervale corespunzătoare
- Sincronizați variațiile câștigătoare - După finalizarea experimentelor, actualizați segmentele de contacte
- Utilizați atribute pentru targetare - Transmiteți e-mailul și atributele utilizatorului pentru potrivirea audiențelor
- Monitorizați statusul experimentului - Sincronizați date doar din experimentele în desfășurare sau finalizate
Securitate
- Tokeni de acces personal - Autentificare cu token Bearer pentru REST API
- Izolare cheie SDK - Chei SDK separate per mediu (dev, staging, prod)
- Evaluare pe server - Evaluați fanioanele de funcționalități pe server pentru a preveni expunerea
- Rotație token - Rotiți Tokenii de acces personal periodic
- Permisiuni minime - Utilizați tokeni read-only când accesul de scriere nu este necesar
- Transport criptat - TLS 1.2+ pentru toate comunicațiile API și SDK