Server Error (5xx)

What the "Server error (5xx)" status in Google Search Console's Page Indexing report means — why a 500-level response slows crawling and eventually drops pages, how to diagnose and fix it, and the right way to take a site down on purpose with a 503 and Retry-After.

First published: Jun 23, 2026 · Last updated: Jul 18, 2026 · Advanced
demand #18 in Indexing#55 in How Search Works#310 in Technical SEO#426 on the site
1 evidence signal on this page

"Server error (5xx)" in Search Console's Page Indexing report means Googlebot requested a URL and the server returned a 500-level error (500, 502, 503, 504) instead of a 200, so the page can't be indexed. Two harms follow: Google slows crawling — proportionate to how many URLs are erroring — and any content from a 5xx is ignored; persistent 5xx eventually drops already-indexed URLs. Recovery is automatic once the server returns 2xx, but the crawl rate ramps back gradually. Common causes are an overloaded or misconfigured host, app/DB errors, upstream/CDN failures, and a CDN/WAF (or rate limiting → 429, which Google buckets with 5xx) blocking Googlebot — verify with reverse DNS/IP ranges before changing security rules, since a Googlebot user-agent is spoofable. Diagnose via Crawl Stats host availability, server logs, and the URL Inspection live test (a page working now doesn't prove what Googlebot saw earlier). The one nuance: Google's default advice is to stay online with limited functionality during a closure; if you must fully disable, 503 + Retry-After is correct for a day or two at most (weeks of downtime harms indexing with no fixed recovery time), and your robots.txt must keep returning 200 throughout, because a 503 on robots.txt can pause crawling site-wide.

TL;DR — “Server error (5xx)” means the server returned a 500-level code when Googlebot requested the URL, so the page can’t be indexed. Two distinct harms: Google slows the crawl rate (proportionate to how many URLs are erroring) and ignores any content a 5xx returns; if the errors persist, already-indexed URLs are preserved at first, then dropped. Recovery is automatic once you return 2xx, but the crawl rate ramps back up gradually. Google buckets 429 (rate limiting / “server overloaded”) with 5xx. Causes: overloaded/misconfigured host, app/DB errors, upstream or CDN failures, a CDN/WAF blocking Googlebot (verify with reverse DNS/IP ranges before changing security rules — a Googlebot user-agent is spoofable). Diagnose with Crawl Stats host availability → server logs → URL Inspection live test. Google’s default recommendation for planned closures is to stay online with limited functionality; if you must fully disable, the correct response is 503 + Retry-After for a day or two (“a few days at most” — weeks of it harms indexing with no fixed recovery time) — and robots.txt must keep returning 200, because a 503 on robots.txt can pause crawling site-wide. Then run Validate Fix (optional — it just tracks the fix).

What the status actually reports

The label reports the response Google observed, not the specific origin, proxy, database, or CDN failure that caused it. Evidence for this claim Google reports Server error 5xx when the server returned a 500-level response for the requested page. Scope: Google Search Console report terminology and documented Search behavior; the label alone may not prove the underlying root cause. Confidence: high · Verified: Google: Page indexing report Google’s HTTP guidance defines the separate crawl and indexing effects. Evidence for this claim Google slows crawling for 5xx responses and may eventually remove persistently failing URLs from the index. Scope: Google Search Console report terminology and documented Search behavior; the label alone may not prove the underlying root cause. Confidence: high · Verified: Google: HTTP status codes

Google’s own definition is one line: your server returned a 500-level error when the page was requested. That’s it. Googlebot made a request, and instead of a 200 with content it got a 500, 502, 503, 504, or similar. The URL lands under Not indexed because there was no usable content to index.

Keep one thing straight: this is about the response code, not the page’s content, markup, or SEO setup. A 5xx is a server-and-infrastructure problem. No amount of editing the page’s HTML fixes a 502 coming from an overloaded backend.

How Google treats 5xx — the crawl economics

This is the part most explainers skip, and it’s the whole reason 5xx matters more than, say, a 404. Google’s HTTP-errors documentation spells out the behavior:

  • Crawling slows down. 5xx (and 429) errors prompt Google’s crawlers to temporarily slow down. The decrease in crawl rate is proportionate to the number of individual URLs returning a server error — a handful of erroring URLs is a nudge; a site-wide 5xx is a hard brake.
  • The content is ignored. Anything Google receives from a URL returning a 5xx is thrown away. There’s no “partial credit” for an error body — Google does not index a “site down” message you served with a 500.
  • Indexed URLs are preserved, then eventually dropped. Already-indexed URLs stay in the index at first. But Google’s indexing pipeline removes URLs that persistently return a server error. So a short outage costs you nothing in the index; a prolonged one costs you the pages.
  • Recovery is automatic — but gradual. Once the server starts responding with 2xx again, Google gradually increases the crawl rate back up. You don’t file a ticket; you fix the server and the crawl ramps back cautiously on its own.

That sequence — slow down → ignore content → preserve → eventually drop → recover on 2xx — is the accuracy spine of this whole topic.

429 counts as a server error. Worth flagging because most competitor content misses it: Google treats a 429 Too Many Requests as a signal that the server is overloaded, and buckets it with 5xx. If your rate limiting or bot protection is firing 429s at Googlebot, you’re getting the same crawl slowdown as a 500.

The common 5xx codes, by likely root cause

Knowing which 5xx you’re getting is a starting point for where to look — not proof of what’s broken. RFC 9110 (the HTTP specification) defines each code by what the responding component was doing, and any of these can be emitted by an origin server, an application server, a load balancer, a CDN, or a proxy sitting in front of the real origin. Treat the code as the first clue, then correlate it against edge, origin, application, and database/dependency logs for the same request before you conclude which layer actually failed:

  • 500 Internal Server Error — per the spec, “the server encountered an unexpected condition that prevented it from fulfilling the request.” That’s deliberately generic: it’s often application code or a runtime/config error, but the status code alone doesn’t prove that — check app logs to confirm.
  • 502 Bad Gateway — “the server, while acting as a gateway or proxy, received an invalid response from an inbound server.” This points at an upstream interaction, not a single vendor: check the chain of load balancer, reverse proxy, CDN, and the origin behind them.
  • 503 Service Unavailable — “the server is currently unable to handle the request due to a temporary overload or scheduled maintenance.” Look at capacity, traffic spikes, and whether something is in a maintenance state. (This is also the code you want to send on purpose during planned downtime — see below.) Note the spec’s own caveat: an overloaded server isn’t required to return 503 at all — “some servers might simply refuse the connection,” which can show up as a timeout or connection error instead of a clean status code.
  • 504 Gateway Timeout — “the server, while acting as a gateway or proxy, did not receive a timely response from an upstream server.” It marks a timeout boundary, not which upstream component was slow: check long database queries, slow third-party calls, and an origin struggling under load.

A practical thread runs through these: 5xx often traces back to an overloaded or slow backend, so server performance work — faster queries, lighter server-side rendering, more capacity — is frequently part of the fix, not a side quest. But because the same status code can come from any layer in the chain, the code narrows your search; the logs tell you where the failure actually happened.

Common causes

  • Overloaded host. Traffic spikes (including aggressive crawling) outrun your server’s capacity and it starts shedding requests as 5xx.
  • Application or database errors. Unhandled exceptions, a downed DB, a bad deploy, exhausted connection pools.
  • Misconfiguration. A broken config after a change, an expired dependency, a full disk.
  • Upstream / CDN failures. Your origin is fine but a proxy, load balancer, or CDN in front of it is returning 502/504 — or the CDN itself had an outage.
  • A CDN/WAF or rate limiter blocking Googlebot. Bot protection, security rules, or rate limiting that mistakes Googlebot for an attacker can return 5xx or 429 only to Googlebot while real users see the site fine. This one is under-covered and a frequent real-world cause — which is why you have to reproduce as Googlebot, not just check the page in your browser.

How to diagnose it

Work from the whole-site view down to the single URL:

  1. Crawl Stats → Host availability. In Search Console, Settings → Crawl stats. The host status section and the by-response-code breakdown show whether 5xx is a persistent, large-scale issue or an isolated blip, and roughly when it started.
  2. Server and access logs. The ground truth. Filter your logs to Googlebot (verified — see the Scripts tab) and look at the status codes it actually received and when. Logs will show you a CDN/WAF blocking Googlebot that a browser test never would.
  3. URL Inspection → Live Test. Run a flagged URL through URL Inspection and use Test Live URL. This confirms whether Google-InspectionTool can access the page right now — useful, but it’s a current-state check, not proof of what happened at the earlier time Google logged the 5xx. A page that loads fine for you (in a browser, or via Live Test) minutes or hours later doesn’t rule out a real error at the moment Googlebot actually hit it — time, IP, geo, cache state, and bot-detection rules can all differ between the two requests.
  4. Reproduce as Googlebot. Request the URL with Googlebot’s user-agent (and, if you can, from outside your network) to catch WAF/rate-limit rules that only fire for the bot. Treat this as a differential test, not verified proof of what Googlebot itself saw — a Googlebot user-agent string is trivial to spoof in either direction. Before you loosen a WAF, CDN, or rate-limit rule because “it’s only blocking Googlebot,” confirm the traffic in your logs is real Googlebot via reverse DNS or Google’s published IP ranges (see the Scripts tab) — don’t change a security control based on the user-agent header alone.

How to fix it

Once you know the cause, the fixes follow Google’s own “fixing server errors” guidance:

  • Confirm the scale in Crawl Stats before you change anything — is this persistent and large, or a one-off?
  • Reduce excessive page loading for dynamic requests. Cache expensive pages, optimize slow queries, and stop generating heavy responses on every hit.
  • Make sure the host isn’t down, overloaded, or misconfigured. Add capacity, fix the config, restart the broken service, check the database.
  • Make sure you’re not inadvertently blocking Google. Audit CDN/WAF/bot rules and rate limits for anything firing 5xx or 429 at Googlebot.
  • Control crawling wisely. If aggressive crawling is overloading you, the answer is a temporary 503/429 to ease the bot off — not a permanent block.

The right way to take a site down on purpose — 503 + Retry-After

Sometimes you want the site unavailable: a migration, scheduled maintenance, pausing an online business. Doing it wrong turns a planned event into a deindexing event. Google’s Pause your online business in Google Search doc is explicit about the correct approach.

Google’s default recommendation is to keep the site up, just limited. If the closure is temporary and you plan to reopen, Google’s own preference is that you “keep your site online and limit the functionality” rather than take it fully offline. Full disable-and-503 is the urgent option, not the default one.

When you do need the whole site down, use 503 (Service Unavailable) with a Retry-After header. Google: “If you need to urgently disable the site for 1-2 days, then return an informational error page with a 503 HTTP response status code.” And pair it with the header: “Use the retry-after HTTP header with a best effort date or duration.” The 503 says “temporarily down,” and Retry-After tells the bot roughly when to come back — but treat that header as advisory, not a guarantee: it’s a best-effort signal, not a promise Google will recrawl at that exact time.

It’s a short-term measure only. Google calls it “an extreme measure that should only be taken for a very short period of time (a few days at most).” And the warning that competitors leave out: “Completely closing a site even for just a few weeks can have negative consequences on Google’s indexing of your site.” Google is explicit that there’s no way to shortcut your way back from that either — “there’s no fixed time for a recovery from a complete removal, and there’s no mechanism to speed that up.” In other words, a correct 503 protects you for a day or two — but no status code, and no amount of validating in Search Console, saves you from the indexing damage of being down for weeks, or gives you a guaranteed comeback date. If you need a long outage, that’s a different conversation (and probably a redirect or a real plan).

Why not a 200 or a 404

  • Don’t serve a 200 “under maintenance” page. Google will treat that page’s content as the real page and may index your “we’ll be back soon” message. The content from a proper 503, by contrast, is ignored — which is what you want.
  • Don’t return a 404 (or 403/410). Google’s guidance is explicit: don’t block the site by returning 403, 404, or 410 during downtime. A 404 signals gone, not temporarily down; you want the page preserved, and a 503 does that.

The robots.txt trap — keep it crawlable

This is the single most-missed detail, and it can pause crawling for your entire site. During a 503 maintenance window, your robots.txt file must keep returning 200 and stay crawlable. Google is blunt: “Don’t return a 503 HTTP response status code for the robots.txt file because this blocks all crawling.” Carve robots.txt out of the maintenance handler so it always answers 200 — don’t rely on what happens if you don’t.

For context, Google’s robots.txt spec doc lays out what actually happens if robots.txt itself starts erroring, and it’s staged rather than an instant, permanent lockout: for the first 12 hours Google stops crawling the site while still retrying robots.txt; for the next 30 days it falls back to the last known good version of robots.txt while still trying to fetch a fresh one; and after 30 days, if the site is otherwise reachable, Google drops the cached version and behaves as if there’s no robots.txt file at all (i.e., no crawl restrictions from it) rather than continuing to block. If there’s no cached version to fall back on in the first place, Google likewise assumes there’s no crawl restriction. None of that is a reason to risk it on purpose — a multi-day crawl pause at the start of the window is still real damage — it just means “robots.txt 503’d” isn’t a permanent, unrecoverable state if it happens by accident and gets fixed.

Validating the fix in GSC

After the server is healthy again:

  1. Open the Server error (5xx) issue in the Page Indexing report.
  2. Click Validate Fix. Google re-crawls the affected URLs in batches.
  3. Watch the validation state. As URLs come back 200, they clear; if some still error, the validation flags them and you diagnose those specifically.

You don’t have to wait for validation to re-crawl naturally — but Validate Fix prioritizes the affected set and gives you a status to track. Remember the crawl rate itself ramps back gradually once you’re returning 2xx, so don’t expect an instant snap-back to your old crawl volume.

Where this sits

A 5xx is a crawl-and-serve problem, so it touches the neighbors: persistent 5xx hammers your crawl rate (the lever Googlebot pulls when your server struggles), and the host-level view of it lives in the Crawl Stats report and its host status. It’s distinct from a 404 (not found), which signals gone rather than broken and is handled far more gently. For the bigger picture of how discovery and fetching work, see the crawling hub; for the rest of the Page Indexing statuses, see the GSC Page Indexing hub.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin an expert quote first.