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

PropriedadeValor
PlataformaOptimizely
CategoriaExperimentação (Personalizado)
Complexidade de configuraçãoMédia
Integração oficialNão
Dados sincronizadosExperimentos, Audiências, Eventos, Feature Flags
Método de autenticaçãoPersonal 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:

  1. Uma conta Optimizely Feature Experimentation
  2. Um Personal Access Token em Configurações da Conta Optimizely
  3. Uma SDK key para seu ambiente Optimizely
  4. Uma conta Brevo com acesso à API
  5. Uma conta Tajo com permissões de conector

Autenticação

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'
};

Autenticação via 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();

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_SEGMENTS

Mapeamento 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 da API

EndpointMétodoDescrição
https://api.optimizely.com/v2/projectsGETListar projetos
https://api.optimizely.com/v2/experimentsGETListar experimentos
https://api.optimizely.com/v2/experiments/{id}GETObter detalhes do experimento
https://api.optimizely.com/v2/experiments/{id}/resultsGETObter resultados do experimento
https://api.optimizely.com/v2/featuresGETListar feature flags
https://api.optimizely.com/v2/features/{id}GETObter feature flag
https://api.optimizely.com/v2/audiencesGETListar audiências
https://api.optimizely.com/v2/eventsGETListar eventos rastreados
https://logx.optimizely.com/v1/eventsPOSTRastrear 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 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 resultados de experimentos

// 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}`);
}
}

Segmentação baseada em feature flag

// 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()
}
});
}

Limites de taxa

EndpointLimiteObservações
REST API50 req/minPor personal access token
Results API10 req/minMaior latência, consultas mais pesadas
SDK Event Dispatch10.000 eventos/batchVia processador de eventos do SDK
Datafile CDNIlimitadoEm 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

ProblemaCausaSolução
401 UnauthorizedToken expirado/inválidoRegere o Personal Access Token
SDK não prontoDatafile não carregadoAguarde a resolução da promise onReady()
Nenhuma decisão registradaNotificação não registradaRegistre o listener antes de tomar decisões
Feature flags desatualizadasCache do datafileDefina updateInterval para atualização automática
Resultados ausentesExperimento não iniciadoVerifique se o status do experimento é “running”

Modo de depuração

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

Melhores práticas

  1. Use o SDK para decisões - Use o SDK para avaliação de flags em tempo real, REST API para gerenciamento
  2. Implemente batching de eventos - Agrupe eventos do SDK em lotes para reduzir sobrecarga de rede
  3. Faça cache do datafile - Habilite atualização automática com intervalos apropriados
  4. Sincronize variações vencedoras - Após o término dos experimentos, atualize os segmentos de contato
  5. Use atributos para segmentação - Passe e-mail e atributos de usuário para correspondência de audiência
  6. 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

Recursos relacionados

Subscribe to updates

developer-docs

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

auto-detect
Assistente AI

Olá! Pergunte-me qualquer coisa sobre a documentação.