Your Dynamic Rendering Setup Is Showing Googlebot Stale Content

TL;DR

Dynamic rendering serves pre-rendered HTML to search engines while serving JavaScript to users. When the pre-rendered cache becomes stale, Googlebot sees outdated content that doesn’t match what users see. This creates indexing gaps where Google shows old prices, discontinued products, or outdated information because your dynamic rendering layer hasn’t refreshed its cached HTML.


The Conversation

James, senior developer at an e-commerce platform, 50,000 products, custom headless CMS, advanced technical knowledge, customers complaining that Google shows wrong prices: Customers are calling saying our prices in Google are wrong. When they click through, prices are different on our site. But our product data is correct. Something’s wrong with how Google sees us.

SDC SEO Brain: If your product data is current on your site but Google shows old data, there’s a caching layer between your content and Googlebot. Are you using dynamic rendering or a prerendering service?

James: We use Prerender.io. It serves static HTML to search engine bots while real users get our React app.

SDC SEO Brain: There’s your likely problem. Prerender.io caches the pre-rendered HTML. When prices change on your site, Prerender’s cache might still have the old prices. Googlebot sees the cached version, not your live content.

James: But we set cache expiration to 24 hours. Prices should refresh daily.

SDC SEO Brain: 24 hours might be too long for price-sensitive content. If you update prices at 10am and the cache refreshed at 9am, Google has 23 hours of stale pricing. Plus, cache expiration doesn’t guarantee immediate refresh. It expires, but the new version isn’t created until Googlebot requests it again.

James: So even with expiration, there’s a lag?

SDC SEO Brain: Yes. The cycle is: Googlebot requests page → Prerender serves cached HTML (even if stale) → cache expires → next Googlebot request triggers new render → new HTML cached. If Googlebot doesn’t recrawl within your refresh window, the first visit after expiration gets stale content and then creates fresh cache for subsequent crawls.

James: How long is Google seeing stale content?

SDC SEO Brain: Check your crawl stats in Search Console. See when Google last crawled your product pages. Compare that to when prices were changed. If Google crawled after the price change but before Prerender’s cache refreshed, it indexed stale data.

James: We have 50,000 products. We can’t manually manage cache for each one.

SDC SEO Brain: You need automated cache invalidation. Most prerendering services have APIs for purging specific URLs when content changes. When your product management system updates a price, it should trigger a cache purge for that product’s URL. The next Googlebot request gets fresh content.

James: That would be a lot of API calls. We update prices frequently.

SDC SEO Brain: It’s the cost of dynamic rendering. You’re trading rendering complexity for caching complexity. Every price change should invalidate that product’s cached HTML. Otherwise, you’re serving stale content to search engines. The API calls are necessary overhead.

James: What about reducing cache time to 1 hour?

SDC SEO Brain: Shorter cache helps but creates its own problems. Prerendering is resource-intensive. If cache expires hourly for 50,000 products, you’re re-rendering constantly. And you still have the same stale window issue, just shorter. Cache invalidation on change is cleaner than time-based expiration for frequently updated content.

James: Is there a way to verify what Prerender is serving to Googlebot?

SDC SEO Brain: Most prerendering services have dashboards showing cached pages. You can also simulate Googlebot yourself: use curl with Googlebot user-agent and compare the response to what a normal browser sees. If prices differ, your dynamic rendering cache is stale.

James: I’m testing now… the Prerender response shows a price from last week. This has been wrong for a while.

SDC SEO Brain: That confirms the issue. Your customers saw current prices because they got the React app. Google saw last week’s prices because Prerender served cached HTML. The cache invalidation wasn’t working or wasn’t configured for price changes.

James: We only invalidate on product creation and deletion, not edits.

SDC SEO Brain: That’s a common oversight. Any content change that matters for search should trigger invalidation: price changes, availability changes, description updates, image changes. If it affects what Google should see, the cache needs to refresh.

James: That’s going to be a significant development effort.

SDC SEO Brain: It’s either development effort now or ongoing customer complaints and ranking issues. Stale content in search results damages trust and conversion. A customer who sees $50 in Google and $70 on your site feels deceived. That’s worse than the development cost.

James: What about transitioning away from dynamic rendering entirely?

SDC SEO Brain: If you can implement proper server-side rendering or static site generation with incremental static regeneration, you eliminate the Prerender dependency. Your server renders fresh HTML directly, no caching layer between you and Googlebot. Modern frameworks like Next.js handle this well for e-commerce.

James: We’re on a custom stack. Moving to Next.js is a major project.

SDC SEO Brain: Understood. Then optimize your current setup: implement comprehensive cache invalidation triggers, reduce cache duration for high-change-velocity pages, and monitor for drift between cached and live content. Dynamic rendering works but requires active management.

James: How do we monitor for drift?

SDC SEO Brain: Build a comparison tool. Periodically fetch your URLs as Googlebot and compare key data points (price, availability, title) to your live database. Flag any discrepancies. This catches cache issues before customers do.


FAQ

Q: Why does dynamic rendering show stale content?
A: Dynamic rendering pre-renders and caches HTML for search engines. If the cache isn’t invalidated when content changes, search engines see the cached version with old data. The cache serves stale content until it expires or is manually purged.

Q: How do I invalidate dynamic rendering cache on content change?
A: Most prerendering services offer APIs for cache invalidation. Configure your CMS or product management system to call the invalidation API whenever significant content changes occur. Price changes, availability updates, and description edits should all trigger invalidation.

Q: Is shorter cache duration a solution?
A: Shorter duration reduces stale windows but doesn’t eliminate them. You still have lag between content change and cache refresh. For frequently changing content like prices, event-driven cache invalidation is more reliable than time-based expiration.

Q: Should I stop using dynamic rendering?
A: Consider it if your content changes frequently and cache management is becoming burdensome. Server-side rendering or static site generation with incremental regeneration can provide fresh content directly without a caching layer. However, these solutions have their own complexity.


Summary

Dynamic rendering caches pre-rendered HTML that can become stale when your live content changes. Price changes, availability updates, and other edits won’t appear in search results until the cache refreshes.

Time-based cache expiration creates stale windows where Googlebot sees outdated content. Event-driven cache invalidation triggered by content changes is more reliable for frequently updated content.

Implement invalidation for all significant content changes: price edits, availability updates, description changes, image replacements. Any change that matters for search should trigger cache purge.

Monitor for cache drift by periodically comparing what Googlebot sees versus your live data. Catching discrepancies proactively prevents customer complaints and trust damage.

Consider transitioning to SSR or static generation if dynamic rendering cache management becomes too complex. These approaches serve fresh content directly without intermediate caching layers.


Sources

  • Google Search Central: Dynamic rendering
  • Prerender.io: Cache management documentation