Конектор Optimizely
Свържете Optimizely Feature Experimentation с Brevo чрез Tajo, за да синхронизирате резултати от експерименти, да насочвате кампании по сегменти с feature flags и да обогатявате маркетинговите автоматизации с данни от A/B тестове и инсайти за аудитории.
Преглед
| Свойство | Стойност |
|---|---|
| Платформа | Optimizely |
| Категория | Експериментиране (Персонализирана) |
| Сложност на настройка | Средна |
| Официална интеграция | Не |
| Синхронизирани данни | Експерименти, Аудитории, Събития, Feature Flags |
| Метод на автентикация | Personal Access Token / OAuth 2.0 |
Функции
- Синхронизация на експерименти – Изпращайте разпределения на A/B тест вариации към атрибутите на контактите в Brevo
- Таргетиране по аудитория – Използвайте аудитории на Optimizely за сегментиране на кампании в Brevo
- Проследяване на конверсии – Проследявайте събития на Optimizely и ги мапвайте към проследяване на събития в Brevo
- Синхронизация на feature flags – Сегментирайте контакти по активирани feature flags
- Отчети с резултати – Синхронизирайте резултати от експерименти за маркетингови кампании след анализа
- Поддръжка на множество проекти – Свържете множество проекти на Optimizely към една Tajo инстанция
Предварителни условия
Преди да започнете, уверете се, че имате:
- Акаунт в Optimizely Feature Experimentation
- Personal Access Token от Optimizely App Settings
- SDK ключ за вашата среда в Optimizely
- Акаунт в Brevo с API достъп
- Акаунт в Tajo с конекторни права
Автентикация
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'};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();Конфигурация
Основна настройка
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Мапване на полета
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_DATEAPI крайни точки
| Endpoint | Method | Описание |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Списък на проектите |
https://api.optimizely.com/v2/experiments | GET | Списък на експериментите |
https://api.optimizely.com/v2/experiments/{id} | GET | Вземане на детайли за експеримент |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Вземане на резултати от експеримент |
https://api.optimizely.com/v2/features | GET | Списък на feature flags |
https://api.optimizely.com/v2/features/{id} | GET | Вземане на feature flag |
https://api.optimizely.com/v2/audiences | GET | Списък на аудиториите |
https://api.optimizely.com/v2/events | GET | Списък на проследяваните събития |
https://logx.optimizely.com/v1/events | POST | Проследяване на събития (SDK endpoint) |
Примери за код
Инициализация на конектора
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'});Синхронизация на решенията от експерименти към 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() } }); } } });Синхронизация на резултати от експерименти
// 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}`); }}Сегментиране на базата на 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() } });}Лимити на заявки
| Endpoint | Лимит | Бележки |
|---|---|---|
| REST API | 50 req/min | За personal access token |
| Results API | 10 req/min | По-висока латентност, по-тежки заявки |
| SDK Event Dispatch | 10,000 събития/batch | Чрез SDK event processor |
| Datafile CDN | Неограничено | Кеширано с автоматични обновления |
Латентност на Results API
Experiment Results API обработва големи набори от данни и може да отнеме 30+ секунди, за да отговори. Използвайте асинхронно допитване или кеширане, за да избегнете блокиране на вашето приложение.
Отстраняване на проблеми
| Проблем | Причина | Решение |
|---|---|---|
| 401 Unauthorized | Изтекъл/невалиден токен | Генерирайте нов Personal Access Token |
| SDK не е готов | Datafile не е зареден | Изчакайте промисът onReady() да се резолвне |
| Няма логнати решения | Нотификация не е регистрирана | Регистрирайте listener преди вземане на решения |
| Остарели feature flags | Кеширан datafile | Задайте updateInterval за автоматично обновяване |
| Липсващи резултати | Експериментът не е стартиран | Проверете дали статусът на експеримента е “running” |
Debug режим
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueНай-добри практики
- Използвайте SDK за решения – Използвайте SDK за оценка на flags в реално време, REST API за управление
- Внедрете batching на събития – Групирайте SDK събития, за да намалите мрежовото натоварване
- Кеширайте datafile – Активирайте автоматично обновяване с подходящи интервали
- Синхронизирайте печелившите вариации – След приключване на експерименти, обновете сегментите на контактите
- Използвайте атрибути за таргетиране – Предавайте email и потребителски атрибути за съответствие с аудиториите
- Следете статуса на експеримента – Синхронизирайте данни само от текущи или приключени експерименти
Сигурност
- Personal Access Tokens – Bearer token автентикация за REST API
- Изолация на SDK ключ – Отделни SDK ключове за среда (dev, staging, prod)
- Server-side оценка – Оценявайте feature flags от сървъра, за да предотвратите излагане
- Ротация на токени – Ротирайте Personal Access Tokens периодично
- Минимални права – Използвайте read-only токени, когато не е нужен write достъп
- Криптиран транспорт – TLS 1.2+ за всички API и SDK комуникации