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ść |
|---|---|
| Platforma | Optimizely |
| Kategoria | Eksperymenty (Niestandardowa) |
| Poziom konfiguracji | Średni |
| Integracja oficjalna | Nie |
| Synchronizowane dane | Eksperymenty, Odbiorcy, Zdarzenia, Flagi funkcji |
| Metoda uwierzytelniania | Personal 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:
- Konto Optimizely Feature Experimentation
- Personal Access Token z Optimizely App Settings
- Klucz SDK dla swojego środowiska Optimizely
- Konto Brevo z dostępem do API
- Konto Tajo z uprawnieniami konektora
Uwierzytelnianie
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'};Uwierzytelnianie 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();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_SEGMENTSMapowanie 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_DATEEndpointy API
| Endpoint | Metoda | Opis |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Lista projektów |
https://api.optimizely.com/v2/experiments | GET | Lista eksperymentów |
https://api.optimizely.com/v2/experiments/{id} | GET | Pobierz szczegóły eksperymentu |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Pobierz wyniki eksperymentu |
https://api.optimizely.com/v2/features | GET | Lista flag funkcji |
https://api.optimizely.com/v2/features/{id} | GET | Pobierz flagę funkcji |
https://api.optimizely.com/v2/audiences | GET | Lista odbiorców |
https://api.optimizely.com/v2/events | GET | Lista śledzonych zdarzeń |
https://logx.optimizely.com/v1/events | POST | Ś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 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() } }); } } });Synchronizuj wyniki eksperymentu
// 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}`); }}Segmentacja oparta na flagach funkcji
// 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() } });}Limity API
| Endpoint | Limit | Uwagi |
|---|---|---|
| REST API | 50 żądań/min | Na personal access token |
| Results API | 10 żądań/min | Wyższe opóźnienie, cięższe zapytania |
| Zdarzenia SDK | 10 000 zdarzeń/partia | Przez procesor zdarzeń SDK |
| Plik danych CDN | Nieograniczony | Buforowany 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
| Problem | Przyczyna | Rozwiązanie |
|---|---|---|
| 401 Unauthorized | Token wygasł/nieprawidłowy | Wygeneruj ponownie Personal Access Token |
| SDK nie gotowy | Plik danych nie załadowany | Poczekaj na rozwiązanie obietnicy onReady() |
| Brak zarejestrowanych decyzji | Powiadomienie nie zarejestrowane | Zarejestruj nasłuchiwacz przed podejmowaniem decyzji |
| Nieaktualne flagi funkcji | Bufor pliku danych | Ustaw updateInterval dla auto-odświeżania |
| Brakujące wyniki | Eksperyment nie uruchomiony | Zweryfikuj, czy status eksperymentu to „running” |
Tryb debug
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueNajlepsze praktyki
- Używaj SDK do decyzji - Używaj SDK do oceny flag w czasie rzeczywistym, REST API do zarządzania
- Wdrożyj wsadowanie zdarzeń - Wsaduj zdarzenia SDK, aby zmniejszyć narzut sieciowy
- Buforuj plik danych - Włącz auto-aktualizację z odpowiednimi interwałami
- Synchronizuj zwycięskie warianty - Po zakończeniu eksperymentów aktualizuj segmenty kontaktów
- Używaj atrybutów do targetowania - Przekazuj e-mail i atrybuty użytkownika dla dopasowania odbiorców
- 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