Konektor PostHog
Hubungkan PostHog ke Brevo melalui Tajo untuk menyinkronkan data product analytics, event perilaku pengguna, dan keanggotaan cohort demi kampanye pemasaran berbasis data serta keterlibatan pelanggan yang dipersonalisasi.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | PostHog |
| Kategori | Product Analytics (Custom) |
| Kompleksitas penyiapan | Sedang |
| Integrasi resmi | Tidak |
| Data tersinkron | Event, person, feature flag, cohort |
| Metode autentikasi | Personal API Key / Project Token |
Fitur
- Sinkronisasi event - Teruskan event analytics PostHog ke Brevo untuk penargetan berbasis perilaku
- Sinkronisasi profil person - Sinkronkan properti person PostHog ke atribut kontak Brevo
- Segmentasi berbasis cohort - Petakan cohort PostHog ke list kontak Brevo
- Sinkronisasi feature flag - Segmentasikan kontak berdasarkan feature flag yang aktif
- Data funnel - Manfaatkan data funnel konversi untuk re-engagement yang tertarget
- Metadata session replay - Perkaya kontak dengan metrik keterlibatan sesi
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Akun PostHog (Cloud atau self-hosted)
- Personal API Key dari PostHog Settings
- Project API Key (token) Anda dari Project Settings
- Akun Brevo dengan akses API
- Akun Tajo dengan izin konektor
Autentikasi
Personal API Key (endpoint privat)
# Generate at https://app.posthog.com/settings/user-api-keysexport POSTHOG_PERSONAL_API_KEY=phx_your_personal_api_keyexport POSTHOG_PROJECT_TOKEN=phc_your_project_tokenexport POSTHOG_HOST=https://us.posthog.com # or https://eu.posthog.comexport TAJO_API_KEY=your_tajo_api_keyexport BREVO_API_KEY=your_brevo_api_key// Private API endpoints use Bearer authenticationconst headers = { 'Authorization': `Bearer ${process.env.POSTHOG_PERSONAL_API_KEY}`, 'Content-Type': 'application/json'};
// Public endpoints use the project tokenconst publicHeaders = { 'Content-Type': 'application/json'};// Token is passed in the request body for public endpointsKeamanan API key
Personal API key memberikan akses penuh ke akun. Jangan pernah menampilkannya di kode sisi klien. Gunakan Project API Key (token) untuk endpoint publik seperti penangkapan event dan evaluasi feature flag.
Konfigurasi
Penyiapan dasar
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 * * *" # Every 3 hours
event_filters: - "$pageview" - "purchase_completed" - "signup_completed" - "feature_used"
lists: all_users: 25 active_users: 26 power_users: 27Pemetaan field
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_COHORTSEndpoint API
| Endpoint | Metode | Deskripsi |
|---|---|---|
{host}/api/projects/{id}/persons/ | GET | Menampilkan daftar person |
{host}/api/projects/{id}/events/ | GET | Menampilkan daftar event |
{host}/api/projects/{id}/cohorts/ | GET | Menampilkan daftar cohort |
{host}/api/projects/{id}/feature_flags/ | GET | Menampilkan daftar feature flag |
{host}/api/projects/{id}/feature_flags/evaluation/ | POST | Mengevaluasi flag |
{host}/api/projects/{id}/insights/ | GET | Menampilkan daftar insight tersimpan |
{host}/api/projects/{id}/query/ | POST | Menjalankan kueri HogQL |
{host}/i/v0/e | POST | Menangkap event (publik) |
{host}/decide/?v=3 | POST | Keputusan feature flag (publik) |
Contoh kode
Inisialisasi konektor
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'});Sinkronkan person ke Brevo
// Paginate through PostHog personslet 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;}Sinkronkan cohort sebagai list Brevo
// Get PostHog cohorts and sync members to Brevo listsconst 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) { // Get persons in this cohort 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 } }); } }}Jalankan kueri HogQL untuk analytics
// Use HogQL to query analytics dataconst 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] } });}Batas rate
| Kategori endpoint | Batas | Catatan |
|---|---|---|
| Endpoint analytics | 240/menit, 1.200/jam | GET persons, events, insights |
| Endpoint query | 2.400/jam | Kueri HogQL dan kueri kustom |
| Evaluasi feature flag | 600/menit | Endpoint evaluasi lokal |
| Endpoint CRUD | 480/menit, 4.800/jam | Operasi create, update, delete |
| Endpoint publik (capture) | Tanpa batas | Penangkapan event, keputusan flag |
Batch export
Untuk ekspor data event berskala besar, gunakan fitur batch export PostHog, bukan API. Batch export mendukung S3, BigQuery, Snowflake, dan destinasi lainnya.
Pemecahan masalah
| Masalah | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | API key tidak valid | Periksa Personal API Key di pengaturan |
| 400 Invalid project | Project ID salah | Periksa project ID pada URL PostHog |
| Daftar person kosong | Tidak ada pengguna teridentifikasi | Pastikan posthog.identify() dipanggil |
| Properti tidak muncul | Properti belum disetel | Periksa pemanggilan $set di SDK klien |
| Rate limit 429 | Terlalu banyak permintaan | Terapkan backoff, periksa header rate limit |
Mode debug
connectors: posthog: debug: true log_level: verbose log_queries: true log_sync: truePraktik terbaik
- Identifikasi pengguna - Selalu panggil
posthog.identify()dengan email agar sinkronisasi person berjalan - Gunakan cohort untuk segmentasi - Manfaatkan cohort perilaku PostHog untuk list Brevo
- Kelompokkan permintaan API - Gunakan paginasi dan pemrosesan batch untuk dataset besar
- Gunakan HogQL untuk kueri kompleks - Tarik analytics kustom dengan kueri bergaya SQL
- Siapkan batch export - Untuk volume data besar, pilih batch export daripada polling API
- Saring event yang relevan - Sinkronkan hanya event yang relevan bagi pemasaran untuk menekan noise
Keamanan
- Personal API Key - Autentikasi bearer token dengan scope terbatas
- Project token - Token publik, hanya untuk operasi sisi klien
- HTTPS saja - Semua endpoint mewajibkan enkripsi TLS
- Allowlist IP - Tersedia untuk instance self-hosted
- Pembatasan scope key - Buat API key dengan scope izin yang spesifik
- Secret scanning GitHub - PostHog bermitra dengan GitHub untuk mendeteksi key yang bocor