---
sharksapi_version: p-c1b362690b
name: weekly-seo-review
description: Weekly SEO and web traffic review — pull GA4 + GSC data, check previous task completion on the dashboard strategy card, create new weekly strategy with updated tasks. Replaces local file-based todo tracking with persistent dashboard state.
allowed-tools: [get_ga4, get_ga4_channels, get_ga4_events, get_ga4_new_vs_returning, get_search_console, get_gsc_top_queries, get_gsc_top_pages, get_gsc_brand_queries, get_bing_webmaster, get_strategy_status, update_strategy_task, update_dashboard, create_dashboard, analyze_pagespeed]
metadata:
  triggers: [weekly seo review, weekly report, iganädalane ülevaade, seo review, weekly audit, check seo progress, nädala ülevaade]
---

# Weekly SEO & Traffic Review

Recurring weekly task: pull analytics data, review previous strategy card progress, and create a new week's strategy card on the SharksAPI dashboard.

## Prerequisites

- SharksAPI agent with GA4 + GSC connected
- An existing dashboard with `public_token` (create one if none exists)
- Previous week's strategy card `widget_id` (if this isn't the first run)

## Step 1: Check Previous Strategy Progress

If this is a recurring review (not the first time), start by checking what was done:

```json
{"tool": "get_strategy_status", "arguments": {
  "token": "{dashboard_token}",
  "widget_id": "{previous_strategy_widget_id}"
}}
```

Review the response:
- `completed_count` / `total_count` — how many tasks were done?
- `tasks[].is_completed` — which specific tasks are done?
- `tasks[].completed_by` — human or AI?

**Carry forward** uncompleted tasks to this week's card (don't lose them).

## Step 2: Pull This Week's Data

Call these tools in parallel for the last 7 days:

**Traffic overview:**
```json
{"tool": "get_ga4", "arguments": {"start_date": "{7_days_ago}", "end_date": "{today}", "aggregate": true}}
```

**Channel breakdown:**
```json
{"tool": "get_ga4_channels", "arguments": {"start_date": "{7_days_ago}", "end_date": "{today}"}}
```

**Search performance:**
```json
{"tool": "get_search_console", "arguments": {"start_date": "{7_days_ago}", "end_date": "{today}", "aggregate": true}}
```

**Top queries + pages:**
```json
{"tool": "get_gsc_top_queries", "arguments": {"start_date": "{7_days_ago}", "end_date": "{today}", "limit": 20}}
{"tool": "get_gsc_top_pages", "arguments": {"start_date": "{7_days_ago}", "end_date": "{today}", "limit": 20}}
```

**Brand search share:**
```json
{"tool": "get_gsc_brand_queries", "arguments": {"start_date": "{7_days_ago}", "end_date": "{today}", "brand_keyword": "{brand_name}"}}
```

**Events / conversions:**
```json
{"tool": "get_ga4_events", "arguments": {"start_date": "{7_days_ago}", "end_date": "{today}", "limit": 15}}
```

**Bing (if connected):**
```json
{"tool": "get_bing_webmaster", "arguments": {"start_date": "{7_days_ago}", "end_date": "{today}"}}
```

## Step 3: Analyze and Compare

From the data, produce:

### Key Metrics Table

| Metric | This Week | Trend |
|--------|-----------|-------|
| Sessions | {N} | +/-% vs last period |
| Users | {N} | |
| Pageviews | {N} | |
| Bounce Rate | {N}% | |
| Avg Session Duration | {N}s | |
| GSC Clicks | {N} | |
| GSC Impressions | {N} | |
| GSC CTR | {N}% | |
| GSC Avg Position | {N} | |
| Brand Click Share | {N}% | |

### Observations

- Which channels grew or declined?
- Any new queries entering top 20?
- Any pages losing clicks significantly?
- Conversion events trending up or down?

## Step 4: SEO Indexing Rule

**IMPORTANT**: Do NOT recommend new SEO content changes to pages that were modified less than 2-4 weeks ago. Google needs time to re-crawl and re-index.

Check: are previous changes reflected in GSC data yet?
- If a page was modified 1 week ago and GSC shows no improvement → **wait, don't change again**
- If a page was modified 4+ weeks ago and still no improvement → it's safe to try a different approach

## Step 5: Create This Week's Strategy Card

Build a new strategy card with:
- Summary of this week's data in the `content` (markdown)
- Status of last week's tasks (carried forward if incomplete)
- New tasks based on fresh data analysis
- Max 10 tasks, prioritized by impact

**Set dashboard password:** Ask the user for a dashboard password (required — `create_dashboard` rejects requests without one). Pass it via the `password` field.

```json
{"tool": "update_dashboard", "arguments": {
  "token": "{dashboard_token}",
  "add_widgets": [{
    "type": "strategy_card",
    "title": "SEO Review — Week {N} ({date_range})",
    "position": 0,
    "grid_cols": 12,
    "content": "## Weekly SEO Summary\n\n| Metric | Value | Trend |\n|---|---|---|\n| Sessions | {N} | {trend} |\n| GSC Clicks | {N} | {trend} |\n| Brand Share | {N}% | {trend} |\n\n### From Last Week\n- Completed: {N}/{total} tasks\n- Carried forward: {list of incomplete tasks}\n\n### Key Observations\n- {observation 1}\n- {observation 2}",
    "source": {
      "mode": "human_controlled",
      "tasks": [
        {"title": "[Carried from last week] {incomplete task 1}"},
        {"title": "[Carried from last week] {incomplete task 2}"},
        {"title": "[New] {task based on this week's data}", "description": "{why and what to do}"},
        {"title": "[New] {task}", "description": "{details}"}
      ]
    }
  }]
}}
```

## Step 6: Report to User

Provide a concise summary:

```
Weekly SEO Review — Week {N}

Key numbers:
  Sessions: {N} ({trend})
  GSC Clicks: {N} ({trend})
  Brand Share: {N}%

Last week's progress: {completed}/{total} tasks done
Carried forward: {N} incomplete tasks
New tasks: {N} based on this week's data

Dashboard updated: {public_url}
Strategy card: "{title}" with {total} tasks
```

## Recurring Schedule

This skill is designed to run weekly. When setting up as a recurring task:

- **Frequency**: Once per week (Monday or Friday recommended)
- **State**: All state lives on the dashboard strategy card — no local files needed
- **History**: Previous weeks' strategy cards remain on the dashboard as a timeline
- **Max cards**: Dashboard supports up to 5 strategy cards. Archive old ones by converting to `text_markdown` (keeps the summary but removes interactive tasks) after 4 weeks.

## Archiving Old Strategy Cards

When you have 4+ strategy cards and need to add a new one:

1. Find the oldest strategy card via `get_dashboard`
2. Get its final status via `get_strategy_status`
3. Convert it to `text_markdown` via `update_widgets`:
```json
{"tool": "update_dashboard", "arguments": {
  "token": "...",
  "update_widgets": [{
    "position": {old_card_position},
    "content": "## Week {N} — Archived\n\nCompleted: {X}/{Y} tasks\n\n### Done\n- {task 1}\n- {task 2}\n\n### Not completed\n- {task 3}"
  }]
}}
```
4. Now add the new week's strategy card
