A Technical SEO Audit Workflow

Run a repeatable, senior-level technical audit that finds what actually moves rankings.

After you have done a few dozen audits, you stop poking at random and start running the same disciplined loop every time. The goal is not a 200-point checklist that no one reads - it is a short list of issues that are blocking crawling, indexing, or trust, ranked by impact.

The order that matters

Work from the outside in. There is no point tuning a title tag on a page Google cannot even reach.

  1. Indexation reality check - compare pages you want indexed against what is actually in the index (Search Console Pages report, plus a site: spot-check). Big gaps are your headline finding.
  2. Crawl the site yourself - run a crawler (Screaming Frog, Sitebulb) and hunt for broken links, redirect chains, orphan pages, and noindex tags that should not be there.
  3. Rendering - check that critical content and links exist in the rendered HTML, not only after client-side JavaScript runs.
  4. Signals - canonicals, hreflang, structured data, internal links.
  5. Experience - Core Web Vitals and mobile usability, using field data.

Write findings as decisions, not observations

"CLS is 0.28" is an observation. "Reserve space for the hero image to cut CLS below 0.1 - dev, 1 hour, affects every template" is a decision someone can act on. Every finding in your report should carry an impact, an effort, and an owner.

A lightweight triage table

IssueImpactEffortDo first?
Key pages blocked in robots.txtCriticalLowYes
Redirect chains sitewideMediumMediumSoon
Missing FAQ schema on 3 postsLowLowLater

Example

Example · bash
# Fast indexation sanity check before a full crawl
# 1. How many URLs do you submit?
curl -s https://example.com/sitemap.xml | grep -c "<loc>"

# 2. Roughly how many are indexed? (manual spot-check)
#    Search Google for:  site:example.com

# 3. Find pages your crawler reached that are set to noindex
#    (Screaming Frog: Directives tab -> filter 'Noindex')
#    A big submitted-vs-indexed gap is your first headline finding.

When to use it

  • An SEO consultant runs a repeatable 6-step technical audit before each client engagement, ensuring consistent issue discovery and prioritisation across every project.
  • A developer integrates a crawl-based audit into the monthly CI pipeline, catching regressions in title tags, canonicals, and redirect chains before they reach production.
  • An agency uses a structured audit workflow to triage 800+ issues across a large e-commerce site into P1/P2/P3 tickets, making the remediation plan actionable for the engineering team.

More examples

Technical audit checklist script

Running crawlability, indexation, and Core Web Vitals checks in sequence creates a repeatable phase-by-phase technical audit foundation.

Example · bash
#!/usr/bin/env bash
# Phase 1: Crawlability check
echo "[1] Fetching robots.txt"
curl -s https://example.com/robots.txt | grep -i disallow

# Phase 2: Indexation
echo "[2] URL Inspection API — homepage"
curl -s -X POST 'https://searchconsole.googleapis.com/v1/urlInspection/index:inspect' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -d '{"inspectionUrl":"https://example.com/","siteUrl":"https://example.com/"}' \
  | python3 -c "import sys,json; r=json.load(sys.stdin); print(r.get('inspectionResult',{}).get('indexStatusResult',{}).get('verdict'))"

# Phase 3: Core Web Vitals
echo "[3] CrUX field data"
curl -s -X POST 'https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com/","metrics":["largest_contentful_paint","cumulative_layout_shift"]}' \
  | python3 -m json.tool | grep p75

Prioritise audit issues by impact

Scoring each audit finding by business impact and implementation effort produces a ranked remediation backlog that engineering teams can action sprint by sprint.

Example · bash
python3 - << 'EOF'
# Triage audit issues into P1 (fix immediately) / P2 / P3
issues = [
    {"issue": "Homepage returns 500",              "impact": "P1", "effort": "low"},
    {"issue": "220 pages with duplicate title tags", "impact": "P2", "effort": "medium"},
    {"issue": "Missing alt text on 400 images",     "impact": "P2", "effort": "medium"},
    {"issue": "sitemap.xml not found",              "impact": "P1", "effort": "low"},
    {"issue": "LCP > 4s on product pages",          "impact": "P1", "effort": "high"},
    {"issue": "50 pages with noindex tag",          "impact": "P2", "effort": "low"},
]
for p in ["P1", "P2", "P3"]:
    group = [i for i in issues if i["impact"] == p]
    print(f"\n{p} ({len(group)} issues):")
    for i in group:
        print(f"  [{i['effort']:6} effort] {i['issue']}")
EOF

Crawl error summary from log analysis

Aggregating Googlebot status codes from access logs provides a server-level view of crawl health, complementing what Search Console's Coverage report shows.

Example · bash
# Summarise Googlebot encounters by HTTP status from nginx logs
grep -i 'googlebot' /var/log/nginx/access.log \
  | awk '{print $9}' \
  | sort | uniq -c | sort -rn

# Expected output:
#  1842 200  <- crawled successfully
#    47 301  <- redirects (check for chains)
#    23 404  <- broken links to fix
#     8 500  <- server errors — investigate immediately

Discussion

  • Be the first to comment on this lesson.
A Technical SEO Audit Workflow — SEO with AI | SoundsCode