web-analytics
'Push-based web analytics intelligence for your entire site portfolio.
Allowed Tools
Provided by Plugin
web-analytics
Push-based web analytics intelligence — self-hosted Umami (primary) via MCP + GA4 (fallback). 9 specialist agents fetch data, detect anomalies, analyze funnels, verify claims, and deliver narrative reports across your entire site portfolio. Three tiers: 30-second pulse, 2-min brief, 5-min full deep-dive.
Installation
This skill is included in the web-analytics plugin:
/plugin install web-analytics@claude-code-plugins-plus
Click to copy
Instructions
Web Analytics Intelligence
Orchestrates a team of specialist agents to deliver business-grade analytics insights
across your entire site portfolio. Not a dashboard replacement — a push-based analytics
team that surfaces what matters.
Overview
This skill routes analytics requests to the right combination of specialist agents based
on the requested tier, compiles their outputs into a cohesive narrative, and delivers
via console, email, or Slack.
Architecture: Orchestrator (this skill) → Data Collector → Specialist Agents (parallel) → Reporter
Prerequisites
- Umami credentials in
~/.env(UMAMI_PASSWORD for the admin user) - Sites configured in
${CLAUDESKILLDIR}/references/site-registry.md - For email delivery:
/emailskill working - For Slack delivery:
/slackskill working
Data Access
The skill uses direct Umami REST API calls (more reliable than MCP):
# Get auth token
TOKEN=$(curl -s "https://analytics.intentsolutions.io/api/auth/login" \
-X POST -H "Content-Type: application/json" \
-d '{"username":"admin","password":"'"$UMAMI_PASSWORD"'"}' | \
python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))")
# Get stats (uses epoch ms, compare=prev for prior period)
curl -s "https://analytics.intentsolutions.io/api/websites/{SITE_ID}/stats?startAt={START_MS}&endAt={END_MS}&compare=prev" \
-H "Authorization: Bearer $TOKEN"
# Get active visitors
curl -s "https://analytics.intentsolutions.io/api/websites/{SITE_ID}/active" \
-H "Authorization: Bearer $TOKEN"
# Get daily pageviews
curl -s "https://analytics.intentsolutions.io/api/websites/{SITE_ID}/pageviews?startAt={START_MS}&endAt={END_MS}&unit=day&timezone=America%2FNew_York" \
-H "Authorization: Bearer $TOKEN"
Instructions
Step 1: Parse Request
Extract from $ARGUMENTS or conversation context:
| Parameter | Default | Options |
|---|---|---|
| Tier | mini | mini, medium, full |
| Site | all | Site name from registry, or all |
| Period | 7d | today, yesterday, 7d, 30d, mtd, qtd |
| Delivery | console | --email, --slack, --all |
| Compare | auto | Previous equivalent period |
Examples:
/analytics→ mini tier, all sites, 7d, console/analytics medium --site=tonsofskills→ medium tier, one site, 7d, console/analytics full --period=30d --email→ full tier, all sites, 30d, email deliveryhow's my traffic today?→ mini tier, all sites, today, console
Step 2: Load Configuration
Read these reference files for context:
${CLAUDESKILLDIR}/references/site-registry.md— site config, baselines, thresholds${CLAUDESKILLDIR}/references/mcp-tool-reference.md— MCP tool signatures${CLAUDESKILLDIR}/references/reporting-tiers.md— output format specs (medium/full tiers)${CLAUDESKILLDIR}/references/interpretation-guide.md— advisory voice standards
Step 3: Route by Tier
Mini Tier (inline — no subagents)
For mini tier, handle data collection inline to minimize latency:
- Source
~/.envto get UMAMI_PASSWORD, then get auth token via curl - Calculate time range as epoch milliseconds (use
date -d "2026-04-30" +%sthen append000) - For each site (or specified site):
- Call
/api/websites/{ID}/stats?startAt=...&endAt=...&compare=prevfor aggregate metrics - Call
/api/websites/{ID}/activefor real-time visitor count
- Compute deltas using the
comparisonblock returned byget_stats - Format as mini pulse:
## Analytics Pulse — {date}
**Portfolio:** {total_visitors} visitors across {n} sites ({+/-n%} vs prior {period})
| Site | Visitors | Pageviews | Bounce | Trend |
|------|----------|-----------|--------|-------|
| {site} | {n} | {n} | {n%} | {↑↓→ n%} |
**Top Signal:** {most notable change across all sites}
**Active Now:** {n} visitors
Keep it under 15 lines. No analysis, just the numbers and one signal.
Medium Tier (4 agents)
Launch these agents using the Agent tool with subagent_type:
Phase A — Data Collection:
- Spawn
data-collectoragent with instructions:
- Sites: {sites from request}
- Period: {calculated time range}
- Data needed: stats, referrers, top pages, time series
- Provide the full content of
${CLAUDESKILLDIR}/references/mcp-tool-reference.md - Provide the full content of
${CLAUDESKILLDIR}/references/site-registry.md
Phase B — Parallel Analysis (after data returns):
- Spawn
traffic-intelligenceagent with data-collector output - Spawn
content-seoagent with data-collector output (if available) - Spawn
anomaly-detectoragent with data-collector output (if available)
Phase C — Compilation:
- Spawn
reporting-narrativeagent with all specialist outputs
- Tier: medium
- Delivery format: {console/email/slack}
Full Tier (all agents)
Phase A — Data Collection:
- Spawn
data-collectoragent — request ALL data types including events, tech, geo
Phase B — Parallel Analysis:
- Spawn ALL specialist agents in parallel:
traffic-intelligence— channel/source analysiscontent-seo— page performanceanomaly-detector— spike/drop detectionconversion-funnel— event/goal analysisaudience-segmentation— cohort/geo analysis
Phase C — Verification:
- Spawn
verification-agentwith all specialist outputs — adversarial quality check
Phase D — Compilation:
- Spawn
reporting-narrativeagent with all outputs + verification notes
- Tier: full
- Delivery format: {console/email/slack}
Step 4: Deliver
Console (default): Display the narrative report directly.
Email (--email): Invoke the /email skill with:
- To: jeremy@intentsolutions.io
- Subject: "Analytics {Tier} — {date} — {headline}"
- Body: Report content (formatted for email)
Slack (--slack): Invoke the /slack skill with:
- Channel: #operation-hired
- Message: Report content (formatted for Slack, respect 3000-char limit)
All (--all): Console + email + Slack.
Step 5: Memory Update (Full Tier Only)
For full-tier reports, spawn the memory-agent to:
- Record this period's baselines for future comparison
- Note any new referral sources or traffic patterns
- Update seasonal adjustment data if applicable
Agent Roster
| Agent | File | Tier | Purpose |
|---|---|---|---|
| data-collector | ${CLAUDESKILLDIR}/agents/data-collector.md |
All | MCP data fetching |
| traffic-intelligence | ${CLAUDESKILLDIR}/agents/traffic-intelligence.md |
Medium+ | Source attribution |
| content-seo | ${CLAUDESKILLDIR}/agents/content-seo.md |
Medium+ | Page performance |
| anomaly-detector | ${CLAUDESKILLDIR}/agents/anomaly-detector.md |
Medium+ | Spike/drop detection |
| conversion-funnel | ${CLAUDESKILLDIR}/agents/conversion-funnel.md |
Full | Event/goal analysis |
| audience-segmentation | ${CLAUDESKILLDIR}/agents/audience-segmentation.md |
Full | Cohort analysis |
| verification-agent | ${CLAUDESKILLDIR}/agents/verification-agent.md |
Full | Output quality check |
| reporting-narrative | ${CLAUDESKILLDIR}/agents/reporting-narrative.md |
Medium+ | Narrative compilation |
| memory-agent | ${CLAUDESKILLDIR}/agents/memory-agent.md |
Full | Rolling context |
Troubleshooting
| Issue | Resolution |
|---|---|
| "Umami MCP not connected" | Run /mcp to check server status. Ensure umami-analytics is in settings.json |
| Empty data for a site | Verify site ID in site-registry.md matches Umami. Run mcpumamiget_websites to list. If all sites show zero, the tracker likely isn't installed on the site (see site-registry per-site repo paths). |
| Slow response (>5min) | Switch to lower tier. Mini tier bypasses all subagents. |
| Email/Slack delivery fails | Test /email and /slack independently first |
| Stale baselines | Run /analytics full to trigger memory-agent baseline update |