---
name: gsc-report
description: Google Search Console performance report — trends, non-branded keywords, page indexing status, clicks, impressions, CTR, and position across all properties.
argument-hint: "property name, 'all', or specific domain"
---

# GSC Report

Check: $ARGUMENTS

## Scope

Search Console analytics only. Uses `gsc_search_analytics` and `gsc_url_inspection` MCP tools.

## Steps

### 1. Resolve Target(s)

- If $ARGUMENTS names a property: read `.claude/properties/<name>.yaml` for the domain, map to `sc-domain:<domain>`
- If $ARGUMENTS is a domain: use directly as `sc-domain:<domain>` or `https://<domain>/`
- If $ARGUMENTS is "all": call `gsc_list_sites` and include all `siteOwner` / `siteFullUser` entries

Skip `siteUnverifiedUser` entries.

### 2. Define Date Ranges

Default comparison window: **last 28 days vs previous 28 days**.

Use `endDate: 3 days ago` (GSC data lags ~2 days).

```
current_start = today - 31 days
current_end   = today - 3 days
prev_start    = today - 59 days
prev_end      = today - 32 days
```

If user asks for a specific period ("last 7 days", "this month"), adjust accordingly.

### 3. Pull Search Analytics per Property

Per property, run these calls in parallel where possible:

**Call A — Current period totals:**
```
tool: gsc_search_analytics
siteUrl: <resolved siteUrl>
startDate: <current_start>
endDate: <current_end>
rowLimit: 1
```

**Call B — Previous period totals:**
```
tool: gsc_search_analytics
siteUrl: <resolved siteUrl>
startDate: <prev_start>
endDate: <prev_end>
rowLimit: 1
```

**Call C — Top queries (current period):**
```
tool: gsc_search_analytics
siteUrl: <resolved siteUrl>
startDate: <current_start>
endDate: <current_end>
dimensions: ["query"]
rowLimit: 50
```

**Call D — Top pages (current period):**
```
tool: gsc_search_analytics
siteUrl: <resolved siteUrl>
startDate: <current_start>
endDate: <current_end>
dimensions: ["page"]
rowLimit: 50
```

**Call E — Non-branded queries (current period):**
```
tool: gsc_search_analytics
siteUrl: <resolved siteUrl>
startDate: <current_start>
endDate: <current_end>
dimensions: ["query"]
dimensionFilter: "query notContains <brand-name>"
rowLimit: 25
```

Brand-name is the property's domain stripped of TLD (e.g. "example" for example.com). Also filter common variations if known.

### 4. Identify Opportunities

From the data, flag:

| Opportunity | Criteria | Action |
|-------------|----------|--------|
| Near page 1 | Position 8-20, >50 impressions | Refresh content or build backlinks |
| Low CTR | CTR < 1%, >100 impressions | Rewrite title/meta description |
| Trending up | Clicks ↑ 20%+ vs previous period | Double down — promote or expand |
| Trending down | Clicks ↓ 20%+ vs previous period | Audit for freshness, competition |
| Brand-only | >80% clicks from brand queries | Build non-branded content |

### 5. Indexing Check (Optional)

If user asks "what pages are not indexed" or flags a specific page:

```
tool: gsc_url_inspection
siteUrl: <resolved siteUrl>
inspectionUrl: <full page URL>
```

For bulk indexing checks, inspect top pages from Call D that show zero impressions. Note: URL Inspection is rate-limited — batch carefully, max 10 pages per property per session.

### 6. Present Report

```
## GSC Report — <Property> — <current_start> to <current_end>

### Summary
| Metric | Current | Previous | Change |
|--------|---------|----------|--------|
| Clicks | 1,240 | 980 | +26.5% ↑ |
| Impressions | 18,500 | 16,200 | +14.2% ↑ |
| CTR | 6.7% | 6.0% | +0.7pp ↑ |
| Avg Position | 14.2 | 15.8 | -1.6 ↑ |

### Top Non-Branded Queries
| Query | Clicks | Impressions | CTR | Position |
|-------|--------|-------------|-----|----------|
| ... | ... | ... | ... | ... |

### Top Pages
| Page | Clicks | Impressions | CTR | Position |
|------|--------|-------------|-----|----------|
| ... | ... | ... | ... | ... |

### Opportunities
- [Near page 1] /page-slug — pos 12.1, 420 imp, 3.1% CTR → refresh + build links
- [Low CTR] /page-slug — pos 6.2, 800 imp, 0.8% CTR → rewrite title/meta
- [Trending down] /page-slug — clicks down 35% vs prev period

### Indexing Status (if requested)
| Page | Indexed | Coverage State | Last Crawl |
|------|---------|----------------|------------|
| https://... | Yes | Indexed | 2026-04-28 |
| https://... | No | Excluded by 'noindex' tag | — |
```

### 7. Limitations Note

- GSC data lags ~2 days — endDate should always be 2-3 days ago
- URL Inspection is rate-limited; bulk checks require patience
- Indexing status reflects Google's view at crawl time, not real-time
- Position is average — a page may rank #3 for one user and #15 for another
