Skip to content
Development
Skill

/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,

From plugin
ai-plugin
95180 skills1 agent3 commands3 hooks
+1

Claude Code

$ npx -y skills add PostHog/ai-plugin --skill querying-posthog-data --agent claude-code

SKILL.md

querying-posthog-data.SKILL.md
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

Read more
@posthog
Ships withai-plugin

Official PostHog plugin for AI clients. Access PostHog products directly from your AI coding tool.

95180 skills1 agent1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
95
Star history of PostHog/ai-plugin on GitHub, a chart by star-history.com

Other skills on ai-plugin.

analyzing-ai-citations

analyzing-ai-citations

Answer AI citation and answer engine optimization (AEO) questions in PostHog: whether AI answer engines (ChatGPT, Claude, and an…

@posthog@posthogInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

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.