Konektor Optimizely

Połącz Optimizely Feature Experimentation z Brevo przez Tajo, aby synchronizować wyniki eksperymentów, targetować kampanie według segmentów flag funkcji i wzbogacać automatyzacje marketingowe danymi z testów A/B i wglądem w odbiorców.

Przegląd

WłaściwośćWartość
PlatformaOptimizely
KategoriaEksperymenty (Niestandardowa)
Poziom konfiguracjiŚredni
Integracja oficjalnaNie
Synchronizowane daneEksperymenty, Odbiorcy, Zdarzenia, Flagi funkcji
Metoda uwierzytelnianiaPersonal Access Token / OAuth 2.0

Funkcje

  • Synchronizacja eksperymentów - Prześlij przypisania wariantów testu A/B do atrybutów kontaktów Brevo
  • Targetowanie odbiorców - Używaj odbiorców Optimizely do segmentacji kampanii Brevo
  • Śledzenie konwersji - Śledź zdarzenia Optimizely i mapuj na śledzenie zdarzeń Brevo
  • Synchronizacja flag funkcji - Segmentuj kontakty według włączonych flag funkcji
  • Raportowanie wyników - Synchronizuj wyniki eksperymentów dla kampanii marketingowych po-analizy
  • Obsługa wielu projektów - Połącz wiele projektów Optimizely z jedną instancją Tajo

Wymagania wstępne

Zanim zaczniesz, upewnij się, że masz:

  1. Konto Optimizely Feature Experimentation
  2. Personal Access Token z Optimizely App Settings
  3. Klucz SDK dla swojego środowiska Optimizely
  4. Konto Brevo z dostępem do API
  5. Konto Tajo z uprawnieniami konektora

Uwierzytelnianie

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

Uwierzytelnianie 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();

Konfiguracja

Podstawowa konfiguracja

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

Mapowanie pól

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

Endpointy API

EndpointMetodaOpis
https://api.optimizely.com/v2/projectsGETLista projektów
https://api.optimizely.com/v2/experimentsGETLista eksperymentów
https://api.optimizely.com/v2/experiments/{id}GETPobierz szczegóły eksperymentu
https://api.optimizely.com/v2/experiments/{id}/resultsGETPobierz wyniki eksperymentu
https://api.optimizely.com/v2/featuresGETLista flag funkcji
https://api.optimizely.com/v2/features/{id}GETPobierz flagę funkcji
https://api.optimizely.com/v2/audiencesGETLista odbiorców
https://api.optimizely.com/v2/eventsGETLista śledzonych zdarzeń
https://logx.optimizely.com/v1/eventsPOSTŚledź zdarzenia (endpoint SDK)

Przykłady kodu

Inicjalizacja konektora

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

Synchronizuj decyzje eksperymentu z 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()
}
});
}
}
}
);

Synchronizuj wyniki eksperymentu

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

Segmentacja oparta na flagach funkcji

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

Limity API

EndpointLimitUwagi
REST API50 żądań/minNa personal access token
Results API10 żądań/minWyższe opóźnienie, cięższe zapytania
Zdarzenia SDK10 000 zdarzeń/partiaPrzez procesor zdarzeń SDK
Plik danych CDNNieograniczonyBuforowany z auto-aktualizacjami

Opóźnienie Results API

Experiment Results API przetwarza duże zestawy danych i może odpowiadać przez 30+ sekund. Używaj asynchronicznego odpytywania lub buforowania, aby unikać blokowania aplikacji.

Rozwiązywanie problemów

ProblemPrzyczynaRozwiązanie
401 UnauthorizedToken wygasł/nieprawidłowyWygeneruj ponownie Personal Access Token
SDK nie gotowyPlik danych nie załadowanyPoczekaj na rozwiązanie obietnicy onReady()
Brak zarejestrowanych decyzjiPowiadomienie nie zarejestrowaneZarejestruj nasłuchiwacz przed podejmowaniem decyzji
Nieaktualne flagi funkcjiBufor pliku danychUstaw updateInterval dla auto-odświeżania
Brakujące wynikiEksperyment nie uruchomionyZweryfikuj, czy status eksperymentu to „running”

Tryb debug

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

Najlepsze praktyki

  1. Używaj SDK do decyzji - Używaj SDK do oceny flag w czasie rzeczywistym, REST API do zarządzania
  2. Wdrożyj wsadowanie zdarzeń - Wsaduj zdarzenia SDK, aby zmniejszyć narzut sieciowy
  3. Buforuj plik danych - Włącz auto-aktualizację z odpowiednimi interwałami
  4. Synchronizuj zwycięskie warianty - Po zakończeniu eksperymentów aktualizuj segmenty kontaktów
  5. Używaj atrybutów do targetowania - Przekazuj e-mail i atrybuty użytkownika dla dopasowania odbiorców
  6. Monitoruj status eksperymentu - Synchronizuj dane tylko z uruchomionych lub zakończonych eksperymentów

Bezpieczeństwo

  • Personal Access Tokens - Uwierzytelnianie tokenem Bearer dla REST API
  • Izolacja klucza SDK - Osobne klucze SDK na środowisko (dev, staging, prod)
  • Ocena po stronie serwera - Oceniaj flagi funkcji po stronie serwera, aby zapobiec ujawnieniu
  • Rotacja tokenów - Regularnie rotuj Personal Access Tokens
  • Minimalne uprawnienia - Używaj tokenów tylko do odczytu, gdy dostęp do zapisu nie jest potrzebny
  • Zaszyfrowany transport - TLS 1.2+ dla całej komunikacji API i SDK

Powiązane zasoby

Subscribe to updates

developer-docs

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

auto-detect
Asystent AI

Cześć! Zapytaj mnie o dokumentację.