squirrelscan
GitHub

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 lastmod that 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. A lastmod counts on the day it was written, whatever its offset or format: 2024-09-10T23:30:00-05:00 is the 10th, though it is the 11th in UTC, and 2024/09/10 is 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 lastmod came 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 IDcrawl/sitemap-lastmod-churn
CategoryCrawlability
ScopeSite-wide
Severitywarning
Weight4/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.

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

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.

Type to search…

↑↓ navigate↵ openesc close