PostHog コネクタ
Tajo を介して PostHog を Brevo に接続し、製品分析データ、ユーザー行動イベント、コホートメンバーシップを同期して、データ駆動型マーケティングキャンペーンとパーソナライズされた顧客エンゲージメントを実現します。
概要
| プロパティ | 値 |
|---|---|
| プラットフォーム | PostHog |
| カテゴリ | 製品分析(カスタム) |
| セットアップの複雑さ | 中 |
| 公式統合 | いいえ |
| 同期データ | イベント、人物、機能フラグ、コホート |
| 認証方式 | Personal API Key / Project Token |
機能
- イベント同期 - 行動ターゲティングのために PostHog 分析イベントを Brevo に転送
- 人物プロファイル同期 - PostHog の人物プロパティを Brevo 連絡先属性に同期
- コホートベースのセグメンテーション - PostHog コホートを Brevo 連絡先リストにマッピング
- 機能フラグ同期 - 有効化された機能フラグで連絡先をセグメント化
- ファネルデータ - ターゲットの再エンゲージメントのためにコンバージョンファネルデータを使用
- セッションリプレイメタデータ - セッションエンゲージメントメトリクスで連絡先を強化
前提条件
開始する前に、以下を準備してください。
- PostHog アカウント(クラウドまたはセルフホスト)
- PostHog Settings からの Personal API Key
- Project Settings からのプロジェクト API キー(トークン)
- API アクセス可能な Brevo アカウント
- コネクタ権限を持つ Tajo アカウント
認証
Personal API Key(プライベートエンドポイント)
# https://app.posthog.com/settings/user-api-keys で生成export POSTHOG_PERSONAL_API_KEY=phx_your_personal_api_keyexport POSTHOG_PROJECT_TOKEN=phc_your_project_tokenexport POSTHOG_HOST=https://us.posthog.com # または https://eu.posthog.comexport TAJO_API_KEY=your_tajo_api_keyexport BREVO_API_KEY=your_brevo_api_key// プライベート API エンドポイントは Bearer 認証を使用const headers = { 'Authorization': `Bearer ${process.env.POSTHOG_PERSONAL_API_KEY}`, 'Content-Type': 'application/json'};
// パブリックエンドポイントはプロジェクトトークンを使用const publicHeaders = { 'Content-Type': 'application/json'};// パブリックエンドポイントではトークンをリクエストボディで渡すAPI キーのセキュリティ
Personal API キーは完全なアカウントアクセスを提供します。クライアントサイドコードに決して公開しないでください。イベントキャプチャや機能フラグ評価などのパブリックエンドポイントにはプロジェクト API キー(トークン)を使用してください。
設定
基本セットアップ
connectors: posthog: enabled: true host: "${POSTHOG_HOST}" personal_api_key: "${POSTHOG_PERSONAL_API_KEY}" project_token: "${POSTHOG_PROJECT_TOKEN}" project_id: "12345"
sync: persons: true events: true cohorts: true feature_flags: true schedule: "0 */3 * * *" # 3 時間ごと
event_filters: - "$pageview" - "purchase_completed" - "signup_completed" - "feature_used"
lists: all_users: 25 active_users: 26 power_users: 27フィールドマッピング
field_mapping: email: email $name: FIRSTNAME $browser: BROWSER $os: OS $initial_referrer: REFERRAL_SOURCE total_events: EVENT_COUNT last_seen: LAST_ACTIVE_DATE signup_date: SIGNUP_DATE plan: SUBSCRIPTION_PLAN company: COMPANY cohort_names: POSTHOG_COHORTSAPI エンドポイント
| エンドポイント | メソッド | 説明 |
|---|---|---|
{host}/api/projects/{id}/persons/ | GET | 人物を一覧取得 |
{host}/api/projects/{id}/events/ | GET | イベントを一覧取得 |
{host}/api/projects/{id}/cohorts/ | GET | コホートを一覧取得 |
{host}/api/projects/{id}/feature_flags/ | GET | 機能フラグを一覧取得 |
{host}/api/projects/{id}/feature_flags/evaluation/ | POST | フラグを評価 |
{host}/api/projects/{id}/insights/ | GET | 保存済みインサイトを一覧取得 |
{host}/api/projects/{id}/query/ | POST | HogQL クエリを実行 |
{host}/i/v0/e | POST | イベントをキャプチャ(パブリック) |
{host}/decide/?v=3 | POST | 機能フラグの判定(パブリック) |
コード例
コネクタの初期化
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('posthog', { host: process.env.POSTHOG_HOST, personalApiKey: process.env.POSTHOG_PERSONAL_API_KEY, projectToken: process.env.POSTHOG_PROJECT_TOKEN, projectId: '12345'});人物を Brevo に同期
// PostHog の人物をページネーションで取得let nextUrl = `${posthogHost}/api/projects/${projectId}/persons/?` + new URLSearchParams({ limit: '100' });
while (nextUrl) { const response = await fetch(nextUrl, { headers: { 'Authorization': `Bearer ${process.env.POSTHOG_PERSONAL_API_KEY}` } });
const data = await response.json();
for (const person of data.results) { const email = person.properties.$email || person.properties.email; if (!email) continue;
await tajo.contacts.sync({ email, attributes: { FIRSTNAME: person.properties.$name || person.properties.name, LAST_ACTIVE_DATE: person.properties.$last_seen, SIGNUP_DATE: person.created_at, EVENT_COUNT: person.properties.$event_count, BROWSER: person.properties.$browser, OS: person.properties.$os, REFERRAL_SOURCE: person.properties.$initial_referrer }, listIds: [25] }); }
nextUrl = data.next;}コホートを Brevo リストとして同期
// PostHog のコホートを取得してメンバーを Brevo リストに同期const cohortsResponse = await fetch( `${posthogHost}/api/projects/${projectId}/cohorts/`, { headers: { 'Authorization': `Bearer ${process.env.POSTHOG_PERSONAL_API_KEY}` } });
const { results: cohorts } = await cohortsResponse.json();
for (const cohort of cohorts) { // このコホート内の人物を取得 const personsResponse = await fetch( `${posthogHost}/api/projects/${projectId}/cohorts/${cohort.id}/persons/`, { headers: { 'Authorization': `Bearer ${process.env.POSTHOG_PERSONAL_API_KEY}` } } );
const { results: persons } = await personsResponse.json();
for (const person of persons) { const email = person.properties.$email || person.properties.email; if (email) { await tajo.contacts.update(email, { attributes: { POSTHOG_COHORTS: cohort.name } }); } }}分析用の HogQL クエリを実行
// HogQL を使用して分析データをクエリconst queryResponse = await fetch( `${posthogHost}/api/projects/${projectId}/query/`, { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.POSTHOG_PERSONAL_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ query: { kind: 'HogQLQuery', query: ` SELECT properties.$email AS email, count() AS event_count, max(timestamp) AS last_event FROM events WHERE event = 'purchase_completed' AND timestamp > now() - interval 30 day GROUP BY email HAVING event_count > 3 ORDER BY event_count DESC LIMIT 1000 ` } }) });
const queryResult = await queryResponse.json();
for (const row of queryResult.results) { await tajo.contacts.update(row[0], { attributes: { PURCHASE_COUNT_30D: row[1], LAST_PURCHASE: row[2] } });}レート制限
| エンドポイントカテゴリ | 制限 | 備考 |
|---|---|---|
| 分析エンドポイント | 240/分、1,200/時間 | GET persons、events、insights |
| クエリエンドポイント | 2,400/時間 | HogQL とカスタムクエリ |
| 機能フラグ評価 | 600/分 | ローカル評価エンドポイント |
| CRUD エンドポイント | 480/分、4,800/時間 | 作成、更新、削除操作 |
| パブリックエンドポイント(キャプチャ) | 無制限 | イベントキャプチャ、フラグ判定 |
バッチエクスポート
大規模なイベントデータエクスポートには、API ではなく PostHog のバッチエクスポート機能を使用してください。バッチエクスポートは S3、BigQuery、Snowflake などの送信先をサポートしています。
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
| 401 Unauthorized | API キーが無効 | 設定で Personal API Key を確認 |
| 400 Invalid project | プロジェクト ID が間違っている | PostHog URL のプロジェクト ID を確認 |
| 人物リストが空 | 識別されたユーザーがいない | posthog.identify() が呼び出されているか確認 |
| プロパティの欠落 | プロパティが未設定 | クライアント SDK の $set 呼び出しを確認 |
| レート制限 429 | リクエスト過多 | バックオフを実装し、レート制限ヘッダーを確認 |
デバッグモード
connectors: posthog: debug: true log_level: verbose log_queries: true log_sync: trueベストプラクティス
- ユーザーを識別する - 人物同期を有効にするため常にメール付きで
posthog.identify()を呼び出す - セグメンテーションにはコホートを使用する - Brevo リストに PostHog の行動コホートを活用
- API リクエストをバッチ処理する - 大規模データセットにはページネーションとバッチ処理を使用
- 複雑なクエリには HogQL を使用する - SQL ライクなクエリでカスタム分析を抽出
- バッチエクスポートを設定する - 大量のデータには API ポーリングよりもバッチエクスポートを優先
- 関連イベントをフィルタリング - ノイズを減らすためマーケティング関連イベントのみを同期
セキュリティ
- Personal API Key - スコープ付き Bearer トークン認証
- プロジェクトトークン - クライアントサイド操作専用のパブリックトークン
- HTTPS のみ - すべてのエンドポイントに TLS 暗号化が必要
- IP 許可リスト - セルフホストインスタンスで利用可能
- キースコープ - 特定の権限スコープで API キーを作成
- GitHub シークレットスキャン - PostHog は漏洩キー検出のため GitHub と提携