AEO checker result card for Freshness signals showing Missing and 0 out of 20 points because no date was found.
← All Quick Wins
AEO & GEOSEO & Search

Add a publish and updated date to your pages

Show a date readers can see, add it in machine-readable form, and keep the modified date honest.

Where this came from:

ā˜† Save

The quick answer

Show a date on the page where readers can see it, and put the same date in machine-readable form, using datePublished and dateModified in JSON-LD or a date meta tag. Change the modified date only when you make a real change. Nobody can promise a date changes rankings or AI citations.

Bottom lineKeep the visible date, the machine-readable date and the sitemap date in agreement, and change the modified date only for real edits.
On this page

Show a date on the page where readers can see it, and put the same date in machine-readable form: datePublished and dateModified in JSON-LD, or a date meta tag. Update the "modified" date only when you make a real change. That is what the freshness check looks for.

What the freshness check means

The AEO checker looks for a date signal on the page and reports one of four results. If AEO is new to you, SEO, AEO and GEO: what is the difference explains where it fits.

  • Pass: a readable, recent date was found. Keep it accurate.
  • Warning, old date: a date was found, but it is old. Review the page, update it if it is outdated, then change the date.
  • Warning, date can't be read: something looks like a date, but the format isn't machine-readable. Use a standard format.
  • Fail, no date signal: no date found. Add a visible date and a machine-readable one.
AEO checker result card for Freshness signals showing Missing, 0 out of 20 points, because no date was found on the page

When a page has no date signal, the report labels the Freshness signals result "Missing" and scores it 0 out of 20. That is the "Fail, no date signal" case above.

The checker also counts a Last-Modified header as a date signal, alongside the meta tags and JSON-LD fields this post covers.

An old date is not automatically bad. A guide that is still correct can stay as it is. The warning is a prompt to check it, not an order to refresh.

Why dates are worth adding

  • Readers judge whether a page is still current by looking for a date.
  • Search engines and other tools can read dates from the page and from structured data, and a clear, consistent date makes that easier.
  • Content with a clear date is easier to judge when you write answers AI tools can quote, because a reader or a tool can tell how current the answer is.
  • It forces a useful habit of reviewing old pages.

This does not mean newer is always better, and a fresh date will not rescue a thin page. Nobody can promise that a date changes rankings or whether an AI tool cites you.

How to add it

1. Show it on the page

Put a date near the title, such as "Published September 20, 2026. Updated October 2, 2026." Use the <time> element so tools can read it:

<p>
  Published <time datetime="2026-09-20">September 20, 2026</time>.
  Updated <time datetime="2026-10-02">October 2, 2026</time>.
</p>

2. Add it to structured data

The dates belong in your Article structured data. If you haven't added any yet, what to add first is the place to start. Here is an Article with the fields most pages need:

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "How to add a publish and updated date to your pages",
  "image": "https://example.com/images/freshness-dates-cover.png",
  "author": {
    "@type": "Person",
    "name": "Alex Morgan"
  },
  "datePublished": "2026-09-20",
  "dateModified": "2026-10-02"
}

The headline, image and author are example values. Use your own, and keep datePublished and dateModified in the same format as shown. If you also add FAQ markup, the FAQPage schema guide has copy-paste JSON-LD you can combine with this.

You can also set the dates as meta tags, which is a lighter option if you can't edit JSON-LD:

<meta property="article:published_time" content="2026-09-20">
<meta property="article:modified_time" content="2026-10-02">

3. Use a standard format

The ISO format YYYY-MM-DD is the safest. Avoid formats like "20/09/26", where day and month can be confused. If you include a time, add the time zone offset as well, for example 2026-10-02T09:30:00+05:00, so the moment is unambiguous.

4. Make all the dates agree

The visible date, the <time> value, the meta tags and the JSON-LD should say the same thing. A mismatch makes it harder for any tool to trust the page.

Rules for the updated date

  • Change dateModified only when the content really changed: corrected facts, new sections, updated steps.
  • Don't bump the date for a typo fix or a layout change.
  • Don't change the published date. It records when the page first went live.
  • If you update a page, check that the information is right, not just that the date is new. Fake freshness is easy to spot and doesn't help readers.

For Next.js and other frameworks

Store publishedAt and updatedAt as fields on each post (for example in your database), and render both the visible text and the JSON-LD from the same values. That keeps them consistent without extra work. Here is a Next.js App Router page that does it:

// app/blog/[slug]/page.js
import { getPost } from '@/lib/posts'; // your own data source

function formatDate(iso) {
  return new Date(iso).toLocaleDateString('en-US', {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    timeZone: 'UTC',
  });
}

export default async function PostPage({ params }) {
  const { slug } = await params;
  const post = await getPost(slug);

  const jsonLd = {
    '@context': 'https://schema.org',
    '@type': 'Article',
    headline: post.title,
    image: post.coverImageUrl,
    author: { '@type': 'Person', name: post.authorName },
    datePublished: post.publishedAt,
    dateModified: post.updatedAt,
  };

  return (
    <article>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{
          __html: JSON.stringify(jsonLd).replace(/</g, '\\u003c'),
        }}
      />
      <h1>{post.title}</h1>
      <p>
        Published <time dateTime={post.publishedAt}>{formatDate(post.publishedAt)}</time>
        {post.updatedAt !== post.publishedAt && (
          <>
            . Updated <time dateTime={post.updatedAt}>{formatDate(post.updatedAt)}</time>
          </>
        )}
        .
      </p>
      {/* post body */}
    </article>
  );
}

Two details matter here. The visible date and the JSON-LD both read from post.publishedAt and post.updatedAt, so they can't drift apart. And timeZone: 'UTC' stops a date like 2026-10-02 from showing as October 1 for readers west of UTC, because a date-only value is read as midnight UTC.

Keep your sitemap in step

If your sitemap lists a <lastmod> for each page, it should match the page's dateModified. Both describe the same event: the last time the page really changed. In a Next.js sitemap, feed lastModified from post.updatedAt, not from the build date. How to create and submit an XML sitemap shows the code.

How to check

View the source. Search the page source for datePublished, dateModified and <time.

Use the console. Open DevTools, go to the Console, and run this to list every <time> value on the page:

[...document.querySelectorAll('time')].map((t) => t.getAttribute('datetime'))

And this to print the dates from the page's JSON-LD:

document.querySelectorAll('script[type="application/ld+json"]').forEach((s) => {
  try {
    const data = JSON.parse(s.textContent);
    console.log(data.datePublished, data.dateModified);
  } catch (e) {
    console.log('This JSON-LD block is not valid JSON');
  }
});

If a block prints undefined undefined, the dates may be nested inside a @graph array, so look inside it. If one block is not valid JSON, fix that first, because a broken block is ignored.

Run the checker. Run the AEO checker on the page to see what date it picks up and which of the four results you get.

Common mistakes

  • Showing a date visually but not in structured data, or the other way around.
  • Setting every page's modified date to the site's build date.
  • Using a date format a machine can't parse.
  • Updating the date without updating the content.
  • Hiding the date entirely to make old content look current.
  • Letting the sitemap lastmod say one thing and the page dateModified another.

Quick reference

  • Visible date: <time datetime="YYYY-MM-DD"> near the title.
  • Structured data: datePublished and dateModified in Article JSON-LD.
  • Alternative: article:published_time and article:modified_time meta tags.
  • Format: ISO YYYY-MM-DD, with a time zone offset if you add a time.
  • Change dateModified: only after a real content change.
  • Change datePublished: never.
  • Keep in sync: visible text, <time>, JSON-LD, meta tags and sitemap lastmod.
  • Check: view source, the console snippets above, or the AEO checker.

Where to go next

Dates are one item on a longer list. Once they're in place, work through the full audit checklist to see what else a new site needs.

FAQ

Only when the content really changed, such as corrected facts, new sections or updated steps. Do not change it for a typo fix or a layout change.

No. It records when the page first went live.

Use ISO YYYY-MM-DD. If you include a time, add the time zone offset, for example 2026-10-02T09:30:00+05:00, so the moment is unambiguous.

Not automatically. A guide that is still correct can stay as it is. The warning is a prompt to review the page, not an order to refresh it.

Yes. Both describe the last time the page really changed, so feed them from the same updated value rather than the build date.

See how your own site scores

Run the same AEO, SEO, and GEO checks this explainer is about — free, rule-based, no signup.

Run the free scan

Comments

No comments yet — be the first.