PostHog
This connector requires the Standard Plan or higher.
Connect PostHog to SIDE Engine using PostHog's AWS Kinesis destination. SIDE Engine provisions a dedicated Kinesis stream per table; PostHog sends flattened JSON records that match your table schema.
Overview
- Create a PostHog table in SIDE Engine with a flat
column_schema(top-level columns only). - Copy AWS credentials and the Kinesis stream name from SIDE Engine once the table is
ACTIVE. - Create the AWS Kinesis destination in PostHog and set a custom payload — a flat JSON object whose keys match your SIDE Engine columns and whose values reference PostHog fields (see section 2).
PostHog's default Kinesis envelope ({ "event": { ... }, "person": { ... } }) does not match SIDE Engine's schema. In PostHog, configure a custom flat payload: each top-level key must match a column in your SIDE Engine column_schema, and each value should reference the PostHog field you want (e.g. {event.uuid}, {person.id}).
1. Create a SIDE Engine PostHog table
Create the table in the SIDE Engine Console (Tables → Create table → PostHog) or with the CLI.
Define top-level columns in column_schema — do not nest fields under event or person. Column names must be lowercase.
posthog_events.yaml
name: example_posthog_events
schema_type: POSTHOG
unique_keys: [uuid]
column_schema:
uuid: String # Unique identifier for the PostHog event
distinct_id: String # User or session identifier
timestamp: DateTime # When the event occurred
event: String # Event name (e.g. "$pageview")
elements_chain: String # Serialized elements chain (autocapture)
url: String # Page URL where the event was captured
properties: String # Event properties (JSON string)
id: String # PostHog person id (from person.id)
| Field | Description |
|---|---|
schema_type | Must be POSTHOG. |
column_schema | Flat map of column name → type. Must match the JSON keys in your PostHog Kinesis payload. |
unique_keys | Columns that uniquely identify a row (e.g. uuid). Used for deduplication in ClickHouse. |
Supported types are the same as other realtime connectors — see Custom Table.
The table is provisioned asynchronously: SCHEDULING → DEPLOYING → ACTIVE.
CLI
side create-table --file posthog_events.yaml
When the table is ACTIVE, open the table in the Console to copy:
- AWS Access Key ID
- AWS Secret Access Key
- AWS Region
- Kinesis Stream Name
2. Configure PostHog AWS Kinesis destination
- In PostHog, go to Data pipeline → Destinations → + Create → AWS Kinesis.
- Enter the values from SIDE Engine:
| PostHog field | SIDE Engine value |
|---|---|
| AWS Access Key ID | From table connection details |
| AWS Secret Access Key | From table connection details |
| AWS Region | From table connection details |
| Kinesis Stream Name | From table connection details (e.g. SideDatasetStream-…) |
| Kinesis Partition Key | Optional (e.g. distinct_id or user_id) |
- Set the payload (custom message body). Build a flat JSON object that matches your
column_schema— you do not need to copy the example below exactly.
How to build your payload (for the schema in section 1 — adapt keys to match yours):
- For each column in column_schema, add one top-level key with the same name.
- Set the value to the PostHog placeholder for that data, usually {event.<field>} or {person.<field>}.
- Only include fields you defined in SIDE Engine; add or remove keys as needed.
{
"url": "{event.url}",
"uuid": "{event.uuid}",
"event": "{event.event}",
"timestamp": "{event.timestamp}",
"properties": "{event.properties}",
"distinct_id": "{event.distinct_id}",
"elements_chain": "{event.elements_chain}",
"id": "{person.id}"
}
If your table only has uuid, distinct_id, and timestamp, a valid payload might be:
{
"uuid": "{event.uuid}",
"distinct_id": "{event.distinct_id}",
"timestamp": "{event.timestamp}"
}
The rule is: payload keys = SIDE Engine column names, payload values = PostHog template variables for the source data.
- Save the payload and click Create & Enable .
PostHog substitutes {event.*} and {person.*} placeholders when sending each event to Kinesis.
3. Verify ingestion
- New events may take a few minutes to appear in your table after PostHog starts sending them.
- In the SIDE Engine Console, open your table and check Sample data once events have been sent after the destination is enabled.
- If columns are empty, confirm the payload keys match
column_schemaexactly (including lowercase names).