/querying-posthog-data
Explains how to query PostHog data, defaulting to typed runners for supported product analytics. Read it before you write HogQL/SQL. Also read it before you call execute-sql against PostHog. Use it to find or aggregate PostHog entities. These entities include insights,
Claude Code
$ npx -y skills add posthog/posthog --skill querying-posthog-data --agent claude-code
Codex
$ npx skills add posthog/posthog --skill querying-posthog-data -a codex -y
Cursor
$ npx skills add posthog/posthog --skill querying-posthog-data -a cursor -y
Gemini CLI
$ npx skills add posthog/posthog --skill querying-posthog-data -a gemini-cli -y
GitHub Copilot
$ npx skills add posthog/posthog --skill querying-posthog-data -a github-copilot -y
OpenCode
$ npx skills add posthog/posthog --skill querying-posthog-data -a opencode -y
Windsurf
$ npx skills add posthog/posthog --skill querying-posthog-data -a windsurf -y
SKILL.md
querying-posthog-data.SKILL.mdname: querying-posthog-data
description: >
Explains how to query PostHog data, defaulting to typed runners for supported product analytics.
Read it before you write HogQL/SQL.
Also read it before you call execute-sql against PostHog.
Use it to find or aggregate PostHog entities.
These entities include insights, dashboards, cohorts, feature flags, experiments,
surveys, hog flows, warehouse data, and persons.
Use it for trends, funnels, retention, lifecycle, paths, stickiness,
web analytics, error tracking, logs, sessions, and LLM traces.
Before you calculate a governed business or telemetry measure, check
system.information_schema.metrics for an approved definition.
Examples include MRR, activation, billable usage, active organizations, and failure rates.
Use the approved definition before you derive a measure from raw events or use a typed domain tool.
It also covers HogQL differences, system table schemas, functions, query examples, and schema discovery.
Querying data in PostHog
The [guidelines](./references/guidelines.md) explain SQL syntax and schema discovery. Read them when you choose `posthog:execute-sql`. You do not need them for typed queries.
Choose the query path
Default to typed query tools for new product-analytics questions and dashboard insights when their schemas support the requested calculation. This includes simple event counts, unique users, property sums, breakdowns, and time series. Choose SQL only when the task needs SQL capabilities or explicitly requests SQL.
For governed measures, follow the semantic-layer workflow below before deriving a query. Reuse a matching approved metric or saved query when it defines the requested measure.
Typed query tools
Use the matching typed query tool for supported product analytics:
- `posthog:query-trends` for native trends with series, breakdowns, formulas, and period comparisons.
- `posthog:query-funnel` for conversion rates, drop-off, and step completion.
- `posthog:query-retention` for users returning over time.
- `posthog:query-stickiness` for engagement frequency.
- `posthog:query-paths` for navigation flows.
- `posthog:query-lifecycle` for new, returning, resurrecting, and dormant users.
Do not approximate these analyses with SQL when the user expects PostHog's standard definitions. Confirm that the selected tool supports the required calculation and output.
SQL queries
Use `posthog:execute-sql` when:
- The request searches `system.*` tables for PostHog entities.
- The user requests SQL, record inspection, or changes to an existing SQL query.
- The analysis needs custom joins, CTEs, window functions, or warehouse SQL.
- You need to inspect records or discover entities before constructing a later typed query. Use those findings to select events, properties, and filters; typed query tools cannot accept SQL result rows as input.
When either method fits
When both methods fit a new event-analytics query, use the typed runner. SQL being familiar, an example being written in SQL, or an earlier discovery call using SQL is not a reason to choose SQL for the final analysis. Use SQL directly when the task needs its capabilities; a failed typed-query attempt is not required.
Keep a valid existing query when it fits the task. Choose the method again when the task changes. For each new dashboard tile, run the matching typed query and save its native query node (such as `TrendsQuery` or `FunnelsQuery`) with `insight-create`; do not wrap an equivalent SQL query in `HogQLQuery`. Use SQL-backed insights only for tiles that need SQL. Both methods support visualizations, so a chart or table request alone does not justify SQL.
Render query results
Choose the presentation path from the harness's capabilities, independently of the query method. A query tool having a UI resource does not mean every harness displays it, especially when the call runs inside `exec`.
- **Already displayed:** direct tool calls and some exec harnesses render query results inline. When the harness says the interactive view is visible (for example, the response says "The user already sees this result as an interactive view"), summarize the conclusion without rendering the same chart again.
- **Exec returned data without a chart:** if the harness exposes the top-level `posthog:render-ui` tool and the query tool is in its `tool_name` enum, call it after the query succeeds. Pass the same tool name and validated input (for example, `tool_name: "query-trends"` with the successful trends input as `tool_input`). Call `render-ui` directly, not through `exec`. The widget fetches its own data; pass query inputs, not result rows or a new SQL query.
- **No supported UI tool:** follow the harness's rendering instructions or provide a written summary. Keep the typed query; lack of an inline chart is not a reason to switch to SQL.
Keep a concise written conclusion alongside the visualization.
When to use this skill
Finding a specific PostHog entity
When the user wants to find a specific entity created in PostHog (insights, dashboards, cohorts, feature flags, experiments, surveys, hog flows, data warehouse items, etc.), or when a list/search tool returns too many results to narrow down:
1. Read the appropriate schema reference under Data Schema to understand the entity's table and columns. 2. Use `posthog:execute-sql` to query the system table and find the matching entity (typically returning its ID). 3. Use the dedicated read tool for that entity type (e.g. `posthog:insight-get`, `posthog:dashboard-get`) to retrieve the full entity by ID.
Don't try to reconstruct the entity from SQL — `execute-sql` is for discovery, the read tool is for retrieval.
Querying analytics data
When SQL is the selected method for an analytics request:
1. Look for a matching example under Analytics Query Examples. The list is not exhaustive — there may not be an example for every scenario. If one is a close fit (same dom
Read more
name: querying-posthog-data description: > Explains how to query PostHog data, defaulting to typed runners for supported product analytics. Read it before you write HogQL/SQL. Also read it before you call execute-sql against PostHog. Use it to find or aggregate PostHog entities. These entities include insights, dashboards, cohorts, feature flags, experiments, surveys, hog flows, warehouse data, and persons. Use it for trends, funnels, retention, lifecycle, paths, stickiness, web analytics, error tracking, logs, sessions, and LLM traces. Before you calculate a governed business or telemetry measure, check system.information_schema.metrics for an approved definition. Examples include MRR, activation, billable usage, active organizations, and failure rates. Use the approved definition before you derive a measure from raw events or use a typed domain tool. It also covers HogQL differences, system table schemas, functions, query examples, and schema discovery.
Querying data in PostHog
The [guidelines](./references/guidelines.md) explain SQL syntax and schema discovery. Read them when you choose `posthog:execute-sql`. You do not need them for typed queries.
Choose the query path
Default to typed query tools for new product-analytics questions and dashboard insights when their schemas support the requested calculation. This includes simple event counts, unique users, property sums, breakdowns, and time series. Choose SQL only when the task needs SQL capabilities or explicitly requests SQL.
For governed measures, follow the semantic-layer workflow below before deriving a query. Reuse a matching approved metric or saved query when it defines the requested measure.
Typed query tools
Use the matching typed query tool for supported product analytics:
- `posthog:query-trends` for native trends with series, breakdowns, formulas, and period comparisons.
- `posthog:query-funnel` for conversion rates, drop-off, and step completion.
- `posthog:query-retention` for users returning over time.
- `posthog:query-stickiness` for engagement frequency.
- `posthog:query-paths` for navigation flows.
- `posthog:query-lifecycle` for new, returning, resurrecting, and dormant users.
Do not approximate these analyses with SQL when the user expects PostHog's standard definitions. Confirm that the selected tool supports the required calculation and output.
SQL queries
Use `posthog:execute-sql` when:
- The request searches `system.*` tables for PostHog entities.
- The user requests SQL, record inspection, or changes to an existing SQL query.
- The analysis needs custom joins, CTEs, window functions, or warehouse SQL.
- You need to inspect records or discover entities before constructing a later typed query. Use those findings to select events, properties, and filters; typed query tools cannot accept SQL result rows as input.
When either method fits
When both methods fit a new event-analytics query, use the typed runner. SQL being familiar, an example being written in SQL, or an earlier discovery call using SQL is not a reason to choose SQL for the final analysis. Use SQL directly when the task needs its capabilities; a failed typed-query attempt is not required.
Keep a valid existing query when it fits the task. Choose the method again when the task changes. For each new dashboard tile, run the matching typed query and save its native query node (such as `TrendsQuery` or `FunnelsQuery`) with `insight-create`; do not wrap an equivalent SQL query in `HogQLQuery`. Use SQL-backed insights only for tiles that need SQL. Both methods support visualizations, so a chart or table request alone does not justify SQL.
Render query results
Choose the presentation path from the harness's capabilities, independently of the query method. A query tool having a UI resource does not mean every harness displays it, especially when the call runs inside `exec`.
- **Already displayed:** direct tool calls and some exec harnesses render query results inline. When the harness says the interactive view is visible (for example, the response says "The user already sees this result as an interactive view"), summarize the conclusion without rendering the same chart again.
- **Exec returned data without a chart:** if the harness exposes the top-level `posthog:render-ui` tool and the query tool is in its `tool_name` enum, call it after the query succeeds. Pass the same tool name and validated input (for example, `tool_name: "query-trends"` with the successful trends input as `tool_input`). Call `render-ui` directly, not through `exec`. The widget fetches its own data; pass query inputs, not result rows or a new SQL query.
- **No supported UI tool:** follow the harness's rendering instructions or provide a written summary. Keep the typed query; lack of an inline chart is not a reason to switch to SQL.
Keep a concise written conclusion alongside the visualization.
When to use this skill
Finding a specific PostHog entity
When the user wants to find a specific entity created in PostHog (insights, dashboards, cohorts, feature flags, experiments, surveys, hog flows, data warehouse items, etc.), or when a list/search tool returns too many results to narrow down:
1. Read the appropriate schema reference under Data Schema to understand the entity's table and columns. 2. Use `posthog:execute-sql` to query the system table and find the matching entity (typically returning its ID). 3. Use the dedicated read tool for that entity type (e.g. `posthog:insight-get`, `posthog:dashboard-get`) to retrieve the full entity by ID.
Don't try to reconstruct the entity from SQL — `execute-sql` is for discovery, the read tool is for retrieval.
Querying analytics data
When SQL is the selected method for an analytics request:
1. Look for a matching example under Analytics Query Examples. The list is not exhaustive — there may not be an example for every scenario. If one is a close fit (same dom
:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.
More skills from other plugins.
paddleocr-doc-parsing
Use this skill to extract structured Markdown/JSON from PDFs and document images—tables with cell-level precision, formulas as…
13c-metabolic-flux
Estimates intracellular metabolic fluxes from steady-state carbon-13 isotope-tracing measurements using validated atom maps,…
Questions about querying-posthog-data.
- Which coding agents can use querying-posthog-data?
- querying-posthog-data installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

