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

PropiedadValor
PlataformaOptimizely
CategoríaExperimentación (Personalizada)
Complejidad de configuraciónMedia
Integración oficialNo
Datos sincronizadosExperimentos, Audiencias, Eventos, Feature Flags
Método de autenticaciónPersonal 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:

  1. Una cuenta de Optimizely Feature Experimentation
  2. Un Personal Access Token desde Optimizely App Settings
  3. Una SDK key de tu entorno de Optimizely
  4. Una cuenta de Brevo con acceso a la API
  5. Una cuenta de Tajo con permisos de conector

Autenticación

Personal Access Token

Terminal window
# Generate at https://app.optimizely.com/v2/accountsettings/tokens
export OPTIMIZELY_ACCESS_TOKEN=your_personal_access_token
export OPTIMIZELY_SDK_KEY=your_sdk_key
export TAJO_API_KEY=your_tajo_api_key
export BREVO_API_KEY=your_brevo_api_key
// All REST API requests use Bearer token auth
const headers = {
'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
};

Autenticación del SDK

// For feature flag evaluation, use the SDK
const 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_SEGMENTS

Asignació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_DATE

Endpoints de la API

EndpointMétodoDescripción
https://api.optimizely.com/v2/projectsGETListar proyectos
https://api.optimizely.com/v2/experimentsGETListar experimentos
https://api.optimizely.com/v2/experiments/{id}GETObtener detalles del experimento
https://api.optimizely.com/v2/experiments/{id}/resultsGETObtener resultados del experimento
https://api.optimizely.com/v2/featuresGETListar feature flags
https://api.optimizely.com/v2/features/{id}GETObtener un feature flag
https://api.optimizely.com/v2/audiencesGETListar audiencias
https://api.optimizely.com/v2/eventsGETListar eventos rastreados
https://logx.optimizely.com/v1/eventsPOSTRegistrar 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 Brevo
const optimizelyClient = optimizelySDK.createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY
});
await optimizelyClient.onReady();
// Register a decision notification listener
optimizelyClient.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 segments
const 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 segments
for (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 segmentation
async 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

EndpointLímiteNotas
REST API50 req/minPor Personal Access Token
Results API10 req/minMayor latencia, consultas más pesadas
SDK Event Dispatch10.000 eventos/loteVía procesador de eventos del SDK
Datafile CDNIlimitadoCacheado 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

ProblemaCausaSolución
401 UnauthorizedToken expirado/no válidoRegenera el Personal Access Token
SDK no listoDatafile no cargadoEspera a que se resuelva la promesa onReady()
No se registran decisionesNotificación no registradaRegistra el listener antes de tomar decisiones
Feature flags desactualizadosCaché del datafileConfigura updateInterval para auto-refrescar
Resultados que faltanExperimento no iniciadoVerifica que el estado del experimento sea “running”

Modo depuración

connectors:
optimizely:
debug: true
log_level: verbose
log_decisions: true
log_events: true

Buenas prácticas

  1. 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
  2. Implementa batching de eventos - Agrupa los eventos del SDK para reducir la sobrecarga de red
  3. Cachea el datafile - Activa el auto-update con intervalos adecuados
  4. Sincroniza las variaciones ganadoras - Tras finalizar los experimentos, actualiza los segmentos de contactos
  5. Usa atributos para la segmentación - Pasa email y atributos de usuario para emparejar audiencias
  6. 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

Recursos relacionados

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
Asistente AI

¡Hola! Pregúntame lo que quieras sobre la documentación.