Sitemap lastmod stamped at build time: how to detect it
If every lastmod carries the same date, the field records your deploy, not your content. squirrel counts distinct days across the sitemap.
What lastmod churn is
<lastmod> records when a page’s content last changed, so a crawler can prioritise what has actually moved. Its usefulness depends on the values being derived from the content rather than from the pipeline that publishes it.
When several hundred URLs all carry the same date, that is what a build-time stamp looks like: the generator writing the current time onto every entry each run. It is not proof, since a site really can republish everything on one day, and this is why the rule reports rather than fails. But a lastmod that moves on every deploy tells a crawler nothing it can act on.
What squirrel checks
The rule is site-wide. It walks every <lastmod> in every discovered sitemap, parses each into a calendar day, and counts distinct days. Google News sitemaps are excluded from the sample and counted separately.
- Skipped when no sitemap was discovered. Message:
No sitemap to validate. - Skipped when fewer than 20 non-news URLs carry a
lastmod. Message:Only 8 sitemap URL(s) carry a lastmod; sitemap is too small to judge lastmod churn. - Skipped with different wording when fewer than 20 URLs carry a
lastmodthat names a day, and some name only a year or a month (2024,2024-09, which the W3C Datetime format allows). Those say nothing about the day a page changed, so they are left out of the sample rather than read as their first day. Alastmodcounts on the day it was written, whatever its offset or format:2024-09-10T23:30:00-05:00is the 10th, though it is the 11th in UTC, and2024/09/10is the 10th on every machine. Message:N sitemap lastmod value(s) name only a year or month, which says nothing about the day a page changed; M name a day, too few to judge lastmod churn. - Skipped when enough URLs carry a lastmod but too few of them are dates squirrel can read the same way on every machine (
2024-9,Sep 31 2024, a zone in the middle of the value). Those values are left out of the sample. Message:N sitemap lastmod value(s) are not dates squirrel can read the same way on every machine; M name a day, too few to judge lastmod churn. - Skipped with different wording when every
lastmodcame from a news sitemap. Message:Only news-sitemap URLs carry a lastmod (140); news sitemaps hold ~48 hours of articles by design, so their lastmod values are excluded from this check. - Warn when the values collapse onto two distinct days or fewer. Message:
412 sitemap URL(s) with lastmod collapse onto 1 distinct day(s): 2026-09-08 (from https://example.com/sitemap.xml), with each date listed as an item carrying its count. Severity warning, weight 4. - Pass otherwise. Message:
412 sitemap URL(s) with lastmod spread across 96 distinct days.
A Google News sitemap holds roughly 48 hours of articles by specification, so its lastmod values always cluster. Pooling them in would accuse every news publisher of build-stamping, which is why they are set aside.
How to fix it
<url>
<loc>https://example.com/blog/post</loc>
<lastmod>2026-03-14T09:12:00Z</lastmod>
</url>Drive lastmod from the content’s own modification timestamp, whether that comes from the CMS field or from version control, and leave it alone when a deploy does not change the page. Omitting the element entirely is better than stamping it: an absent lastmod says nothing, and a wrong one says something false.
| Rule ID | crawl/sitemap-lastmod-churn |
| Category | Crawlability |
| Scope | Site-wide |
| Severity | warning |
| Weight | 4/10 |
Enable / disable
Disable this rule
[rules]
disable = ["crawl/sitemap-lastmod-churn"]Disable all Crawlability rules
[rules]
disable = ["crawl/*"]Enable only this rule
[rules]
enable = ["crawl/sitemap-lastmod-churn"]enable replaces the default ["*"], so this is the only rule selected. Leave disable out: a rule that matches any disable pattern is skipped even when enable names it. Only an enabled setting under a rule’s own [rule_options] table overrides both lists.
Related rules
- crawl/sitemap-lastmod-drift: lastmod that disagrees with the page’s own dateModified.
- content/freshness: which date signals the page publishes about itself.
- content/date-agreement: the dates a page shows in its markup and its text.
- crawl/sitemap-valid: structural problems in the same file.
Crawlability findings ship in every audit next to the SEO, performance and agent experience rules. See The Screaming Frog alternative for agents for how an agent works through a report.
References
- Best practices for setting the lastmod element, Google Search Central
- Build and submit a sitemap, Google Search Central
Check your site
Run squirrel audit https://example.com and open the Crawlability section of the report. The distinct dates are listed with how many URLs carry each one. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.