---
title: "Konektor PostHog"
description: "Panduan integrasi PostHog lengkap untuk menyinkronkan product analytics, feature flag, dan data perilaku pengguna dengan Brevo melalui Tajo."
url: https://tajo.io/in/docs/connectors/custom/posthog/
markdown: https://tajo.io/in/docs/connectors/custom/posthog.md
lang: id-ID
robots: noindex
---

Ajukan akses awal

Masukkan nama depan dan alamat email kerja Anda. Kami akan mengirim tautan untuk mengonfirmasi permintaan akses Tajo.

# Konektor PostHog

Status konektor: Direncanakan Belum dibangun. Tajo belum menjalankan konektor ini.

| Field sumber | Field tujuan | Nilai contoh |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

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:

1. Akun PostHog (Cloud atau self-hosted)
2. Personal API Key dari [PostHog Settings](https://app.posthog.com/settings/user-api-keys)
3. Project API Key (token) Anda dari [Project Settings](https://app.posthog.com/project/settings)
4. Akun Brevo dengan akses API
5. Akun Tajo dengan izin konektor

## Autentikasi

### Personal API Key (endpoint privat)

```bash
# Generate at https://app.posthog.com/settings/user-api-keys
export POSTHOG_PERSONAL_API_KEY=phx_your_personal_api_key
export POSTHOG_PROJECT_TOKEN=phc_your_project_token
export POSTHOG_HOST=https://us.posthog.com  # or https://eu.posthog.com
export TAJO_API_KEY=your_tajo_api_key
export BREVO_API_KEY=your_brevo_api_key
```

```javascript
// Private API endpoints use Bearer authentication
const headers = {
  'Authorization': `Bearer ${process.env.POSTHOG_PERSONAL_API_KEY}`,
  'Content-Type': 'application/json'
};

// Public endpoints use the project token
const publicHeaders = {
  'Content-Type': 'application/json'
};
// Token is passed in the request body for public endpoints
```

Keamanan 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

```yaml
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: 27
```

### Pemetaan field

```yaml
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_COHORTS
```

## Endpoint 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

```javascript
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

```javascript
// Paginate through PostHog persons
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;
}
```

### Sinkronkan cohort sebagai list Brevo

```javascript
// Get PostHog cohorts and sync members to Brevo lists
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) {
  // 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

```javascript
// Use HogQL to query analytics data
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]
    }
  });
}
```

## 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

```yaml
connectors:
  posthog:
    debug: true
    log_level: verbose
    log_queries: true
    log_sync: true
```

## Praktik terbaik

1. **Identifikasi pengguna** - Selalu panggil `posthog.identify()` dengan email agar sinkronisasi person berjalan
2. **Gunakan cohort untuk segmentasi** - Manfaatkan cohort perilaku PostHog untuk list Brevo
3. **Kelompokkan permintaan API** - Gunakan paginasi dan pemrosesan batch untuk dataset besar
4. **Gunakan HogQL untuk kueri kompleks** - Tarik analytics kustom dengan kueri bergaya SQL
5. **Siapkan batch export** - Untuk volume data besar, pilih batch export daripada polling API
6. **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

## Sumber daya terkait

- [Konektor Optimizely](https://tajo.io/in/docs/connectors/custom/optimizely)
- [Konektor Segment](https://tajo.io/in/docs/connectors/custom/segment)
- [Konektor Snowflake](https://tajo.io/in/docs/connectors/custom/snowflake)
- [Dokumentasi API PostHog](https://posthog.com/docs/api)
