Conector Optimizely
Conecte o Optimizely Feature Experimentation ao Brevo através do Tajo para sincronizar resultados de experimentos, segmentar campanhas por grupos de feature flags e enriquecer automações de marketing com dados de testes A/B e insights de audiência.
Visão geral
| Propriedade | Valor |
|---|---|
| Plataforma | Optimizely |
| Categoria | Experimentação (Personalizado) |
| Complexidade de configuração | Média |
| Integração oficial | Não |
| Dados sincronizados | Experimentos, Audiências, Eventos, Feature Flags |
| Método de autenticação | Personal Access Token / OAuth 2.0 |
Recursos
- Sincronização de experimentos - Envie atribuições de variações de testes A/B para atributos de contato do Brevo
- Segmentação por audiência - Use audiências do Optimizely para segmentação de campanhas do Brevo
- Rastreamento de conversão - Rastreie eventos do Optimizely e mapeie para o rastreamento de eventos do Brevo
- Sincronização de feature flags - Segmente contatos por feature flags habilitadas
- Relatórios de resultados - Sincronize resultados de experimentos para campanhas de marketing pós-análise
- Suporte multi-projeto - Conecte múltiplos projetos Optimizely a uma única instância Tajo
Pré-requisitos
Antes de começar, certifique-se de ter:
- Uma conta Optimizely Feature Experimentation
- Um Personal Access Token em Configurações da Conta Optimizely
- Uma SDK key para seu ambiente Optimizely
- Uma conta Brevo com acesso à API
- Uma conta Tajo com permissões de conector
Autenticação
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'};Autenticação via 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();Configuração
Configuração 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_SEGMENTSMapeamento 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 da API
| Endpoint | Método | Descrição |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Listar projetos |
https://api.optimizely.com/v2/experiments | GET | Listar experimentos |
https://api.optimizely.com/v2/experiments/{id} | GET | Obter detalhes do experimento |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Obter resultados do experimento |
https://api.optimizely.com/v2/features | GET | Listar feature flags |
https://api.optimizely.com/v2/features/{id} | GET | Obter feature flag |
https://api.optimizely.com/v2/audiences | GET | Listar audiências |
https://api.optimizely.com/v2/events | GET | Listar eventos rastreados |
https://logx.optimizely.com/v1/events | POST | Rastrear eventos (endpoint do SDK) |
Exemplos de código
Inicializar o 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 decisões de experimentos para o 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 resultados de experimentos
// 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}`); }}Segmentação baseada em feature flag
// 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() } });}Limites de taxa
| Endpoint | Limite | Observações |
|---|---|---|
| REST API | 50 req/min | Por personal access token |
| Results API | 10 req/min | Maior latência, consultas mais pesadas |
| SDK Event Dispatch | 10.000 eventos/batch | Via processador de eventos do SDK |
| Datafile CDN | Ilimitado | Em cache com atualizações automáticas |
Latência da Results API
A Experiment Results API processa grandes conjuntos de dados e pode levar mais de 30 segundos para responder. Use polling assíncrono ou cache para evitar bloquear sua aplicação.
Solução de problemas
| Problema | Causa | Solução |
|---|---|---|
| 401 Unauthorized | Token expirado/inválido | Regere o Personal Access Token |
| SDK não pronto | Datafile não carregado | Aguarde a resolução da promise onReady() |
| Nenhuma decisão registrada | Notificação não registrada | Registre o listener antes de tomar decisões |
| Feature flags desatualizadas | Cache do datafile | Defina updateInterval para atualização automática |
| Resultados ausentes | Experimento não iniciado | Verifique se o status do experimento é “running” |
Modo de depuração
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueMelhores práticas
- Use o SDK para decisões - Use o SDK para avaliação de flags em tempo real, REST API para gerenciamento
- Implemente batching de eventos - Agrupe eventos do SDK em lotes para reduzir sobrecarga de rede
- Faça cache do datafile - Habilite atualização automática com intervalos apropriados
- Sincronize variações vencedoras - Após o término dos experimentos, atualize os segmentos de contato
- Use atributos para segmentação - Passe e-mail e atributos de usuário para correspondência de audiência
- Monitore o status do experimento - Sincronize dados apenas de experimentos em execução ou concluídos
Segurança
- Personal Access Tokens - Autenticação Bearer token para a REST API
- Isolamento de SDK key - SDK keys separadas por ambiente (dev, staging, prod)
- Avaliação do lado do servidor - Avalie feature flags no servidor para evitar exposição
- Rotação de tokens - Faça rotação periódica dos Personal Access Tokens
- Permissões mínimas - Use tokens somente de leitura quando acesso de escrita não for necessário
- Transporte criptografado - TLS 1.2+ para todas as comunicações de API e SDK