posthog/simulate-new-user
> Send synthetic first-time-visitor traffic to a URL and confirm that PostHog $pageview events fire. Use when a customer wants to verify that anonymous visitor tracking works, after deploying instrumentation changes, or when debugging "events not arriving" reports.
npx skills add https://github.com/PostHog/posthog --skill simulate-new-user
Drives a fresh browser context for each visit (no cookies, no localStorage),
goes to the given URL, scrolls a bit, and reports which PostHog events fired.
Each visit looks to PostHog like a brand-new anonymous visitor.
$pageview fires on the first visit (no cookies present).distinct_id is generated and a PostHog requestis sent within a few seconds of page load.
Call the simulate_new_user MCP tool with:
url (required) — the page to visit, e.g. https://example.com/pricing.visits (default 3) — number of fresh-context visits.interval (default 5.0) — seconds between visits.posthog_host (default https://us.i.posthog.com) — set tohttps://eu.i.posthog.com for the EU cloud, or your self-hosted host
(e.g. https://ph.example.com).
Each visit takes ~10s of Playwright time plus the interval, so plan accordingly.
The tool returns a structured summary:
{
"run_id": "a1b2c3d4",
"scenario": "new-user",
"total_visits": 3,
"posthog_requests": 6,
"posthog_requests_ok": 6,
"events_by_type": { "$pageview": 3, "$autocapture": 3 },
"pageviews": 3,
"errors": [],
"verified": true,
}
verified: true means at least one $pageview was captured per visit andno errors occurred — the new-user flow works.
verified: false with pageviews: 0 means PostHog isn't firing pageviews.Run check_posthog_loading next to see whether the snippet is even loaded.
posthog_requests_ok < posthog_requests means PostHog returned non-2xxresponses. Check the project's ingestion limits and api_host configuration.
Take posthog/simulate-new-user 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.