Troubleshooting
Start from the failed proof gate. Do not rotate tokens, delete data, or reinstall everything before identifying which boundary failed.
MCP cannot connect
- Pin the runner to
@poolstatis/mcp@0.7.0; do not use@latest. - Confirm the host has Node.js 22, 23, or 24 and can run
pnpm dlx. - Check
POOLSTATIS_URLand thatPOOLSTATIS_TOKENis apt_orsk_token. - Restart the MCP host after changing its private configuration.
- Run
list_projects, thenget_onboarding_status. A copied config is not connection proof.
An sk_ token can see only its project. A pt_ token can discover projects in its
organization. A pk_ key is ingest-only and cannot call MCP queries.
Skills are not discovered
Confirm each installed folder contains a non-empty SKILL.md. Codex user skills live under
${CODEX_HOME:-$HOME/.codex}/skills; Claude Code project skills live under
.claude/skills. Start a new agent turn after installation. Skills teach workflow but do
not replace the MCP connection.
Event was sent but no metric moves
- Inspect the ingest response for
accepted,unregistered, and per-element errors. - Use
sample_eventswith the exact event, project, and environment. - Confirm the metric is
active, its source event and filters match, and the query range includes the accepted timestamp. - Check clock-skew and ingest warnings. Do not backfill a fake zero when evidence is missing.
Browser analytics shows no visits
- Confirm the Browser module started in the browser, not during SSR.
- Confirm the integration starts the Browser module on page load.
- Confirm CORS allows the site's exact origin and the
pk_key targets the expected env. - Only canonical
page.viewedevents with$browser_context = "1"enter Web analytics. country=unknownmeans the event predates country enrichment or no trusted country source enriched it; it is not a country.
UTM or source is missing
UTM values are captured once from the landing session and only from the five canonical allowlisted parameters. Direct visits legitimately report direct/unknown. The SDK never stores the full query string or retroactively copies a later campaign into an existing session.
Click or scroll map has no page
The aggregate grid can exist before a screenshot, but a layout-accurate overlay requires the
exact surface + route + version + device + env snapshot used by the events. Register a
stable release id, capture both desktop and mobile after the deploy, upload the immutable
PNG/WebP artifact, then query the same tuple. Poolstatis will not guess a background from a
different release.
Time on site or bounce is absent
Confirm the site runs @poolstatis/sdk@0.4.0 and that stored page.engagement snapshots
share the owning $page_view_id. Use get_web_overview, get_session_engagement, and
get_page_engagement from @poolstatis/mcp@0.7.0; do not approximate attention with
first/last timestamps. Missing terminal evidence is incomplete, not zero or bounce.
Replay setup produces no recording
Install the exact published replay SDK with pnpm add @poolstatis/sdk@0.4.0, then import the
separate @poolstatis/sdk/replay entrypoint. Verify affirmative versioned consent, the
exact-host allowlist, registered surface and finite route keys, privacy-policy hash,
object-store configuration, and manifest status.
Only contiguous, validated recordings with an initial full snapshot become playable.
See Session Replay.
Bitrix duplicates page views
Load one bundle per document. The Browser module already observes History API navigation.
Call pageViewed() manually only when custom AJAX changes the canonical screen without
updating browser history. Keep the route vocabulary finite and verify one navigation in
sample_events.
When escalating, include the project slug, environment, event/metric key, timestamp range, HTTP status/error code, and the relevant onboarding or warning output. Never paste tokens, raw personal data, or full production payloads.