Optimizely コネクタ

Tajo を介して Optimizely Feature Experimentation を Brevo に接続し、実験結果を同期し、機能フラグセグメントでキャンペーンをターゲティングし、A/B テストデータとオーディエンスインサイトでマーケティング自動化を強化します。

概要

プロパティ
プラットフォームOptimizely
カテゴリ実験(カスタム)
セットアップの複雑さ
公式統合いいえ
同期データ実験、オーディエンス、イベント、機能フラグ
認証方式Personal Access Token / OAuth 2.0

機能

  • 実験の同期 - A/B テストのバリエーション割り当てを Brevo 連絡先属性にプッシュ
  • オーディエンスターゲティング - Brevo キャンペーンのセグメンテーションに Optimizely オーディエンスを使用
  • コンバージョントラッキング - Optimizely イベントをトラッキングして Brevo イベントトラッキングにマッピング
  • 機能フラグの同期 - 有効化された機能フラグで連絡先をセグメント化
  • 結果レポート - 事後分析マーケティングキャンペーン用に実験結果を同期
  • マルチプロジェクトサポート - 複数の Optimizely プロジェクトを単一の Tajo インスタンスに接続

前提条件

開始する前に、以下を準備してください。

  1. Optimizely Feature Experimentation アカウント
  2. Optimizely App Settings からの Personal Access Token
  3. Optimizely 環境の SDK キー
  4. API アクセス可能な Brevo アカウント
  5. コネクタ権限を持つ Tajo アカウント

認証

Personal Access Token

Terminal window
# https://app.optimizely.com/v2/accountsettings/tokens で生成
export OPTIMIZELY_ACCESS_TOKEN=your_personal_access_token
export OPTIMIZELY_SDK_KEY=your_sdk_key
export TAJO_API_KEY=your_tajo_api_key
export BREVO_API_KEY=your_brevo_api_key
// すべての REST API リクエストは Bearer トークン認証を使用
const headers = {
'Authorization': `Bearer ${process.env.OPTIMIZELY_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
};

SDK 認証

// 機能フラグ評価には SDK を使用
const optimizelySDK = require('@optimizely/optimizely-sdk');
const optimizelyClient = optimizelySDK.createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY,
datafileOptions: {
autoUpdate: true,
updateInterval: 60000 // 1 分
}
});
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 * * *" # 2 時間ごと
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_DATE

API エンドポイント

エンドポイントメソッド説明
https://api.optimizely.com/v2/projectsGETプロジェクトを一覧取得
https://api.optimizely.com/v2/experimentsGET実験を一覧取得
https://api.optimizely.com/v2/experiments/{id}GET実験詳細を取得
https://api.optimizely.com/v2/experiments/{id}/resultsGET実験結果を取得
https://api.optimizely.com/v2/featuresGET機能フラグを一覧取得
https://api.optimizely.com/v2/features/{id}GET機能フラグを取得
https://api.optimizely.com/v2/audiencesGETオーディエンスを一覧取得
https://api.optimizely.com/v2/eventsGETトラッキングされたイベントを一覧取得
https://logx.optimizely.com/v1/eventsPOSTイベントをトラッキング(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 に同期

// 実験の意思決定をトラッキングして Brevo に同期
const optimizelyClient = optimizelySDK.createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY
});
await optimizelyClient.onReady();
// 意思決定通知リスナーを登録
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()
}
});
}
}
}
);

実験結果の同期

// 実験結果を取得して勝ちセグメントを同期
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();
// バリエーションを処理して連絡先セグメントを更新
for (const variation of results.metrics) {
const isWinner = variation.is_improvement && variation.statistical_significance >= 0.95;
if (isWinner) {
// 勝ちバリエーションのユーザー用 Brevo セグメントを作成
console.log(`Winning variation: ${variation.variation_name}`);
}
}

機能フラグベースのセグメンテーション

// ユーザーセグメンテーションのために機能フラグを評価
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()
}
});
}

レート制限

エンドポイント制限備考
REST API50 req/分Personal Access Token 単位
Results API10 req/分高レイテンシ、重いクエリ
SDK イベントディスパッチ10,000 イベント/バッチSDK イベントプロセッサ経由
Datafile CDN無制限自動更新でキャッシュ

Results API のレイテンシ

Experiment Results API は大量のデータセットを処理するため、応答に 30 秒以上かかる場合があります。アプリケーションのブロックを避けるため、非同期ポーリングまたはキャッシングを使用してください。

トラブルシューティング

問題原因解決策
401 Unauthorizedトークン期限切れ/無効Personal Access Token を再生成
SDK 未準備Datafile がロードされていないonReady() プロミスの解決を待つ
意思決定がログに記録されない通知が登録されていない意思決定を行う前にリスナーを登録
古い機能フラグDatafile のキャッシュ自動更新のため updateInterval を設定
結果の欠落実験が開始されていない実験ステータスが「running」であることを確認

デバッグモード

connectors:
optimizely:
debug: true
log_level: verbose
log_decisions: true
log_events: true

ベストプラクティス

  1. 意思決定には SDK を使用する - リアルタイムのフラグ評価には SDK を、管理には REST API を使用
  2. イベントのバッチ処理を実装する - ネットワークオーバーヘッドを削減するため SDK イベントをバッチ処理
  3. Datafile をキャッシュする - 適切な間隔で自動更新を有効化
  4. 勝ちバリエーションを同期する - 実験終了後、連絡先セグメントを更新
  5. ターゲティングに属性を使用する - オーディエンスマッチングのためにメールとユーザー属性を渡す
  6. 実験ステータスを監視する - 実行中または終了した実験からのみデータを同期

セキュリティ

  • Personal Access Tokens - REST API 用の Bearer トークン認証
  • SDK キーの分離 - 環境ごとに個別の SDK キー(dev、staging、prod)
  • サーバーサイド評価 - 機能フラグをサーバーサイドで評価して公開を防止
  • トークンのローテーション - Personal Access Token を定期的にローテーション
  • 最小限の権限 - 書き込みアクセスが不要な場合は読み取り専用トークンを使用
  • 暗号化された通信 - すべての API および SDK 通信に TLS 1.2 以上

関連リソース

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AIアシスタント

こんにちは!ドキュメントについて何でもお聞きください。