Коннектор PostHog
Подключите PostHog к Brevo через Tajo для синхронизации данных продуктовой аналитики, поведенческих событий пользователей и членства в когортах, для data-driven маркетинговых кампаний и персонализированного взаимодействия с клиентами.
Обзор
| Свойство | Значение |
|---|---|
| Платформа | PostHog |
| Категория | Product Analytics (Custom) |
| Сложность настройки | Средняя |
| Официальная интеграция | Нет |
| Синхронизируемые данные | События, профили, флаги функций, когорты |
| Метод аутентификации | Personal API Key / Project Token |
Возможности
- Синхронизация событий, пересылка аналитических событий PostHog в Brevo для поведенческого таргетинга
- Синхронизация профилей пользователей, синхронизация свойств профилей PostHog с атрибутами контактов Brevo
- Сегментация по когортам, сопоставление когорт PostHog с листами контактов Brevo
- Синхронизация флагов функций, сегментация контактов по включённым флагам функций
- Данные воронок, использование данных конверсионных воронок для целевого повторного вовлечения
- Метаданные записей сессий, обогащение контактов показателями вовлечённости в сессии
Предварительные требования
Прежде чем начать, убедитесь, что у вас есть:
- Аккаунт PostHog (Cloud или self-hosted)
- Personal API Key из настроек PostHog
- Project API Key (токен) из настроек проекта
- Аккаунт Brevo с доступом к API
- Аккаунт Tajo с правами на управление коннекторами
Аутентификация
Personal API Key (приватные эндпоинты)
# Сгенерируйте на 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 # или 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 Key
Personal API Keys предоставляют полный доступ к аккаунту. Никогда не раскрывайте их в клиентском коде. Используйте Project API Key (токен) для публичных эндпоинтов, таких как захват событий и оценка флагов функций.
Конфигурация
Базовая настройка
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_COHORTSЭндпоинты API
| Эндпоинт | Метод | Описание |
|---|---|---|
{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
// Постраничный обход профилей PostHoglet 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 и синхронизация участников с листами Brevoconst 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 профилей, событий, инсайтов |
| Эндпоинт запросов | 2 400/час | HogQL и пользовательские запросы |
| Оценка флагов функций | 600/мин | Эндпоинт локальной оценки |
| CRUD-эндпоинты | 480/мин, 4 800/час | Создание, обновление, удаление |
| Публичные эндпоинты (захват) | Без ограничений | Захват событий, решения по флагам |
Пакетные экспорты
Для экспорта больших объёмов данных о событиях используйте функцию batch exports в PostHog вместо API. Пакетные экспорты поддерживают S3, BigQuery, Snowflake и другие назначения.
Устранение неполадок
| Проблема | Причина | Решение |
|---|---|---|
| 401 Unauthorized | Недействительный API-ключ | Проверьте Personal API Key в настройках |
| 400 Invalid project | Неверный ID проекта | Проверьте ID проекта в URL PostHog |
| Пустой список профилей | Нет идентифицированных пользователей | Убедитесь, что вызывается posthog.identify() |
| Отсутствующие свойства | Свойства не заданы | Проверьте вызовы $set в клиентском SDK |
| Лимит 429 | Слишком много запросов | Реализуйте задержку, проверьте заголовки лимитов |
Режим отладки
connectors: posthog: debug: true log_level: verbose log_queries: true log_sync: trueЛучшие практики
- Идентифицируйте пользователей, всегда вызывайте
posthog.identify()с email для синхронизации профилей - Используйте когорты для сегментации, применяйте поведенческие когорты PostHog для листов Brevo
- Пакетные API-запросы, используйте пагинацию и пакетную обработку для больших наборов данных
- Используйте HogQL для сложных запросов, извлекайте пользовательскую аналитику с помощью SQL-подобных запросов
- Настройте пакетные экспорты, для больших объёмов данных предпочтительнее пакетные экспорты, а не опрос API
- Фильтруйте релевантные события, синхронизируйте только события, значимые для маркетинга, чтобы снизить шум
Безопасность
- Personal API Key, аутентификация через Bearer token с ограниченными правами
- Токен проекта, публичный токен только для клиентских операций
- Только HTTPS, все эндпоинты требуют TLS-шифрования
- IP-разрешение, доступно для self-hosted экземпляров
- Ограничение прав ключей, создавайте API-ключи с конкретными правами доступа
- Сканирование секретов GitHub, PostHog сотрудничает с GitHub для обнаружения утечки ключей