Sitemaps and feeds
Differentiated lastModified, a priority ladder that says something, hreflang per URL, and an RSS feed generated from the same source so the two cannot disagree.
4 min read · updated 2026-07-26· last reviewed 2026-07-26
This is the highest-value idea in the chapter, so it goes first. A sitemap claiming that 2,100 pages all changed at 03:14 this morning is not a freshness signal. It is noise, and a crawler that encounters it a few times learns that your lastmod field carries no information and stops reading it.
You do not get that trust back by fixing it later. You are then a site with a correct lastmod that nobody reads.
The rest of "Sitemaps and feeds"
867 words covering 4 sections, with the implementation code for 8 checks. The table of contents below is the full outline, so you can see exactly what is behind this.
Already bought it? Read it in your library.
What this chapter covers
- One build timestamp on 2,100 URLs is worse than none
- The principle
- The implementation
- The priority ladder
- The principle
- The implementation
- The integrity test
- The principle
- The implementation
- Feeds
- The principle
- The implementation
Checks this chapter covers
Each one has a command you can run against your own site.
- →The sitemap is composed from the same data the pages render fromcrawl-sitemap-generated
- →lastModified comes from content dates, never from the build timestampcrawl-lastmodified-differentiated
- →A differentiated priority ladder, not 0.8 on everythingcrawl-priority-ladder
- →hreflang alternates are emitted per URL in the sitemapcrawl-hreflang
- →A build-time test fails on duplicate, off-origin or trailing-slash sitemap URLscrawl-sitemap-integrity
- →An RSS feed generated from the same source as the sitemapcrawl-feed-valid
- →Every interpolated value in the feed is XML-escapedcrawl-feed-escaped
- →The feed is declared in the head and linked from the footercrawl-feed-declared