← Course page SEO Automation
0/10 modules

SEO as an agent task

Why SEO is a strong fit for agent automation

Scale versus judgment

SEO splits into two different kinds of work: mechanical operations on data (rank tracking, link audits, report generation) and strategic judgment (priorities, brand voice, risk). The first kind fits agents β€” it is structured, repeatable, and scalable. The second needs business context and human expertise.

The numbers are blunt: an agent checks 10,000 URLs in a few minutes, while an experienced SEO specialist would spend days on the same pass. Mechanical check quality is not lower β€” the agent does not tire, skip spreadsheet rows, or mistype when copying data.

An agent does not replace SEO expertise. It amplifies it: it absorbs the routine volume so the specialist can spend time where understanding matters β€” strategy, brand, anomaly interpretation, incident response. That is the operating principle: the agent is a tool, not a substitute for the expert.

Three zones of automability

Not every SEO task automates equally. Split them into three zones:

Full automation

The agent runs the task end to end with no human in the loop.

  • Rank tracking (position monitoring)
  • Keyword data fetch (keyword metric pulls)
  • Broken link checks
  • Performance monitoring (speed / Core Web Vitals)
  • Sitemap generation
  • Automated reporting

Augmentation (agent + human)

The agent does the volume; a human makes the decisions.

  • Writing content (LLM drafts β†’ editor reviews)
  • Link prospecting (agent finds candidates, human chooses)
  • Technical audit (agent finds issues, human prioritizes)

Stays with the human

  • SEO strategy β€” needs business goals, market, competitive position
  • Brand voice β€” tone and style are set by the brand team
  • Incident response β€” a sharp traffic drop needs contextual judgment
  • E-E-A-T signals β€” authority and expertise need qualitative analysis

The chart below shows automation ROI for eight representative SEO tasks on a 0–10 scale:

Color coding: ▮ Green β€” high ROI, full automation;  ▮ Yellow β€” medium ROI, augmentation (agent + human);  ▮ Red β€” low ROI, the task stays with the human.

Types of SEO agents

Agent systems in SEO split into a few functional types β€” each owns a class of tasks:

  • Data-collector β€” pulls data from APIs (Search Console, Ahrefs, Semrush, PageSpeed Insights), parses the SERP, aggregates metrics into tables. The basic building block of most SEO systems.
  • Auditor β€” crawls the site, finds technical issues (404s, duplicates, missing meta, slow pages), builds a prioritized findings list for the SEO specialist.
  • Content-generator β€” uses an LLM to draft copy, optimize title/description, and generate a keyword set. It works in tandem with an editor.
  • Monitor β€” watches changes in near real time: rank drops, new competitors, algorithm shifts. Sends alerts on anomalies.
  • Orchestrator β€” coordinates the other agents, manages the task queue, and rolls results into one report. The most complex type β€” it needs reliable planning and error handling.
In real systems one agent can hold several roles. A monitoring agent often includes a data-collector as a submodule.

Check yourself

Which task is the strongest fit for full agent automation?
A) Building a year-long SEO strategy
B) Tracking positions for 10,000 keywords
C) Creating the brand content style
D) Scoring competitor E-E-A-T signals
The agent scales the SEO specialist on volume and speed β€” strategic decisions stay with the human.

The agent stack for SEO

Four layers: from data sources to a finished output

Stack architecture

Any SEO agent has four layers. Each layer owns a job β€” the boundaries matter when you pick tools.

1. Data Sources

  • Google Search Console API β€” positions, CTR, clicks, impressions per query and page. The only official Google source for that data.
  • SERP APIs (SerpAPI, DataForSEO, Bright Data) β€” live Google SERP: top 10, featured snippets, PAA.
  • Ahrefs / Semrush API β€” backlinks, keyword difficulty, competitor organic traffic.
  • Web crawlers β€” requests + BeautifulSoup for static sites, Scrapy for scale, Playwright for JS sites (browser rendering).

2. Processing

  • HTML parsing β€” extract title, h1, meta description, canonical, structured data.
  • Data normalization β€” canonicalize URLs, clean text, strip HTML tags.
  • Deduplication β€” find duplicate pages and keywords.
  • Storage β€” SQLite for prototypes, PostgreSQL for production load.

3. Agent Logic

  • LLM β€” Claude API, GPT-4o, Ollama (local). The agent brain: analyzes, reasons, writes recommendations.
  • Prompt engineering β€” a system prompt with site context, role, and output format.
  • Tool use / function calling β€” the agent calls GSC API, SERP API, or the crawler when it needs them.
  • Memory β€” persist prior state (old positions, change history) so you can compare movement.

4. Output

  • Reports β€” Markdown or JSON with concrete recommendations and priorities.
  • Tracker tickets β€” auto-create issues in Jira or Linear.
  • CMS API β€” publish optimized content straight into WordPress, Strapi, Contentful.
  • Alerts β€” WhatsApp, Telegram, or email when ranks drop sharply.

A minimal Python agent

Here is the skeleton of a simple SEO agent. In a real project each function grows; the structure stays the same:

import anthropic
import sqlite3
from datetime import datetime

# --- 1. Data Sources ---
def fetch_gsc_data(site_url: str, days: int = 28) -> list[dict]:
    """
    Returns top pages from the Google Search Console API.
    Requires: google-auth, google-api-python-client
    Scope: googleapis.com/auth/webmasters.readonly
    """
    # ... initialize credentials ...
    # ... call searchanalytics.query(...) ...
    return [
        {"page": "/blog/seo-guide", "clicks": 320, "position": 4.2},
        # ...
    ]

def fetch_serp(keyword: str) -> dict:
    """
    Live SERP via SerpAPI / DataForSEO.
    """
    # import serpapi; top-10 results
    return {"organic_results": [...]}

# --- 2. Processing ---
def normalize_pages(raw_data: list[dict]) -> list[dict]:
    """Deduplicate URLs, normalize positions."""
    seen = set()
    result = []
    for row in raw_data:
        url = row["page"].rstrip("/")
        if url not in seen:
            seen.add(url)
            result.append({**row, "page": url})
    return result

def save_to_db(conn: sqlite3.Connection, rows: list[dict]) -> None:
    conn.execute("""
        CREATE TABLE IF NOT EXISTS pages
        (page TEXT, clicks INT, position REAL, date TEXT)
    """)
    for row in rows:
        conn.execute(
            "INSERT INTO pages VALUES (?,?,?,?)",
            (row["page"], row["clicks"], row["position"],
             datetime.today().isoformat())
        )
    conn.commit()

# --- 3. Agent Logic ---
client = anthropic.Anthropic()

def analyze_pages(pages: list[dict]) -> str:
    """LLM analyzes the data and writes recommendations."""
    data_str = "\n".join(
        f"- {p['page']}: position {p['position']:.1f}, clicks {p['clicks']}"
        for p in pages[:20]  # top 20
    )
    message = client.messages.create(
        model="claude-sonnet-4-6"  # current ID: check docs.anthropic.com,
        max_tokens=1024,
        system=(
            "You are an SEO analyst. Analyze page positions, "
            "find growth opportunities, give concrete priorities."
        ),
        messages=[{
            "role": "user",
            "content": f"GSC data for 28 days:\n{data_str}\n\n"
                       "Return the top 5 recommendations in Markdown."
        }]
    )
    return message.content[0].text

# --- 4. Output ---
def save_report(text: str, path: str = "report.md") -> None:
    with open(path, "w", encoding="utf-8") as f:
        f.write(f"# SEO report {datetime.today().date()}\n\n{text}")
    print(f"Report saved: {path}")

# --- Main ---
if __name__ == "__main__":
    conn = sqlite3.connect("seo.db")
    raw = fetch_gsc_data("example.com")
    pages = normalize_pages(raw)
    save_to_db(conn, pages)
    report = analyze_pages(pages)
    save_report(report)
Tip: Start with this skeleton. Swap fetch_gsc_data for a real API call, add logging β€” you already have a working agent. Add complexity later.

Choosing tools

SERP API: price and capability

SerpAPI

  • Free tier: 100 queries/month β€” prototype only
  • Paid plan: from $50/month for 5,000 queries
  • Simple API, solid documentation
  • Supports Google, Bing, YouTube, Maps

DataForSEO

  • Pay-as-you-go: from $0.0006 per query
  • Broad coverage: 50+ search engines
  • Bulk API for high volume
  • Fits production with unpredictable traffic

Bright Data

  • Specialty: hard JS sites, anti-bot bypass
  • Higher price, more reliable at scale
  • Fits agents that work with dynamic content
Important: Any SERP API free tier (usually 100 queries/month) is only for a proof of concept. A production agent handling thousands of keywords needs a paid plan.

LLM: picking a model for an SEO agent

Claude Sonnet β€” the default pick
A strong quality/price balance for SEO work. $3/1M input tokens, $15/1M output. It handles SEO context well and writes structured recommendations.
GPT-4o β€” OpenAI alternative
Comparable quality to Claude Sonnet. $2.50/1M input, $10/1M output. A solid choice if the stack is already OpenAI.
Ollama β€” local run (no API fee)
No API fee, data stays on the server β€” useful with private client data. Tradeoff: slower, needs a GPU, quality trails cloud models.

Agent stack cost calculator

At 10,000 queries/month the full stack is about $30/month β€” less than one hour of specialist time. Run your scenario:

Takeaway: SERP API dominates cost. LLM is usually cheaper if tokens per request stay reasonable. Tighten prompts (fewer tokens) and cache SERP results (fewer queries) β€” cost often drops 2–3Γ—.

Check yourself

The agent needs the site's Google ranking data. Which is the official Google API for that?
A) Google Analytics API
B) Google Search Console API
C) Google PageSpeed Insights API
D) Google Tag Manager API
Module takeaway: Minimum stack: GSC API + one SERP API + Claude API = ~$30/month. That is enough for a first working agent that analyzes positions, finds growth opportunities, and writes concrete recommendations β€” automatically, without a human in the loop.

Technical site audit

Audit agent: find, prioritize, report

Technical SEO checklist

The audit agent checks each of these items as it crawls the site:

  • robots.txt and sitemap.xml β€” files reachable, syntax valid, sitemap registered in GSC
  • Index status β€” no unwanted noindex; canonical points at the right URLs
  • Broken links (4xx / 5xx) β€” every internal link returns 2xx
  • Duplicate content β€” identical or near-identical pages without canonical cause cannibalization
  • Core Web Vitals β€” LCP ≀ 2.5s, CLS ≀ 0.1, INP ≀ 200ms (direct Google ranking factors)
  • HTTPS and mixed content β€” all content loads over HTTPS, no HTTP assets on an HTTPS page
  • Mobile layout β€” viewport meta present, content is not clipped on screens < 375 px
  • Structured Data / Schema.org β€” markup is valid and covers the key entity types
  • Image alt text β€” every meaningful image has a descriptive alt
  • Meta tags β€” title 50–60 characters, description 120–158 characters, unique on every page
  • Click depth β€” important pages are reachable in no more than 3 clicks from the homepage
  • Orphan pages β€” no indexable page lacks inbound internal links

Audit agent architecture

crawl(url)
  β†’ fetch_page(url)          # download HTML, status, headers
  β†’ check_all(page): [findings]  # run all 12+ checks
  β†’ prioritize(findings):    # priority = severity Γ— traffic_impact
  β†’ generate_report(findings)    # JSON / Markdown / HTML report
  β†’ notify(report)           # Slack / email / Jira ticket

Crawler tools

requests + BeautifulSoup

Baseline crawler for static HTML. Fast, no browser dependency.

Playwright

JS rendering for SPA and React sites. Sees what a real browser sees.

Screaming Frog API

Industrial crawler for large sites when a license is available.

Prioritizing findings

A raw list of hundreds of findings is useless. The audit agent applies:

priority = severity × traffic_impact
  • Severity (1–5): 5 = a direct Google ranking factor, 1 = cosmetic fix
  • Traffic Impact (1–5): 5 = site-wide, 1 = a single page
  • Final range: 1–25

Priority examples

Finding Severity Traffic Impact Priority
LCP > 4s (Core Web Vitals fail) 5 5 25
Mixed content (HTTP on HTTPS) 4 5 20
Duplicate pages without canonical 4 4 16
Broken links (4xx) 3 3 9
Missing H1 3 3 9
Image alt text 2 2 4
Severity scale (1–5):
  • 5 β€” direct Google ranking factor (Core Web Vitals, noindex, robots.txt block)
  • 4 β€” meaningful technical signal (duplicate content, HTTPS/mixed content)
  • 3 β€” moderate impact (broken links, missing H1, meta description)
  • 2 β€” cosmetic with tiny SEO impact (alt text, minor schema errors)
  • 1 β€” no ranking impact (style mismatches, extra tags)
Traffic Impact similarly: 5 = whole site, 4 = section/category, 3 = several pages, 2 = one page, 1 = decorative element.

Finding priority calculator

Finding priority calculator
Priority Score: β€”

Check yourself

A page takes 6 seconds to load (LCP = 6s). It has 2 broken links and no H1. What does the agent put at highest priority?
A) Add an H1
B) Fix broken links
C) Speed up the page
D) Add Structured Data
The audit agent does not just find issues β€” it ranks them with severity × impact so the team works the highest-leverage items.

Keyword Intelligence

Clustering, intent mapping, and gap opportunities

Keyword classification

Before the agent works the keyword set, it needs a keyword taxonomy β€” one classification by length and by intent. Without it clustering is noise: the agent does not know which pages to assign the terms to.

By query length

Head keywords

1–2 words. High volume (>10,000 / month), difficulty KD > 70. Heavy competition β€” unrealistic as a primary target for a new site.

python, SEO, buy phone

Body keywords

3–4 words. Mid volume and difficulty. A workable balance, still competitive in most niches.

buy iPhone 15, SEO course

Long-tail keywords β€” the sweet spot for a new site

5+ words. Volume < 500 / month, KD < 30. Each query is small, but thousands of them add up past one head term β€” and they are far easier to rank for.

how to choose an SEO agency for an ecommerce store in 2025

By intent (Search Intent)

Search intent is the goal behind the query. An agent that mislabels intent assigns the keyword to the wrong page type, and the content never reaches the top β€” even if the technical quality is high.

Informational

The user wants to learn.

"how SEO works"
"what is PageRank"

β†’ articles, guides, FAQ

Navigational

The user is looking for a specific site.

"ahrefs login"
"google search console"

β†’ brand pages

Commercial

The user is comparing options.

"best SEO tool"
"ahrefs vs semrush"

β†’ reviews, comparison tables

Transactional

The user is ready to buy.

"buy semrush"
"ahrefs subscription pricing"

β†’ product pages, PLP

Semantic clustering

The agent collects thousands of keywords; without grouping they are noise. Clustering turns a flat list into a map of future site structure: each cluster is one page (or section).

Classic N-gram overlap

Groups keys that share the same words. Fast, no ML, runs on any hardware.

Downside: no synonyms. "notebook" and "laptop" land in different clusters.

Embeddings + k-means

sentence-transformers turns each query into a vector β†’ cosine similarity β†’ k-means clustering by semantic proximity.

Upside: catches synonyms and paraphrases. Downside: needs a GPU / cloud API.

Agent output after clustering β€” a cluster map with a site-structure proposal: 'Cluster "buy iPhone" (42 keywords, avg KD 35) β†’ create /shop/iphone/ with 1 category page and 4 product pages'.

Keyword Gap Analysis

Gap analysis finds keywords where a competitor already ranks and you do not. Demand is proven, relevance is proven by the competitor; the job is to ship a stronger page.

Agent algorithm

  1. Fetch the competitor's domain keywords via Ahrefs / Semrush API
  2. Fetch your domain keywords
  3. Set difference: competitor_kw - your_kw β†’ gap keyword list
  4. Sort by the priority formula: Volume / (KD + 1)
  5. Filter by matching intent β€” pick the right page types
  6. Output top-N into a report with content recommendations

The gap-analysis sweet spot β€” keywords with high volume + low KD + matching intent for pages you already have or can create cheaply. The agent can flag this quadrant automatically.

Example Python pseudocode:

# gap_analysis.py β€” agent gap-analysis pseudocode

import requests

AHREFS_TOKEN = "..."

def fetch_domain_keywords(domain: str) -> set[str]:
    """Return the domain keyword set via Ahrefs API."""
    # GET api.ahrefs.com/v3/site-explorer/organic-keywords
    resp = requests.get(
        AHREFS_TOKEN,  # endpoint lives in config
        params={"target": domain, "limit": 10000},
        headers={"Authorization": f"Bearer {AHREFS_TOKEN}"}
    )
    resp.raise_for_status()
    return {row["keyword"] for row in resp.json()["keywords"]}

def fetch_kw_metrics(keywords: list[str]) -> dict:
    """Fetch Volume and KD for a keyword list."""
    # POST api.ahrefs.com/v3/keywords-explorer/overview
    resp = requests.post(
        AHREFS_TOKEN,  # endpoint lives in config
        json={"keywords": keywords},
        headers={"Authorization": f"Bearer {AHREFS_TOKEN}"}
    )
    resp.raise_for_status()
    return {r["keyword"]: r for r in resp.json()["keywords"]}

def gap_analysis(your_domain: str, competitor_domain: str, top_n: int = 50):
    your_kws     = fetch_domain_keywords(your_domain)
    competitor_kws = fetch_domain_keywords(competitor_domain)

    gap_kws = list(competitor_kws - your_kws)          # set difference
    metrics  = fetch_kw_metrics(gap_kws)

    # Sort: high volume, low difficulty first
    ranked = sorted(
        gap_kws,
        key=lambda kw: metrics.get(kw, {}).get("volume", 0)
                       / (metrics.get(kw, {}).get("kd", 100) + 1),
        reverse=True
    )

    return [
        {
            "keyword": kw,
            "volume":  metrics[kw]["volume"],
            "kd":      metrics[kw]["kd"],
            "intent":  metrics[kw].get("intent", "unknown"),
            "score":   metrics[kw]["volume"] / (metrics[kw]["kd"] + 1),
        }
        for kw in ranked[:top_n]
        if kw in metrics
    ]

if __name__ == "__main__":
    results = gap_analysis("yoursite.com", "competitor.com", top_n=50)
    for r in results:
        print(f"{r['score']:6.1f}  Vol={r['volume']:5d}  KD={r['kd']:2d}  "
              f"[{r['intent'][:4]}]  {r['keyword']}")

Keyword map

A Volume vs Difficulty scatter is the main visual for prioritization. Each point is a keyword; dashed lines split the space into quadrants.

Sweet spot β€” lower-right quadrant (right of the dashed vertical, below the horizontal): high volume + low difficulty. Green points are gap opportunities: a competitor already ranks, KD is modest, and the agent recommends pages for these keywords first.

Check yourself

Queries "buy iPhone 15 Pro Max", "iPhone 15 Pro Max price", "where to buy iPhone 15 Pro Max cheaper" β€” what is their search intent?

  • A) Informational
  • B) Navigational
  • C) Transactional / commercial
  • D) Educational
The agent turns thousands of keywords into an actionable map: which intent β†’ which page, and where competitors leave a gap.

The content agent

From a keyword to a finished SEO article in one pipeline

A 6-stage pipeline

The content agent does not write an article in one call β€” it runs six sequential stages, each narrowing context and raising output quality.

1 Keyword Input

Target keyword, a cluster of related queries, and search intent β€” informational, transactional, or navigational.

2 Brief Generation

The agent writes a brief: topic, audience, H1/H2/H3 structure, tone, top-10 competitor analysis.

3 Outline

The agent generates a full outline and the key points of each section from the brief.

4 Draft

The agent writes the full article, following the approved outline. Each section is a separate call or one large prompt.

5 SEO Check

The agent checks: keyword in H1 and meta title, density 1–2%, title length 50–60 chars, meta description 120–158 chars.

6 Review Gate

A human checks facts, brand-voice fit, and publishes. The only mandatory manual step.

System prompt: what goes in

Content-agent quality is mostly the system prompt. Required pieces:

  • Target keyword and LSI terms β€” as an explicit list so the agent knows which variants to use naturally.
  • Search intent β€” what the user wants: learn (informational), buy (transactional), or find a site (navigational).
  • Required structure β€” H1 with the keyword, 4–5 H2s, a required close/CTA.
  • Hard limits β€” do NOT invent statistics without sources, do NOT use the keyword above 2% of the text.
  • Target length β€” 1,000–1,500 words for informational, 500–800 for transactional.

System prompt template (pseudocode):

You are an SEO copywriter. Write the article strictly to spec.

TARGET QUERY: {target_keyword}
LSI TERMS: {lsi_list}
INTENT: {intent_type}  # informational | transactional

STRUCTURE:
  H1: must contain {target_keyword}
  H2 x 4-5: {h2_list}
  Close: short summary + call to action

CONSTRAINTS:
  - Do NOT invent statistics without a source
  - Keyword density: 1-2% of the text
  - Length: {min_words}-{max_words} words

META:
  title: 50-60 characters, contains {target_keyword}
  description: 120-158 characters, reason to click

AUDIENCE: {audience_description}
TONE: {tone}  # formal | conversational | expert

When the agent, when the editor

The agent can handle it

  • Low-competition long-tail content
  • Programmatic SEO β€” thousands of similar pages (cities, products, categories)
  • Technical descriptions with a clear structure
  • FAQ pages and glossaries

An editor is required

  • YMYL content (health, finance, legal)
  • E-E-A-T pieces that need first-hand author experience
  • Expert articles with fresh data
  • Brand voice with a distinctive tone
Forbidden practices: keyword stuffing (Google Panda demotes the site), AI spam with no reader value, factual hallucinations without verification.

Content pipeline cost

Calculate the real cost of producing content at your scale.

Key insight: at the defaults (100 articles/month) the LLM costs $0.39/month and the editor $750/month. The LLM is ~1,900Γ— cheaper. The main cost is human review time, not tokens.

Check yourself

What must you not put in a content-agent system prompt for an SEO article about smartphones?

A) The target keyword and semantic variants
B) The required document structure (H1 / H2 / close)
C) A 5-year table of S&P 500 quotes
D) Target user intent (informational / transactional)
At 100 articles/month the LLM costs $0.39 β€” the rest is editorial labor. Automation changes production speed, not the cost of the words themselves.

SERP monitoring and link profile

The agent watches ranks and backlinks β€” and raises the alarm first

SERP monitoring

Search positions move every day. Tracking them by hand means you always learn late. A monitor agent makes this systematic.

What to track

Keyword positions

Organic rank is the baseline signal. Track it daily on priority keywords.

CTR from GSC

Google Search Console gives real clicks and impressions. Rank is stable but CTR falls? The title or snippet needs work.

SERP features

Featured Snippet, People Also Ask, Local Pack β€” they sit above organic. Losing a snippet drops CTR even at the same rank.

Moving-average rule. Do not react to every rank twitch. Watch a 3–7 day moving average. Daily noise is normal; a sustained trend is a signal.

Anomaly thresholds

  • Traffic drop > 20% in a day β€” diagnose immediately: algo update or a technical issue
  • Rank drop > 10 places in a day on one keyword β€” check competitors and fresh content on the page
  • Drop on all keywords at once β€” likely robots.txt / noindex or a Google algo update

Market-wide volatility is tracked by MozCast and SERPoscope β€” if those indexes spike, it is not just your site in the storm.

Monitor agent: pseudocode

# Rank-monitor agent (cron: every 24h)

def serp_monitor_agent(keywords: list, threshold_drop: int = 5):
    state = load_state("serp_positions.json")   # previous positions
    alerts = []

    for keyword in keywords:
        current_pos = fetch_position(keyword)   # GSC API / DataForSEO
        prev_pos    = state.get(keyword, current_pos)

        drop = current_pos - prev_pos           # positive = worse

        if drop > threshold_drop:
            alerts.append({
                "keyword":  keyword,
                "prev":     prev_pos,
                "current":  current_pos,
                "drop":     drop,
                "severity": "HIGH" if drop > 15 else "MEDIUM"
            })

        state[keyword] = current_pos            # update state

    save_state("serp_positions.json", state)

    if alerts:
        # Extra context: check MozCast
        volatility = fetch_mozcast_score()
        context = "algo-update likely" if volatility > 80 else "site-specific issue"

        send_alert(alerts, context=context)

    return alerts

Rank movement over 30 days

On the chart below: the lower the line, the better the rank (position 1 beats position 25).

What the chart shows: "Head keyword" fell from ~3 to ~22 on days 10–15 β€” a likely algo update. Then it recovered. "Rising keyword" moves steadily from 25 to 2 β€” the result of consistent SEO work. Dashed line = Top-10 boundary.

Link profile

Backlinks have been a core Google ranking factor since PageRank. Links pass "authority" (link equity) from one domain to another.

Link quality metrics

DR
Domain Rating (Ahrefs)
0–100, logarithmic
DA
Domain Authority (Moz)
0–100, logarithmic
TF
Trust Flow (Majestic)
quality of the link path
RD
Referring Domains
unique referring domains

Toxic links and risk

Google Penguin / Manual Action. Mass links from spam directories, paid link schemes, and PBNs (Private Blog Networks) can draw a Google manual action or a Penguin hit. Result: a rank collapse that content will not fix.

Toxic-link tells:

  • Domains with DR < 5 and irrelevant topics
  • The same anchor text on hundreds of links (over-optimized anchors)
  • Links from forum signatures, comments, low-quality directories
  • A sudden burst of hundreds of links in a short window

Link Gap Analysis

Link gap β€” domains that link to competitors but not to you. A ready prospect list.

Link-profile analyst agent logic
# Agent: link-profile analysis + link gap

def link_profile_agent(my_domain: str, competitors: list):

    # 1. Fetch backlinks via API (Ahrefs / Semrush)
    my_backlinks  = fetch_backlinks(my_domain)
    comp_backlinks = {c: fetch_backlinks(c) for c in competitors}

    # 2. Score referring domains
    scored = []
    for link in my_backlinks:
        score = compute_link_score(
            dr=link["domain_rating"],
            tf=link["trust_flow"],
            relevance=link["topical_relevance"]   # 0..1
        )
        scored.append({**link, "score": score})

    # 3. Filter toxic (score < 0.2)
    toxic    = [l for l in scored if l["score"] < 0.2]
    healthy  = [l for l in scored if l["score"] >= 0.2]

    if toxic:
        build_disavow_file(toxic)   # -> disavow.txt for Google

    # 4. Link gap: competitor domains you do not have
    my_domains   = {l["domain"] for l in healthy}
    gap_domains  = set()
    for comp, links in comp_backlinks.items():
        for link in links:
            if link["domain"] not in my_domains:
                gap_domains.add(link["domain"])

    # 5. Prioritize prospects by DR
    prospects = sorted(gap_domains,
                       key=lambda d: get_dr(d), reverse=True)[:50]

    return {
        "healthy_links": len(healthy),
        "toxic_links":   len(toxic),
        "prospects":     prospects
    }
  
Multi-source principle. One signal is not truth. A traffic drop in GA4 or Plausible must be checked against GSC, the MozCast index, and the link-profile state. Only the combination yields a reliable diagnosis.

Check yourself

The site lost 45% of organic traffic in one day, and ranks fell on all keywords at once. What do you check first?
A) The count of toxic backlinks
B) A Google algorithm update and site indexing
C) Competitor activity
D) Social media mentions
The monitor agent spots anomalies in seconds β€” the team learns about an algo update the same day, not a week later. The link agent continuously cleans a toxic profile and builds a prospect list to grow domain authority.

Orchestrating SEO pipelines

How to assemble every worker into one system with reliable triggers

Orchestrator-worker pattern

In an agent SEO system the orchestrator is the central coordinator. It does not do the work itself: it takes a task, splits it, hands pieces to workers, and collects results. Workers are specialized agents; each owns a domain.

AuditorWorker
Technical page audit, finding issues, prioritization
KeywordWorker
Collect and cluster keywords, gap analysis
ContentWorker
Generate briefs, outline, draft, SEO check
MonitorWorker
SERP + backlink monitoring, alerts, anomalies

Running workers in parallel cuts wall-clock time: while KeywordWorker pulls data, AuditorWorker crawls the site.

class SEOOrchestrator:
    def route_task(self, task_type, complexity):
        """Pick a model by task type (wired to M10)."""
        if complexity == 'high' or task_type in ('strategy', 'eeat', 'competitive'):
            return 'claude-opus-4'       # frontier β€” deep analysis
        elif task_type in ('content', 'audit', 'monitor'):
            return 'claude-sonnet-4-6'   # workhorse β€” content and audit
        else:
            return 'claude-haiku-4-5'    # bulk β€” high-volume processing

    async def run(self, task: SEOTask):
        # Decompose the task
        subtasks = self.decompose(task)

        # Run workers in parallel
        results = await asyncio.gather(
            self.auditor.run(subtasks.audit),
            self.keyword.run(subtasks.keywords),
            self.monitor.run(subtasks.serp),
        )

        # Aggregate and decide
        plan = self.aggregate(results)

        # HITL check before irreversible actions
        if plan.requires_human_approval:
            await self.request_approval(plan)
        else:
            await self.execute(plan)

Trigger types

The pipeline starts three ways β€” each fits a different scenario:

Cron / Schedule
  • Daily SERP monitoring (06:00)
  • Weekly audit (Monday)
  • Monthly rollup report
0 6 * * * serp_monitor.py
Event-driven
  • New page published β†’ keyword + audit check
  • Ranks dropped 20% β†’ alert + causal analysis
  • Competitor hit top 3 β†’ revisit the content
Manual
  • On a manager request β€” one-off audit
  • Urgent competitor analysis
  • Check before launching a Google Ads campaign

Interactive pipeline

Click any block to see its role in the system.

Trigger
β†’
Orchestrator
β†’
AuditorWorker
KeywordWorker
ContentWorker
MonitorWorker
β†’
⚠ HITL
β†’
Output
Click a block to see its role in the pipeline.

Human-in-the-loop: when it is mandatory

Automation does not mean no humans. HITL is mandatory when an action is irreversible, reputationally risky, or can take the site down.

Never auto-publish content or change robots.txt without confirmation. A robots.txt mistake can hide the site from indexing in minutes.
Publishing content
An irreversible public action. Content can break brand voice or contain factual errors.
Outreach to link donors
Reputational risk. A bad email cannot be unsent; it stays in the partner inbox.
robots.txt / redirects
One typo can block the whole site from indexing or break a redirect chain.
Low agent confidence
If the agent is unsure (confidence < threshold), ask a human rather than guess wrong.
Rule of thumb: if the action is hard to undo or has external consequences β€” add a HITL step. Everything else is a candidate for automation.

Error handling and state

Fault tolerance

Retry + exponential backoff
delay = base * (2 ** attempt)
# 1s β†’ 2s β†’ 4s β†’ 8s
# for API 429 / 503
Dead letter queue
Tasks that exhausted retries go to a dead-letter queue for human review; they are not dropped.
Graceful degradation
SERP API is down β†’ skip the iteration, log it, keep going. The system does not die because one component failed.

What to persist between runs (State)

The pipeline must remember previous runs β€” otherwise anomalies and trends are invisible.

What to store Format Why
Keyword positions SQLite / JSON Trends, anomalies, drop alerts
List of indexed URLs SQLite Incremental crawl, deduplication
Audit results JSON Before/after comparison, progress tracking
Task status / DLQ SQLite Retry logic, manual error review

Check yourself

In which case must the SEO pipeline always ask a human to confirm?
A) Daily rank pulls from the GSC API
B) Auto-publishing an article to the site
C) Generating a keyword report into an internal file
D) Clustering keywords
The orchestrator conducts the system: it does not know crawl or generation details, but it knows whom to delegate to and when to call a human.

Evaluation and iteration

KPIs, anti-patterns, and the path from this course to a first working agent

KPIs for SEO agents

Metrics sit on two levels: operational (the system works correctly) and business (the system produces value).

Operational KPIs

KPI Formula Target Source
Coverage % of pages audited β‰₯ 95% Crawler
Error Rate # errors / # runs < 2% Logs
Latency Workflow time < 30 min Orchestrator
Cost/Action $ / unit of work Trend down API billing

Business KPIs

KPI Formula Target
Organic Traffic Growth % growth MoM β‰₯ 5% MoM
Avg Position Improvement Δ avg_pos Trend down
Content Conversion Rate Conversions / SEO visits β‰₯ 2%
Indexed Pages Growth # indexed pages Trend up

Content A/B tests

What to test: meta title, H1, opening paragraph, CTA.

Process:

  1. The agent generates variant B (alternate title / H1).
  2. Publish side by side or on a schedule β€” two URLs or rotation.
  3. Wait 2–4 weeks while GSC collects CTR for each variant.
  4. The agent monitors CTR β†’ detects a winner (ΔCTR > threshold) β†’ recommends (or auto-applies) the stronger variant.
The agent automates the whole loop: generate title variants β†’ monitor CTR β†’ winner detection. A/B becomes a continuous self-improving loop without manual labor.

Anti-patterns β€” what kills the system

The most dangerous: missing HITL. An agent that changes robots.txt or canonical tags on its own can drop the site from the index in hours. Any irreversible indexing action goes through Human-in-the-Loop.
  • Hallucinated facts β€” the agent invents statistics and quotes. Google E-E-A-T penalizes sites with untrustworthy content β†’ loss of trust and ranks.
  • Keyword stuffing β€” packing the page with keywords. Google Panda filter β†’ the whole site drops in the SERP.
  • Duplicate content β€” the agent generates similar articles without a uniqueness check. Cannibalization β€” both URLs lose rank; Google does not know which to rank.
  • Blind scaling β€” publishing 500 articles with no quality control. Mass low-quality content β†’ possible Google Manual Action.
  • Missing HITL β€” the agent changes robots.txt / canonical with no human check. The site drops out of the index. Irreversible actions need confirmation.

SEO automation ROI

Calculate how much an agent system saves versus manual SEO.

The calculator uses a simplified model: ROI = (savings βˆ’ system cost) / system cost. Real math should include build capex, rollout time, and indirect gains (quality, reaction speed). Use it as a compass, not a finance forecast.

5 steps to a first working agent

  1. Pick ONE task.
    A strong start is rank monitoring: no irreversible actions, fast feedback, easy to check by hand.
  2. Assemble a minimum stack.
    GSC API + Claude API β€” under $5/month to start. No heavy infrastructure on day one.
  3. Run it on 50–100 keywords.
    Check the first results by hand. Confirm the data is correct, the logic holds, and there are no hallucinations.
  4. Add a second worker.
    Page audit or keyword gap analysis β€” high ROI, low risk.
  5. Iterate on the data.
    What works in the top 15% β†’ study the pattern β†’ update prompts and topic lists β†’ scale. Repeat every 4–6 weeks.

Check yourself

A content agent publishes 200 articles/month. After 3 months: 90 articles (15%) drove > 100 visits/month; the other 510 articles drove almost none. What next?
A) Double volume β€” 400 articles/month
B) Analyze the top 15% and retune the agent toward similar topics
C) Switch entirely to manual copywriting
D) Immediately delete the 570 unsuccessful articles
Iteration beats the first launch: an agent with 3 months of data is smarter than the agent that shipped 3 months ago. Track KPIs, fix anti-patterns, scale what works.

AI search and GEO

How to change SEO strategy when search moves into AI answers

What is happening to search

From 2024–2026 the SERP shifted structurally: an AI-generated answer sits above organic results, and users reach the blue links less often.

Google AI Overviews

They appear on 40–60% of informational queries. The user gets a summary in the SERP and often does not click through.

Zero-click searches

Featured Snippet, PAA (People Also Ask), and AI Overview answer without a click. An organic click on an informational query became rare.

Alternative AI search engines

Perplexity cites sources. ChatGPT Search and Bing Copilot are standalone search surfaces with multi-million audiences.

The trend is clear: for informational queries ("how", "what is", "why") an organic click is becoming the exception. Sites that did not adapt the strategy lose 30–60% of traffic when an AI Overview appears.

GEO is still SEO

GEO (Generative Engine Optimization) is a label for optimizing not for a user click but for citation by an AI engine. The goal: become a source that Perplexity, Google AI Overview, or ChatGPT Search includes in the answer.

Google's official position (AI Optimization Guide, Google Search Central, 2025): "optimizing for generative AI search is optimizing for search experience, which means it is still SEO". There is no separate "GEO/AEO magic": whether you appear in an AI answer is decided by the same quality and indexability signals. GEO/AEO are convenient labels, not a secret extra tactic set.

How AI actually picks sources (RAG + Query Fan-Out)

Google describes the mechanism directly β€” not a separate "AI ranking", but a layer on ordinary search:

  1. Retrieval (RAG). The same core ranking systems pull relevant fresh pages from the index. You enter an AI answer only if the page is indexed and snippet-eligible β€” you cannot skip ordinary SEO.
  2. Query Fan-Out. For one query the model spawns several related sub-queries (e.g. "how to get rid of weeds" β†’ a set of follow-ups) and gathers results for each. Cover the topic and adjacent sub-questions, not one exact phrase.
  3. Generation. From retrieved pages the model takes concrete facts and forms an answer with clickable source links.

Signals that actually work are SEO fundamentals, not "AI tricks": E-E-A-T and expertise, domain authority and citability, crawler access, semantic HTML, solid page experience. Structured data is not a requirement for AI features (see the note below).

Content formats AI prefers

Clear definitions
Answer the query in the first paragraph.
Numbered lists
AI cites steps and lists easily.
FAQ structure
Question–answer is a strong snippet format.
Data with sources
Statistics with a primary source raise trust-score.
What not to do (straight from Google's guide):
  • Do not spawn llms.txt and "special" AI markup β€” it is not needed for visibility.
  • Do not shatter content into tiny chunks β€” the model understands multi-topic pages.
  • Do not rewrite copy "for the machine" or chase keyword variations.
  • Do not manufacture inauthentic mentions across the web.
  • Do not make a separate page for every query variant β€” that is scaled content abuse.
  • Do not overrate structured data as an AI requirement: useful, but an optional signal.

AI Overview probability by query type

Indicative data (BrightEdge, 2025): informational ~47% on average, healthcare/finance up to 77%; transactional < 10%. Transactional and navigational queries are the "safe zone" of traditional SEO.

Strategy by query type

Not every query is equally exposed to AI Overviews. The tactic depends on intent:

Informational
"how to choose", "what is", "why"

AIO risk: high (~47% on average, up to 77% in-niche). Strategy: GEO β€” FAQ structure, structured data, clear definitions, authority.

Educational
"course on", "guide", "training"

AIO risk: medium (40–50%). Strategy: hybrid β€” GEO + traditional SEO.

Commercial
"best", "comparison", "ranking"

AIO risk: low (15–20%). Strategy: traditional SEO, conversion focus.

Transactional / Navigational
"buy", "price", "[brand] site"

AIO risk: minimal (5–10%). Strategy: traditional SEO at full strength. For AI-answer visibility Google points to Merchant Center feeds and Google Business Profile.

Implication for the content agent: shift generation toward transactional and commercial content, where the organic click still lives. Informational articles β€” raise quality (answer-first, first-hand expert data, primary sources, E-E-A-T), do not rewrite "for the machine": Google says not to tune copy for AI systems.

AI Overview monitoring agent

The agent's job is to watch whether an AI Overview appeared for your keywords and to change content strategy on the alert.

Tools

  • DataForSEO SERP API β€” supports ai_overview in the response object (field items_types[]).
  • SerpAPI / Bright Data β€” alternatives with similar AIO detection.
  • State store β€” SQLite/Redis: record the date AIO first appeared and the movement after.

Agent pseudocode

# AIO Monitor Agent β€” pseudocode
# Run: cron every 24h (or a webhook on rank change)

import serp_api, db, alerts

def run_aio_monitor(keywords: list[str]):
    for kw in keywords:
        result = serp_api.fetch(kw, features=["ai_overview", "featured_snippet"])

        aio_present = result.has("ai_overview")
        prev_state  = db.get_aio_state(kw)          # True/False/None

        if aio_present and not prev_state:
            # AIO appeared for the first time
            db.set_aio_state(kw, True, date=today())
            alerts.send(
                channel="slack",
                msg=f"[AIO ALERT] AI Overview appeared for '{kw}'. "
                    f"Current URL in position 1: {result.top_organic_url}. "
                    f"Recommendation: raise quality and the answer-first structure of the page."
            )
            content_pipeline.schedule_quality_review(kw)

        elif not aio_present and prev_state:
            # AIO gone β€” traditional SEO is the priority again
            db.set_aio_state(kw, False, date=today())
            alerts.send(
                channel="slack",
                msg=f"[AIO GONE] AI Overview disappeared for '{kw}'. "
                    f"Traditional SEO is the priority again."
            )

        # Log organic rank regardless of AIO
        db.log_rank(kw, result.organic_position, result.url)
The agent does not need browser automation β€” the SERP API returns structured JSON with an ai_overview flag. Cost: ~$0.002–0.005 per query. For 500 keywords a day β€” under $2.50/day.

Updating the content pipeline for GEO

Bridge to module M5: add a GEO layer on top of the existing content-generation pipeline.

1. Changes in the content-agent system prompt

# Add to the content-agent SYSTEM PROMPT (GEO mode): CONTENT_RULES_GEO = """ - First paragraph = a clear definition: answer the query in 1–2 sentences. - Add an FAQ section (at least 4 Q&A pairs) at the end of the article. - For every claim with numbers β€” cite the primary source in parentheses. - Use numbered lists for steps and instructions. - The article author must be named with credentials (bio block). - Avoid diluted intros β€” AI picks dense, factual content. """

2. Structured data β€” optional, not an "AI lever"

Google warns not to overrate structured data as a requirement for AI features. Schema is still useful β€” for ordinary rich results, Merchant feeds, parsing β€” but it is not a "secret signal" that unlocks an AI answer. Add it as hygiene, not as a GEO strategy.
# Generate FAQ schema (add to the SEO Check pipeline step)

def generate_faq_schema(faq_items: list[dict]) -> str:
    """
    faq_items: [{"question": "...", "answer": "..."}, ...]
    Returns a JSON-LD string to insert in <head>.
    """
    schema = {
        "@context": "schema.org",
        "@type": "FAQPage",
        "mainEntity": [
            {
                "@type": "Question",
                "name": item["question"],
                "acceptedAnswer": {
                    "@type": "Answer",
                    "text": item["answer"]
                }
            }
            for item in faq_items
        ]
    }
    return f'<script type="application/ld+json">{json.dumps(schema)}</script>'

# Likewise: HowTo schema for step-by-step instructions,
# Article schema with author.name + author.url for E-E-A-T

3. Intent detection as an SEO Check step

# Add to the SEO Check Agent before publish:

def check_aio_risk(keyword: str, content: str) -> dict:
    intent = classify_intent(keyword)          # 'informational'|'commercial'|...
    aio_prob = AIO_RISK_MAP.get(intent, 0.5)   # from the monitoring database

    if aio_prob > 0.4:
        geo_score = score_geo_readiness(content)
        # geo_score: 0..1 (FAQ, definitions, structured data, authorship present)
        if geo_score < 0.6:
            return {
                "status": "warn",
                "msg": f"AIO risk {aio_prob:.0%}, GEO readiness {geo_score:.0%}. "
                       "Recommended: add FAQ, structured data, improve the definition."
            }
    return {"status": "ok", "aio_prob": aio_prob}
Final pipeline (M5 + GEO layer): Intent Detection β†’ Content Generation (GEO prompt) β†’ SEO Check (AIO risk + GEO-score) β†’ Schema Injection β†’ Publish. When AIO risk >40% β€” automatically add FAQ schema and GEO rules.

Quiz: check your understanding

The site sits at position #1 for the informational query "how to choose a CRM". Google added an AI Overview. Traffic fell 55%. What next?
A) Wait β€” still #1, the algorithm did not change
B) Raise quality: answer-first definition, expert data with sources, E-E-A-T
C) Switch to ads
D) Create 10 more similar articles
Main takeaway: AIO does not kill SEO and does not invent a separate discipline β€” Google's position is that this is still SEO. What changes is effort allocation: transactional queries still hold click value; informational ones need genuinely high-quality answer-first content (E-E-A-T, primary sources) to be cited. The monitor agent tracks where AIO appeared and where quality must rise.

Frontier models in SEO β€” routing them correctly

Sonnet does 95% of the work. Opus is needed less often than most teams think.

This is the final module of the course. Before practice β€” a mental-model correction, without which teams spend money on Opus where Sonnet already handles the job.

Meta point: this 10-module course β€” architecture, research, code, strategy, competitive analysis, GEO β€” was produced with Claude Sonnet. Not Opus. If Sonnet can build a full SEO-automation course, it can handle a competitive analysis too.

1. Rethinking "smart" tasks

Most SEO specialists inherit an outdated mental model of model tiers. Here is where it breaks:

Wrong

Haiku = cheap
Sonnet = mid tier
Opus = smart, for hard tasks

This model leads to extra spend and the wrong expectations

Right

Haiku = bulk throughput (10k+ calls/day)
Sonnet = strategy + content + analysis (95% of tasks)
Opus = extended thinking, edge cases (<5%)

The right question: "Can Sonnet handle this?" β€” almost always yes

The shift: Sonnet is not "mid tier", it is the default working tool. Opus is insurance for <5% of cases where extended thinking actually changes the answer.

2. Three real model-choice scenarios

Haiku β€” when you need SCALE on a fixed template

Use it when the task is templated and call volume is in the thousands:

  • Check 50,000 meta tags for length and duplicates
  • Classify 10,000 keywords by intent (informational/transactional/navigational)
  • Generate short alt texts for 5,000 images from a template
  • Export and structure GSC data into a table
Haiku test: the task is one step under fixed rules, not reasoning

Sonnet β€” almost everything else (including "smart" tasks)

The default model for anything that needs analysis, synthesis, or strategy:

  • Competitive analysis of the top-10 SERP for a keyword
  • Score a competitor page's E-E-A-T profile
  • Strategic call: attack a head term or a long-tail cluster?
  • Write a content brief, outline, article draft
  • Technical SEO audit with interpreted priorities
  • Analyze 50–100 site pages in one request (200k context)
  • GEO optimization for AI Overviews
  • "Which content gap should we fill next?"
This entire 10-module course was built with Sonnet β€” architecture, code, strategic analysis, and competitive recommendations included

Opus β€” only when Sonnet is actually insufficient

Not "a hard task" β€” a task where extended thinking changes the conclusion:

  • Multi-step reasoning over 15+ steps with branching uncertainty
  • A 500+ page document in one call with deep synthesis
  • An irreversible decision (e.g. a full site-architecture redesign) where one error = months of work
  • A task where extended thinking itself changes the final conclusion
Opus costs ~10Γ— Sonnet. Before using it β€” confirm Sonnet was tried and actually failed, not that "the task looks hard".

3. Sonnet in action: patterns for "hard" tasks

Three tasks that look "smart" β€” all three are Sonnet jobs:

Pattern A β€” Competitive Intelligence

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=4096,
    messages=[{"role": "user", "content": f"""
Analyze the Google top 10 for '{keyword}'.
For each: content type, length, H1-H3 structure, main topics.
Find: which topics are missing? Which format dominates?
Write a brief for an article that can take first place.
"""}]
)

Pattern B β€” E-E-A-T Assessment

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    messages=[{"role": "user", "content": f"""
Score this page's E-E-A-T profile on a 1-10 scale:
{page_content}

What to improve? Which authority signals to add?
"""}]
)

Pattern C β€” Strategic Decision

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=3000,
    messages=[{"role": "user", "content": f"""
GSC data: {gsc_summary}
Competitor profile: {competitor_data}

Question: should we compete on the head term '{head_term}'
or focus on the long-tail cluster '{longtail_cluster}'?
Argue from the data and name the risks of each option.
"""}]
)
All three patterns use claude-sonnet-4-6 β€” not as a budget compromise, but as the right choice for these tasks.

4. An honest threshold for Opus

Rule: "If the task is 1–2 reasoning steps β€” Sonnet. If you need 10+ steps with branching logic and the cost of error is high β€” consider Opus with extended thinking".

An example where Opus is justified in SEO:

"Analyze a 200-page site" β€” in one call:
  • Find conflicting canonical errors across 200 pages
  • Cluster them into typical issues
  • Auto-generate a redirect plan
  • Design a canonical strategy for the whole structure

An error in this plan = hundreds of hours of manual work β†’ extended thinking changes output quality.

Note: this is not "a hard SEO task", it is a specific mix: huge input + multi-step logic + high cost of error. Competitive analysis on one keyword does not meet that bar.

5. Model routing in a real pipeline

A correct router makes Sonnet the default, not the exception:

def route_task(task_type, input_size, complexity):
    # Rule 1: massive bulk -> Haiku
    if task_type in ('bulk_classify', 'simple_check') and input_size > 1000:
        return 'claude-haiku-4-5'

    # Rule 2: Opus only for truly exceptional
    if complexity == 'exceptional' and task_type in ('full_site_strategy', 'canonical_rebuild'):
        return 'claude-opus-4-8'

    # Rule 3: Sonnet -- default for everything else
    return 'claude-sonnet-4-6'
Architectural point: return 'claude-sonnet-4-6' is not a fallback for "mid" tasks. It is the right choice for competitive analysis, E-E-A-T scoring, content strategy, and technical audits.

6. SEO pipeline cost calculator

Look at real numbers. Defaults match a typical split: Haiku takes volume, Sonnet takes value:

Key insight: at the defaults Sonnet handles only ~1.6% of tasks by count β€” but all the strategically important ones. Haiku handles 98%+ of tasks by count at comparable cost. Opus adds insurance for edge cases at a tiny share of budget.

Formula: let Haiku do volume β€” Sonnet does value.

7. Check your understanding

You need a competitive analysis: study the top 10 for a keyword, find topics they miss, and write a content brief. It is several reasoning steps. Which model?
A) Haiku β€” save budget
B) Sonnet
C) Opus with extended thinking
D) An ensemble of all three models
Module and course takeaway: the right question is not "do we need Opus?" β€” it is "can Sonnet handle this?". The answer is almost always yes. Opus is not a "smart tier" for hard tasks; it is insurance for <5% of cases where extended thinking actually changes the result. This course is the working proof: 10 modules, architecture, research, strategy, code β€” all produced with Sonnet.

Done!

10 modules complete. The full SEO-agent stack β€” from architecture to AI search and frontier analytics.

  • Decompose an SEO workflow into agent tasks
  • Assemble an agent stack: Data Sources β†’ LLM β†’ Output
  • Build a technical-audit agent with prioritization
  • Automate keyword research and intent mapping
  • Set up a content pipeline with SEO checks
  • Monitor SERP and the backlink profile with an agent
  • Orchestrate a full SEO pipeline with human-in-the-loop
  • Measure automation ROI and iterate the system
  • Adapt SEO strategy to AI Overviews and GEO
  • Apply frontier models to deep SEO analysis

What to read next

  • Google Search Central Blog β€” official algorithm updates
  • Anthropic API Docs β€” Claude API for content agents
  • Screaming Frog Docs β€” advanced technical audit
  • Ahrefs Academy β€” keyword research and backlink analysis