PostHog-connector
Verbind PostHog met Brevo via Tajo om product-analyticsdata, gebruikersgedragsevents en cohort-lidmaatschappen te synchroniseren voor datagedreven marketingcampagnes en gepersonaliseerde klantbetrokkenheid.
Overzicht
| Eigenschap | Waarde |
|---|---|
| Platform | PostHog |
| Categorie | Product Analytics (Custom) |
| Setupcomplexiteit | Gemiddeld |
| Officiële integratie | Nee |
| Gesynchroniseerde data | Events, Persons, Feature Flags, Cohorts |
| Auth-methode | Personal API Key / Project Token |
Functies
- Eventsynchronisatie - Stuur PostHog-analytics-events door naar Brevo voor gedragstargeting
- Person-profielsynchronisatie - Synchroniseer PostHog person-properties naar Brevo-contactattributen
- Cohort-gebaseerde segmentatie - Map PostHog-cohorts naar Brevo-contactlijsten
- Feature flag-synchronisatie - Segmenteer contacten op basis van geactiveerde feature flags
- Funneldata - Gebruik conversiefunneldata voor gerichte heractivering
- Session replay-metadata - Verrijk contacten met sessiebetrokkenheidsmetrics
Vereisten
Voordat je begint, zorg dat je beschikt over:
- Een PostHog-account (Cloud of self-hosted)
- Een Personal API Key uit PostHog Settings
- Je Project API Key (token) uit Project Settings
- Een Brevo-account met API-toegang
- Een Tajo-account met connector-rechten
Authenticatie
Personal API Key (private endpoints)
# 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 endpointsAPI key-beveiliging
Personal API keys geven volledige accounttoegang. Stel ze nooit bloot in client-side code. Gebruik de Project API Key (token) voor publieke endpoints zoals event-capture en feature flag-evaluatie.
Configuratie
Basisinstelling
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: 27Veldmapping
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-endpoints
| Endpoint | Method | Beschrijving |
|---|---|---|
{host}/api/projects/{id}/persons/ | GET | Personen opvragen |
{host}/api/projects/{id}/events/ | GET | Events opvragen |
{host}/api/projects/{id}/cohorts/ | GET | Cohorten opvragen |
{host}/api/projects/{id}/feature_flags/ | GET | Feature flags opvragen |
{host}/api/projects/{id}/feature_flags/evaluation/ | POST | Flags evalueren |
{host}/api/projects/{id}/insights/ | GET | Opgeslagen insights opvragen |
{host}/api/projects/{id}/query/ | POST | HogQL-queries uitvoeren |
{host}/i/v0/e | POST | Events capturen (publiek) |
{host}/decide/?v=3 | POST | Feature flag-decisions (publiek) |
Codevoorbeelden
Connector initialiseren
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'});Personen synchroniseren naar 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;}Cohorten synchroniseren als Brevo-lijsten
// 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 } }); } }}HogQL-queries uitvoeren voor 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] } });}Rate limits
| Endpoint-categorie | Limiet | Opmerkingen |
|---|---|---|
| Analytics-endpoints | 240/min, 1.200/uur | GET persons, events, insights |
| Query-endpoint | 2.400/uur | HogQL en custom queries |
| Feature flag-evaluatie | 600/min | Local evaluation-endpoint |
| CRUD-endpoints | 480/min, 4.800/uur | Create-, update- en delete-operaties |
| Publieke endpoints (capture) | Onbeperkt | Event-capture, flag-decisions |
Batch Exports
Voor grootschalige eventdata-exports kun je beter PostHog’s batch exports-functie gebruiken in plaats van de API. Batch exports ondersteunen S3, BigQuery, Snowflake en andere bestemmingen.
Probleemoplossing
| Probleem | Oorzaak | Oplossing |
|---|---|---|
| 401 Unauthorized | Ongeldige API key | Verifieer Personal API Key in settings |
| 400 Invalid project | Verkeerd project-ID | Controleer project-ID in PostHog-URL |
| Lege personenlijst | Geen geïdentificeerde gebruikers | Zorg dat posthog.identify() wordt aangeroepen |
| Properties ontbreken | Properties niet gezet | Verifieer $set-calls in client SDK |
| Rate limit 429 | Te veel requests | Implementeer backoff, controleer rate limit-headers |
Debugmodus
connectors: posthog: debug: true log_level: verbose log_queries: true log_sync: trueBest practices
- Identificeer gebruikers - Roep altijd
posthog.identify()aan met email om person-sync mogelijk te maken - Gebruik cohorten voor segmentatie - Maak gebruik van PostHog’s gedragscohorten voor Brevo-lijsten
- Batch API-requests - Gebruik paginering en batch-verwerking voor grote datasets
- Gebruik HogQL voor complexe queries - Extracteer custom analytics met SQL-achtige queries
- Stel batch exports in - Geef voor grote datavolumes voorkeur aan batch exports boven API-polling
- Filter relevante events - Synchroniseer alleen marketingrelevante events om ruis te verminderen
Beveiliging
- Personal API Key - Gescoopte Bearer-token-authenticatie
- Project token - Publiek token alleen voor client-side operaties
- Alleen HTTPS - Alle endpoints vereisen TLS-encryptie
- IP-allowlisting - Beschikbaar voor self-hosted instances
- Key-scoping - Maak API keys aan met specifieke permission scopes
- GitHub secret scanning - PostHog werkt samen met GitHub voor detectie van gelekte keys