---
title: "Conector de Optimizely"
description: "Guía completa de integración con Optimizely para sincronizar resultados de experimentos, feature flags y datos de audiencia con Brevo a través de Tajo."
url: https://tajo.io/es/docs/connectors/custom/optimizely/
markdown: https://tajo.io/es/docs/connectors/custom/optimizely.md
lang: es-ES
robots: noindex
---

Solicita acceso anticipado

Escribe tu nombre y dirección de correo de trabajo. Te enviaremos un enlace para confirmar tu solicitud de acceso a Tajo.

# Conector de Optimizely

Estado del conector: Planificado Aún no está construido. Tajo no ejecuta este conector hoy.

| Campo de origen | Campo de destino | Valor de ejemplo |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

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:

1. Una cuenta de Optimizely Feature Experimentation
2. Un Personal Access Token desde [Optimizely App Settings](https://app.optimizely.com/v2/accountsettings/tokens)
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

```bash
# 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
```

```javascript
// 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

```javascript
// 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

```yaml
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

```yaml
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

| 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

```javascript
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

```javascript
// 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

```javascript
// 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

```javascript
// 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

| 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

```yaml
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

- [Conector de PostHog](https://tajo.io/es/docs/connectors/custom/posthog)
- [Conector de Segment](https://tajo.io/es/docs/connectors/custom/segment)
- [Skill de sincronización de clientes](https://tajo.io/es/docs/skills/data-sync/customer-sync)
- [Documentación de Optimizely Feature Experimentation](https://docs.developers.optimizely.com/feature-experimentation/docs)
