Most Sitemaps We Audit Fail Validation. Ours Was Valid and Still Wrong
49 audited sites: 57% of sitemaps fail XML validation, and the passing ones hide worse problems. Includes the day our own valid sitemap went dark.
Between May 5 and August 15, 2026, we validated the XML sitemap of every site that completed an audit — 49 domains, latest snapshot each. 28 of them, 57.1%, failed validation outright: malformed XML, missing protocol namespace, broken loc entries, or lastmod values no crawler is required to honor.
That makes the sitemap the most broken discovery file we measure. And the same week we compiled these numbers, we found the most instructive sitemap failure in the entire dataset on our own domain — inside a sitemap that passed every validation check.
More than half of sitemaps fail before a crawler reads the first URL
Our engine runs 4 separate sitemap checks, and they fail in a telling order. Validation — the shallowest check — fails most. The deeper checks, which fetch the listed URLs and test whether each one deserves to be in a sitemap at all, fail less often but cost more when they do.
| XML validates against the sitemap protocol | 49 | 28 | 57.1% |
| Listed URLs free of soft 404s | 46 | 10 | 21.7% |
| Listed URLs free of noindex directives | 21 | 7 | 33.3% |
| Listed URLs answer without redirecting | 19 | 5 | 26.3% |
Methodology: latest completed audit snapshot per domain from our current checkset, May 5 – August 15, 2026, anonymized. 49 audited sites; per-check denominators vary between 19 and 49 because the deeper checks only run where the sitemap and its sampled member URLs could actually be fetched. The sample is self-selected — site owners who ran an audit — and skews small-to-mid-size. Treat the rates as directional.
Validation fails on details most generators never test
The sitemap protocol is small, which is exactly why failing it is avoidable. Our validator checks what the protocol actually requires: the document parses as XML, the root element is urlset or sitemapindex and declares the sitemap namespace, every entry carries a single non-empty loc that is an absolute HTTP or HTTPS URL on the same site as the sitemap, and any lastmod is a valid W3C date or a timezone-qualified datetime.
The failures cluster on the last 2 rules. Cross-site loc entries usually mean a staging hostname or a CDN origin leaked into production. And lastmod is the quiet champion of invalid values: generators love to write database timestamps like 2026-07-14 19:10:31 — space instead of T, no timezone — which is not a W3C datetime. Google's sitemap documentation says it uses lastmod when the values are consistently and verifiably accurate; a format it cannot parse forfeits that signal on every entry. Truncated files fail too: a sitemap that gets cut off mid-transfer is not a smaller sitemap, it is a broken one.
Every failure of this class is a config-layer fix, the same pattern we found in the 10 checks websites fail most: the errors live below anything a browser renders, so nobody sees them without a machine looking.
A valid sitemap can still send crawlers to dead pages
The 3 deeper checks treat the sitemap as a set of claims and test each one. A sitemap entry asserts: this URL is alive, indexable, and worth a crawler's time. Our engine fetches sampled listed URLs and looks for 3 contradictions:
- Noindexed URLs — 33.3% of evaluated sites. A sitemap entry says "index this"; a
noindexrobots directive on the same URL says "do not." Crawlers resolve the contradiction in the direction you do not want, and the mixed signal degrades trust in the rest of the file. 1 in 3 of the sites where we could fetch sitemap members had at least 1 of these contradictions live. - Redirecting URLs — 26.3%. Entries that 301 or 302 somewhere else. The sitemap should list final URLs; every redirect in it is a stale claim and an extra round-trip per crawl.
- Soft 404s — 21.7%. Pages that answer 200 but are not really there: thin responses whose title, heading, or opening text says "not found," pages with almost no words at all, or pages that canonicalize to the homepage. Each one burns crawl budget and teaches crawlers your sitemap exaggerates.
These rates run lower than the validation number, but the order flips when you weigh consequences. An invalid lastmod costs you a scheduling hint. A sitemap full of contradictions and soft 404s costs you crawler trust in the whole file.
Our own sitemap passed validation while hiding every article
On August 15, 2026, we discovered that seoreport.dev's sitemap had been silently omitting every article URL we have ever published.
The cause was an authorization hardening we deployed on August 1. It moved the API's plugin routes to default-deny — the right security posture — but the allowlist admitted only a single internal surface. The public article endpoints started answering 401 to anonymous callers, including our own sitemap generator and our own articles page. The generator caught the failure, logged nothing, and emitted a perfectly valid sitemap containing only the static pages. The articles page rendered an empty list. Every published article recorded 0 views in the window.
Nothing alarmed because everything kept passing. The sitemap parsed, declared its namespace, listed real 200-status URLs with well-formed lastmod values. By the validation standard that 57.1% of audited sites fail, ours was exemplary. It was also missing its entire reason to exist. The failure was invisible precisely because the file stayed syntactically valid — a fallback that degrades silently into plausible output is worse than a crash, because a crash gets fixed the same day.
We fixed it the same day, in 4 moves. The authorization boundary now admits the published-article reads explicitly — list, by-slug, view counter — method-scoped, while drafts and mutations stay default-deny. The sitemap generator and article fetchers now log a public-surface failure at error level instead of degrading. A health-check dimension probes the anonymous article route continuously, so this class of outage pages an operator instead of waiting for a human to notice an empty page. And we resubmitted the full URL set via IndexNow the same day — which surfaced a further lesson: an IndexNow key file hosted under /.well-known/ can only vouch for URLs under that path, so host the key at the site root or every site-wide submission comes back 422.
The hygiene contract: a sitemap is a set of promises about every URL in it
Validation is the floor. The standard worth holding is that every entry keeps 4 promises, plus 1 promise about the file itself:
1. Alive: the URL answers 200, directly. No 3xx, no 404, no challenge page. List final URLs only. Verify mechanically:
curl -s https://example.com/sitemap.xml \| grep -o '<loc>[^<]*</loc>' | sed 's/<[^>]*>//g' \| xargs -n1 -P4 curl -s -o /dev/null -w '%{http_code} %{url_effective}\n' \| grep -v '^200'
Any output is a violation.
2. Indexable: no contradicting directives. No <meta name="robots" content="noindex">, no X-Robots-Tag: noindex header, no robots.txt rule blocking the path. If a URL should not be indexed, the fix is removing it from the sitemap, never listing it with a noindex attached.
3. Canonical: the page canonicalizes to itself. An entry whose rel=canonical points elsewhere tells crawlers to index a different URL than the one you submitted. List the canonical, drop the variant.
4. Truthful lastmod. W3C format only — 2026-08-24 or 2026-08-24T08:00:00-05:00 — driven by real content changes. A build pipeline that stamps every entry with deploy time is announcing that your lastmod means nothing, and crawlers learn to treat it that way.
5. Complete: the file contains what it should, and someone is checking. This is the promise our own incident broke. XML validity says nothing about composition, so monitor composition directly — assert that each expected URL class is present, and alert when a class collapses to 0:
count=$(curl -s https://example.com/sitemap.xml | grep -c '/articles/')[ "$count" -ge 1 ] || echo "ALERT: sitemap lost its article URLs"
And make the generator honest: when a data source fails, log loudly and fail the build. A sitemap generator must never degrade into a smaller valid file.
The first 4 promises are what our audit checks on every run — the free report shows which entries break which promise, with the exact URLs. The fifth requires knowing what your sitemap should contain, which only you know; the systematic way to fold that into a repeatable routine is covered in how to run a systematic SEO audit.
A sitemap that validates is not a sitemap that is true. 57.1% of sites have not reached the floor, and the floor is an afternoon of fixes. The ceiling — a file where every entry is alive, indexable, canonical, dated honestly, and complete — is what makes crawlers treat your sitemap as a source of truth. We keep both standards under continuous check now, because we learned the difference on our own domain, the hard way, with the validator saying everything was fine.
See How Your Site Ranks
Get a free AI-powered SEO report with actionable findings and priority fixes for your website.
No signup required.