Dynamic Content for AI
Modern web apps often load content dynamically via AJAX, WebSockets, or client-side routing. Learn how to make this content visible to AI crawlers.
In this guide
- Handling AJAX-loaded content
- SPA considerations for crawlers
- Pagination and infinite scroll
- Real-time content strategies
The Dynamic Content Challenge
AI crawlers typically fetch a URL and process the response. Content loaded afterward through JavaScript may be completely invisible:
<!-- What crawlers see -->
<div id="content">
<div class="loading">Loading...</div>
</div>
<!-- What users see (after JS executes) -->
<div id="content">
<h2>Product Features</h2>
<p>Our CRM includes contact management, deal tracking...</p>
</div> Single Page Applications (SPAs)
SPAs present unique challenges because the entire application runs client-side:
Problem: Hash-based Routing
https://app.com/#/about
Crawlers may not process hash fragments as separate pages
Solution: History API Routing
https://app.com/about
Each route is a distinct, crawlable URL
SPA Solutions
- • Pre-rendering: Generate static HTML for each route at build time
- • SSR: Render on the server for each request
- • Hybrid: SSR for initial load, SPA for navigation
AJAX Content
For content loaded via AJAX requests, ensure critical information is also available in the initial HTML:
<!-- Include key content in HTML, enhance with JS -->
<div id="pricing">
<!-- Base content for crawlers -->
<h2>Pricing</h2>
<p>Plans start at $29/month</p>
<!-- JS-enhanced pricing calculator loaded here -->
<div id="calculator" data-enhance="true"></div>
</div> Pagination Strategies
Proper pagination ensures crawlers can discover all your content:
Traditional Pagination
Best for AI visibility. Each page has a unique, crawlable URL:
/blog?page=1
/blog?page=2
/blog?page=3
<!-- With rel links for crawlers -->
<link rel="prev" href="/blog?page=1" />
<link rel="next" href="/blog?page=3" /> Infinite Scroll
Provide a paginated alternative for crawlers:
<!-- Hidden pagination links for crawlers -->
<nav class="pagination" aria-label="Blog pages">
<a href="/blog?page=1">Page 1</a>
<a href="/blog?page=2">Page 2</a>
...
</nav> "Load More" Buttons
Similar to infinite scroll. Include crawlable pagination links:
<button id="load-more">Load More</button>
<!-- Also provide: -->
<a href="/blog?page=2" class="sr-only">Next page</a> Tabs and Accordions
Content hidden in tabs or accordions may not be indexed. Solutions:
Option 1: Include in HTML
Render all tab content in HTML, use CSS/JS to show/hide. Content is accessible to crawlers.
Option 2: Separate Pages
Make each tab a separate URL. Better for large amounts of tabbed content.
Real-Time Content
For content that updates frequently (stock prices, live feeds, etc.):
Provide Static Snapshots
Generate periodic static versions of real-time data that crawlers can index.
Archive Historical Data
Create crawlable archives of past data (daily summaries, historical records).
API Feeds
Offer structured data feeds (RSS, JSON) for frequently updated content.
Key Takeaway
Progressive enhancement is the safest approach.
Start with static, crawlable HTML that contains your critical content, then enhance the experience with JavaScript. This ensures AI crawlers can always access your content, regardless of their JS capabilities.
Sources
- Dynamic Rendering | Google: Google's guidance on dynamic rendering for crawlers
- Progressive Enhancement | Smashing Magazine: Progressive enhancement best practices