HTTP Status Codes and SEO: How Google Treats Each Response
Only a 200 goes to indexing. 301 passes the strong canonical signal, 302 does not, redirect chains die at 10 hops, and 503 is the right code for maintenance — not 404 or 5xx.
Only a 200 response is sent to indexing, and even then indexing is not guaranteed. Every other status changes what Google does with the URL: 301 passes the strong permanent canonical signal to the target, 302 does not, redirect chains are followed for at most 10 hops before Google gives up, and 4xx/5xx responses eventually drop the URL from the index. Serving the correct status code is one of the highest-leverage technical decisions on a site, because the code is the first thing Googlebot reads and it governs everything downstream.
2xx — success
A 200 OK is the only response that proceeds to the indexing pipeline, and indexing is still not guaranteed on a 200 — content quality and canonicalization decide the rest. Two edge cases: 201/202 cause Google to wait a limited time before proceeding, and 204 No Content yields nothing to index. The trap in the 2xx range is the soft 404 — a 200 returned for a page whose content is empty or says "not found." Google detects the mismatch, refuses to index it, and keeps recrawling it because the 200 invites return visits. This has its own detailed treatment in our soft 404 guide; Crawlinx flags it as status.soft_404.
3xx — redirects
Redirects are followed, but not all pass ranking signals equally.
| Code | Signal to target | Use |
|---|---|---|
| 301 / 308 | Strong, permanent — canonical signal consolidates onto the target | Permanent moves |
| 302 / 303 / 307 | Weak, temporary — source may stay indexed | Genuinely temporary redirects |
301 versus 302
This is the most consequential redirect distinction in SEO. A 301 (or its HTTP/2 equivalent 308) tells Google the move is permanent: it follows the redirect and consolidates the source URL's signals onto the target, treating the target as the canonical. A 302 (or 303/307) says the move is temporary: Google follows it but keeps the source URL as the canonical candidate and may leave it indexed.
The practical rule is blunt. If a URL has moved for good — a migration, a merged page, an HTTP-to-HTTPS switch — use 301. Using 302 for a permanent move withholds the consolidation you want and can leave the old URL competing in the index. Reserve 302/307 for redirects that will genuinely be reversed. Crawlinx flags redirects encountered during the crawl as redirect.single so you can confirm the type matches the intent.
Redirect chains and the 10-hop limit
Google follows at most 10 redirect hops in a single crawl attempt, then reports an error and stops. Well before that ceiling, chains cost you: each hop is a separate fetch that dilutes the canonical signal and wastes crawl budget, because Googlebot follows them one at a time across crawls. A chain like /a → /b → /c → /d should be collapsed to a single /a → /d. Redirect loops are fatal — Google gives up and the URL never resolves. Crawlinx flags chains of multiple hops as redirect.chain. The crawl-budget cost of long chains is covered in our crawl budget guide.
A note on non-server redirects: a meta-refresh with a 0 delay is treated as permanent, a delayed one as temporary, and a JavaScript location redirect is only honored if the render succeeds — server-side 301 is the most reliable option by a wide margin.
4xx — client errors
Content behind a 4xx (400, 401, 403, 404, 410, 411 — but not 429) is unused by Google. A previously indexed URL that starts returning a 4xx is removed from the index, and Google's crawl frequency for it decays over time.
404 versus 410
Both mean the resource is gone, and Google treats them as the same removal — a 404 Not Found and a 410 Gone both drop the URL. The difference is intent and speed: 410 explicitly says "permanently gone," and Google may act on it slightly faster than a 404, which leaves open the possibility the page returns.
The decision is simple:
404when a page is missing and might conceivably come back, or when you are not certain — the safe default.410when you have deliberately and permanently removed content and want it dropped promptly, such as an expired listing or a retired product.
Neither is "better" for preserving value — both remove the URL. Choose 410 only to signal deliberate permanence. Crucially, do not redirect every missing page to the homepage to avoid a 404: Google usually reclassifies that as a soft 404, worse than an honest error. A real 404/410 page can still be user-friendly — just make sure the header carries the status. Crawlinx flags client-error responses as status.4xx.
5xx — server errors and 429
A 5xx (500, 502, 503) is ignored for indexing; Google slows its crawl and retains indexed URLs for a while, then drops them if the errors persist. 429 Too Many Requests is treated as a server error rather than a normal 4xx. Network failures, DNS errors, and timeouts are all treated like 5xx.
503 for maintenance
When a site or page is temporarily down — a deploy, a migration, planned maintenance — return 503 Service Unavailable, optionally with a Retry-After header. 503 tells Google "come back later" and preserves the indexed URL. The mistakes here are damaging:
- Returning
200with an "under maintenance" message is a soft 404 in the making — Google indexes the maintenance page. - Returning
404/410during maintenance tells Google the pages are gone, and it starts removing them. - Serving
5xx/429on your robots.txt is worst of all: a server error there halts crawling of the entire site short-term, far worse than the404that would mean "crawl everything." Never use error codes to throttle crawlers — see the robots.txt guide.
Crawlinx flags server errors as status.5xx and any non-200 primary response as status.non_200.
How Crawlinx detects status-code problems
Crawlinx records the response status for every URL it fetches and flags the ones that hurt indexing: client errors (status.4xx), server errors (status.5xx), any non-200 primary response (status.non_200), and the 200-but-empty soft 404 (status.soft_404). It tracks redirect behaviour too — single hops (redirect.single) and multi-hop chains that waste crawl budget (redirect.chain). Run these within the technical SEO audit checklist.
Takeaway
The status code is the first thing Google reads, so make it truthful. Serve 200 only for real content; use 301 for permanent moves and 302 only for genuinely temporary ones; collapse redirect chains well under the 10-hop limit; return 404 or 410 for gone pages instead of redirecting them to the homepage; and use 503 for maintenance — never a 200, a 4xx, or a 5xx on robots.txt.
Audit your own site — free
77 checks, internal PageRank, render-diff. No signup, results in ~30s.