Σύνδεσμος Optimizely
Συνδέστε το Optimizely Feature Experimentation με το Brevo μέσω Tajo για συγχρονισμό αποτελεσμάτων πειραμάτων, στόχευση καμπανιών βάσει τμημάτων feature flag και εμπλουτισμό αυτοματισμών marketing με δεδομένα δοκιμών A/B και πληροφορίες κοινού.
Επισκόπηση
| Ιδιότητα | Τιμή |
|---|---|
| Πλατφόρμα | Optimizely |
| Κατηγορία | Πειραματισμός (Προσαρμοσμένο) |
| Πολυπλοκότητα Ρύθμισης | Μεσαία |
| Επίσημη Ενσωμάτωση | Όχι |
| Δεδομένα που Συγχρονίζονται | Πειράματα, Κοινά, Εκδηλώσεις, Feature Flags |
| Μέθοδος Πιστοποίησης | Personal Access Token / OAuth 2.0 |
Χαρακτηριστικά
- Συγχρονισμός πειράματος - Μεταφόρτωση αναθέσεων παραλλαγής δοκιμών A/B σε χαρακτηριστικά επαφών Brevo
- Στόχευση κοινού - Χρήση κοινών Optimizely για τμηματοποίηση καμπανιών Brevo
- Παρακολούθηση μετατροπών - Παρακολούθηση εκδηλώσεων Optimizely και αντιστοίχιση σε παρακολούθηση εκδηλώσεων Brevo
- Συγχρονισμός feature flag - Τμηματοποίηση επαφών βάσει ενεργοποιημένων feature flags
- Αναφορά αποτελεσμάτων - Συγχρονισμός αποτελεσμάτων πειράματος για καμπάνιες marketing μετά-ανάλυσης
- Υποστήριξη πολλαπλών projects - Σύνδεση πολλαπλών projects Optimizely σε μεμονωμένη περίπτωση Tajo
Προαπαιτούμενα
Πριν ξεκινήσετε, βεβαιωθείτε ότι διαθέτετε:
- Λογαριασμό Optimizely Feature Experimentation
- Personal Access Token από τις Ρυθμίσεις Εφαρμογής Optimizely
- Κλειδί 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_DATEEndpoints API
| Endpoint | Μέθοδος | Περιγραφή |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Λίστα projects |
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 | Παρακολούθηση εκδηλώσεων (endpoint SDK) |
Παραδείγματα Κώδικα
Αρχικοποίηση Συνδέσμου
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 αιτ./λεπτό | Ανά personal access token |
| Results API | 10 αιτ./λεπτό | Υψηλότερη καθυστέρηση, βαρύτερα ερωτήματα |
| Αποστολή εκδηλώσεων SDK | 10.000 εκδηλώσεις/batch | Μέσω επεξεργαστή εκδηλώσεων SDK |
| Datafile CDN | Απεριόριστο | Αποθηκευμένο στη cache με αυτόματες ενημερώσεις |
Καθυστέρηση Results API
Το Results API Πειράματος επεξεργάζεται μεγάλα σύνολα δεδομένων και μπορεί να χρειαστεί 30+ δευτερόλεπτα για απόκριση. Χρησιμοποιήστε ασύγχρονο polling ή αποθήκευση στη cache για αποφυγή αποκλεισμού της εφαρμογής σας.
Αντιμετώπιση Προβλημάτων
| Πρόβλημα | Αιτία | Λύση |
|---|---|---|
| 401 Unauthorized | Token ληγμένο/μη έγκυρο | Αναγέννηση Personal Access Token |
| SDK δεν είναι έτοιμο | Το datafile δεν έχει φορτωθεί | Αναμείνετε επίλυση της υπόσχεσης onReady() |
| Δεν καταγράφονται αποφάσεις | Η ειδοποίηση δεν εγγράφηκε | Εγγράψτε ακροατή πριν τη λήψη αποφάσεων |
| Παλαιά feature flags | Cache datafile | Ορίστε updateInterval για αυτόματη ανανέωση |
| Λείπουν αποτελέσματα | Το πείραμα δεν ξεκίνησε | Επαληθεύστε ότι η κατάσταση πειράματος είναι “running” |
Λειτουργία Εντοπισμού Σφαλμάτων
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueΒέλτιστες Πρακτικές
- Χρησιμοποιήστε SDK για αποφάσεις - Χρησιμοποιήστε SDK για αξιολόγηση flag σε πραγματικό χρόνο, REST API για διαχείριση
- Εφαρμόστε ομαδοποίηση εκδηλώσεων - Ομαδοποιήστε εκδηλώσεις SDK για μείωση overhead δικτύου
- Αποθηκεύστε datafile στη cache - Ενεργοποιήστε αυτόματη ενημέρωση με κατάλληλα διαστήματα
- Συγχρονίστε νικητές παραλλαγές - Μετά την ολοκλήρωση πειραμάτων, ενημερώστε τμήματα επαφών
- Χρησιμοποιήστε χαρακτηριστικά για στόχευση - Μεταβιβάστε email και χαρακτηριστικά χρήστη για αντιστοίχιση κοινού
- Παρακολουθήστε κατάσταση πειράματος - Συγχρονίζετε μόνο δεδομένα από εκτελούμενα ή ολοκληρωμένα πειράματα
Ασφάλεια
- Personal Access Tokens - Πιστοποίηση Bearer token για REST API
- Απομόνωση κλειδιού SDK - Ξεχωριστά κλειδιά SDK ανά περιβάλλον (dev, staging, prod)
- Αξιολόγηση πλευράς server - Αξιολογείτε feature flags πλευρά server για αποτροπή έκθεσης
- Εναλλαγή token - Εναλλάσσετε Personal Access Tokens περιοδικά
- Ελάχιστα δικαιώματα - Χρησιμοποιήστε tokens μόνο ανάγνωσης όταν δεν απαιτείται πρόσβαση εγγραφής
- Κρυπτογραφημένη μεταφορά - TLS 1.2+ για όλες τις επικοινωνίες API και SDK