PostHog Analytics Skill
Automate PostHog dashboard creation, sync, update, and export via API.
Prerequisites
Required Tools
curl- HTTP client (pre-installed on macOS/Linux)jq- JSON processor:brew install jqorapt install jqbash- Shell (the script is bash)
PostHog API Key
- Go to PostHog Settings → Personal API Keys
- Create a new key with read/write access
- Export it:
bashexport POSTHOG_PERSONAL_API_KEY=phx_xxx
Note: The API key determines your organization and project. The script uses @current project context (your default project).
Verify Setup
bash# Test your API key - should return your project info curl -s -H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \ "https://us.i.posthog.com/api/projects/@current/" | jq '{id, name}'
Expected output:
json{ "id": 209268, "name": "Default project" }
If you get an error, check your API key is correct and has proper permissions.
Quick Start: Blog Analytics Example
Step 1: Write Your Config
Create blog_dashboard.json:
json{ "name": "Blog Analytics", "description": "Track blog performance and reader engagement", "filter": {"key": "source", "value": "blog"}, "dashboard_id": null, "insights": [ {"name": "Blog Pageviews (Total)", "type": "pageviews_total"}, {"name": "Unique Blog Readers", "type": "unique_users"}, {"name": "Blog Traffic Trend", "type": "traffic_trend"}, {"name": "Top Blog Posts", "type": "top_pages"} ] }
Note: Set dashboard_id: null for new dashboards.
Step 2: Create Dashboard
bash./scripts/posthog_sync.sh create blog_dashboard.json
Output:
Creating dashboard: Blog Analytics Dashboard created: ID 1166599 Creating insight: Blog Pageviews (Total) {id: 6520531, name: "Blog Pageviews (Total)"} ... Dashboard URL: https://us.posthog.com/project/209268/dashboard/1166599
The script:
- Creates a new dashboard in your PostHog project
- Returns dashboard_id (e.g.,
1166599) and project_id (e.g.,209268) in the URL - Automatically updates your config file with the
dashboard_id
Step 3: Add New Insights (Sync)
Edit config to add new insights, then:
bash./scripts/posthog_sync.sh sync blog_dashboard.json
Only creates NEW insights. Existing ones (matched by name) are skipped.
Step 4: Update Existing Insights
Changed your filter? Edit config, then:
bash./scripts/posthog_sync.sh update blog_dashboard.json
Updates ALL insights with current config settings. Use when changing filters.
Step 5: Export Existing Dashboard
bash./scripts/posthog_sync.sh export 1166599 > exported_dashboard.json
Config Reference
| Field | Required | Description |
|---|---|---|
name | Yes | Dashboard name |
description | No | Dashboard description |
filter | No* | Event property filter: {"key": "source", "value": "blog"} |
domain_filter | No* | URL filter fallback: "blog.sylph.ai" |
dashboard_id | No | Set to null for create, or existing ID for sync/update |
insights | Yes | Array of insight objects |
*At least one filter recommended. filter takes precedence over domain_filter.
Insight Types
| Type | Display | Description |
|---|---|---|
pageviews_total | BoldNumber | Total pageview count |
unique_users | BoldNumber | Unique visitors (DAU) |
traffic_trend | LineGraph | Traffic over time |
top_pages | Table | Top pages breakdown |
Optional Insight Fields
| Field | Default | Options |
|---|---|---|
math | total | total, dau, weekly_active, monthly_active |
display | Auto | BoldNumber, ActionsLineGraph, ActionsTable |
date_range | -30d | -7d, -30d, -90d, etc. |
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
POSTHOG_PERSONAL_API_KEY | Yes | - | Your API key (determines org/project) |
POSTHOG_HOST | No | us.i.posthog.com | API host (EU: eu.i.posthog.com) |
POSTHOG_UI_HOST | No | us.posthog.com | UI host for dashboard URLs |
Files
scripts/posthog_sync.sh- CLI script (create/sync/update/export)examples/blog_dashboard.json- Example config

