Konektor Optimizely
Propojte Optimizely Feature Experimentation s Brevo přes Tajo pro synchronizaci výsledků experimentů, cílení kampaní podle segmentů příznaků funkcí a obohacení marketingových automatizací o data A/B testů a poznatky o publiku.
Přehled
| Vlastnost | Hodnota |
|---|---|
| Platforma | Optimizely |
| Kategorie | Experimentování (Vlastní) |
| Složitost nastavení | Střední |
| Oficiální integrace | Ne |
| Synchronizovaná data | Experimenty, Publika, Události, Příznaky funkcí |
| Metoda ověření | Osobní přístupový token / OAuth 2.0 |
Funkce
- Synchronizace experimentů – Odesílejte přiřazení variací A/B testů do atributů kontaktů Brevo
- Cílení publika – Používejte publika Optimizely pro segmentaci kampaní Brevo
- Sledování konverzí – Sledujte události Optimizely a mapujte je na sledování událostí Brevo
- Synchronizace příznaků funkcí – Segmentujte kontakty podle povolených příznaků funkcí
- Reporting výsledků – Synchronizujte výsledky experimentů pro marketingové kampaně po analýze
- Podpora více projektů – Propojte více projektů Optimizely s jednou instancí Tajo
Předpoklady
Než začnete, ujistěte se, že máte:
- Účet Optimizely Feature Experimentation
- Osobní přístupový token z Nastavení aplikace Optimizely
- SDK klíč pro vaše prostředí Optimizely
- Účet Brevo s přístupem k API
- Účet Tajo s oprávněními ke konektoru
Ověření
Osobní přístupový token
# Vygenerujte na 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// Všechny požadavky REST API používají ověření Bearer tokenemconst headers = { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`, 'Content-Type': 'application/json'};Ověření SDK
// Pro vyhodnocení příznaků funkcí použijte SDKconst optimizelySDK = require('@optimizely/optimizely-sdk');
const optimizelyClient = optimizelySDK.createInstance({ sdkKey: process.env.OPTIMIZELY_SDK_KEY, datafileOptions: { autoUpdate: true, updateInterval: 60000 // 1 minuta }});
await optimizelyClient.onReady();Konfigurace
Základní nastavení
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 * * *" # Každé 2 hodiny
mapping: experiment_variation: EXPERIMENT_VARIATION feature_flags: ENABLED_FEATURES audience_segments: OPT_SEGMENTSMapování polí
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_DATEKoncové body API
| Koncový bod | Metoda | Popis |
|---|---|---|
https://api.optimizely.com/v2/projects | GET | Výpis projektů |
https://api.optimizely.com/v2/experiments | GET | Výpis experimentů |
https://api.optimizely.com/v2/experiments/{id} | GET | Získání podrobností experimentu |
https://api.optimizely.com/v2/experiments/{id}/results | GET | Získání výsledků experimentu |
https://api.optimizely.com/v2/features | GET | Výpis příznaků funkcí |
https://api.optimizely.com/v2/features/{id} | GET | Získání příznaku funkce |
https://api.optimizely.com/v2/audiences | GET | Výpis publik |
https://api.optimizely.com/v2/events | GET | Výpis sledovaných událostí |
https://logx.optimizely.com/v1/events | POST | Sledování událostí (koncový bod SDK) |
Příklady kódu
Inicializace konektoru
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'});Synchronizace rozhodnutí experimentu do Brevo
// Sledování rozhodnutí experimentu a synchronizace do Brevoconst optimizelyClient = optimizelySDK.createInstance({ sdkKey: process.env.OPTIMIZELY_SDK_KEY});
await optimizelyClient.onReady();
// Registrace naslouchátka notifikace rozhodnutíoptimizelyClient.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() } }); } } });Synchronizace výsledků experimentu
// Načtení výsledků experimentu a synchronizace vítězných segmentůconst resultsResponse = await fetch( `https://api.optimizely.com/v2/experiments/${experimentId}/results`, { headers: { 'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}` } });
const results = await resultsResponse.json();
// Zpracování variací a aktualizace segmentů kontaktůfor (const variation of results.metrics) { const isWinner = variation.is_improvement && variation.statistical_significance >= 0.95;
if (isWinner) { // Vytvoření segmentu Brevo pro uživatele ve vítězné variaci console.log(`Vítězná variace: ${variation.variation_name}`); }}Segmentace na základě příznaků funkcí
// Vyhodnocení příznaků funkcí pro segmentaci uživatelůasync 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() } });}Omezení rychlosti
| Koncový bod | Limit | Poznámky |
|---|---|---|
| REST API | 50 požadavků/min | Na osobní přístupový token |
| Results API | 10 požadavků/min | Vyšší latence, náročnější dotazy |
| Odesílání událostí SDK | 10 000 událostí/dávka | Přes procesor událostí SDK |
| Datafile CDN | Neomezeno | Ukládáno do mezipaměti s automatickými aktualizacemi |
Latence Results API
Results API experimentů zpracovává velké datové sady a může trvat 30+ sekund, než odpoví. Používejte asynchronní polling nebo ukládání do mezipaměti, abyste neblokovali svou aplikaci.
Řešení problémů
| Problém | Příčina | Řešení |
|---|---|---|
| 401 Unauthorized | Token vypršel/neplatný | Obnovte osobní přístupový token |
| SDK není připraven | Datový soubor není načten | Počkejte na vyřešení příslibu onReady() |
| Žádná zalogovaná rozhodnutí | Naslouchátko není registrováno | Registrujte naslouchátko před přijímáním rozhodnutí |
| Zastaralé příznaky funkcí | Mezipaměť datového souboru | Nastavte updateInterval pro automatické obnovování |
| Chybějící výsledky | Experiment nezačal | Ověřte, zda je stav experimentu “running” |
Režim ladění
connectors: optimizely: debug: true log_level: verbose log_decisions: true log_events: trueOsvědčené postupy
- Používejte SDK pro rozhodnutí – Používejte SDK pro vyhodnocení příznaků v reálném čase, REST API pro správu
- Implementujte dávkování událostí – Dávkujte události SDK pro snížení síťové zátěže
- Ukládejte datový soubor do mezipaměti – Povolte automatické aktualizace s vhodnými intervaly
- Synchronizujte vítězné variace – Po ukončení experimentů aktualizujte segmenty kontaktů
- Používejte atributy pro cílení – Předávejte e-mail a uživatelské atributy pro porovnávání publik
- Monitorujte stav experimentu – Synchronizujte pouze data z běžících nebo ukončených experimentů
Zabezpečení
- Osobní přístupové tokeny – Ověřování Bearer tokenem pro REST API
- Izolace SDK klíčů – Samostatné SDK klíče pro každé prostředí (dev, staging, prod)
- Vyhodnocení na straně serveru – Vyhodnocujte příznaky funkcí na straně serveru, aby nedošlo k jejich odhalení
- Rotace tokenů – Pravidelně rotujte osobní přístupové tokeny
- Minimální oprávnění – Používejte tokeny jen pro čtení, když není potřeba přístup pro zápis
- Šifrovaný přenos – TLS 1.2+ pro veškerou komunikaci API a SDK