Common technical SEO issues and how to fix them
·4 min read
Most technical SEO issues come down to nine problems. They are an accidental noindex, a robots.txt block, a canonical pointing at the wrong URL, redirect chains, soft 404s, duplicate http and www hosts, content that only exists after JavaScript runs, slow LCP and broken internal links. Each has a clear symptom in Search Console or the page source and a fix you can ship in an afternoon. Work down the list in order, because a page Google may not index gains nothing from a faster LCP.
The technical SEO issues at a glance
| Issue | Symptom | Usual cause | Fix |
|---|---|---|---|
| Accidental noindex | "Excluded by 'noindex' tag" in Search Console | Staging setting shipped to production, plugin toggle, X-Robots-Tag header | Remove the directive from the template or server config |
| robots.txt block | "Blocked by robots.txt", no snippet in results | A broad Disallow rule written for another purpose |
Narrow the rule, then retest the exact URL |
| Wrong canonical | Google picks a different URL as canonical | Canonical hard-coded to the home page, or to a redirecting or noindexed URL | Point each page's canonical at its own final 200 URL |
| Redirect chain | Slow first load, several 3xx hops | Rule stacked on rule after migrations | One permanent redirect straight to the final URL |
| Soft 404 | "Soft 404" in Page indexing | Empty or "not found" pages that return 200 | Return a real 404 or 410, or add real content |
| Duplicate hosts | Same page loads on http, https, www and bare | Missing host redirect | Redirect every version to one host and protocol |
| JS-only content | Raw HTML is a near-empty shell | Client-side rendering | Server-render or prerender the main content |
| Slow LCP | Poor LCP in Core Web Vitals | Large hero image, slow server, render-blocking files | Fix the LCP element and server response first |
| Broken internal links | 404s in crawl reports, dead ends | Renamed or deleted pages | Update the link to the current URL |
Indexing blockers: noindex, robots.txt and canonicals
Accidental noindex. The page drops out of results and Search Console lists it under "Excluded by 'noindex' tag". The cause is usually a staging setting, such as WordPress's "Discourage search engines" box, or an X-Robots-Tag noindex header set at the server or CDN, which never shows in the page source. Our post on fixing excluded by noindex tag walks through each source.
robots.txt block. Google can still index a blocked URL that other pages link to, without a description. A typical culprit looks like this:
User-agent: *
Disallow: /pThat rule meant to hide /preview/ also blocks /pricing and /products/. Robots rules match by prefix, so write the full path with a trailing slash.
Wrong canonical. Google reports "Duplicate, Google chose different canonical than user" or quietly indexes another URL. Common causes are a template that sets every canonical to the home page, or a canonical pointing at a URL that redirects or carries noindex. Google treats the tag as a hint and ignores it when other signals disagree. The canonical tag guide covers the edge cases.
Redirect chains, soft 404s and duplicate hosts
Redirect chains. http://example.com/old goes to https://example.com/old, then to https://www.example.com/old, then to https://www.example.com/new. Google follows up to 10 hops, per its redirects documentation, but every hop slows visitors and crawlers. Rewrite the rules so each old URL reaches its final destination in one 301. More in our post on redirect chains.
Soft 404s. A deleted product or a "page not found" message that still returns HTTP 200. Google flags it and drops it. Return 404 or 410 for pages that are gone, and 301 only when a close replacement exists. Redirecting every dead URL to the home page creates more soft 404s, not fewer.
Duplicate hosts. Load all four versions of your home page. If more than one loads without redirecting, every page has duplicates. Pick one host and redirect the rest at the server. The www vs non-www post has the server rules.
JavaScript-only content
Google renders JavaScript, but it queues rendering after the first crawl, and most AI crawlers fetch raw HTML and never run your scripts. View the page source, not the inspector. If your product description, prices or article body are missing from the source, those crawlers see an empty page. Server-render or prerender the main content. Our JavaScript SEO post covers the frameworks.
Slow LCP and broken internal links
Slow LCP. Largest Contentful Paint is "good" at 2.5 seconds or less, per web.dev. The usual causes are an oversized hero image, a lazy-loaded LCP image, render-blocking CSS and a slow server response. Find the LCP element in PageSpeed Insights, serve it at the right size, never lazy-load it, and fix server response time before anything else.
Broken internal links. Pages get renamed and old links stay in menus and body copy. Update the link to the current URL instead of leaning on a redirect. Redirects are for inbound links you cannot edit.
Find technical SEO issues on your own site
Our SEO tools check most of this list one URL at a time, and each runs on its own. The Indexing and Canonical Checker reads the status code, robots.txt rules for Google and Bing, meta robots, X-Robots-Tag and the canonical with its target, then names the signal that blocks the page. It costs 8 credits per run. It cannot confirm that Google has indexed the URL and does not render JavaScript, so use Search Console's URL Inspection for that.
The Redirects, Headers and Host Checker follows each redirect hop, checks that the http, https, www and bare hosts all end at one URL, and flags response headers that hurt crawling or indexing, for 10 credits. The Broken Internal Link Finder checks up to 30 same-host links on one page for 4xx and 5xx errors, main-content links first, for 15 credits. It does not crawl the whole site or check links to other sites.