Optimizely Bağlayıcısı
Deney sonuçlarını senkronize etmek, özellik bayrağı segmentlerine göre kampanya hedeflemek ve pazarlama otomasyonlarını A/B test verileri ve kitle öngörüleriyle zenginleştirmek için Optimizely Feature Experimentation’ı Tajo üzerinden Brevo’ya bağlayın.
Genel Bakış
| Özellik | Değer |
|---|---|
| Platform | Optimizely |
| Kategori | Deneme (Özel) |
| Kurulum Karmaşıklığı | Orta |
| Resmi Entegrasyon | Hayır |
| Senkronize Edilen Veri | Deneyler, Kitleler, Olaylar, Özellik Bayrakları |
| Kimlik Doğrulama Yöntemi | Kişisel Erişim Belirteci / OAuth 2.0 |
Özellikler
- Deney senkronizasyonu - A/B test varyasyon atamalarını Brevo kişi özniteliklerine aktarın
- Kitle hedefleme - Brevo kampanya segmentasyonu için Optimizely kitlelerini kullanın
- Dönüşüm takibi - Optimizely olaylarını izleyin ve Brevo olay takibine eşleyin
- Özellik bayrağı senkronizasyonu - Kişileri etkinleştirilmiş özellik bayraklarına göre segmentlere ayırın
- Sonuç raporlama - Sonraki analiz pazarlama kampanyaları için deney sonuçlarını senkronize edin
- Çoklu proje desteği - Tek bir Tajo örneğine birden fazla Optimizely projesi bağlayın
Ön Koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
- Bir Optimizely Feature Experimentation hesabı
- Optimizely Uygulama Ayarlarından bir Kişisel Erişim Belirteci
- Optimizely ortamınız için bir SDK anahtarı
- API erişimi olan bir Brevo hesabı
- Bağlayıcı izinlerine sahip bir Tajo hesabı
Kimlik Doğrulama
Kişisel Erişim Belirteci
# https://app.optimizely.com/v2/accountsettings/tokens adresinde oluşturunexport 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// Tüm REST API istekleri Bearer belirteç kimlik doğrulaması kullanırconst headers = { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`, 'Content-Type': 'application/json'};SDK Kimlik Doğrulaması
// Özellik bayrağı değerlendirmesi için SDK'yı kullanınconst optimizelySDK = require('@optimizely/optimizely-sdk');
const optimizelyClient = optimizelySDK.createInstance({ sdkKey: process.env.OPTIMIZELY_SDK_KEY, datafileOptions: { autoUpdate: true, updateInterval: 60000 // 1 dakika }});
await optimizelyClient.onReady();Yapılandırma
Temel Kurulum
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 * * *" # Her 2 saatte bir
mapping: experiment_variation: EXPERIMENT_VARIATION feature_flags: ENABLED_FEATURES audience_segments: OPT_SEGMENTSAlan Eşleştirme
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 Uç Noktaları
| Uç Nokta | Yöntem | Açıklama |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Projeleri listele |
https://api.optimizely.com/v2/experiments | GET | Deneyleri listele |
https://api.optimizely.com/v2/experiments/{id} | GET | Deney ayrıntılarını al |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Deney sonuçlarını al |
https://api.optimizely.com/v2/features | GET | Özellik bayraklarını listele |
https://api.optimizely.com/v2/features/{id} | GET | Özellik bayrağını al |
https://api.optimizely.com/v2/audiences | GET | Kitleleri listele |
https://api.optimizely.com/v2/events | GET | İzlenen olayları listele |
https://logx.optimizely.com/v1/events | POST | Olayları izle (SDK uç noktası) |
Kod Örnekleri
Bağlayıcıyı Başlatma
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'});Deney Kararlarını Brevo’ya Senkronize Etme
// Deney kararlarını izle ve Brevo'ya senkronize etconst optimizelyClient = optimizelySDK.createInstance({ sdkKey: process.env.OPTIMIZELY_SDK_KEY});
await optimizelyClient.onReady();
// Bir karar bildirim dinleyicisi kaydetoptimizelyClient.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() } }); } } });Deney Sonuçlarını Senkronize Etme
// Deney sonuçlarını getir ve kazanan segmentleri senkronize etconst resultsResponse = await fetch( `https://api.optimizely.com/v2/experiments/${experimentId}/results`, { headers: { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}` } });
const results = await resultsResponse.json();
// Varyasyonları işle ve kişi segmentlerini güncellefor (const variation of results.metrics) { const isWinner = variation.is_improvement && variation.statistical_significance >= 0.95;
if (isWinner) { // Kazanan varyasyondaki kullanıcılar için bir Brevo segmenti oluştur console.log(`Winning variation: ${variation.variation_name}`); }}Özellik Bayrağı Tabanlı Segmentasyon
// Kullanıcı segmentasyonu için özellik bayraklarını değerlendirasync 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() } });}Hız Sınırları
| Uç Nokta | Sınır | Notlar |
|---|---|---|
| REST API | 50 istek/dk | Kişisel erişim belirteci başına |
| Sonuçlar API | 10 istek/dk | Daha yüksek gecikme, daha ağır sorgular |
| SDK Olay Gönderimi | Toplu iş başına 10.000 olay | SDK olay işlemcisi aracılığıyla |
| Datafile CDN | Sınırsız | Otomatik güncellemelerle önbelleğe alınır |
Sonuçlar API Gecikmesi
Deney Sonuçları API’si büyük veri kümelerini işler ve yanıt vermesi 30+ saniye sürebilir. Uygulamanızı engellememek için eşzamansız yoklama veya önbelleğe alma kullanın.
Sorun Giderme
| Sorun | Neden | Çözüm |
|---|---|---|
| 401 Unauthorized | Süresi dolmuş/geçersiz belirteç | Kişisel Erişim Belirtecini yeniden oluşturun |
| SDK hazır değil | Datafile yüklenmedi | onReady() sözünün çözülmesini bekleyin |
| Karar kaydedilmiyor | Bildirim kaydedilmemiş | Kararlar vermeden önce dinleyiciyi kaydedin |
| Eski özellik bayrakları | Datafile önbelleği | Otomatik yenileme için updateInterval ayarlayın |
| Eksik sonuçlar | Deney başlamadı | Deney durumunun “running” olduğunu doğrulayın |
Hata Ayıklama Modu
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueEn İyi Uygulamalar
- Kararlar için SDK kullanın - Gerçek zamanlı bayrak değerlendirmesi için SDK, yönetim için REST API kullanın
- Olay toplu işleme uygulayın - Ağ yükünü azaltmak için SDK olaylarını toplu işleyin
- Datafile’ı önbelleğe alın - Uygun aralıklarla otomatik güncellemeyi etkinleştirin
- Kazanan varyasyonları senkronize edin - Deneyler sona erdikten sonra kişi segmentlerini güncelleyin
- Hedefleme için öznitelikleri kullanın - Kitle eşleştirmesi için e-posta ve kullanıcı öznitelikleri iletin
- Deney durumunu izleyin - Yalnızca çalışan veya sonuçlanmış deneylerden veri senkronize edin
Güvenlik
- Kişisel Erişim Belirteçleri - REST API için Bearer belirteç kimlik doğrulaması
- SDK anahtar izolasyonu - Ortam başına ayrı SDK anahtarları (dev, staging, prod)
- Sunucu tarafı değerlendirme - İfşayı önlemek için özellik bayraklarını sunucu tarafında değerlendirin
- Belirteç rotasyonu - Kişisel Erişim Belirteçlerini periyodik olarak döndürün
- Minimum izinler - Yazma erişimine gerek olmadığında yalnızca okuma belirteçleri kullanın
- Şifreli taşıma - Tüm API ve SDK iletişimleri için TLS 1.2+