# SEO audit checklist: 45 checks for a whole site, in the order that matters

> An SEO audit checklist for a whole site: what to check, how to verify each item for free and what counts as a pass, from indexing and robots.txt to templates, links, speed and Search Console.

Updated 2026-09-26 · Technical SEO · HTML version: https://getreport.app/guides/seo-audit-checklist

An SEO audit checklist is the ordered list of things to verify on a website so search engines can crawl it, index the right URLs and understand every page. This one has 45 checks in nine groups, each with how to verify it for free and what counts as a pass. It covers the whole site: the site-wide files, one page of every template and what Google Search Console reports. For the reasons behind each area, read the [technical SEO guide](https://getreport.app/guides/technical-seo), which this checklist puts into practice. Allow two to four hours for a site with a handful of templates.

## Quick answer

- **Work top to bottom.** The groups are in order of impact: a page Google cannot index makes every later check irrelevant.
- **Audit templates, not pages.** Pick one URL of each page type (home, category, product or service, article, landing page). A fix in the template fixes every page built from it.
- **Check the site-wide files once:** robots.txt, the XML sitemap and the http, https, `www` and trailing-slash variants.
- **Use Search Console for what only Google knows:** which URLs are indexed, which are not and why, and field Core Web Vitals.
- **Write down the evidence for every fail** (URL, what you saw, where) so the fix can be verified later.
- **Fix blockers first:** indexing, then crawl paths, then duplicates, then templates, then speed and extras.

## How this checklist differs from a one-page audit

A one-page audit asks whether a single URL is set up to rank; the [on-page SEO checklist](https://getreport.app/guides/one-page-seo-audit) walks through it check by check. This checklist is the level above: whether robots.txt and the sitemap agree, whether every URL variant collapses into one, whether templates repeat a mistake across hundreds of pages, and what Google has indexed. You run the one-page audit once per template as part of it.

## Before you start: scope and access

1. **List the templates** (home, category, product or service, article, landing page, static pages) and pick one URL of each, plus the ten pages with most organic clicks from Search Console → Performance → Pages.
2. **Get access** to Google Search Console, the CMS or SEO plugin settings, and ideally someone who can change server or CDN rules.
3. **Decide where findings go.** [The SEO audit report template](https://getreport.app/guides/seo-audit-report-template) has a structure for writing them up.

A desktop crawler helps on sites of more than a few hundred pages, to find orphans and site-wide duplicates, but the checks below do not need one.

## 1. Indexing: can Google keep your pages?

Do this group first, on every template URL and the top ten pages.

| # | Check | How to verify | Pass when |
| --- | --- | --- | --- |
| 1 | Pages return HTTP 200 | Run the audit or a status checker on each URL | 200 on the final URL, at most one redirect before it |
| 2 | No accidental `noindex` | View source for `name="robots"`; check the `X-Robots-Tag` header | Only pages you want out of search carry `noindex` |
| 3 | Not blocked by robots.txt | Search Console → URL Inspection, or a robots.txt tester | Every page you want indexed is allowed for Googlebot |
| 4 | Indexed pages match your intent | Search Console → Indexing → Pages, "Indexed" count | Roughly the number of pages you want in search |
| 5 | "Not indexed" reasons make sense | Same report, "Why pages aren't indexed" | No important URLs under noindex, 404, soft 404 or blocked |
| 6 | CMS search visibility is on | WordPress: Settings → Reading | "Discourage search engines" is unticked |

> **Check: The page can be indexed.** To appear in search, a page must return HTTP 200, carry no noindex directive and be allowed in robots.txt. If any of the three fails, the page is invisible to searchers.
>
> 1. Open the technical detail to see which condition fails, then fix that one; the individual findings above have the steps.
> 2. After the fix, request indexing in Google Search Console to speed things up.

> **Check: The page is not set to noindex.** A noindex directive tells Google to drop this page from search results. Unless that is intended, every visit from search is lost.
>
> 1. Remove noindex from the robots meta tag and from the X-Robots-Tag header, unless the page should stay out of search.
> 2. In WordPress, untick Settings → Reading → "Discourage search engines" and check the page's SEO plugin settings.

If an important page fails here, stop and fix it before continuing. [Why is my page not in Google?](https://getreport.app/guides/why-is-my-page-not-in-google) is the step-by-step diagnosis, and [Discovered – currently not indexed](https://getreport.app/guides/discovered-currently-not-indexed-what-it-means-and-what-to-do) covers the most common Search Console status.

## 2. Site-wide files: robots.txt and the XML sitemap

| # | Check | How to verify | Pass when |
| --- | --- | --- | --- |
| 7 | robots.txt exists and answers 200 | Open `/robots.txt` | Plain text, 200, no `Disallow: /` for all agents |
| 8 | No important paths blocked | Read each `Disallow` line | CSS, JavaScript and images the page needs are not blocked |
| 9 | Sitemap declared | `Sitemap:` line in robots.txt, submitted in Search Console | At least one absolute sitemap URL |
| 10 | Sitemap is valid XML | Sitemap validator | Parses; under 50,000 URLs and 50 MB per file |
| 11 | Sitemap lists only canonical 200 URLs | Sample the URLs | No redirects, 404s, `noindex` or parameter URLs |
| 12 | Important pages are in the sitemap | Search for your template URLs in it | Every page you want indexed is listed |
| 13 | `lastmod` is honest or absent | Compare dates with real edits | Changes only when the content changes |

> **Check: robots.txt allows this page.** A Disallow rule stops search engines from crawling this page, so they cannot read its content or see any updates. The page can still appear in results as a bare URL with no description.
>
> 1. Remove or narrow the Disallow rule in robots.txt so this URL is allowed for all crawlers.
> 2. If the page should stay out of search, allow crawling and use a noindex tag instead; a blocked page cannot be de-indexed.

> **Check: The XML sitemap follows the sitemaps.org protocol.** Google reads a sitemap only when it is well-formed XML with absolute URLs and valid dates. One bad file means new pages are found late or not at all, and Search Console reports "couldn't fetch".
>
> 1. Regenerate the sitemap from your CMS or SEO plugin instead of editing it by hand, and validate it after every change.
> 2. Use absolute https URLs in <loc>, dates as YYYY-MM-DD in <lastmod>, and split files above 50,000 URLs into a sitemap index.

> **Check: Sitemap URL status.** A sitemap should list only pages that answer 200. Redirects, 404s and noindex pages in it waste crawl budget and make Google trust the file less.
>
> 1. Remove deleted pages from the sitemap and list the final URL of redirected pages.
> 2. Most CMS plugins do this automatically; if you generate the file yourself, rebuild it from the live URL list before publishing.

Google says it ignores `priority` and `changefreq`, so do not spend time on them. The [robots.txt guide](https://getreport.app/guides/robots-txt) and [XML sitemap validation](https://getreport.app/guides/xml-sitemap-validation) explain each rule.

## 3. One URL per page: HTTPS, hosts and redirects

| # | Check | How to verify | Pass when |
| --- | --- | --- | --- |
| 14 | HTTP redirects to HTTPS | Request `http://` for the home page and one deep page | One 301 or 308 to the https URL |
| 15 | One host | Request the `www` and bare versions | One redirects to the other in one hop |
| 16 | One trailing-slash style | Request a URL with and without the slash | One form answers 200, the other redirects |
| 17 | No redirect chains | Follow the redirects of old URLs and internal links | One hop at most |
| 18 | Canonical is self-referencing | View source for `rel="canonical"` on each template | Exactly one tag, absolute, pointing at the page's own clean URL |
| 19 | Parameter URLs canonicalise | Add `?utm_source=test` to a URL | The canonical still names the clean URL |
| 20 | Removed pages are handled | Check a few old URLs | 301 to the closest replacement, or 404 or 410 |

> **Check: The site is served over HTTPS.** Browsers label HTTP pages "Not secure" and Google uses HTTPS as a small ranking signal. Anyone on the network can read or alter what visitors see.
>
> 1. Get a certificate (Let's Encrypt is free) and enable HTTPS on your host.
> 2. Redirect every http:// URL to https:// with a 301.

> **Check: Only one of www and non-www serves the page.** When the www and non-www addresses both return the page, search engines see two copies of every URL and split links and rankings between them.
>
> 1. Pick one host as canonical and 301-redirect the other to it, keeping the path (most hosts and CDNs have a one-click setting for this).
> 2. Make sure the canonical tag on every page uses the chosen host.

> **Check: The URL loads without a redirect chain.** Each redirect is a full request and response before the browser can start loading the page, which slow mobile connections feel most. Google says redirects do not lose ranking value, but Googlebot follows at most 10 hops, and long chains slow crawling and break when one hop changes.
>
> 1. Point every old URL straight at the final one (a single 301), and update internal links to use the final URL directly.
> 2. Look for rules that stack, for example http → https, then non-www → www, then trailing slash; combine them into one rule.

> **Check: Canonical tag points to a valid URL.** The canonical tag asks Google to index that URL instead of this one. If it points to another site, appears twice or leads to an error page, your ranking signals are given away or ignored.
>
> 1. Point the canonical at this page's own clean URL (same scheme and host, no tracking parameters), and make sure it returns 200.
> 2. Keep exactly one canonical tag; if a plugin and the theme both add one, disable one of them.

The canonical side of this group has its own topic: [canonical tags explained](https://getreport.app/guides/canonical-tags-explained). For the redirect rules per server, see [trailing slashes, www and https: pick one](https://getreport.app/guides/trailing-slashes-www-and-https-pick-one).

## 4. Templates: titles, descriptions and headings

Run the one-page audit on each template URL and read the SEO findings.

| # | Check | How to verify | Pass when |
| --- | --- | --- | --- |
| 21 | Every page has a unique title | Audit per template; crawl or Search Console for duplicates | 30–60 characters, topic first, different on every page |
| 22 | Meta description per important page | Audit per template | 70–160 characters, describes that page |
| 23 | One H1 per page | Audit per template | Exactly one, naming the topic |
| 24 | Logical heading order | Audit per template | No jumps from H2 to H4 |
| 25 | `lang` and viewport set | Audit per template | `<html lang>` matches the content; viewport tag present |
| 26 | Paginated and filtered pages have distinct titles | Open page 2 of a category | "Page 2" or the filter in the title |
| 27 | Thin or empty templates | Tag, author and empty category pages | Either useful content or `noindex` |

> **Check: Title length.** Google truncates titles past about 60 characters and may rewrite very short ones, so your chosen wording does not reach searchers.
>
> 1. Rewrite the title to 30–60 characters, main topic first, brand last.
> 2. Keep the most specific words at the start; they survive truncation.

> **Check: The page has exactly one H1 heading.** One H1 tells search engines and screen readers what the page is about. Several, or none, blur that signal.
>
> 1. Keep exactly one <h1> with the page's main topic; make the others <h2>.
> 2. Check the theme: many put the site name or logo in an <h1> on every page.

Duplicates across the site are the most common template failure; [duplicate titles and descriptions across a site](https://getreport.app/guides/duplicate-titles-and-descriptions-across-a-site) shows how to find them in Search Console and fix the pattern.

## 5. Links and site architecture

| # | Check | How to verify | Pass when |
| --- | --- | --- | --- |
| 28 | No broken internal links | Broken link check per template, crawler for the site | No 4xx or 5xx targets |
| 29 | Internal links point at final URLs | Same check, redirect column | No links to redirecting URLs |
| 30 | Every important page is linked | Compare the sitemap with a crawl | No orphan pages |
| 31 | Important pages are near the top | Click depth in a crawler, or count clicks from home | Key pages reachable in a few clicks |
| 32 | Links are real `<a href>` | View source of menus and "load more" | Crawlable links, not click handlers |
| 33 | Internal links are followed | Look for `rel="nofollow"` on internal links | None, except login or cart links |

> **Check: Broken links.** A link to a 404 page is a dead end for visitors and a wasted crawl for search engines. Old campaign or product pages are the usual cause.
>
> 1. Update or remove each link listed in the technical detail; redirect the missing pages if they still get visits.
> 2. In WordPress, a plugin such as Broken Link Checker finds these site-wide.

> **Check: Internal links.** Internal links are how crawlers and visitors reach the rest of your site. Fewer than 3 leaves the page a dead end; more than 300 dilutes every link and overwhelms visitors.
>
> 1. Link to related pages from the body text and keep navigation and footer links to what visitors actually need.
> 2. For very long lists, split them across pages or use category pages instead of one giant menu.

[Internal links: how many, where and with what anchor text](https://getreport.app/guides/internal-links-how-many-where-anchor-text) and [finding orphan pages](https://getreport.app/guides/orphan-pages-finding-and-linking-them) cover the fixes.

## 6. Rendering: does the content need JavaScript?

| # | Check | How to verify | Pass when |
| --- | --- | --- | --- |
| 34 | Main content is in the HTML | View source (not the inspector) and search for a sentence of body text | The text is there before scripts run |
| 35 | Title, canonical and robots are not changed by scripts | Compare source with the rendered page | Same values in both |
| 36 | Google sees the rendered page | URL Inspection → View crawled page | The screenshot and HTML show the content |

> **Check: The visible text is present without JavaScript.** Google renders JavaScript later and with a budget, so text that only appears after scripts run can be indexed late or not at all. Other search engines and link previews may never see it.
>
> 1. Serve the main content in the HTML (server-side rendering or static generation) and use JavaScript only to enhance it.
> 2. Check the difference in the technical detail; menus and widgets are fine, headlines and body copy are not.

See [JavaScript-rendered content and Google](https://getreport.app/guides/javascript-rendered-content-and-google) for framework-specific fixes.

## 7. Mobile and speed

Google indexes the mobile version of your pages, so audit on a phone-sized viewport first.

| # | Check | How to verify | Pass when |
| --- | --- | --- | --- |
| 37 | Viewport tag present, zoom allowed | Audit per template | `width=device-width`, no `user-scalable=no` |
| 38 | Same content on mobile and desktop | Compare both versions | Same text, headings, links and structured data |
| 39 | Core Web Vitals pass in the field | Search Console → Core Web Vitals, or a speed test with field data | LCP ≤ 2.5 s, INP ≤ 200 ms, CLS ≤ 0.1 at the 75th percentile |
| 40 | Server responds quickly | Time to first byte per template | Consistently under about 0.8 s |

> **Check: Viewport meta tag is present.** Without a viewport tag, phones render the page at desktop width and shrink it. Google indexes the mobile version first, so this hurts rankings directly.
>
> 1. Add <meta name="viewport" content="width=device-width, initial-scale=1"> in <head>.

The [page speed guide](https://getreport.app/guides/page-speed) explains the metrics and what to fix per template.

## 8. Structured data, international and security

| # | Check | How to verify | Pass when |
| --- | --- | --- | --- |
| 41 | Structured data parses | Schema validator per template | Every JSON-LD block parses |
| 42 | Required properties present | Same, per type (Product, Article, Organization…) | No missing required properties |
| 43 | hreflang pairs link back | hreflang check on each language version | Every version lists all others and itself |
| 44 | No mixed content | Audit or browser console | No `http://` images or scripts on https pages |
| 45 | No security warnings | Search Console → Security issues and Manual actions | Both empty |

> **Check: JSON-LD syntax.** A JSON-LD block with a syntax error is ignored completely, so Google reads no structured data from it. One stray comma or missing quote costs the whole block.
>
> 1. Open the technical detail to see the parser message and the block number.
> 2. Paste the block into a JSON validator, fix the character it points at, and run this check again.

> **Check: Every hreflang alternate links back to this page.** hreflang only works when every version lists every other version, including itself. An alternate that does not point back makes Google ignore the pair, so visitors get the wrong language.
>
> 1. On each alternate page, add a <link rel="alternate" hreflang="…"> for this page and for itself.
> 2. Generate the tags from one list (CMS, plugin or the XML sitemap with xhtml:link) so every page carries the same set.

## How getReport checks it

> **Free tool:** [Free SEO checker and SEO audit for any page](https://getreport.app/tools/seo-audit): Free SEO audit of any page: titles, headings, canonical, robots.txt, sitemaps, indexability and broken links, each with a plain-language fix. No sign-up.

The SEO audit covers most of groups 1 to 5 for one URL per run, from indexability, robots.txt and the sitemap to redirects, the canonical, titles, headings and broken links. The same report includes speed, security and structured data, which covers much of groups 7 and 8. Run it once per template URL and keep the report links: each one stays at its address for 12 months, which gives you the "before" for the re-check.

What it does not do: crawl the whole site, find orphan pages or show what Google has indexed. Search Console, which is free, covers indexing, and a site crawl of up to 500 pages is a funded unlock that switches on for everyone once donations cover it.

## How to prioritise what you find

Sort the fails into blockers (group 1 and robots.txt, fix the same day), site-wide signals (groups 2 and 3, one change fixes every page), template fixes (groups 4 to 6) and projects (groups 7 and 8). Within each, do the small-effort fixes first; [picking which fixes to do first](https://getreport.app/guides/picking-which-fixes-to-do-first-impact-vs-effort) has an impact-versus-effort grid.

## How often to run the audit

Run the full checklist once or twice a year, and immediately after a migration, redesign, CMS or theme change, or a new SEO plugin. Between audits, a monthly pass over groups 1 and 3 catches most regressions in 30 minutes: see [SEO monitoring between audits](https://getreport.app/guides/monthly-site-health-routine). Before a new site goes live, the [website launch checklist](https://getreport.app/guides/pre-launch-website-checklist) is the version for launch day.

> **Free tool:** [Monitor website for changes: email alerts](https://getreport.app/tools/change-monitor): Monitor a website for changes for free and get one email with the added and removed lines when its text changes. It switches on once donations cover it.

## Common mistakes

- **Auditing only the home page.** It is usually the best-maintained page on the site; templates carry the problems.
- **Reading tool scores instead of findings.** A 92 with a `noindex` on the product template is worse than a 70 with slow images.
- **Treating every Search Console "Not indexed" row as an error.** Redirects, canonicalised duplicates and intentional `noindex` pages belong there.
- **Blocking duplicates in robots.txt.** Google then cannot see their canonical or `noindex`; use those instead.

## Questions people ask

### What is an SEO audit?

An SEO audit is a structured check of whether search engines can crawl, index and understand your pages, and whether they are set up to earn clicks. It covers technical basics (status codes, robots.txt, canonicals, sitemaps, speed), on-page elements (titles, descriptions, headings, links, images) and often content and backlinks. The result is a prioritised list of problems with fixes, not a ranking guarantee.

### How do I do an SEO audit?

Start with indexability, then work outward. Check that key pages return 200, are not blocked by robots.txt and carry no stray `noindex`. Then check titles, descriptions, headings and canonicals on one page per template, internal links, images and structured data. Finish with speed and Search Console's Pages report. The [SEO audit](https://getreport.app/tools/seo-audit) runs the page-level checks in about a minute; fix whatever fails on every template first.

### What should an SEO audit include?

At minimum: whether pages can be crawled and indexed (robots.txt, noindex, canonical, sitemap), titles and meta descriptions, headings, internal and broken links, redirects, page speed and Core Web Vitals, mobile layout, HTTPS and structured data. A full audit adds content quality, keyword targeting and backlinks, which need Search Console and other data. Fix whatever blocks indexing first, then what affects clicks.

### How do I conduct a technical SEO site audit?

Crawl the whole site with a crawler, and pair the result with Search Console's Pages, Sitemaps and Core Web Vitals reports. Look for pages returning errors or redirects, accidental `noindex` tags and robots.txt blocks, duplicate URLs without canonicals, orphan pages, redirect chains and slow templates. Then audit one page per template in detail. getReport's audit covers the page-level half; its site-wide crawl is a funded unlock.

### How often should you audit your site for SEO?

Run a full audit once or twice a year, and a light check monthly. A monthly pass over the key templates catches the common regressions: a plugin update that adds `noindex`, a theme change that breaks titles, a slower server. Audit immediately after any migration, redesign, CMS change or large content change, because that is when most accidental damage happens. A [monthly site health routine](https://getreport.app/guides/monthly-site-health-routine) takes about 30 minutes.

### What is the difference between an SEO checklist and an SEO audit?

An SEO checklist is the list of things to verify; an SEO audit is the act of going through it on a specific site and recording what passes, what fails and what to fix first. The checklist stays the same from site to site. The audit produces evidence, a priority order and a report, and it is only useful if someone acts on the fails and re-checks them afterwards.

### Can I do an SEO audit myself without paying for tools?

Yes. Google Search Console, which is free, shows what Google has indexed, why other pages are left out and your Core Web Vitals. A free checker covers the page-level and site-file checks per template, and your browser's view source covers the rest. Paid crawlers save time on large sites, mainly for finding orphan pages and duplicates across thousands of URLs.

### How long does a technical SEO audit take?

Two to four hours for a small site with a handful of templates, if you follow a checklist and audit one page per template. Large shops and sites with many languages or parameters take one to several days, mostly for crawling and working through duplicates. Writing up the findings and agreeing the priorities often takes as long as the checks themselves.

### What should I check first in an SEO audit?

Check that your important pages can be indexed: they return 200, carry no noindex, are allowed in robots.txt and have a correct canonical. Then open Search Console's Pages report and read why pages are not indexed. Everything else, from titles to speed, only helps pages that Google can already keep in its index.

### Do I need to crawl my whole site for an SEO audit?

Not for most problems. They come from templates, so checking one page per template plus the site-wide files finds them. A full crawl adds what page-level checks cannot see: orphan pages, duplicate titles across hundreds of URLs, broken links deep in the site and pages missing from the sitemap. It is worth doing on sites with more than a few hundred pages.
