Connettore Optimizely

Collega Optimizely Feature Experimentation a Brevo tramite Tajo per sincronizzare i risultati degli esperimenti, targettizzare le campagne per segmenti di feature flag e arricchire le automazioni marketing con dati di A/B test e insight di audience.

Panoramica

ProprietàValore
PiattaformaOptimizely
CategoriaExperimentation (Custom)
Complessità di setupMedia
Integrazione ufficialeNo
Dati sincronizzatiEsperimenti, Audience, Eventi, Feature Flag
Metodo di autenticazionePersonal Access Token / OAuth 2.0

Funzionalità

  • Sync esperimenti - Invia le assegnazioni di variante dei test A/B agli attributi dei contatti Brevo
  • Targeting audience - Usa le audience Optimizely per la segmentazione delle campagne Brevo
  • Tracciamento conversioni - Traccia gli eventi Optimizely e mappali al tracking eventi Brevo
  • Sync feature flag - Segmenta i contatti per feature flag abilitati
  • Reporting risultati - Sincronizza i risultati degli esperimenti per campagne marketing di post-analisi
  • Supporto multi-progetto - Collega più progetti Optimizely a una singola istanza Tajo

Prerequisiti

Prima di iniziare, assicurati di avere:

  1. Un account Optimizely Feature Experimentation
  2. Un Personal Access Token da Optimizely App Settings
  3. Una SDK key per il tuo ambiente Optimizely
  4. Un account Brevo con accesso API
  5. Un account Tajo con permessi sui connettori

Autenticazione

Personal Access Token

Terminal window
# Genera su 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
// Tutte le richieste REST API usano autenticazione Bearer token
const headers = {
'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
};

Autenticazione SDK

// Per la valutazione dei feature flag, usa l'SDK
const optimizelySDK = require('@optimizely/optimizely-sdk');
const optimizelyClient = optimizelySDK.createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY,
datafileOptions: {
autoUpdate: true,
updateInterval: 60000 // 1 minuto
}
});
await optimizelyClient.onReady();

Configurazione

Setup di base

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 * * *" # Ogni 2 ore
mapping:
experiment_variation: EXPERIMENT_VARIATION
feature_flags: ENABLED_FEATURES
audience_segments: OPT_SEGMENTS

Mapping dei campi

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

Endpoint API

EndpointMetodoDescrizione
https://api.optimizely.com/v2/projectsGETElenca i progetti
https://api.optimizely.com/v2/experimentsGETElenca gli esperimenti
https://api.optimizely.com/v2/experiments/{id}GETOttieni dettagli esperimento
https://api.optimizely.com/v2/experiments/{id}/resultsGETOttieni risultati esperimento
https://api.optimizely.com/v2/featuresGETElenca i feature flag
https://api.optimizely.com/v2/features/{id}GETOttieni un feature flag
https://api.optimizely.com/v2/audiencesGETElenca le audience
https://api.optimizely.com/v2/eventsGETElenca gli eventi tracciati
https://logx.optimizely.com/v1/eventsPOSTTraccia eventi (endpoint SDK)

Esempi di codice

Inizializzare il connettore

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

Sincronizzare le decisioni degli esperimenti su Brevo

// Traccia le decisioni degli esperimenti e sincronizzale su Brevo
const optimizelyClient = optimizelySDK.createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY
});
await optimizelyClient.onReady();
// Registra un notification listener per le decisioni
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()
}
});
}
}
}
);

Sincronizzare i risultati degli esperimenti

// Recupera i risultati degli esperimenti e sincronizza i segmenti vincenti
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();
// Elabora le varianti e aggiorna i segmenti contatto
for (const variation of results.metrics) {
const isWinner = variation.is_improvement && variation.statistical_significance >= 0.95;
if (isWinner) {
// Crea un segmento Brevo per gli utenti nella variante vincente
console.log(`Variante vincente: ${variation.variation_name}`);
}
}

Segmentazione basata su feature flag

// Valuta i feature flag per la segmentazione utenti
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()
}
});
}

Limiti di rate

EndpointLimiteNote
REST API50 req/minPer personal access token
Results API10 req/minLatenza più alta, query più pesanti
SDK Event Dispatch10.000 eventi/batchTramite event processor SDK
Datafile CDNIllimitatoCachato con auto-aggiornamenti

Latenza Results API

L’Experiment Results API elabora grandi dataset e può impiegare 30+ secondi per rispondere. Usa polling asincrono o caching per evitare di bloccare la tua applicazione.

Risoluzione dei problemi

ProblemaCausaSoluzione
401 UnauthorizedToken scaduto/non validoRigenera il Personal Access Token
SDK non prontoDatafile non caricatoAttendi la risoluzione della promise onReady()
Nessuna decisione loggataNotification non registrataRegistra il listener prima di prendere decisioni
Feature flag stantiiCache del datafileImposta updateInterval per l’auto-refresh
Risultati mancantiEsperimento non avviatoVerifica che lo stato dell’esperimento sia “running”

Modalità debug

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

Best practice

  1. Usa l’SDK per le decisioni - Usa l’SDK per la valutazione flag in real-time, la REST API per la gestione
  2. Implementa batching degli eventi - Raggruppa gli eventi SDK per ridurre l’overhead di rete
  3. Metti in cache il datafile - Abilita l’auto-update con intervalli appropriati
  4. Sincronizza le varianti vincenti - Dopo la conclusione degli esperimenti, aggiorna i segmenti contatti
  5. Usa gli attributi per il targeting - Passa email e attributi utente per il matching delle audience
  6. Monitora lo stato degli esperimenti - Sincronizza solo i dati di esperimenti in corso o conclusi

Sicurezza

  • Personal Access Token - Autenticazione Bearer token per la REST API
  • Isolamento SDK key - SDK key separate per ambiente (dev, staging, prod)
  • Valutazione server-side - Valuta i feature flag lato server per evitare esposizioni
  • Rotazione token - Ruota periodicamente i Personal Access Token
  • Permessi minimi - Usa token read-only quando l’accesso in scrittura non è necessario
  • Trasporto cifrato - TLS 1.2+ per tutte le comunicazioni API e SDK

Risorse correlate

Subscribe to updates

developer-docs

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

auto-detect
Assistente AI

Ciao! Chiedimi qualsiasi cosa sulla documentazione.