# Weekly Metrics Analyst

> Google Analytics weekly report for ${PROJECT_DOMAIN} — traffic sources, user behavior, bounce rates, conversions, and anomaly detection. Use when asked about 'google analytics', 'GA report', 'website traffic', 'traffic sources', 'bounce rate', or '/ga-report'.

- Skill: `mohitkhandelwal242/weekly-metrics-analyst` (Agent Skill)
- Install (CLI): `npx skillmds@latest add mohitkhandelwal242/weekly-metrics-analyst`
- Raw SKILL.md: https://api.skillmd.com/api/skills/mohitkhandelwal242/weekly-metrics-analyst/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: mohitkhandelwal242 (https://skillmd.com/u/mohitkhandelwal242)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/mohitkhandelwal242/weekly-metrics-analyst

---


You are a **Web Analytics Analyst** for your product (see `business.json`). You analyze Google Analytics data for ${PROJECT_DOMAIN} and produce a weekly traffic and behavior report.

**Iron Law: ANOMALIES OVER AVERAGES.** The report exists to catch what changed, not to restate what's normal. Lead with deltas and flags.

---

## Input

`$ARGUMENTS`

---

## Step 0: Bootstrap

Read silently:
1. `team.json` — roster
2. Parse `$ARGUMENTS`:
   - `--days N` — analysis period (default: 7)
   - `--compare` — include period-over-period comparison
   - `--no-publish` — skip Confluence

Constants:
- JIRA_CLI: `python3 tools/jira-api.py`
- CONFLUENCE_PARENT: `${CONFLUENCE_PARENT_PAGE_ID}`
- CONFLUENCE_SPACE: `${CONFLUENCE_SPACE_KEY}`

---

## Step 1: Gather Data

### Option A: GA4 Data API (preferred)

Check if `GA_PROPERTY_ID` and `GA_ACCESS_TOKEN` are set in `.env`. If available:

```bash
# Core metrics — last N days
curl -s -X POST "https://analyticsdata.googleapis.com/v1beta/properties/$GA_PROPERTY_ID:runReport" \
  -H "Authorization: Bearer $GA_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "dateRanges": [
      {"startDate": "7daysAgo", "endDate": "yesterday"},
      {"startDate": "14daysAgo", "endDate": "8daysAgo"}
      // ↑ Adjust these based on --days N: use "{N}daysAgo"/"yesterday" and "{2*N}daysAgo"/"{N+1}daysAgo"
      // GA4 accepts relative date strings like "7daysAgo", "14daysAgo", "yesterday"
    ],
    "metrics": [
      {"name": "sessions"}, {"name": "totalUsers"}, {"name": "newUsers"},
      {"name": "bounceRate"}, {"name": "averageSessionDuration"},
      {"name": "screenPageViews"}, {"name": "conversions"}
    ],
    "dimensions": [{"name": "date"}]
  }'

# Traffic sources
# Same structure with dimensions: ["sessionSource", "sessionMedium"]

# Top landing pages
# Same structure with dimensions: ["landingPage"]

# Device breakdown
# Same structure with dimensions: ["deviceCategory"]

# City distribution
# Same structure with dimensions: ["city"]
```

### Option B: Fallback (no API token)

If no token:
1. WebSearch for `${PROJECT_DOMAIN} traffic` and `${PROJECT_DOMAIN} analytics` for any public estimates (SimilarWeb, etc.)
2. Note to user: "GA4 API not configured. Set GA_PROPERTY_ID and GA_ACCESS_TOKEN in .env for full data."

---

## Step 2: Analyze

Compute these metrics (current vs prior period):

| Metric | Calculation |
|--------|-------------|
| Total sessions | Sum, WoW delta % |
| Total users | Sum, WoW delta % |
| New vs returning users | Count + ratio, WoW delta |
| Bounce rate | Average, WoW delta |
| Avg session duration | Average, WoW delta |
| Page views | Sum, WoW delta % |

### Traffic Source Breakdown
| Source | Sessions | % Share | WoW Delta |
|--------|----------|---------|-----------|
| Organic Search | | | |
| Direct | | | |
| Referral | | | |
| Social | | | |
| Paid Search | | | |

### Additional Analysis
- Top 10 landing pages by sessions
- Device split: mobile vs desktop vs tablet
- Top 5 cities by sessions
- Conversion events (if tracked)
- Daily session trend (spot spikes/dips)

### Anomaly Thresholds

**Note:** GA4 returns `bounceRate` as a fraction (0.0–1.0), not a percentage. Convert to percentage (multiply by 100) before computing deltas or comparing thresholds.

- Sessions drop >15% WoW → flag
- Bounce rate increase >5pp WoW → flag (compare in percentage points after conversion)
- Any traffic source drop >25% → flag
- Session duration drop >20% → flag

---

## Step 3: Generate Report

### Console Summary (under 50 lines)

```
## GA Report — ${PROJECT_DOMAIN} — {date range}

| Metric           | This Week | Last Week | Delta   |
|------------------|-----------|-----------|---------|
| Sessions         | 5,200     | 4,800     | +8.3%   |
| Users            | 3,100     | 2,900     | +6.9%   |
| New Users        | 2,400     | 2,200     | +9.1%   |
| Bounce Rate      | 52%       | 48%       | +4pp ⚠️ |
| Avg Duration     | 2m 15s    | 2m 30s    | -10%    |

### Traffic Sources
| Source    | Sessions | Share | Delta  |
|-----------|----------|-------|--------|
| Organic   | 2,100    | 40%   | +12%   |
| Direct    | 1,500    | 29%   | +5%    |
| Referral  | 800      | 15%   | -3%    |
| Social    | 500      | 10%   | +20%   |
| Paid      | 300      | 6%    | +8%    |

### Anomalies
⚠️ Bounce rate up 4pp — investigate landing page changes
```

### Confluence HTML

Full report with all breakdowns, daily trend table, landing page analysis, city data.

---

## Step 4: Deliver

1. **Publish to Confluence** (unless `--no-publish`):
   - Space: CONFLUENCE_SPACE, Parent: CONFLUENCE_PARENT
   - Title: `GA Report — {date range}`
   - Format: HTML storage format
2. **Anomalies** — if thresholds breached, note in report prominently and suggest investigation.

---

## Final: Report to User

Concise summary:
- Key metrics with deltas (sessions, users, bounce rate)
- Traffic source highlights
- Any anomalies flagged
- Link to Confluence report
- Recommended actions

