Visible date disagrees with schema: which date is wrong
A page states its date in several places and presence checks pass as soon as one exists. squirrel compares the byline, the schema and the URL year.
What date agreement is
A dated page usually carries its date more than once: a visible byline, datePublished and dateModified in schema, a year in the URL or the title, the sitemap lastmod, the Last-Modified header. Readers see one of those and crawlers read another.
Different dates are not automatically a contradiction: a publication date and a modification date describe different events and should differ. What should agree is the visible and the machine-readable version of the same event. When those disagree, one of them is wrong, and a presence check cannot tell you which, because it passes as soon as any single signal exists. The usual cause is a template printing a build-time or hardcoded value while the schema prints the CMS field, or the other way round.
What squirrel checks
The rule runs on every crawled page. It reads the visible byline date, the schema dates on the node that describes this document, and any year in the URL or title. Only a node of a document type counts, so a sitewide Organization or SoftwareApplication node cannot supply the date. Four check names exist and at most two appear in one result, since the schema-source branch returns immediately and the byline and missing-date branches are mutually exclusive:
schema-date-sourcereports info when the only schema date sits on a non-document node. Message:The only schema date on this page is datePublished 2019-04-02 on a SoftwareApplication node, which describes that entity rather than this page — the visible date 12 March 2026 has nothing to be checked against. Add datePublished/dateModified to an Article or WebPage node.byline-vs-schema-datecompares every visible date against every schema date and takes the closest pairing, so one visible date that matches prevents a warning. It is skipped for a non-article document node with several visible dates. It warns when that closest pair is more thantolerance_daysapart. Message:The visible date reads 12 March 2026 but the Article schema says datePublished 2026-01-04 — 67 day(s) apart, so readers and crawlers are being told different things. It passes otherwise withVisible date 12 March 2026 agrees with the Article schema dates.visible-date-missingwarns when an article-type node carries a date and the page shows the reader none. Message:This Article states datePublished 2026-03-12 in its schema but shows the reader no date at all.url-title-yeartakes the year from a URL path segment that is a year on its own (/blog/2024/03/caching) or that opens a dated slug with a two-digit month and a day (/2024-03-12-caching;/2024-10-best-toolsis a title, not a date), and looks at the title only when the path has none. A year inside a slug, such as/reviews/2024-honda-civic-review, is a model year or a round-up title rather than a date and is ignored. It warns when that year is not one of the schema years. Message:The title says 2024 but the Article schema dates are from 2026. It passes otherwise withThe title year 2024 matches the Article schema dates.
Which dates squirrel can read
Visible dates are read in these forms: ISO (2026-01-08), written month names in English, French, German, Spanish, Italian, Portuguese, Dutch and Polish (Publié le 8 janvier 2026, Veröffentlicht am 8 Januar 2026, 8 de enero de 2026, 8 stycznia 2026), year-month-day with Japanese, Chinese or Korean markers (2026年1月8日), and numeric day, month and year (08/01/2026, 8.1.2026). A numeric date such as 08/01/2026 is the 8th of January in most of the world and the 1st of August in the US, so it is compared both ways: it only counts as a disagreement when neither reading is close to the schema date.
The visible-date-missing check is suppressed by any date-shaped string in the selected content root, even one squirrel cannot fully parse (31 April 2024, 2024 March 12, 8/1/26, 2026年1月), so it stays silent on those pages instead of claiming the page shows no date. The word between the day and the year has to be a month name from the languages above: 3 million 2024 or Top 10 2024 is not a date. A date written with the months of another language is not recognised, so that page can still get visible-date-missing. For that suppression only, a bare dot counts as a day marker (8. Januar 2026), so Version 3. March 2024 also reads as date-shaped. A bare dot is never read as a date to compare with the schema, so a German byline written 8. Januar 2026 silences visible-date-missing but is not compared; write it 8 Januar 2026 or use a <time datetime> to have it checked. Text from sibling elements is separated before matching, so a date that runs straight into the next element (March 12, 2024Read more) is still found.
Severity warning, weight 4. The rule is skipped on soft 404 pages, whose dates describe nothing.
How to fix it
Render the visible date and the schema date for the same event from the same field. When the byline and the schema disagree, find which one renders from the wrong field, and check that the schema date is attached to the node describing the page rather than to a sitewide entity. Keep the publication and modification dates as separate values: they are meant to differ.
If the schema carries dates the reader never sees, render the date in the article header. Google asks for a visible date on dated content, and a date only crawlers can see is not one.
| Rule ID | content/date-agreement |
| Category | Content |
| Scope | Per-page |
| Severity | warning |
| Weight | 4/10 |
Options
| Option | Type | Default | Description |
|---|---|---|---|
tolerance_days | number | 1 | Days the visible byline date may differ from the schema document date before warning |
Configuration example
[rule_options."content/date-agreement"]
tolerance_days = 3Enable / disable
Disable this rule
[rules]
disable = ["content/date-agreement"]Disable all Content rules
[rules]
disable = ["content/*"]Enable only this rule
[rules]
enable = ["content/date-agreement"]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: the sitemap date compared against the same page dates.
- content/freshness: whether the page publishes any date signal at all.
- content/stale-copyright: the footer year, a different date claim.
- eeat/content-dates: dates as a trust signal rather than a consistency one.
Content findings ship in every audit next to the SEO, performance and agent experience rules. See Fix SEO issues with AI for how an agent works through a report.
References
Check your site
Run squirrel audit https://example.com and open the Content section of the report. Each disagreement is reported with both dates and the gap between them. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.