posthog/triaging-web-analytics-support
> the in-app conversations product and their Zendesk mirrors, classify each into a diagnostic shape (frontend crash, "two numbers don't match", traffic count drop, tracker not loading / undercounting vs a competitor, ad-platform integration error, channel type misclassification), run the matching playbook, and produce reply drafts plus fix PRs where warranted. Use when asked to triage the web analytics support channel, investigate a web analytics Zendesk or conversations ticket, or explain metric discrepancies a data; never copy customer names or their traffic numbers into public artifacts (PRs, issues, commits).
npx skills add https://github.com/PostHog/posthog --skill triaging-web-analytics-support
The job: turn a pile of open support tickets into (a) reply drafts grounded in code or data, and (b) draft PRs for real bugs.
Most reported "bugs" are explainable semantics; most real bugs show up in error tracking or raw data before they show up in the code.
Diagnose before writing code, and always determine which layer a symptom lives in before proposing a fix.
Tickets live in the conversations product and are queryable via the PostHog MCP execute-sql tool against system.support_tickets (project 2, US).
Zendesk mirrors carry full comment history in the data warehouse.
See references/ticket-queries.md for ready-to-run SQL: open-ticket scans, keyword filters, full Zendesk comment extraction (the child_events JSON pattern), and resolving a requester email to an org/team across US and EU regions.
Slack channel #support-web-analytics mirrors new Zendesk tickets; the in-app ticket link in each message carries the conversations UUID.
Detailed walk-throughs with worked examples are in references/diagnostic-playbooks.md. The shapes:
| Shape | Trigger phrases | First move |
| -------------------------------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Frontend crash | "everything crashes", exception ID, stack trace | Error tracking lookup; sourcemapped frames name the file. Check both US and EU projects |
| Two numbers don't match | "two different bounce rates", "insight X disagrees with tile Y" | Semantics first, not code: event-level vs session-entry scoping, "landing vs containing", any-event vs entry-event filters explain most of these |
| Count drop over time | "pageviews declined", "tracking loss" | Layer split: raw stored counts vs query-side exclusion. $pageview vs $pageleave ratio, UA segmentation, SDK version pin. Bot-shaped traffic disappearing is common and is not a PostHog bug |
| Tracker not loading / undercounts competitor | "numbers lower than <other tool>", GTM, consent, ad blockers | Runtime loading audit with Playwright against their live site: load method, first-request timing, blocklist simulation. See references/loading-audit.md |
| Ad-platform integration error | "can't re-add source", OAuth errors, "no conversions" | Source re-creation paths, OAuth failure modes (for example Microsoft AADSTS650052), attribution join keys (exact campaign name + normalized source, both UTMs required for the fallback) |
| Channel type misclassification | "shows as Direct", "wrong channel" | posthog/models/channel_type/channel_definitions.json + the decision tree in posthog/hogql/database/schema/channel_type.py; unknown source + stripped referrer falls through to Direct |
Two cross-cutting rules:
count() can't be caused by query-time bot exclusion; a classification change can't alter stored counts. State which layer the evidence points at.$entry_utm_campaign instead of event utm_campaign)..notes/) with one section per ticket and an explicit "action left" marker per ticket, so a human can pick up the queue.query-clickhouse-via-metabase skill covers prod-us and prod-eu access.query-error-tracking-issues-list / query-error-tracking-issue-events with verbosity: stack gives sourcemapped frames.Take posthog/triaging-web-analytics-support from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.