Expired time-bound structured data remains on an indexable page

In the reportTime-bound markup has expired but the page is still live

structured_data_expired_time_bound_markup · Issue

Short answer

Update or remove time-bound markup when its declared lifetime has ended. A past JobPosting validThrough is a permitted way to close a vacancy and does not trigger this check.

Severity: Medium. Correct expired declarations on an indexable page.

Why it matters

Outdated time-bound markup can describe an event or offer that is no longer current. The report shows the exact declaration and the response time used for comparison.

What to do

  1. Check the reported entity type, date property and original markup against the current page.
  2. For Event, use its real endDate; when endDate is absent, the entire startDate calendar day must finish before the event is expired. Update or remove obsolete declarations.
  3. Keep Offer.priceValidUntil and BroadcastEvent.endDate consistent with the actual offer or broadcast.

When to leave it as it is: A JobPosting with a past validThrough is a supported closure method and is not a violation of this rule. An Event that has started and has a future endDate is still ongoing.

What we read

We join complete captured JSON-LD, Microdata or RDFa with the same response’s observation time, page indexing directives, canonical and captured robots policy. We do not run JavaScript or fetch remote contexts.

Event uses endDate when present. Without endDate, an explicit timezone is required to determine the completion of the startDate calendar day. A missing, invalid or unproved timezone does not demonstrate expiry or a correction.

Offer uses priceValidUntil. BroadcastEvent uses endDate when isLiveBroadcast is true. JobPosting is excluded from this check.

A robots Disallow cannot demonstrate that previously expired markup has been fixed. HTML or HTTP noindex is conclusive for this check only when the captured Googlebot robots policy allows fetching the page. A canonical pointing elsewhere is a hint and remains not checked by itself.

Example & evidence

Illustrative comparison at 2026-10-03T12:00:00Z; this is not a live audit.

{"@type":"Event","startDate":"2026-10-02T10:00:00Z","endDate":"2026-10-04T18:00:00Z"}

This event is ongoing and is not expired. Without endDate, a startDate of 2026-10-02T10:00:00Z becomes expired at 2026-10-03T00:00:00Z, after its whole start day has ended.

Confirm & check again

Check for yourself: Compare the reported original declaration with the served HTML and check the intended timezone and response time. Use Google’s relevant structured-data guidance when changing the markup.

Check again: Full audit — Run a new full site audit. A correction requires sufficient current coverage of the same page and no remaining expired declaration. Incomplete capture, an unknown date, unavailable robots policy, canonical-away alone, or noindex behind Disallow does not close the finding.

Limits & sources

Date-only and local datetimes without a proved event timezone remain not checked. The captured page does not provide a reliable event-location timezone inference.

This check does not establish Google indexing, ranking or rich-result display. Cancelled or rescheduled Events are excluded; ambiguous status or unsupported markup remains not checked.

Confidence: High The finding preserves the original declaration, comparison boundary, response clock and indexability evidence. It makes no assumption that missing coverage proves a fix.

Sources

  • Google, Event structured data — Documents Event startDate and endDate, event status and timezone interpretation. Checked 4 October 2026.
  • Google, JobPosting structured data — Allows a past validThrough as one way to close a vacancy. Checked 4 October 2026.

Editorial review: 2 November 2026