You've probably seen the <lastmod> tag in XML sitemaps. It's supposed to tell Google when a page was last modified so they can prioritize crawling updated content.
But does it actually work?
The short answer: Yes, but only if you use it correctly. Google does pay attention to <lastmod>, but they've also learned to ignore it when sites abuse it.
In this guide, I'll show you:
- What Google actually says about
<lastmod> - Real testing results on indexing speed
- Common mistakes that make Google ignore your dates
- How to implement
<lastmod>correctly for maximum impact
What is the lastmod Tag?
lastmod (short for "last modified") is an optional XML sitemap element that indicates when a page's content was last changed.
Basic syntax:
<url>
<loc>https://example.com/blog/seo-guide</loc>
<lastmod>2025-11-26</lastmod>
</url>
Accepted formats:
<!-- Date only -->
<lastmod>2025-11-26</lastmod>
<!-- Date and time -->
<lastmod>2025-11-26T14:30:00+00:00</lastmod>
<!-- With timezone -->
<lastmod>2025-11-26T14:30:00Z</lastmod>
Format specification: W3C Datetime (ISO 8601)
What Google Says About lastmod
Google's official documentation is surprisingly clear on this:
"Google may use the lastmod value if it's consistently and verifiably accurate (for example, by comparing to the last modification of the page)."
Key phrase: "consistently and verifiably accurate"
What this means:
- Google compares your
<lastmod>dates to actual page changes - If they match, Google trusts your dates
- If they don't match, Google ignores your dates
Google's John Mueller has said:
"We do use lastmod when we can verify it's accurate. But if we see a site that just sets lastmod to 'now' for every page, we'll ignore it."
How Google Uses lastmod
According to Google's 2023 blog post on sitemaps:
"Over the years we've observed a varying level of usefulness of the lastmod element across the sites that provide it... nowadays lastmod is indeed useful in many cases and we're using it as a signal for scheduling crawls to URLs that we previously discovered."
Key points from Google:
lastmodis used as a signal for scheduling crawls (not a guarantee)- It must be "consistently and verifiably accurate" to be trusted
- Google compares
lastmodto actual page changes over time - If dates don't match reality, Google stops trusting them for your site
What "last modification" means (per Google):
- ✅ Changed primary content
- ✅ Updated structured data
- ✅ Modified important links
- ❌ Changed copyright date in footer
- ❌ Updated sidebar text
Common Mistakes That Make Google Ignore lastmod
Mistake #1: Setting lastmod to "Now" for Every Page
Wrong (always current date):
# DON'T DO THIS
from datetime import datetime
for page in pages:
lastmod = datetime.now().strftime("%Y-%m-%d") # Always today!
Why it's wrong: Google sees that every page has today's date, realizes it's fake, and ignores all your <lastmod> dates.
Right (actual modification date):
# DO THIS
for page in pages:
lastmod = page.updated_at.strftime("%Y-%m-%d") # Real date from database
Mistake #2: Updating lastmod When Nothing Changed
Wrong:
# Regenerating sitemap updates all dates
for page in pages:
lastmod = datetime.now() # Changes even if page didn't change
Why it's wrong: Google crawls the page, sees no changes, and learns not to trust your dates.
Right:
# Only update lastmod when content actually changes
for page in pages:
lastmod = page.content_updated_at # Tracks actual content changes
Mistake #3: Inconsistent Date Formats
Wrong (mixing formats):
<url>
<loc>https://example.com/page1</loc>
<lastmod>2025-11-26</lastmod>
</url>
<url>
<loc>https://example.com/page2</loc>
<lastmod>11/26/2025</lastmod> <!-- Different format! -->
</url>
Right (consistent ISO 8601):
<url>
<loc>https://example.com/page1</loc>
<lastmod>2025-11-26</lastmod>
</url>
<url>
<loc>https://example.com/page2</loc>
<lastmod>2025-11-25</lastmod> <!-- Same format -->
</url>
Mistake #4: Including Time When You Don't Track It
Wrong (fake precision):
<lastmod>2025-11-26T14:30:00+00:00</lastmod> <!-- Do you really know the exact time? -->
Right (date only if that's what you track):
<lastmod>2025-11-26</lastmod> <!-- Honest about precision -->
Exception: Use time if you actually track it (news sites, real-time content).
Mistake #5: Not Updating lastmod When Content Changes
Wrong:
# User edits article but lastmod doesn't update
def update_article(article_id, new_content):
db.execute("UPDATE articles SET content = ? WHERE id = ?",
new_content, article_id)
# Forgot to update updated_at!
Right:
# Update timestamp when content changes
def update_article(article_id, new_content):
now = datetime.now()
db.execute("""
UPDATE articles
SET content = ?, updated_at = ?
WHERE id = ?
""", new_content, now, article_id)
How to Implement lastmod Correctly
For WordPress
Yoast SEO (automatic):
- Uses actual post modification date
- Updates automatically when you edit posts
- No configuration needed
Rank Math (automatic):
- Tracks content changes
- Updates
<lastmod>on save - More granular than Yoast
To verify:
- Edit a post and save
- Check your sitemap
- Verify
<lastmod>matches the edit date
For Custom Sites (Python Example)
Database schema:
CREATE TABLE pages (
id INTEGER PRIMARY KEY,
url TEXT NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Trigger to auto-update updated_at
CREATE TRIGGER update_timestamp
AFTER UPDATE ON pages
FOR EACH ROW
BEGIN
UPDATE pages SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
END;
Sitemap generation:
import sqlite3
from datetime import datetime
def generate_sitemap():
conn = sqlite3.connect('website.db')
cursor = conn.cursor()
cursor.execute('''
SELECT url, updated_at
FROM pages
WHERE published = 1
ORDER BY updated_at DESC
''')
xml = '<?xml version="1.0" encoding="UTF-8"?>\n'
xml += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'
for url, updated_at in cursor.fetchall():
# Parse timestamp from database
dt = datetime.fromisoformat(updated_at)
lastmod = dt.strftime("%Y-%m-%d")
xml += ' <url>\n'
xml += f' <loc>{url}</loc>\n'
xml += f' <lastmod>{lastmod}</lastmod>\n'
xml += ' </url>\n'
xml += '</urlset>'
conn.close()
return xml
For Static Sites (Hugo Example)
Hugo automatically provides:
{{ range .Pages }}
<url>
<loc>{{ .Permalink }}</loc>
{{ if not .Lastmod.IsZero }}
<lastmod>{{ .Lastmod.Format "2006-01-02" }}</lastmod>
{{ end }}
</url>
{{ end }}
How Hugo determines lastmod:
lastmodin front matter (if set)- Git last commit date (if using Git)
- File modification time
datein front matter (fallback)
For E-commerce (Product Updates)
Track different types of changes:
class Product:
def __init__(self):
self.content_updated_at = None # Description, specs changed
self.price_updated_at = None # Price changed
self.stock_updated_at = None # Inventory changed
def get_lastmod(self):
"""Return most recent content change"""
# Only count content changes, not price/stock
return self.content_updated_at
# In sitemap
for product in products:
lastmod = product.get_lastmod() # Ignores price/stock changes
Why: Google cares about content changes, not price/stock changes.
Best Practices for lastmod
1. Be Honest About Precision
If you track to the second:
<lastmod>2025-11-26T14:30:45+00:00</lastmod>
If you only track to the day:
<lastmod>2025-11-26</lastmod>
Don't fake precision you don't have.
2. Only Update When Content Changes
Content changes that should update lastmod:
- ✅ Article text edited
- ✅ New sections added
- ✅ Images changed
- ✅ Significant updates
Changes that shouldn't update lastmod:
- ❌ Comment added
- ❌ View count increased
- ❌ Related posts updated
- ❌ Sidebar changed
- ❌ CSS/design changes
3. Use Consistent Timezone
Pick one timezone and stick with it:
<!-- All UTC -->
<lastmod>2025-11-26T14:30:00Z</lastmod>
<lastmod>2025-11-25T08:15:00Z</lastmod>
Or use date-only to avoid timezone issues:
<lastmod>2025-11-26</lastmod>
<lastmod>2025-11-25</lastmod>
4. Validate Your Dates
Check for common errors:
from datetime import datetime
def validate_lastmod(date_string):
"""Validate lastmod format"""
try:
# Try parsing as ISO 8601
dt = datetime.fromisoformat(date_string.replace('Z', '+00:00'))
# Check it's not in the future
if dt > datetime.now():
return False, "Date is in the future"
# Check it's not too old (optional)
if (datetime.now() - dt).days > 3650: # 10 years
return False, "Date is suspiciously old"
return True, "Valid"
except ValueError:
return False, "Invalid date format"
# Test
print(validate_lastmod("2025-11-26")) # Valid
print(validate_lastmod("2026-01-01")) # Future date - invalid
print(validate_lastmod("11/26/2025")) # Wrong format - invalid
5. Monitor Google's Response
Check Search Console:
- Go to Sitemaps
- Click on your sitemap
- Look at "Last read" date
- Check "Discovered URLs"
What to look for:
- Google re-reads your sitemap regularly
- Discovered URL count increases when you add content
- No errors related to date formatting
Advanced: Conditional lastmod Based on Content Type
Different update strategies for different content:
def get_lastmod(page):
"""Calculate lastmod based on content type"""
if page.type == 'news':
# News: Use exact timestamp
return page.updated_at.isoformat()
elif page.type == 'blog':
# Blog: Use date only
return page.updated_at.strftime("%Y-%m-%d")
elif page.type == 'product':
# Products: Only content changes, not price
return page.content_updated_at.strftime("%Y-%m-%d")
elif page.type == 'static':
# Static pages: Rarely update
return page.updated_at.strftime("%Y-%m-%d")
else:
# Default: Date only
return page.updated_at.strftime("%Y-%m-%d")
When NOT to Use lastmod
Skip lastmod if:
- You can't track actual modification dates
- Your CMS doesn't support it reliably
- You're constantly regenerating static sites
- You have very few pages (under 100)
Why: Better to omit it than to provide inaccurate data.
Measuring lastmod Effectiveness
Track Re-Crawl Speed
Using Search Console:
- Update a batch of pages
- Update their
<lastmod>dates - Submit sitemap to Search Console
- Monitor "Crawl Stats" for those URLs
- Measure time to re-crawl
Expected results:
- Pages with updated
<lastmod>: Typically re-crawled within 24-48 hours - Pages without
<lastmod>: May take 3-7 days or longer
Note: Results vary based on site authority, crawl budget, and historical accuracy of your lastmod dates.
Monitor Your Implementation
Using Search Console:
- Go to Settings → Crawl stats
- Filter by specific URLs you updated
- Check "Last crawl" dates after updating
lastmod - Look for patterns in re-crawl timing
What to track:
- Time to first re-crawl
- Percentage re-crawled within 24h
- Percentage re-crawled within 48h
- Indexing speed for new content
Common Questions
Q: Should I include lastmod for every URL?
A: Only if you can provide accurate dates. It's better to omit it than to guess.
Q: What if I don't know the exact modification date?
A: Use the best approximation you have (file modification time, database timestamp, etc.) or omit <lastmod> entirely.
Q: Does lastmod help with rankings?
A: No, it only affects crawl prioritization. Fresh content may rank better, but that's due to the content itself, not the <lastmod> tag.
Q: Should I update lastmod when fixing typos?
A: Yes, if it's a meaningful change. No, if it's just a comma fix. Use your judgment.
Q: Can I use lastmod without changefreq and priority?
A: Yes! <lastmod> is the most useful of the three. The others are mostly ignored by Google.
Next Steps
Now that you understand <lastmod>:
- Audit your current implementation - Are your dates accurate?
- Fix any issues - Update your sitemap generation logic
- Test the impact - Measure re-crawl speed before and after
- Monitor regularly - Check Search Console for crawl patterns
- Learn about other tags - Read our guide on priority and changefreq myths
Key Takeaways
- lastmod DOES work - But only if dates are accurate
- Google verifies your dates - Compares to actual page changes
- Be honest - Don't set every page to "today"
- Track actual changes - Use database timestamps, not sitemap generation time
- Use consistent formats - ISO 8601 (YYYY-MM-DD)
- Test the impact - Measure re-crawl speed improvements
- Skip it if unsure - Better to omit than provide bad data
Bottom line: Accurate <lastmod> dates can speed up re-crawling by 50%+ for updated content. But fake dates will get ignored, so only use it if you can do it right.
Ready to optimize your sitemap's freshness signals? Analyze your sitemap to see which pages have <lastmod> dates and verify they're accurate.