How to use this
You don't need to be technical to get through this. Every item below is explained in plain language, with a free tool to check it, no agency jargon assumed. Go through each section against your own site. Anything you can't check off in a couple of minutes, write it down and move on, don't stop to fix it mid-audit. Fix everything after you've seen the full picture, so you're prioritizing against the whole list instead of whichever issue you happened to find first. Check items off as you go, your progress is saved in this browser, so you can leave and pick up where you stopped.
1. Crawlability & indexing
This category is just: can Google (and the AI systems that now answer buyer questions) actually find and read your pages? If they can't, nothing else on this list matters, a beautifully written page nobody can reach doesn't rank or get cited.
Screaming Frog's SEO Spider has a free tier that crawls up to 500 URLs and flags most of this automatically: broken links, missing canonicals, blocked pages, the works. screamingfrog.co.uk/seo-spider
Quick manual check: type site:yourdomain.com into Google. That shows roughly what Google has actually indexed, if pages you expect are missing, that's your first clue something above is blocking them. Google Search Console's free URL Inspection tool gives the exact, authoritative answer for any single page.
2. Core Web Vitals & performance
This category is about page speed, and about how stable the page feels while it loads, does text jump around, does a click register right away. Google measures three specific numbers, taken from real visitors' browsers, not a lab test:
Paste any URL into Google's free PageSpeed Insights and it measures all three numbers for you, plus tells you in plain terms what's slowing the page down. pagespeed.web.dev
3. Structured data
Structured data (people also call it "schema markup") is a hidden block of code on a page that spells out, in a format a machine can read directly, exactly what that page is: a product, an article, a local business, a person. Without it, Google and AI systems have to guess that from your words alone.
Google's Rich Results Test is free, paste in any page URL and it shows exactly what schema it found and flags any errors. search.google.com/test/rich-results
4. Content & on-page
This is the part most people think of as "SEO": the actual words on the page, and the handful of settings that control how it shows up in search results.
Ahrefs' free Webmaster Tools account will scan your site and flag duplicate or missing titles and meta descriptions at no cost. ahrefs.com/webmaster-tools
5. AI visibility (GEO)
The newest category, and the one most checklists still skip entirely: whether ChatGPT, Perplexity, and Google's AI Overviews can find you, trust you, and actually mention you when a buyer asks a relevant question.
A quietly useful fact most checklists skip: Bing's index feeds ChatGPT search, Copilot, and part of Perplexity, not just Google's. Bing Webmaster Tools is free and shows you exactly how Bing crawls and indexes your site, and it'll import your data straight from Google Search Console in a couple of clicks. bing.com/webmasters
Two more free tools worth having open while you do all of this: Google Search Console is your overall health dashboard, indexing status, search rankings, and any errors Google itself has flagged, all free. Google Analytics (GA4) tracks what visitors actually do on your site, and it recently added "AI assistants" as its own traffic channel, so you can see visits arriving from ChatGPT, Perplexity, and similar tools broken out separately, instead of buried inside "Direct." search.google.com/search-console · analytics.google.com
How often to run this
Every three to six months for an active site is the general rhythm, and immediately after any major change: a redesign, a CMS migration, or a sudden, unexplained drop in traffic or rankings. A checklist run once and never revisited catches a moment in time, not an ongoing state.
Bonus: automate the crawl with a free Python script
If you'd rather not click through every page by hand, this short script does the boring part of section 1 and 4 for you: it reads your sitemap, visits every URL, and flags pages with a bad status code, a missing or oversized title tag, a missing meta description, or images with no alt text. You don't need to be a developer to run it, if you can install Python and paste a command into a terminal, this works. Hand it to whoever maintains your site if that's not you.
import requests
from xml.etree import ElementTree
from bs4 import BeautifulSoup
SITEMAP_URL = "https://yourdomain.com/sitemap.xml"
def get_urls(sitemap_url):
xml = requests.get(sitemap_url, timeout=10).text
root = ElementTree.fromstring(xml)
ns = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}
return [loc.text for loc in root.findall(".//sm:loc", ns)]
def check_page(url):
issues = []
try:
r = requests.get(url, timeout=10)
except requests.RequestException as e:
return [f"Could not load page: {e}"]
if r.status_code != 200:
issues.append(f"Status code {r.status_code}")
soup = BeautifulSoup(r.text, "html.parser")
title = soup.find("title")
if not title or not title.text.strip():
issues.append("Missing title tag")
elif len(title.text) > 60:
issues.append(f"Title too long ({len(title.text)} chars)")
meta_desc = soup.find("meta", attrs={"name": "description"})
if not meta_desc or not meta_desc.get("content", "").strip():
issues.append("Missing meta description")
images_missing_alt = [img for img in soup.find_all("img") if not img.get("alt", "").strip()]
if images_missing_alt:
issues.append(f"{len(images_missing_alt)} image(s) missing alt text")
return issues
if __name__ == "__main__":
urls = get_urls(SITEMAP_URL)
report_lines = [f"Checking {len(urls)} pages from {SITEMAP_URL}\n"]
for url in urls:
issues = check_page(url)
if issues:
report_lines.append(url)
for issue in issues:
report_lines.append(f" - {issue}")
else:
report_lines.append(f"{url} — OK")
report_text = "\n".join(report_lines)
print(report_text)
with open("seo-report.txt", "w") as f:
f.write(report_text)
print("\nSaved to seo-report.txt in this same folder.")
Save the code above into a file named check.py, then edit the SITEMAP_URL line near the top to point at your own site.
If you're on a Mac and use TextEdit to save it, TextEdit defaults to Rich Text format, which silently wraps your code in formatting Python can't read (you'll see an error starting with {\rtf1\ansi...). Before saving, go to TextEdit's Format menu → Make Plain Text (or Cmd + Shift + T). Easiest fix: skip TextEdit entirely and use a free code editor like VS Code, which saves plain text by default.
- On Mac: open Terminal (search for it with Spotlight,
Cmd + Space), navigate to the folder where you saved the file (cd ~/Downloads, for example, if that's where it is), then runpip3 install --user requests beautifulsoup4followed bypython3 check.py. Ifpip3refuses with an "externally-managed-environment" error, that--userflag is what fixes it. - On Windows: install Python from python.org first if you don't already have it, and make sure to tick "Add Python to PATH" during setup. Then open Command Prompt (search "cmd"), navigate to the folder with
cd(for examplecd Downloads), then runpip install requests beautifulsoup4followed bypython check.py.
It'll print every URL from your sitemap with any issues found underneath it, or "OK" if a page is clean. It's a starting point, not a replacement for Screaming Frog or PageSpeed Insights above, but it's a genuinely free, five-minute way to catch the most common on-page mistakes across an entire site at once.
What should be included in an SEO audit checklist?
How often should you run a technical SEO audit?
What are the Core Web Vitals thresholds to check in an audit?
Is a free SEO audit checklist enough, or do I need a professional audit?
Core Web Vitals thresholds per Google's official web.dev documentation. Accessed July 29, 2026.