Conector de Optimizely
Conecta Optimizely Feature Experimentation con Brevo a través de Tajo para sincronizar resultados de experimentos, orientar campañas según segmentos de feature flags y enriquecer las automatizaciones de marketing con datos de pruebas A/B e insights de audiencia.
Resumen
| Propiedad | Valor |
|---|---|
| Plataforma | Optimizely |
| Categoría | Experimentación (Personalizada) |
| Complejidad de configuración | Media |
| Integración oficial | No |
| Datos sincronizados | Experimentos, Audiencias, Eventos, Feature Flags |
| Método de autenticación | Personal Access Token / OAuth 2.0 |
Funcionalidades
- Sincronización de experimentos - Envía las asignaciones de variaciones de pruebas A/B a los atributos de contacto de Brevo
- Segmentación por audiencia - Usa audiencias de Optimizely para segmentar campañas de Brevo
- Seguimiento de conversiones - Rastrea eventos de Optimizely y asócialos al seguimiento de eventos de Brevo
- Sincronización de feature flags - Segmenta contactos según los feature flags activados
- Informes de resultados - Sincroniza los resultados de experimentos para campañas de marketing posteriores
- Soporte multiproyecto - Conecta varios proyectos de Optimizely a una única instancia de Tajo
Requisitos previos
Antes de empezar, asegúrate de tener:
- Una cuenta de Optimizely Feature Experimentation
- Un Personal Access Token desde Optimizely App Settings
- Una SDK key de tu entorno de Optimizely
- Una cuenta de Brevo con acceso a la API
- Una cuenta de Tajo con permisos de conector
Autenticación
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'};Autenticación del 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();Configuración
Configuración básica
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_SEGMENTSAsignación de campos
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_DATEEndpoints de la API
| Endpoint | Método | Descripción |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Listar proyectos |
https://api.optimizely.com/v2/experiments | GET | Listar experimentos |
https://api.optimizely.com/v2/experiments/{id} | GET | Obtener detalles del experimento |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Obtener resultados del experimento |
https://api.optimizely.com/v2/features | GET | Listar feature flags |
https://api.optimizely.com/v2/features/{id} | GET | Obtener un feature flag |
https://api.optimizely.com/v2/audiences | GET | Listar audiencias |
https://api.optimizely.com/v2/events | GET | Listar eventos rastreados |
https://logx.optimizely.com/v1/events | POST | Registrar eventos (endpoint del SDK) |
Ejemplos de código
Inicializar el 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'});Sincronizar decisiones de experimentos con 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() } }); } } });Sincronizar los resultados del experimento
// 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}`); }}Segmentación basada en 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() } });}Límites de velocidad
| Endpoint | Límite | Notas |
|---|---|---|
| REST API | 50 req/min | Por Personal Access Token |
| Results API | 10 req/min | Mayor latencia, consultas más pesadas |
| SDK Event Dispatch | 10.000 eventos/lote | Vía procesador de eventos del SDK |
| Datafile CDN | Ilimitado | Cacheado con actualizaciones automáticas |
Latencia de la Results API
La Experiment Results API procesa grandes conjuntos de datos y puede tardar más de 30 segundos en responder. Usa polling asíncrono o caché para no bloquear tu aplicación.
Resolución de problemas
| Problema | Causa | Solución |
|---|---|---|
| 401 Unauthorized | Token expirado/no válido | Regenera el Personal Access Token |
| SDK no listo | Datafile no cargado | Espera a que se resuelva la promesa onReady() |
| No se registran decisiones | Notificación no registrada | Registra el listener antes de tomar decisiones |
| Feature flags desactualizados | Caché del datafile | Configura updateInterval para auto-refrescar |
| Resultados que faltan | Experimento no iniciado | Verifica que el estado del experimento sea “running” |
Modo depuración
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueBuenas prácticas
- Usa el SDK para las decisiones - Usa el SDK para la evaluación de flags en tiempo real y la REST API para la gestión
- Implementa batching de eventos - Agrupa los eventos del SDK para reducir la sobrecarga de red
- Cachea el datafile - Activa el auto-update con intervalos adecuados
- Sincroniza las variaciones ganadoras - Tras finalizar los experimentos, actualiza los segmentos de contactos
- Usa atributos para la segmentación - Pasa email y atributos de usuario para emparejar audiencias
- Monitoriza el estado del experimento - Sincroniza datos solo de experimentos en curso o finalizados
Seguridad
- Personal Access Tokens - Autenticación por Bearer token para la REST API
- Aislamiento de SDK keys - SDK keys separadas por entorno (dev, staging, prod)
- Evaluación en el servidor - Evalúa los feature flags en el servidor para evitar su exposición
- Rotación de tokens - Rota los Personal Access Tokens periódicamente
- Permisos mínimos - Usa tokens de solo lectura cuando no necesites acceso de escritura
- Transporte cifrado - TLS 1.2+ para todas las comunicaciones de API y SDK