Connecteur Optimizely
Connectez Optimizely Feature Experimentation à Brevo via Tajo pour synchroniser les résultats d’expérimentation, cibler les campagnes par segments de feature flags et enrichir les automatisations marketing avec les données de tests A/B et les insights d’audience.
Vue d’ensemble
| Propriété | Valeur |
|---|---|
| Plateforme | Optimizely |
| Catégorie | Expérimentation (Custom) |
| Complexité d’installation | Moyenne |
| Intégration officielle | Non |
| Données synchronisées | Expériences, audiences, événements, feature flags |
| Méthode d’authentification | Personal Access Token / OAuth 2.0 |
Fonctionnalités
- Synchronisation des expériences, Poussez les attributions de variations de tests A/B vers les attributs de contact Brevo
- Ciblage d’audience, Utilisez les audiences Optimizely pour la segmentation de campagnes Brevo
- Suivi des conversions, Suivez les événements Optimizely et mappez-les vers le tracking d’événements Brevo
- Synchronisation des feature flags, Segmentez les contacts par feature flags activés
- Reporting des résultats, Synchronisez les résultats d’expérimentation pour des campagnes marketing post-analyse
- Support multi-projets, Connectez plusieurs projets Optimizely à une instance Tajo unique
Prérequis
Avant de commencer, assurez-vous de disposer de :
- Un compte Optimizely Feature Experimentation
- Un Personal Access Token depuis Optimizely App Settings
- Une SDK key pour votre environnement Optimizely
- Un compte Brevo avec accès API
- Un compte Tajo avec les permissions connecteur
Authentification
Personal Access Token
# Générez-le sur 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// Toutes les requêtes de l'API REST utilisent l'auth par Bearer tokenconst headers = { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`, 'Content-Type': 'application/json'};Authentification SDK
// Pour l'évaluation de feature flags, utilisez le 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();Configuration
Configuration de base
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 * * *" # Toutes les 2 heures
mapping: experiment_variation: EXPERIMENT_VARIATION feature_flags: ENABLED_FEATURES audience_segments: OPT_SEGMENTSMappage des champs
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 | Méthode | Description |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Lister les projets |
https://api.optimizely.com/v2/experiments | GET | Lister les expériences |
https://api.optimizely.com/v2/experiments/{id} | GET | Obtenir les détails d’une expérience |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Obtenir les résultats d’une expérience |
https://api.optimizely.com/v2/features | GET | Lister les feature flags |
https://api.optimizely.com/v2/features/{id} | GET | Obtenir un feature flag |
https://api.optimizely.com/v2/audiences | GET | Lister les audiences |
https://api.optimizely.com/v2/events | GET | Lister les événements suivis |
https://logx.optimizely.com/v1/events | POST | Tracker des événements (endpoint SDK) |
Exemples de code
Initialiser le connecteur
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'});Synchroniser les décisions d’expérimentation vers Brevo
// Tracker les décisions d'expérimentation et synchroniser vers Brevoconst optimizelyClient = optimizelySDK.createInstance({ sdkKey: process.env.OPTIMIZELY_SDK_KEY});
await optimizelyClient.onReady();
// Enregistrer un listener de notification de décisionoptimizelyClient.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() } }); } } });Synchroniser les résultats d’expérimentation
// Récupérer les résultats d'expérimentation et synchroniser les segments gagnantsconst resultsResponse = await fetch( `https://api.optimizely.com/v2/experiments/${experimentId}/results`, { headers: { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}` } });
const results = await resultsResponse.json();
// Traiter les variations et mettre à jour les segments de contactfor (const variation of results.metrics) { const isWinner = variation.is_improvement && variation.statistical_significance >= 0.95;
if (isWinner) { // Créer un segment Brevo pour les utilisateurs de la variation gagnante console.log(`Winning variation: ${variation.variation_name}`); }}Segmentation basée sur les feature flags
// Évaluer les feature flags pour la segmentation utilisateurasync 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() } });}Limites de débit
| Endpoint | Limite | Notes |
|---|---|---|
| REST API | 50 req/min | Par Personal Access Token |
| Results API | 10 req/min | Latence plus élevée, requêtes plus lourdes |
| SDK Event Dispatch | 10 000 événements/lot | Via le processeur d’événements du SDK |
| Datafile CDN | Illimité | Mis en cache avec mises à jour automatiques |
Latence de l'API de résultats
L’API Experiment Results traite de grands ensembles de données et peut prendre plus de 30 secondes à répondre. Utilisez un polling asynchrone ou un cache pour éviter de bloquer votre application.
Dépannage
| Problème | Cause | Solution |
|---|---|---|
| 401 Unauthorized | Token expiré/invalide | Régénérez le Personal Access Token |
| SDK pas prêt | Datafile non chargé | Attendez que la promesse onReady() se résolve |
| Aucune décision enregistrée | Notification non enregistrée | Enregistrez le listener avant de prendre des décisions |
| Feature flags périmés | Cache du datafile | Définissez updateInterval pour un auto-refresh |
| Résultats manquants | Expérimentation non démarrée | Vérifiez que le statut de l’expérimentation est « running » |
Mode debug
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueBonnes pratiques
- Utilisez le SDK pour les décisions, Utilisez le SDK pour l’évaluation de flags en temps réel, l’API REST pour la gestion
- Implémentez le batching d’événements, Groupez les événements du SDK pour réduire la charge réseau
- Mettez en cache le datafile, Activez l’auto-update avec des intervalles appropriés
- Synchronisez les variations gagnantes, Après la conclusion d’une expérimentation, mettez à jour les segments de contacts
- Utilisez les attributs pour le ciblage, Passez l’e-mail et les attributs utilisateur pour le matching d’audience
- Surveillez le statut des expérimentations, Ne synchronisez que les données d’expérimentations en cours ou terminées
Sécurité
- Personal Access Tokens, Authentification par Bearer token pour l’API REST
- Isolation des SDK keys, SDK keys séparées par environnement (dev, staging, prod)
- Évaluation côté serveur, Évaluez les feature flags côté serveur pour éviter l’exposition
- Rotation des tokens, Faites tourner les Personal Access Tokens périodiquement
- Permissions minimales, Utilisez des tokens en lecture seule lorsque l’accès en écriture n’est pas nécessaire
- Transport chiffré, TLS 1.2+ pour toutes les communications API et SDK