<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
<channel>
<title>Prerender</title>
<atom:link href="https://prerender.io/feed/" rel="self" type="application/rss+xml" />
<link>https://prerender.io</link>
<description>Prerender. JavaScript SEO, solved with Dynamic Rendering</description>
<lastBuildDate>Wed, 30 Sep 2026 15:38:17 +0000</lastBuildDate>
<language>en-US</language>
<sy:updatePeriod>
hourly </sy:updatePeriod>
<sy:updateFrequency>
1 </sy:updateFrequency>
<generator>https://wordpress.org/?v=7.1.1</generator>
<image>
<url>https://prerender.io/wp-content/uploads/favicon-150x150.png</url>
<title>Prerender</title>
<link>https://prerender.io</link>
<width>32</width>
<height>32</height>
</image>
<item>
<title>Why Your Website Loses SEO Rankings During a Site Migration</title>
<link>https://prerender.io/blog/why-website-loses-seo-rankings-during-site-migration/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Fri, 02 Oct 2026 08:18:00 +0000</pubDate>
<category><![CDATA[Technical SEO]]></category>
<guid isPermaLink="false">https://prerender.io/?p=14945</guid>
<description><![CDATA[Passed your site migration checklist but lost traffic? Learn 3 rendering failures standard SEO plans miss.]]></description>
<content:encoded><![CDATA[
<p class="wp-block-paragraph">You completed a website migration. Redirects are working, canonicals were preserved, the sitemap was submitted, and Googlebot is crawling your new URLs. Yet weeks later, rankings remain down, and your traffic data doesn’t clearly explain why.</p>
<p class="wp-block-paragraph">A broken redirect map or an overlooked migration task doesn’t always cause that gap. Instead, it often traces to what crawlers receive after requesting your new URLs while critical content still depends on JavaScript to become available. A site migration can pass all standard checks while silently introducing a rendering dependency that restricts what crawlers can access.</p>
<p class="wp-block-paragraph">Working from infrastructure logs covering billions of monthly render requests, our team sees three recurring rendering-related failure patterns in SEO site migrations. Here’s how to identify these failure modes in your data, diagnose what your standard migration checks missed, and keep your SEO performance at its peak even during complex site migrations.</p>
<h2 class="wp-block-heading">TL;DR: Why Site Migration Causes SEO Ranking Drops</h2>
<ul class="wp-block-list">
<li>Standard migration checklists confirm important SEO signals moved correctly, but they don’t always confirm crawlers can access the full pages those signals point to.</li>
<li>Crawl budget and rendering resources come under pressure together at cutover. A large migration forces search engines to process many new or changed URLs while revisiting old URLs and following redirects.</li>
<li>Ranking losses tend to concentrate on templates with the thinnest initial HTML, usually product and category pages, which total traffic reports can hide.</li>
<li>AI crawlers, including GPTBot, ClaudeBot, and PerplexityBot, never execute JavaScript, so they receive the initial HTML response, leaving content and SEO signals unavailable if they are injected after the page loads.</li>
<li>A rendering layer such as Prerender.io can serve complete HTML to crawlers, reducing their need to execute your site’s JavaScript during and after a migration.</li>
</ul>
<h2 class="wp-block-heading">Why Standard Site Migration Checklists Miss the Real Risk</h2>
<p class="wp-block-paragraph">Standard SEO migration checklists confirm that critical signals have moved correctly—by verifying <a href="https://prerender.io/blog/do-redirect-chains-hurt-seo/" data-type="link" data-id="https://prerender.io/blog/do-redirect-chains-hurt-seo/">redirect chains</a>, canonical tags, XML sitemaps, and Search Console verification. However, they miss a critical diagnostic question: <strong>when a crawler requests one of your new URLs, what payload does it actually receive?</strong></p>
<p class="wp-block-paragraph">A successful HTTP response code doesn’t mean every important part of the page was available in the initial HTML. Server-rendered pages deliver content and SEO signals instantly, whereas JS-heavy sites require script execution before critical elements appear. Because crawling, rendering, and indexing are separate pipeline stages, rendering costs search engines significant time and resources—and many crawlers cannot execute JavaScript at all. During a website migration, this bottleneck worsens as search engines simultaneously reprocess thousands of changed URLs, follow redirects, and discover new paths.</p>
<p class="wp-block-paragraph">This is why crawl monitoring alone can give false confidence. Crawl statistics show that bots are requesting your pages, but not whether the expected HTML was available, JavaScript executed successfully, or the resulting page contained the SEO signals you intended to migrate. When standard checks pass, yet traffic drops, your priority should be investigating the rendering layer to identify clear <a href="https://prerender.io/blog/signs-of-javascript-rendering-problems/" data-type="link" data-id="https://prerender.io/blog/signs-of-javascript-rendering-problems/">signs your site has JavaScript rendering problems</a>.</p>
<h2 class="wp-block-heading">3 Reasons Your Site Migration Can Cause SEO Ranking Drops</h2>
<p class="wp-block-paragraph">Once you look beyond crawl activity alone, running a targeted JavaScript rendering audit can reveal technical bottlenecks that standard migration checks miss. The three failure modes below do not explain every migration-related ranking drop. But they matter most for JavaScript-heavy sites because they sit beneath otherwise successful redirects, canonical mappings, and crawl reports.</p>
<h3 class="wp-block-heading">1. Crawl Budget and Rendering Resources Get Stretched at the Same Time</h3>
<p class="wp-block-paragraph">Most migration guides discuss <a href="https://prerender.io/blog/crawl-budget-management-for-large-websites/" data-type="link" data-id="https://prerender.io/blog/crawl-budget-management-for-large-websites/">crawl budget management for large websites</a>, since a major migration creates a massive URL-processing workload. For JavaScript-heavy sites, however, crawling is only half the cost.</p>
<p class="wp-block-paragraph">Search engines like <a href="https://developers.google.com/search/docs/crawling-indexing/javascript/fix-search-javascript" data-type="link" data-id="https://developers.google.com/search/docs/crawling-indexing/javascript/fix-search-javascript" target="_blank" rel="noreferrer noopener nofollow">Google discover and fetch a page first</a>, then render it if the important content isn’t in the initial HTML. Those are separate stages drawing on separate resources, and a migration strains both at once.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="423" height="301" src="https://prerender.io/wp-content/uploads/How-Google-indexes-JS-content-1.png" alt="How Google indexes JS content" class="wp-image-14949" srcset="https://prerender.io/wp-content/uploads/How-Google-indexes-JS-content-1.png 423w, https://prerender.io/wp-content/uploads/How-Google-indexes-JS-content-1-300x213.png 300w" sizes="(max-width: 423px) 100vw, 423px" /></figure>
</div>
<p class="wp-block-paragraph"><br>While well-implemented redirects carry historical signals forward, a migration still pushes thousands of URLs back through Google’s processing pipeline. When your server latency spikes or redirect chains consume initial crawl allocation, Google’s Web Rendering Service suffers the downstream bottleneck.</p>
<p class="wp-block-paragraph">Because executing client-side JavaScript requires roughly 9x more processing power than parsing static HTML (according to <a href="https://www.onely.com/blog/google-needs-9x-more-time-to-crawl-js-than-html/" data-type="link" data-id="https://www.onely.com/blog/google-needs-9x-more-time-to-crawl-js-than-html/" target="_blank" rel="noreferrer noopener nofollow">Onely’s research</a>), any delay at the crawl stage forces Google to defer the rendering stage, queuing your JS-injected content indefinitely.</p>
<p class="wp-block-paragraph">That cost gap is why two teams can run equally careful migrations and see completely different recovery curves. In our infrastructure logs, the visible result is <a href="https://prerender.io/blog/how-to-avoid-discovered-currently-not-indexed/">pages sitting at “Discovered – currently not indexed”</a> for weeks after publication.</p>
<h4 class="wp-block-heading">How to Diagnose Crawl and Render Bottlenecks</h4>
<ul class="wp-block-list">
<li><strong>Step 1: Check GSC Indexation Baselines<br></strong><br>Open Page Indexing in Google Search Console and inspect the <em>“Discovered – currently not indexed”</em> report. A post-cutover spike that fails to drain indicates Google has queued your JS pages due to rendering budget constraints.</li>
</ul>
<ul class="wp-block-list">
<li><strong>Step 2: Measure Server Latency & Bot Volume</strong><br><br>Extract four weeks of pre- and post-cutover Googlebot server logs. A sudden drop in daily request volume signals a server-level bottleneck. Check your TTFB (Time to First Byte) immediately.</li>
</ul>
<ul class="wp-block-list">
<li><strong>Step 3: Calculate Your Redirect Allocation Ratio</strong><br><br>Divide total 3xx responses by total bot requests. If 3xx responses exceed 20%, more than a fifth of your crawl budget is being consumed by redirect hops instead of live, renderable content.</li>
</ul>
<h3 class="wp-block-heading">2. Ranking Loss Concentrates on JavaScript-Heavy Page Types</h3>
<p class="wp-block-paragraph">When rankings fall after a site migration, most teams open a total organic traffic chart. It confirms the decline but doesn’t show where the problem is concentrated because migration losses are never evenly spread.</p>
<p class="wp-block-paragraph">The loss clusters on templates with the thinnest initial HTML. For example, product pages that load important details after an API request, category pages that generate listings client-side, or any template that depends on JavaScript for its main content. Meanwhile, <a href="https://prerender.io/blog/what-is-srr-and-why-do-you-need-to-know/" data-type="link" data-id="https://prerender.io/blog/what-is-srr-and-why-do-you-need-to-know/">server-rendered pages</a> in the same migration often recover faster, which is how teams reach the comfortable and wrong conclusion that the migration mostly worked.</p>
<p class="wp-block-paragraph">Two other signals go missing for the same underlying reason. Internal links rendered via a client-side router never appear in the raw HTML, so equity from the old site stops flowing to the pages that relied on it. Canonical tags injected by JS are also absent, leaving the duplicate URL variants your migration created with nothing to consolidate them.</p>
<h4 class="wp-block-heading">How to Diagnose Rendering Dependencies by Page Type</h4>
<ul class="wp-block-list">
<li><strong>Step 1: Segment Performance Data by Template Path</strong><br><br>Filter your Page Indexing and Performance reports in Google Search Console by URL pattern (e.g., <mark style="background-color:rgba(0, 0, 0, 0);color:#188038" class="has-inline-color">/product/</mark> vs. <mark style="background-color:rgba(0, 0, 0, 0);color:#188038" class="has-inline-color">/category/</mark> vs. <mark style="background-color:rgba(0, 0, 0, 0);color:#188038" class="has-inline-color">/blog/</mark>) and compare the traffic decline across each group. Look specifically for URL classes spiking in <em>“Discovered — currently not indexed,”</em> as this indicates Google found the URLs but has deferred its rendering resources.</li>
</ul>
<ul class="wp-block-list">
<li><strong>Step 2: Inspect Raw HTML vs. Rendered DOM</strong><br><br>Take a representative URL from each template and test it in GSC’s URL Inspection Tool. Compare the initial HTML response against the rendered view to audit critical SEO signals:</li>
</ul>
<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Template</th><th class="has-text-align-left" data-align="left">Content in raw HTML?</th><th class="has-text-align-left" data-align="left">Internal links present?</th><th class="has-text-align-left" data-align="left">Canonical present?</th><th class="has-text-align-left" data-align="left">Indexing status</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">/product/</td><td class="has-text-align-left" data-align="left"></td><td class="has-text-align-left" data-align="left"></td><td class="has-text-align-left" data-align="left"></td><td class="has-text-align-left" data-align="left"></td></tr><tr><td class="has-text-align-left" data-align="left">/category/</td><td class="has-text-align-left" data-align="left"></td><td class="has-text-align-left" data-align="left"></td><td class="has-text-align-left" data-align="left"></td><td class="has-text-align-left" data-align="left"></td></tr><tr><td class="has-text-align-left" data-align="left">/blog/</td><td class="has-text-align-left" data-align="left"></td><td class="has-text-align-left" data-align="left"></td><td class="has-text-align-left" data-align="left"></td><td class="has-text-align-left" data-align="left"></td></tr></tbody></table></figure>
<ul class="wp-block-list">
<li><strong>Step 3: Evaluate Rendering Dependencies</strong><br><br>Any template where critical elements appear only after rendering has a confirmed rendering dependency. While a rendering dependency doesn’t automatically prove the root cause of every loss, it uncovers a critical blind spot no redirect map or sitemap audit will expose. For instance, Eldorado <a href="https://prerender.io/resources/case-studies/how-eldorados-traffic-grew-by-80-after-fixing-spa-rendering-issues/" data-type="link" data-id="https://prerender.io/resources/case-studies/how-eldorados-traffic-grew-by-80-after-fixing-spa-rendering-issues/">increased organic traffic by 80%</a> simply by fixing SPA rendering bottlenecks that restricted search engines from accessing core content.</li>
</ul>
<p class="wp-block-paragraph">To learn more about how client-side execution affects your search visibility, read our complete guide on <a href="https://prerender.io/blog/why-javascript-complicates-indexation-and-how-to-fix-it/" data-type="link" data-id="https://prerender.io/blog/why-javascript-complicates-indexation-and-how-to-fix-it/">why JavaScript complicates indexing performance</a>.</p>
<h3 class="wp-block-heading">3. AI Crawlers Have No Rendering Fallback, and Migration Resets Their Crawl History Too</h3>
<p class="wp-block-paragraph">While Google eventually renders and reindexes your JavaScript pages, AI crawlers give you nothing equivalent.</p>
<p class="wp-block-paragraph"><a href="https://vercel.com/blog/the-rise-of-the-ai-crawler" data-type="link" data-id="https://vercel.com/blog/the-rise-of-the-ai-crawler" target="_blank" rel="noreferrer noopener nofollow">Vercel and MERJ analyzed</a> hundreds of millions of crawler fetches and found no evidence that any major AI crawler executes JavaScript. GPTBot fetched JavaScript files in about 11.5% of requests without executing them, while ClaudeBot downloaded them in about 23.84% of requests and never ran them. PerplexityBot, Bytespider, and Meta’s crawler behave the same way. Only Google Gemini differs, since it leverages Googlebot’s Web Rendering Service.</p>
<p class="wp-block-paragraph">This is why a site migration raises the stakes. Googlebot queues your new URLs and eventually reaches them, whereas an AI crawler that requests a new URL and receives an empty shell simply records it and moves on. Nothing holds the page for another attempt, so your content stops <a href="https://prerender.io/blog/ai-optimization-technical-seo-guide/" data-type="link" data-id="https://prerender.io/blog/ai-optimization-technical-seo-guide/">surfacing in AI-generated answers</a>, and no rank tracking tool will show you it happened.</p>
<p class="wp-block-paragraph">Structured data further widens that gap. AI systems rely on schema markup to understand a page and cite it confidently, so product, FAQ, and organization schema injected through a tag manager or a JavaScript component stays invisible to every non-rendering crawler until rendering is fixed.</p>
<h4 class="wp-block-heading">How to Diagnose AI Crawler Visibility and Schema Gaps</h4>
<ul class="wp-block-list">
<li><strong>Step 1: Inspect the Raw Source Code<br></strong><br>Open View Source (Ctrl+U / Cmd+Option+U) on your live URL to view the unrendered server response.</li>
</ul>
<ul class="wp-block-list">
<li><strong>Step 2: Run a String Search for Core Elements</strong><br><br>Search the raw source response for three critical identifiers:<br>
<ul class="wp-block-list">
<li>Your main page heading</li>
<li>A distinctive line of primary body copy</li>
<li>Your JSON-LD structured data block</li>
</ul>
</li>
</ul>
<ul class="wp-block-list">
<li><strong>Step 3: Audit Template Exposure</strong><br><br>Execute this check across the same templates evaluated in your GSC audit. Anything missing from the raw source code is completely invisible to AI crawlers today, with no deferred rendering queue to fix it tomorrow.</li>
</ul>
<p class="wp-block-paragraph">To learn more about how search engines and LLM crawlers process your site differently, read our detailed breakdown on <a href="https://prerender.io/blog/understanding-web-crawlers-traditional-ai/" data-type="link" data-id="https://prerender.io/blog/understanding-web-crawlers-traditional-ai/">understanding web crawlers: traditional vs. AI bots</a>.</p>
<h2 class="wp-block-heading">How to Protect SEO Rankings During a Site Migration</h2>
<p class="wp-block-paragraph">Once you’ve identified a rendering dependency, the fix isn’t to rebuild your SEO migration plan. It’s to add a layer that gives crawlers a complete representation of your new pages immediately, without requiring each one to do the rendering work itself.</p>
<h3 class="wp-block-heading">5 Consequence Risks: What Happens to Rankings Without a Rendering Layer</h3>
<ul class="wp-block-list">
<li><strong>Indexing takes longer.</strong> Google Search Console reports blank or thin pages at new URLs while the rendering queue works through your inventory.</li>
<li><strong>Redirects fail silently for bots.</strong> Client-side and JavaScript-driven redirects fire in a browser and never execute for a crawler that does not run JavaScript.</li>
<li><strong>Pre-migration link equity goes to waste.</strong> Bots cannot render the new URLs to confirm the destination exists, so the authority pointed at your old pages has nowhere to land.</li>
<li><strong>Ranking losses becomes harder to diagnose.</strong> Aggregate traffic data shows a decline without revealing that one JavaScript-heavy template accounts for most of it.</li>
<li><strong>International SEO signals become harder to validate.</strong> Crawlers that never execute JavaScript can’t confirm hreflang annotations generated through JavaScript.</li>
</ul>
<h3 class="wp-block-heading">How Prerender.io Protects Your Site Before, During, and After Migration</h3>
<p class="wp-block-paragraph"><a href="https://prerender.io" data-type="link" data-id="https://prerender.io">Prerender.io</a> provides a rendering layer for JavaScript sites. It intercepts crawler requests at your CDN or server, <a href="https://prerender.io/blog/how-prerender-renders-javascript-websites/" data-type="link" data-id="https://prerender.io/blog/how-prerender-renders-javascript-websites/">renders the page</a> in a headless browser, caches the resulting HTML, and serves that version to the crawler.</p>
<figure class="wp-block-image size-full"><img decoding="async" width="624" height="296" src="https://prerender.io/wp-content/uploads/migration-timeline.jpg" alt="How Prerender.io Protects Your Site Before, During, and After Migration" class="wp-image-14961" srcset="https://prerender.io/wp-content/uploads/migration-timeline.jpg 624w, https://prerender.io/wp-content/uploads/migration-timeline-300x142.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>
<p class="wp-block-paragraph">Across a migration timeline, this infrastructure layer operates in three distinct phases:</p>
<p class="wp-block-paragraph"><strong>A. Before Migration (Pre-Cutover Indexing)</strong></p>
<ul class="wp-block-list">
<li>Phased and incremental migrations often run old and new stacks in parallel.</li>
<li>Prerender serves fully rendered pages from the new stack to search engines before full cutover.</li>
<li>Bots index the new URLs while construction is finishing, ensuring cutover happens against URLs that already have an established index history.</li>
</ul>
<p class="wp-block-paragraph"><strong>B. During Migration (Crawl Budget and Signal Preservation)</strong></p>
<ul class="wp-block-list">
<li>Prerender complements correct 301 redirects and URL mapping.</li>
<li>Once a crawler reaches a JS-heavy destination URL, Prerender serves static HTML directly rather than forcing client-side execution.</li>
<li>Crawl budget is preserved because crawlers aren’t wasting allocation on unrenderable URLs or multi-hop redirect chains.</li>
</ul>
<p class="wp-block-paragraph"><strong>C. After Migration (Cache Hygiene and Signal Validation)</strong></p>
<ul class="wp-block-list">
<li>Prerender serves cached rendered pages instantly on subsequent crawls, preventing GSC from registering blank pages.</li>
<li>Critical Cache Hygiene Step: Clear stale snapshots keyed to pre-migration URLs by clearing cache by URL pattern, submitting your new XML sitemap, and <a href="https://docs.prerender.io/docs/how-to-purge-cache">using the Recache API</a> to prioritize revenue-critical pages.</li>
<li>JS-dependent elements—including body content, internal links, schema markup, and <mark style="background-color:rgba(0, 0, 0, 0);color:#188038" class="has-inline-color">hreflang</mark> tags—become permanently visible to all supported crawlers.</li>
</ul>
<h2 class="wp-block-heading">Protecting Your Site Migration SEO Beyond the Standard Checklist</h2>
<p class="wp-block-paragraph">A website migration can fail for many reasons, but when redirects, canonical tags, and other standard checks don’t explain a lasting ranking drop, your rendering setup is the next place to look. Site migration SEO stops where a crawler requests your new URL, and the rendering layer determines what happens next.</p>
<p class="wp-block-paragraph">If important content and SEO signals depend on JavaScript, serving crawlers complete rendered HTML through Prerender.io removes a major blind spot that no migration checklist covers.</p>
<p class="wp-block-paragraph"><a href="https://prerender.io/pricing/">Try Prerender.io for free</a> and see how prerendering protects your site’s visibility before, during, and after a migration.</p>
<h2 class="wp-block-heading">FAQs on Site Migration</h2>
<h3 class="wp-block-heading">1. How long does it take to recover SEO rankings after a site migration?</h3>
<p class="wp-block-paragraph">Recovering SEO rankings after a site migration typically takes a few weeks for small to medium-sized sites, while enterprise-level migrations can take several months. <a href="https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes" target="_blank" rel="noreferrer noopener nofollow">According to Google, recovery timelines depend on URL volume and server processing speed</a>. For JavaScript-heavy applications, rendering capacity becomes a critical third variable: a URL that has been crawled remains unindexed until search engines complete the rendering phase.</p>
<h3 class="wp-block-heading">2. Why do SEO rankings drop after a site migration even when redirects are correct?</h3>
<p class="wp-block-paragraph">SEO rankings can drop after a site migration with correct 301 redirects because a proper redirect only transfers URL signals. It does not guarantee the destination page is free of technical or rendering issues. On JS sites, ranking drops frequently trace back to rendering failures in which critical content, links, or canonical tags fail to appear in the initial HTML shell. Comparing the raw crawled HTML against the rendered view in Search Console’s URL Inspection tool will confirm if rendering dependencies are responsible.</p>
<h3 class="wp-block-heading">3. How do you check whether JavaScript rendering is affecting SEO after a migration?</h3>
<p class="wp-block-paragraph">You can check if JavaScript rendering is affecting your post-migration SEO by segmenting your affected URLs by page template rather than looking at aggregate traffic charts. Inspect representative URLs from each template using GSC’s URL Inspection Tool and compare the raw HTML response against the rendered view. If critical elements like body copy, internal links, canonical tags, or schema markup appear only after JavaScript executes, you have confirmed a rendering dependency that requires a dedicated rendering solution</p>
<p class="wp-block-paragraph"></p>
]]></content:encoded>
</item>
<item>
<title>What Hreflang Checker Misses on JavaScript Websites</title>
<link>https://prerender.io/blog/hreflang-checker/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Wed, 30 Sep 2026 15:34:53 +0000</pubDate>
<category><![CDATA[Technical SEO]]></category>
<guid isPermaLink="false">https://prerender.io/?p=14936</guid>
<description><![CDATA[Discover why JavaScript-rendered hreflang tags pass audit tools but fail for Googlebot and AI crawlers—and how to fix it.]]></description>
<content:encoded><![CDATA[
<p class="wp-block-paragraph">Your hreflang checker says every hreflang tag is in place, yet your international buyers landing on the wrong storefront (German shoppers visit the the French website) and Search Console keeps indexing the wrong locale. If that sounds familiar, the problem is not your hreflang implementation itself.</p>
<p class="wp-block-paragraph">On JavaScript-heavy sites, the tool auditing your hreflang tags and the crawler indexing them often read two different versions of the same page. Your hreflang checker reads one version and reports success, but Googlebot reads the other version and finds nothing.</p>
<p class="wp-block-paragraph">This article explains how that gap forms, why it breaks entire language clusters rather than individual tags, and why AI crawlers turn a delayed problem into a permanent one. By the end, you’ll know exactly why a passing hreflang audit can sit on top of a broken hreflang setup, and what actually closes the gap — all to help you improve your international SEO health.</p>
<h2 class="wp-block-heading">Key Takeaways: How Hreflang Checker Blind Spots Hurt International SEO</h2>
<ul class="wp-block-list">
<li><strong>Hreflang audit tools vs. search engine discrepancy:</strong> Hreflang checkers test your site after JavaScript loads, but search engines read your raw website code first—meaning they completely miss your language tags if they are added by JavaScript.</li>
<li><strong>Misleading audit results:</strong> your site can pass every test with zero errors, yet search engines will still send visitors to the wrong country’s page because the testing tools and search bots are reading two different versions of your site.</li>
<li><strong>Prerender.io for multi-language websites:</strong> by using Prerender.io to serve fully loaded, static HTML right away, every search engine and AI bot instantly sees your complete hreflang tags on the very first try.</li>
</ul>
<h2 class="wp-block-heading">How Does Hreflang Checker Work?</h2>
<p class="wp-block-paragraph">Hreflang checker validates your international SEO setup by simulating a user’s browser. When you run an audit, the tool requests each URL, lets your server return the page, and executes any client-side JavaScript before scanning the DOM for tags. It verifies that every language variant is declared, return links point back correctly, and canonical URLs align.</p>
<p class="wp-block-paragraph">Because these tools evaluate the finished, fully rendered page, they report a clean implementation as long as your tags exist once JavaScript finishes running, regardless of when or how those tags were delivered.</p>
<h2 class="wp-block-heading">Why Does an Hreflang Audit Pass When the Wrong Locales Rank?</h2>
<p class="wp-block-paragraph">You’ve run your site through Screaming Frog, Ahrefs Site Audit, or a browser-based hreflang checker. Every locale page shows its tags, return links, and the report comes back clean, but your traffic tells a different story.</p>
<p class="wp-block-paragraph">German shoppers keep resolving to the French storefront, the localized pricing you built for that market never reaches it, and Search Console’s Pages report shows the wrong locale indexed as canonical. Both things are true at once, and neither tool is malfunctioning.</p>
<p class="wp-block-paragraph">The problem is that your hreflang checker loads the page as a browser would. It waits for JavaScript to run, lets your framework inject the hreflang tags, and grades the finished result. Googlebot’s first crawl never waits. It just reads the raw HTML response off your server and moves on.</p>
<p class="wp-block-paragraph">When your hreflang tags only appear after JavaScript executes, your checker sees a complete implementation, and Googlebot sees nothing at all. That’s a false negative, and it’s the most expensive kind.</p>
<p class="wp-block-paragraph">Search Console won’t explicitly flag the issue for you either. <a href="https://support.google.com/webmasters/answer/12474899?hl=en" data-type="link" data-id="https://support.google.com/webmasters/answer/12474899?hl=en" target="_blank" rel="noreferrer noopener nofollow">Google removed the dedicated International Targeting report in September 2022</a>, meaning GSC no longer provides direct hreflang error diagnostics. Instead, the symptom shows up quietly in your GSC Pages report: Google selects the wrong country page as the primary canonical, leaving your intended localized URL unindexed or misrouted.”</p>
<p class="wp-block-paragraph">So the question isn’t whether your hreflang tags are correct. It’s <strong>which version of your page was Google reading when it decided?</strong></p>
<h2 class="wp-block-heading">How Hreflang Tags Are Served on JavaScript-Rendered Sites</h2>
<p class="wp-block-paragraph">Googlebot indexes a JavaScript site in two passes, and your hreflang tags may only exist in the second.</p>
<p class="wp-block-paragraph">The first pass, Wave 1, reads the raw HTML your server returns and processes it immediately. Links, meta tags, and hreflang annotations present in that response enter Google’s systems right away.</p>
<p class="wp-block-paragraph">The second pass, Wave 2, happens later. Google sends the page to its Web Rendering Service, a <a href="https://prerender.io/blog/how-prerender-renders-javascript-websites/" data-type="link" data-id="https://prerender.io/blog/how-prerender-renders-javascript-websites/">headless Chromium renderer</a> that executes your JavaScript and captures whatever your framework added to the page. Only then does Google see content and tags that were injected client-side.</p>
<p class="wp-block-paragraph">Wave 2 is queued, and the queue is shared across the entire web. <a href="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics" data-type="link" data-id="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics" target="_blank" rel="noreferrer noopener nofollow">Google’s own documentation</a> says a page may sit in that queue for a few seconds, but it can take longer. In practice, depending on your site’s size and crawl priority, the gap between Wave 1 and Wave 2 stretches from a few hours to several weeks. During that window, Google is working with a version of your page that may contain no hreflang tags at all.</p>
<p class="wp-block-paragraph">Your hreflang checker skips that window, evaluating the same output Wave 2 eventually produces. It grades the version Googlebot sees last, while Google’s language targeting begins with the version it sees first.</p>
<figure class="wp-block-image size-full"><img decoding="async" width="624" height="351" src="https://prerender.io/wp-content/uploads/What-hreflang-checker-vs.-Google-vs.-AI-crawler-sees.png" alt="What hreflang checker vs. Google vs. AI crawler sees" class="wp-image-14942" srcset="https://prerender.io/wp-content/uploads/What-hreflang-checker-vs.-Google-vs.-AI-crawler-sees.png 624w, https://prerender.io/wp-content/uploads/What-hreflang-checker-vs.-Google-vs.-AI-crawler-sees-300x169.png 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>
<p class="wp-block-paragraph">The diagram above traces both readers along the same pipeline. Your audit grades the finish line. Google’s language targeting starts at the gun.</p>
<p class="wp-block-paragraph">That mismatch explains the contradiction between your clean hreflang audit and your misrouted traffic. Both are reporting honestly on different documents.</p>
<h2 class="wp-block-heading">3 Ways JavaScript Rendering Breaks Your Hreflang Tags</h2>
<p class="wp-block-paragraph">Hreflang operates in clusters. Every language version must reference every other version, and each must link back. Google treats that bidirectional agreement as a single unit, so if it breaks anywhere, Google can discard signals for the whole group, and your English, German, and Japanese pages stop supporting each other overnight. That’s why one JavaScript-injected page can take down every locale it’s linked to.</p>
<p class="wp-block-paragraph">Rendering attacks cluster integrity in three ways: <strong>the return links, the canonical, and the timing</strong>.</p>
<h3 class="wp-block-heading">1. Missing Return Links: One-Sided Signals in Raw HTML</h3>
<p class="wp-block-paragraph"><a href="https://developers.google.com/search/docs/specialty/international/localized-versions" data-type="link" data-id="https://developers.google.com/search/docs/specialty/international/localized-versions" target="_blank" rel="noreferrer noopener nofollow">Google’s hreflang documentation</a> is explicit: if page X links to page Y, page Y must link back to page X, and where that isn’t true across all pages using hreflang — the annotations may be ignored or misinterpreted.</p>
<p class="wp-block-paragraph">Suppose your US page lists all its alternates in raw HTML, but your German and French pages inject their hreflang tags with JavaScript. On Googlebot’s first pass over those alternate pages, the return links pointing back to the US page aren’t there. Without confirmed return links, Google may treat the relationship as unverified and reject the cluster.</p>
<p class="wp-block-paragraph">Your hreflang checker won’t catch this, because it reads the rendered version of every page in the cluster. Each page looks complete. The raw HTML tells a different story, and that’s what Wave 1 indexes.</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="624" height="351" src="https://prerender.io/wp-content/uploads/Why-JS-breaks-your-hreflang-configuration.png" alt="Why JS breaks your hreflang configuration" class="wp-image-14943" srcset="https://prerender.io/wp-content/uploads/Why-JS-breaks-your-hreflang-configuration.png 624w, https://prerender.io/wp-content/uploads/Why-JS-breaks-your-hreflang-configuration-300x169.png 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>
<p class="wp-block-paragraph">In the comparison above, two missing return links are enough to leave the whole cluster unconfirmed.</p>
<h3 class="wp-block-heading">2. Canonical Conflicts: Raw HTML vs. JavaScript Signals to Googlebot</h3>
<p class="wp-block-paragraph">Many JavaScript frameworks inject the canonical tag and the hreflang tags together. If the raw HTML ships with a default canonical, or none at all, and JavaScript later rewrites it, Google receives two conflicting canonical signals for the same URL at two different times.</p>
<p class="wp-block-paragraph">Hreflang depends on canonicals. Google requires each annotation to point to the canonical version of its locale page, and a canonical pointing to a different language version causes Google to disregard the hreflang annotations on non-canonical pages.</p>
<p class="wp-block-paragraph">When the canonical itself is ambiguous, Google can’t resolve which URLs belong in the cluster, and ignoring the hreflang signals is the safest option from its side. One rendering inconsistency compounds into a second, and together they take down the group.</p>
<h3 class="wp-block-heading">3. Render Timing Gaps: Why Locale Pages Fail to Index at the Same Time</h3>
<p class="wp-block-paragraph">Render priority isn’t spread evenly across your site. High-traffic pages tend to get rendered sooner. Deep catalog pages, long-tail product variants, and low-priority locale pages wait longer in the render queue.</p>
<p class="wp-block-paragraph">On a multi-language ecommerce site with 300,000 to 1 million+ URLs, that means <strong>your hreflang visibility is never in a single consistent state</strong>. At any point in the crawl cycle, some pages in a cluster have rendered and show their tags while their siblings haven’t. Google keeps encountering partially confirmed clusters, and partial confirmation often reads as failure.</p>
<p class="wp-block-paragraph">React sites show this clearly. If <a href="https://prerender.io/blog/common-javascript-seo-problems/" data-type="link" data-id="https://prerender.io/blog/common-javascript-seo-problems/">hreflang tags are added during hydration</a>, each page’s tags surface only when that page clears the render queue. Two pages in the same cluster, deployed from identical code, can show Google different hreflang states for weeks. The inconsistency is structural, and it persists no matter how many times your audit passes.</p>
<h2 class="wp-block-heading">Why AI Crawlers (GPTBot, Perplexity) Ignore JavaScript Hreflang Tags</h2>
<p class="wp-block-paragraph">Googlebot does eventually run Wave 2 and pick up your JavaScript-injected tags, even if the cluster suffers while it waits. Every failure so far has been a delay.</p>
<p class="wp-block-paragraph">AI crawlers, however, remove the “eventually.” GPTBot, ClaudeBot, PerplexityBot, and the other bots feeding AI search surfaces do not execute JavaScript at all. They read the raw HTML response and stop there. There is no second wave, no render queue, and no later pass that catches up. <a href="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics" data-type="link" data-id="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics" target="_blank" rel="noreferrer noopener nofollow">Google’s own JavaScript SEO documentation</a> concedes the point from the other side, recommending pre-rendering partly because not all bots can run JavaScript.</p>
<p class="wp-block-paragraph">For a multi-market business, the consequence is direct. <strong>If your hreflang tags are injected client-side, every AI-driven search surface is working with zero language signal from your site</strong>. When an AI assistant answers a shopping query from a user in Germany, it has no machine-readable way to know your German-language catalog exists, because the page it fetched never declared any alternatives.</p>
<p class="wp-block-paragraph">The x-default tag shows how the checker deepens that false confidence. Checkers evaluate the rendered page, where x-default is present, and report it as fine.</p>
<p class="wp-block-paragraph">On a client-side single-page application, an x-default that only appears after JavaScript runs may never reach Googlebot’s initial index, and will never reach an AI crawler at all. The checker validates a tag that a growing share of crawlers cannot see.</p>
<p class="wp-block-paragraph">For Googlebot, JavaScript-injected hreflang is a reliability problem you can wait out. For AI crawlers, waiting changes nothing because the tag was never in the document they read.</p>
<h2 class="wp-block-heading">Prerender.io Solves Hreflang Issues for Multi-Language Websites</h2>
<p class="wp-block-paragraph">The fix to hreflang issues is to make sure there’s only one version of your page to read, and Prerender.io can help with that.</p>
<p class="wp-block-paragraph">Prerender.io does this by <a href="https://prerender.io/blog/a-guide-to-prerender-process-and-benefits/" data-type="link" data-id="https://prerender.io/blog/a-guide-to-prerender-process-and-benefits/">rendering your JavaScript pages in advance</a> and serving crawlers a static HTML snapshot with everything already in place, hreflang tags included. When Googlebot requests a page, it receives a complete document on the first pass, so the Wave 1 and Wave 2 distinction stops mattering. There’s nothing left for rendering to add.</p>
<p class="wp-block-paragraph">One change closes all four gaps. Return links and canonicals ship together in the raw HTML of every locale page, so clusters confirm on first contact instead of waiting for a render that arrives page by page. Your audit starts grading the document Google indexes, and because GPTBot, ClaudeBot, and PerplexityBot read raw HTML, your language signal reaches AI search for the first time.</p>
<p class="wp-block-paragraph">Prerender.io makes the hreflang tags you’ve already implemented visible to every crawler — pair it with your existing hreflang checker to catch misconfigurations before they ship. It makes the hreflang tags you’ve already implemented exist in the document every crawler receives, the one thing no hreflang checker can do for you. If your locale pages are rendering client-side, that gap is already costing you traffic across every market you’ve localized for.</p>
<p class="wp-block-paragraph"><a href="https://prerender.io/pricing/" data-type="link" data-id="https://prerender.io/pricing/">Start a free trial with Prerender</a> and see what Googlebot sees on the first request.</p>
<h2 class="wp-block-heading">Final Thoughts on Hreflang Checker Blind Spots</h2>
<p class="wp-block-paragraph">Your hreflang checker isn’t broken. It answers a question you didn’t mean to ask: does hreflang exist once the page has finished loading? What you needed to know was whether the tags exist in the document that the document crawlers receive.</p>
<p class="wp-block-paragraph">On a server-rendered site, those questions have the same answer, which is why the checker earned your trust. On a JavaScript site, they come apart, and every hour your tags wait in the render queue is an hour Google routes your German shoppers by guesswork.</p>
<p class="wp-block-paragraph">Check it yourself in two minutes. Disable JavaScript, view the page source of one locale page, and search it for hreflang. If the tags aren’t there, no checker result is worth acting on until they are.</p>
<h2 class="wp-block-heading">FAQs About Hreflang Checker for Multiple-Language Websites</h2>
<h3 class="wp-block-heading">Why Does My Hreflang Checker Show No Errors While the Wrong Locale Still Ranks?</h3>
<p class="wp-block-paragraph">My hreflang checker shows no errors while Search Console indexes the wrong country page because your checker evaluates the rendered page after JavaScript runs, but Googlebot’s initial pass only reads raw HTML. Client-side tags are invisible on that first crawl, and without GSC’s deprecated International Targeting report, Googlebot silently defaults to routing users without hreflang signals—indexing the wrong country page while your audit tool passes.</p>
<h3 class="wp-block-heading">If My Hreflang Cluster Looks Correct in My Checker Tool, Can Google Still Reject It?</h3>
<p class="wp-block-paragraph">If your hreflang cluster looks correct in your checker tool, Google can still reject it because your checker reads every page fully rendered, making the whole cluster look confirmed. However, if any locale page serves its return links via JavaScript, those links are absent from the raw HTML Google indexes first. Unconfirmed return links, or a canonical that conflicts with the injected tags, can make Google discard signals for the entire cluster while your audit still passes.</p>
<h3 class="wp-block-heading">Do AI Crawlers Like ChatGPT’s and Perplexity’s Bots Support Hreflang at All?</h3>
<p class="wp-block-paragraph">AI crawlers like ChatGPT’s and Perplexity’s bots support hreflang only if the tags exist in the raw HTML response. GPTBot, ClaudeBot, and PerplexityBot do not execute JavaScript, so any hreflang tag added client-side is permanently invisible to them. On a JavaScript site without pre-rendering, AI search surfaces receive no language signal from your pages.</p>
<h3 class="wp-block-heading">How Does Prerender.io Handle Localized Pricing, Currency, and Stock Variations Across Different Markets?</h3>
<p class="wp-block-paragraph">Prerender.io handles localized pricing, currency, and stock variations across different markets by rendering and caching each locale URL as its own document, so your German page is snapshotted with its German pricing, currency, and availability, and your Japanese page with its own. Crawlers requesting each URL receive the fully localized version of that page, with recaching keeping time-sensitive details like stock levels current.</p>
<h3 class="wp-block-heading">Does Using Prerender.io for Hreflang Tags Count as Cloaking?</h3>
<p class="wp-block-paragraph">Using Prerender.io for hreflang tags does not count as cloaking because cloaking means showing crawlers meaningfully different content than users see. Prerender.io serves crawlers the same content your users get after JavaScript runs, delivered as static HTML. Google’s own documentation states that it generally doesn’t treat dynamic rendering as cloaking as long as the crawler and the user receive similar content, which is how Prerender.io works.</p>
]]></content:encoded>
</item>
<item>
<title>Product-Led SEO and What AI Search Broke</title>
<link>https://prerender.io/blog/product-led-seo-and-what-ai-search-broke/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Tue, 29 Sep 2026 10:52:03 +0000</pubDate>
<category><![CDATA[AI SEO]]></category>
<category><![CDATA[Podcast]]></category>
<guid isPermaLink="false">https://prerender.io/?p=14927</guid>
<description><![CDATA[Get Discovered is back! Kickstarting season three, we discuss what AI has really changed in search and what it hasn't with Eli Schwartz, author of Product-Led SEO. Tune in! ]]></description>
<content:encoded><![CDATA[
<p class="wp-block-paragraph">For years, SEO’s job was simple: rank, get the click, own the journey from there. <a href="https://www.elischwartz.co/" data-type="link" data-id="https://www.elischwartz.co/">Eli Schwartz</a>, author of <em>Product-Led SEO</em> and strategist who took SurveyMonkey’s organic search from near-zero to a $200M-a-year growth engine, says that doesn’t exist anymore.</p>
<p class="wp-block-paragraph">Opening season 3 of <a href="https://prerender.io/podcast/" data-type="link" data-id="https://prerender.io/podcast/">Get Discovered</a> Podcast, he argued this isn’t a crisis. It’s SEO doing what it always has, adapting to a new interface</p>
<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://youtu.be/x0D_JsZoBqM">Listen now</a></div>
</div>
<h2 class="wp-block-heading">Product-led SEO was never about writing more</h2>
<p class="wp-block-paragraph">Five years after his book, Schwartz’s core idea is sharper than ever. Stop building content for the algorithm and start building a product for the searcher.</p>
<p class="wp-block-paragraph">Most companies still treat SEO as “create for the machine and hope.” Rank, trap the visitor, and figure out monetization later. Product-led SEO starts instead with why someone opens a search bar. What’s their trigger, the job to be done, and the experience that answers it?</p>
<p class="wp-block-paragraph">That matters more now. Commodity content, the kind re-explained across a thousand sites, is exactly what AI Overviews and AI Mode are built to absorb. An LLM will say it faster and never send anyone to you. The content that survives does something a summary can’t.</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-9-16 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="What Does "Product-Led SEO" Really Mean?" width="540" height="960" src="https://www.youtube.com/embed/A88DtClLLtY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<h2 class="wp-block-heading">SEO, AEO, GEO: Why the label matters less than the system behind it</h2>
<p class="wp-block-paragraph">Schwartz would rather the acronyms didn’t exist. Hiring separate SEO and AEO specialists is, in his view, as mistaken as splitting out “mobile SEO.” But with this much organizational attention flowing toward the terms, they’re probably here to stay.</p>
<p class="wp-block-paragraph">Where he and host Joe Walsh agreed: the real shift sits one layer down, in discovery and crawling, the systems most teams ignore while staring at rankings. Rankings without a click mean nothing, and being cited by an LLM doesn’t guarantee one either. AI hasn’t stolen SEO; it’s disrupted the top of the funnel SEO used to own.</p>
<h2 class="wp-block-heading">The head-term/long-tail split is dissolving</h2>
<p class="wp-block-paragraph">Search “hotel prices” and Google folds in your past searches, location, and intent signals until a two-word query behaves like a hyper-specific one. Personalization has erased the line between generic head content and pure long-tail. Anyone still designing a single “average” customer journey should take note, he advises.</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-9-16 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="How Search Personalization Is Changing SEO" width="540" height="960" src="https://www.youtube.com/embed/-nyyqL1MMR8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<h2 class="wp-block-heading">The attribution crisis is real</h2>
<p class="wp-block-paragraph">Impressions and rankings, Schwartz argued, were vanity metrics that hid mediocre work for years. Now that AI answers have stripped that cover away, dashboards are flashing red for teams that didn’t get worse. They just lost the metric flattering them.</p>
<p class="wp-block-paragraph">His fix isn’t a new dashboard. It’s tying everything to revenue and accepting the attribution fog brand marketing has always lived with. Paid media never had to, because Google and Meta had every incentive to prove their own case. Car companies, by contrast, have always trusted that the billboard worked. SEO teams now need to build that same trust, often without the authority to change how they’re measured.</p>
<p class="wp-block-paragraph">Demand hasn’t changed; people need products and services as much as ever. The pathway has. Teams that can’t tell that story convincingly are the ones getting cut.</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-9-16 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Are You Measuring the Wrong SEO Metrics?" width="540" height="960" src="https://www.youtube.com/embed/cx3fBxBCgKE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<h2 class="wp-block-heading">Better for users, brutal for marketers</h2>
<p class="wp-block-paragraph">Schwartz believes AI search favours users: shorter journeys and more exposure for niche, quality brands Google once buried as too risky. The tradeoff is less browsing and less serendipitous discovery.</p>
<p class="wp-block-paragraph">For marketers, the shortcuts are dying. AI can cross-reference a page’s claims against review sentiment, complaint volume, and reputation signals, so buying links and gaming rankings stop working. What survives is real quality and a real audience, which is terrifying or liberating depending on what your growth was built on.</p>
<h2 class="wp-block-heading">The takeaway</h2>
<p class="wp-block-paragraph">SEO isn’t over. The shortcuts, the vanity metrics, and the assumption that ranking equals revenue are. What’s left is the older, harder work Schwartz has always championed: know exactly who you’re building for, build something worth finding, and defend your results in a language that no longer starts with “impressions.”</p>
<h2 class="wp-block-heading">Tune in to the full conversation</h2>
<p class="wp-block-paragraph">Listen to the full episode of the Get Discovered podcast wherever you get your podcasts. Subscribe so you don’t miss any conversation on the fundamentals of online discovery and machine experience.</p>
<figure class="wp-block-embed is-type-rich is-provider-spotify wp-block-embed-spotify wp-embed-aspect-21-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Spotify Embed: Product-Led SEO and What AI Search Changed: Eli Schwartz, Author of Product-Led SEO" style="border-radius: 12px" width="100%" height="152" frameborder="0" allowfullscreen allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy" src="https://open.spotify.com/embed/show/0rzmrAPI063Y0LYpHipII8?utm_source=oembed"></iframe>
</div></figure>
<p class="wp-block-paragraph"><em><a href="https://www.linkedin.com/in/schwartze/">Eli Schwartz</a> is the author of Product-Led SEO and is currently writing Customer Intelligence*, a follow-up focused on how few companies actually understand their customers beyond a persona board. Find him on <a href="https://www.linkedin.com/in/schwartze/">LinkedIn</a> or at <a href="https://www.productledseo.com/">productledseo.com</a>.</em></p>
]]></content:encoded>
</item>
<item>
<title>Prerender.io Announces Strategic Partnership with Arbona Agency</title>
<link>https://prerender.io/blog/prerender-io-announces-strategic-partnership-with-arbona/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Thu, 17 Sep 2026 10:42:36 +0000</pubDate>
<category><![CDATA[News and Updates]]></category>
<category><![CDATA[Arbona]]></category>
<category><![CDATA[partnership announcements]]></category>
<category><![CDATA[partnerships]]></category>
<category><![CDATA[prerender partnership]]></category>
<guid isPermaLink="false">https://prerender.io/?p=14449</guid>
<description><![CDATA[Prerender.io and Arbona partner to support growth and AI search visibility across ecommerce and tourism clients. ]]></description>
<content:encoded><![CDATA[ <div data-elementor-type="wp-post" data-elementor-id="14449" class="elementor elementor-14449" data-elementor-post-type="post">
<div class="elementor-element elementor-element-77d8e605 e-flex e-con-boxed e-con e-parent" data-id="77d8e605" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="e-con-inner">
<div class="elementor-element elementor-element-7b6184cf elementor-widget elementor-widget-text-editor" data-id="7b6184cf" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<p class="wp-block-paragraph">Prerender.io is excited to announce a new strategic partnership with <a href="https://arbona-agency.com/">Arbona Agency</a>, a Croatian digital marketing agency founded in 2010 with offices across Varaždin, Zagreb, Rijeka, Belgrade, and Ljubljana.</p>
<p class="wp-block-paragraph">Arbona has spent over a decade helping businesses grow through performance advertising, including <a href="https://arbona-agency.com/en/google-ads-78/77">Google Ads</a>, <a href="https://arbona-agency.com/en/bing-ads-4097/4096">paid search,</a> <a href="https://arbona-agency.com/en/seo-393/392">SEO</a>, <a href="https://arbona-agency.com/en/optimization-for-ai-and-chatgpt-searches/9367">AEO</a>, <a href="https://arbona-agency.com/en/social-media-marketing-398/397">social</a>, and <a href="https://arbona-agency.com/en/email-marketing-408/407">email</a>. The agency runs more than 250 active projects at any given time for clients across industries. Their approach centers on Arbona 360, a unified digital strategy that treats paid, organic, and lifecycle channels as one connected system rather than isolated campaigns.</p>
<p class="wp-block-paragraph">This partnership brings together Arbona’s multi-channel digital strategy work and Prerender.io’s technical SEO infrastructure to solve a challenge that’s especially common across their ecommerce and tourism client base: making JavaScript-heavy sites fully visible to search engines and AI crawlers.</p>
<h2 class="wp-block-heading">Solving JavaScript SEO and GEO challenges</h2>
<p class="wp-block-paragraph">Many of Arbona’s clients run dynamic, JavaScript-rendered storefronts and booking platforms, the kind of builds that deliver a strong on-site experience but can leave search engines and AI crawlers struggling to see the full picture. For ecommerce in particular, that gap shows up as incomplete indexation, slow discovery of new listings or products, and content that’s technically live but effectively invisible in search.</p>
<p class="wp-block-paragraph">This is the exact scenario <a href="https://prerender.io/">Prerender.io</a> is built to solve. By serving fully rendered HTML to crawlers in place of raw JavaScript, Prerender.io gives search engines and AI crawlers a complete, readable version of every page without changing the user experience or client codebase.</p>
<p class="wp-block-paragraph">For ecommerce brands and <a href="https://prerender.io/enterprise/">enterprise</a> accounts, that means product and pricing updates get indexed accurately instead of sitting invisible. For tourism businesses, where availability and content shift constantly, the same gap can mean lost visibility during the exact windows travelers are searching and booking. In both cases, it’s about staying visible exactly when it counts.</p>
<p class="wp-block-paragraph">With AI search steadily establishing itself as the de facto search platform, Arbona positions itself to successfully navigate this challenge, together with its clients, regardless of the underlying framework.</p>
<div data-elementor-type="container" data-elementor-id="14452" class="elementor elementor-14452" data-elementor-post-type="elementor_library">
<div class="elementor-element elementor-element-277802ff e-con-full case_study_testimonial e-flex e-con e-child" data-id="277802ff" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[],"background_background":"classic"}">
<div class="elementor-element elementor-element-ba04e44 elementor-view-default elementor-widget elementor-widget-icon" data-id="ba04e44" data-element_type="widget" data-e-type="widget" data-widget_type="icon.default">
<div class="elementor-widget-container">
<div class="elementor-icon-wrapper">
<div class="elementor-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="69" height="55" viewBox="0 0 69 55" fill="none"><path d="M22.5175 25.7206C25.1981 26.9069 27.289 28.6863 28.7902 31.0588C30.2914 33.4314 31.042 36.2353 31.042 39.4706C31.042 44.1078 29.5944 47.8824 26.6993 50.7941C23.8042 53.598 20.1049 55 15.6014 55C11.0979 55 7.34499 53.5441 4.34266 50.6324C1.44755 47.7206 0 44 0 39.4706C0 37.3137 0.268065 35.1569 0.804196 33C1.34033 30.8431 2.51981 27.6078 4.34266 23.2941L13.6713 0H29.5944L22.5175 25.7206ZM60.4755 25.7206C63.1562 26.9069 65.2471 28.6863 66.7482 31.0588C68.2494 33.4314 69 36.2353 69 39.4706C69 44.1078 67.5524 47.8824 64.6573 50.7941C61.7622 53.598 58.0629 55 53.5594 55C49.0559 55 45.303 53.5441 42.3007 50.6324C39.4056 47.7206 37.958 44 37.958 39.4706C37.958 37.3137 38.2261 35.1569 38.7622 33C39.2984 30.8431 40.4779 27.6078 42.3007 23.2941L51.6294 0H67.5524L60.4755 25.7206Z" fill="#66D756"></path></svg> </div>
</p></div>
</p></div>
</p></div>
<div class="elementor-element elementor-element-508dc7bb elementor-widget elementor-widget-text-editor" data-id="508dc7bb" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<strong>AI-driven search is redefining visibility. Our clients invest in Google Ads, SEO, and AEO together, and this partnership ensures their content is just as discoverable to LLMs and AI crawlers as it is to traditional search engines.</strong> </div>
</p></div>
<div class="elementor-element elementor-element-76fbca11 e-con-full e-flex e-con e-child" data-id="76fbca11" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="elementor-element elementor-element-376f7870 e-con-full e-flex e-con e-child" data-id="376f7870" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="elementor-element elementor-element-10a53c32 elementor-widget elementor-widget-image" data-id="10a53c32" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
<div class="elementor-widget-container">
<img loading="lazy" decoding="async" width="150" height="150" src="https://prerender.io/wp-content/uploads/Andrej-Tonkovic-Arbona-Agency-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-image-14456" alt="Andrej Tonković from Arbona Agency" srcset="https://prerender.io/wp-content/uploads/Andrej-Tonkovic-Arbona-Agency-150x150.jpg 150w, https://prerender.io/wp-content/uploads/Andrej-Tonkovic-Arbona-Agency.jpg 200w" sizes="(max-width: 150px) 100vw, 150px" /> </div>
</p></div>
</p></div>
<div class="elementor-element elementor-element-5454fe8e e-flex e-con-boxed e-con e-child" data-id="5454fe8e" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="e-con-inner">
<div class="elementor-element elementor-element-753e5296 elementor-widget elementor-widget-text-editor" data-id="753e5296" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
Andrej Tonković </div>
</p></div>
<div class="elementor-element elementor-element-6198e58e elementor-widget elementor-widget-text-editor" data-id="6198e58e" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
Head of Client Strategy, Arbona Agency </div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div></p>
<h2 class="wp-block-heading">How the partnership benefits Arbona’s clients</h2>
<p class="wp-block-paragraph">For Arbona, this partnership means being able to close a technical SEO gap that sits outside their existing offering without adding complexity to client builds.</p>
<p class="wp-block-paragraph">Clients benefit from enhanced product and content visibility for search engines and AI crawlers. Additionally, clients can expect faster indexation of new and updated pages, improved Core Web Vitals and PageSpeed scores for greater downstream search engine success.</p>
<p class="wp-block-paragraph">This is where the two companies complement each other well: Arbona builds and runs the strategy across channels, and Prerender.io makes sure that work is fully visible to the crawlers deciding what gets found.</p>
<div data-elementor-type="container" data-elementor-id="14458" class="elementor elementor-14458" data-elementor-post-type="elementor_library">
<div class="elementor-element elementor-element-277802ff e-con-full case_study_testimonial e-flex e-con e-child" data-id="277802ff" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[],"background_background":"classic"}">
<div class="elementor-element elementor-element-ba04e44 elementor-view-default elementor-widget elementor-widget-icon" data-id="ba04e44" data-element_type="widget" data-e-type="widget" data-widget_type="icon.default">
<div class="elementor-widget-container">
<div class="elementor-icon-wrapper">
<div class="elementor-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="69" height="55" viewBox="0 0 69 55" fill="none"><path d="M22.5175 25.7206C25.1981 26.9069 27.289 28.6863 28.7902 31.0588C30.2914 33.4314 31.042 36.2353 31.042 39.4706C31.042 44.1078 29.5944 47.8824 26.6993 50.7941C23.8042 53.598 20.1049 55 15.6014 55C11.0979 55 7.34499 53.5441 4.34266 50.6324C1.44755 47.7206 0 44 0 39.4706C0 37.3137 0.268065 35.1569 0.804196 33C1.34033 30.8431 2.51981 27.6078 4.34266 23.2941L13.6713 0H29.5944L22.5175 25.7206ZM60.4755 25.7206C63.1562 26.9069 65.2471 28.6863 66.7482 31.0588C68.2494 33.4314 69 36.2353 69 39.4706C69 44.1078 67.5524 47.8824 64.6573 50.7941C61.7622 53.598 58.0629 55 53.5594 55C49.0559 55 45.303 53.5441 42.3007 50.6324C39.4056 47.7206 37.958 44 37.958 39.4706C37.958 37.3137 38.2261 35.1569 38.7622 33C39.2984 30.8431 40.4779 27.6078 42.3007 23.2941L51.6294 0H67.5524L60.4755 25.7206Z" fill="#66D756"></path></svg> </div>
</p></div>
</p></div>
</p></div>
<div class="elementor-element elementor-element-508dc7bb elementor-widget elementor-widget-text-editor" data-id="508dc7bb" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<strong>Arbona’s track record with ecomm and enterprise accounts made this an easy partnership to say yes to. Their clients run complex, JavaScript-heavy builds that need a solution like ours most. We’re looking forward to helping their clients and internal team keep pace with how search and AI discovery are evolving.</strong> </div>
</p></div>
<div class="elementor-element elementor-element-76fbca11 e-con-full e-flex e-con e-child" data-id="76fbca11" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="elementor-element elementor-element-376f7870 e-con-full e-flex e-con e-child" data-id="376f7870" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="elementor-element elementor-element-10a53c32 elementor-widget elementor-widget-image" data-id="10a53c32" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
<div class="elementor-widget-container">
<img loading="lazy" decoding="async" width="150" height="150" src="https://prerender.io/wp-content/uploads/user-1-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-image-6182" alt="" srcset="https://prerender.io/wp-content/uploads/user-1-150x150.jpg 150w, https://prerender.io/wp-content/uploads/user-1.jpg 200w" sizes="(max-width: 150px) 100vw, 150px" /> </div>
</p></div>
</p></div>
<div class="elementor-element elementor-element-5454fe8e e-flex e-con-boxed e-con e-child" data-id="5454fe8e" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="e-con-inner">
<div class="elementor-element elementor-element-753e5296 elementor-widget elementor-widget-text-editor" data-id="753e5296" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
Marcos Withington </div>
</p></div>
<div class="elementor-element elementor-element-6198e58e elementor-widget elementor-widget-text-editor" data-id="6198e58e" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<p>Head of Partnerships at Prerender.io</p>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div></p>
<h2 class="wp-block-heading">About Arbona Agency</h2>
<p class="wp-block-paragraph"><a href="https://arbona-agency.com/" target="_blank" rel="noreferrer noopener nofollow" data-type="link" data-id="https://arbona-agency.com/">Arbona Agency</a> is a Croatian digital marketing agency founded in 2010, with offices in Varaždin, Zagreb, Rijeka, Belgrade, and Ljubljana. The agency builds and runs cross-channel strategies for clients, with Google Ads and paid search forming the largest part of its portfolio, complemented by SEO, AEO, social media, and email marketing. Arbona serves companies across retail, ecommerce, tourism, amongst other industries, managing more than 250 active client projects at any given time.</p>
<h2 class="wp-block-heading">About Prerender.io</h2>
<p class="wp-block-paragraph"><a href="https://prerender.io/">Prerender.io</a> is a technical SEO solution that helps websites ensure their JavaScript content is fully visible to search engines and generative AI tools. Used by thousands of companies worldwide, including Microsoft and Walmart, Prerender.io solves critical SEO challenges for modern websites.</p>
<p class="wp-block-paragraph">Interested in becoming a <a href="https://prerender.io/partners/">Prerender.io Partner</a>? <a href="https://prerender.io/partners/#join">Get in touch</a>.</p>
</div>
</div>
</div>
</div>
</div>
]]></content:encoded>
</item>
<item>
<title>What’s Really Deciding AI Visibility? Find Out in Season 3</title>
<link>https://prerender.io/blog/season-3-coming-soon/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Tue, 15 Sep 2026 17:05:36 +0000</pubDate>
<category><![CDATA[Podcast]]></category>
<category><![CDATA[get discovered podcast]]></category>
<category><![CDATA[podcast]]></category>
<category><![CDATA[prerender podcast]]></category>
<guid isPermaLink="false">https://prerender.io/?p=14464</guid>
<description><![CDATA[Get a glimpse of what’s to come from season three as we break down what’s really deciding your AI visibility, the infrastructure and technical decisions behind it, and what you can do about it.]]></description>
<content:encoded><![CDATA[
<p class="wp-block-paragraph">Get a glimpse of what’s to come from season three as we break down what’s really deciding your AI visibility, the infrastructure and technical decisions behind it, and what you can do about it.</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="What's Really Deciding AI Visibility? Find Out in Season 3" width="640" height="360" src="https://www.youtube.com/embed/-Qp7z4zSDrg?list=PLT0E2vMvCuQU" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p class="wp-block-paragraph"></p>
]]></content:encoded>
</item>
<item>
<title>International SEO: Technical Guide for Multi-Market Websites</title>
<link>https://prerender.io/blog/international-seo-technical-guide/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Fri, 04 Sep 2026 06:12:50 +0000</pubDate>
<category><![CDATA[Enterprise SEO]]></category>
<category><![CDATA[Technical SEO]]></category>
<guid isPermaLink="false">https://prerender.io/?p=14277</guid>
<description><![CDATA[We look at nine technical issues that break multi-market sites for international SEO, all of which sit below hreflang and geotargeting, where standard audits never look.]]></description>
<content:encoded>< | grep -i “hreflang”</li>
<li>Compare the raw HTML annotation count against the rendered DOM in your browser’s Developer Tools.</li>
<li>Diagnostic: Fewer tags in the raw HTML response means your annotations rely on client-side JavaScript execution (see Issue #2). Varying tag counts between locale templates indicate a broken template render, which breaks cluster reciprocity.</li>
</ol>
<p class="wp-block-paragraph">Need more help? <a href="https://prerender.io/blog/fix-hreflang-tag-issues/">This Hreflang guide can help you to fix common hreflang problems.</a></p>
<h3 class="wp-block-heading">2. How JavaScript Rendering Multiplies Crawl Cost</h3>
<p class="wp-block-paragraph">Loading pages with JavaScript forces search engines to spend extra computing power to render your content before they can index it. While Google handles client-side scripts easily on smaller sites, massive multi-market catalogs overwhelm that system.</p>
<p class="wp-block-paragraph">On a 500,000-page catalog spread across multiple countries, Googlebot simply runs out of crawl budget. Your deep regional product pages aren’t stuck because the code itself is slow; they are stuck waiting in a massive queue just to be fetched and rendered in the first place. Parameterized URLs and site filters make this backlog exponentially worse, delaying hreflang discovery and keeping secondary markets unindexed for weeks.</p>
<h4 class="wp-block-heading">Business impact</h4>
<p class="wp-block-paragraph">New product launches, campaign landing pages, and inventory updates in secondary markets take weeks or months to appear in local search results. This creates a severe lag in time-to-market revenue, giving agile local competitors a free pass to capture search traffic and sales first. </p>
<h4 class="wp-block-heading">Run this check: render overhead in your crawl allocation</h4>
<ol class="wp-block-list">
<li>Open Crawl Stats in Search Console and compare request rates between parameterized locale URLs and clean category URLs.</li>
<li>Run URL Inspection on a filtered category page in a secondary market and inspect its last crawl date.</li>
<li>Diagnostic: Filtered pages recrawling monthly, while clean category pages recrawl weekly, confirms that JavaScript rendering overhead is eating your crawl budget.</li>
</ol>
<p class="wp-block-paragraph">For more ways to fix these client-side issues, explore our breakdown of <a href="https://www.google.com/search?q=https://prerender.io/blog/8-javascript-seo-problems-and-how-to-solve-them/">8 JavaScript SEO Problems and How to Solve Them</a>. </p>
<h3 class="wp-block-heading">3. Why AI Crawlers Miss International SEO Signals</h3>
<p class="wp-block-paragraph">Most international SEO advice focuses exclusively on Googlebot, but AI search engines like ChatGPT, Claude, and Perplexity crawl your site differently. Major AI crawlers—including GPTBot, ClaudeBot, and PerplexityBot—do not execute JavaScript at all. They fetch your site’s raw HTML response, ignore client-side scripts, and move on.</p>
<p class="wp-block-paragraph">If your localized copy, structured data (schema), alternate tags, or translated metadata are injected via JavaScript, they are completely invisible to these engines. When an AI crawler requests a localized page on a client-side rendered site, it receives a blank template or unlocalized default content, causing AI search engines to overlook your regional presence entirely.</p>
<h4 class="wp-block-heading">Business impact</h4>
<p class="wp-block-paragraph">When prospective international customers ask AI tools for regional product recommendations or pricing, these platforms pull answers from local competitors who serve static, fully rendered HTML. This creates an invisible leak in high-intent global traffic and brand visibility as search behavior shifts toward AI tools. </p>
<h4 class="wp-block-heading">Run this check: what AI crawlers receive from your locales</h4>
<ol class="wp-block-list">
<li>Fetch a localized URL using an AI crawler user agent:<br>curl -A “GPTBot/1.0” [https://example.com/de/kategorie/](https://example.com/de/kategorie/) | grep -c “application/ld+json”</li>
<li>Check the output count for your localized schema or translated text blocks.</li>
<li>Diagnostic: A result of zero confirms that AI crawlers receive none of your localized schema or content on that regional page, leaving your brand invisible in AI-generated answers.</li>
</ol>
<p class="wp-block-paragraph">To ensure your dynamic site stays visible across all artificial intelligence engines, learn <a href="https://prerender.io/blog/how-to-optimize-your-website-for-ai-crawlers/">how to optimize your website for AI crawlers</a>.</p>
<h3 class="wp-block-heading">4. Crawl Budget Management Across Markets</h3>
<p class="wp-block-paragraph"><a href="https://developers.google.com/search/docs/crawling-indexing/large-site-managing-crawl-budget" target="_blank" rel="noreferrer noopener nofollow">Search engine crawl budget is finite per host</a>, and multi-market sites burn through it fast. Near-duplicate regional pages across similar locales (like en-us, en-gb, and en-au) consume separate crawl visits for nearly identical content. Thin localized variants and complex faceted navigation filters compound this waste, forcing search bots to spend resources on low-value URLs instead of indexing core regional catalog items.</p>
<p class="wp-block-paragraph">A structural fix requires locale-segmented XML sitemaps. Build one sitemap per market under a parent sitemap index, include every regional hreflang alternate URL inside its respective locale sitemap, and submit each to its corresponding Google Search Console property. Pair this with isolated path rules in your robots.txt file to block unnecessary parameter crawls. </p>
<h4 class="wp-block-heading">Business impact</h4>
<p class="wp-block-paragraph">Key product launches and seasonal inventory in secondary markets take weeks to index while primary market SKUs surface in days. This delay wastes crawl budget on non-converting URLs and stalls international revenue growth on high-margin inventory. </p>
<h4 class="wp-block-heading">Run this check: Crawl waste per locale</h4>
<ol class="wp-block-list">
<li>Segment your server logs by regional path (e.g., /de/, /fr/, /jp/).</li>
<li>Calculate Googlebot request volume per 1,000 indexable URLs for each market, then measure what percentage hits non-canonical or parameterized filter URLs.</li>
<li>Diagnostic: A secondary locale burning a significantly higher share of crawl requests on parameters than your primary market confirms severe crawl waste.</li>
</ol>
<p class="wp-block-paragraph">Read <a href="https://prerender.io/blog/crawl-budget-management-for-large-websites/">our crawl budget best practices for large sites</a> to learn more.</p>
<h3 class="wp-block-heading">5. Template Drift Causing Cross-Market Hreflang Errors</h3>
<p class="wp-block-paragraph">Most teams treat international SEO as a one-time validation setup, but live multi-market sites suffer from template drift. Because parent CMS templates push updates into every regional child site simultaneously, a routine front-end code release can silently strip self-referencing tags or invert canonical URLs across eight markets at once.</p>
<p class="wp-block-paragraph">Because these template updates rarely trigger SEO alerts, the code regression goes unnoticed. The diagnostic failure lands weeks later when search engines recrawl the affected pages and silently drop regional rankings. Monitoring must align with your front-end deployment cadence rather than relying on static monthly audits.</p>
<h4 class="wp-block-heading">Business impact</h4>
<p class="wp-block-paragraph">A single unflagged front-end update can break international signals overnight, wiping out months of organic search growth across global storefronts without anyone realizing code was broken. </p>
<h4 class="wp-block-heading">Run this check: Post-deploy head diff</h4>
<ol class="wp-block-list">
<li>Capture the code of a benchmark sample URL from each locale before your next code release.</li>
<li>Diff the post-deployment HTML against your pre-deployment baseline.</li>
<li>Diagnostic: Any unapproved changes to hreflang tags, canonical URLs, or structured data confirm template drift, allowing you to catch regressions before search engines recrawl.</li>
</ol>
<h3 class="wp-block-heading">6. Schema Localization Gaps on JS-Rendered Sites</h3>
<p class="wp-block-paragraph">Structured data must reflect the specific local market it sits in. Translating on-page text while leaving JSON-LD fields like priceCurrency, availability, region, or inLanguage set to primary-market defaults tells search engines your page has contradictory signals. This metadata conflict suppresses rich snippet eligibility across every language version.</p>
<p class="wp-block-paragraph">JavaScript-rendered sites carry a second failure mode: schema injected after initial page load stays missing from the raw HTML response. It waits in a delayed rendering queue for Googlebot and remains completely invisible to non-rendering AI search engines. </p>
<h4 class="wp-block-heading">Business impact</h4>
<p class="wp-block-paragraph">Conflicting or missing localized schema strips your search listings of eye-catching rich snippets (like localized pricing, star ratings, and stock status). This lowers click-through rates and degrades search conversion across all regional markets. </p>
<h4 class="wp-block-heading">Run this check: locale-specific schema values </h4>
<p class="wp-block-paragraph">Diagnostic: Identical currency or language values across different locales mean your schema was machine-translated without being localized, suppressing rich snippets globally.</p>
<p class="wp-block-paragraph">Extract the raw application/ld+json schema block from an equivalent page in each locale:<br>curl -sL [https://example.com/de/produkt/](https://example.com/de/produkt/) | grep -i “application/ld+json”</p>
<p class="wp-block-paragraph">Verify that priceCurrency, inLanguage, and localized offer availability reflect the target market.</p>
<h3 class="wp-block-heading">7. Core Web Vitals Vary by Region, So Measure and Fix Per Market</h3>
<p class="wp-block-paragraph">Core Web Vitals rely on field data collected from real user sessions, meaning performance scores reflect the actual physical geography of visitors loading your pages. Distance to server origin shows up first in Time to First Byte (TTFB). Official <a href="https://web.dev/articles/ttfb">web.dev guidance on TTFB</a> classifies performance as good at 0.8 seconds or below, and poor above 1.8 seconds. Because TTFB precedes both First Contentful Paint (FCP) and Largest Contentful Paint (LCP), every millisecond of server latency directly degrades your primary rendering metrics.</p>
<p class="wp-block-paragraph">A centralized site served from a North American origin server can clear LCP standards in the US while failing performance thresholds in Southeast Asia or South America on identical code. Evaluating global performance averages masks regional failures, as Chrome User Experience Report (CrUX) judges each market on its own local 75th-percentile distribution. CDN edge nodes reduce latency for static assets, but dynamic origin calls (like local currency or inventory checks) bypass edge caching. </p>
<h4 class="wp-block-heading">Business impact</h4>
<p class="wp-block-paragraph">Slow regional load times hurt organic rankings in local search results and drive up bounce rates among international shoppers, directly reducing cross-border ecommerce conversion rates. </p>
<h4 class="wp-block-heading">Run this check: CrUX field data by market</h4>
<ol class="wp-block-list">
<li>Open the CrUX Dashboard in BigQuery or query the CrUX API segmented by country dimension for your top international markets.</li>
<li>Compare 75th-percentile TTFB and LCP metrics side-by-side across regions.</li>
<li>Diagnostic: A secondary market sitting above 1.8 seconds on TTFB while your primary market clears 0.8 seconds confirms an infrastructure latency bottleneck that front-end code optimizations cannot fix.</li>
</ol>
<p class="wp-block-paragraph">To better understand how content delivery networks handle dynamic rendering overhead, learn about <a href="https://www.google.com/search?q=https://prerender.io/blog/cdns-vs-prerender-for-enterprise-seo/">the difference between CDNs vs. Prerender.io for enterprise SEO</a>.</p>
<h3 class="wp-block-heading">8. URL Structure Trade-Offs for Crawl and Authority at Scale</h3>
<p class="wp-block-paragraph">Choosing between country-code top-level domains (ccTLDs), subdirectories, and subdomains is often treated as an architectural decision made once during a site launch. However, the long-term crawl budget and domain authority costs compound over time.</p>
<p class="wp-block-paragraph"><a href="https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites" target="_blank" rel="noreferrer noopener nofollow">Google names ccTLDs as the strongest country-targeting signal</a> available, but force Googlebot to allocate separate crawl budgets and build domain authority independently across every market. Managing eight ccTLDs means managing eight isolated, under-resourced crawl pools that cannot pass link equity to one another. Subdirectories consolidate crawl budget and domain authority under a single root domain, allowing equity earned in your primary market to benefit international pages. Subdomains sit awkwardly in the middle, incurring authority fragmentation without the strong geotargeting benefits of ccTLDs. </p>
<h4 class="wp-block-heading">Business impact</h4>
<p class="wp-block-paragraph">Fragmented domain architecture keeps secondary markets weak, forcing you to spend extra budget building local domain authority from scratch for every new international launch. </p>
<h4 class="wp-block-heading">Run this check: Crawl allocation per host, tracked quarterly</h4>
<p class="wp-block-paragraph">Diagnostic: A declining crawl ratio on secondary hosts proves that host fragmentation is suppressing search engine discovery across your international portfolio.</p>
<p class="wp-block-paragraph">Log Search Console crawl request totals per 1,000 indexable URLs per host property on a quarterly basis.</p>
<p class="wp-block-paragraph">Compare the crawl frequency of your weakest international domain against your primary host.</p>
<h3 class="wp-block-heading">9. IP-Based Redirects Block Googlebot From International Pages</h3>
<p class="wp-block-paragraph">Forcing automated IP-based redirects is one of the most common ways multi-market sites accidentally destroy their international search presence. Googlebot originates almost all of its crawls from US IP addresses and rarely sends location-specific header variations. A country-keyed IP redirect intercepts Googlebot on regional URLs and forces it back to your US default store.</p>
<p class="wp-block-paragraph">This issue is even worse for AI crawlers. Major AI bots (including OpenAI and Anthropic crawlers) run strictly out of US data centers. An automated IP redirect routes every AI bot directly to your default US pages, rendering international variants completely unreachable to conversational search engines. The correct technical solution is to serve requested URLs directly, suggest a location banner with an opt-in switcher, and maintain stable URLs. </p>
<h4 class="wp-block-heading">Business impact</h4>
<p class="wp-block-paragraph">Automated IP redirects block Googlebot and AI crawlers from ever visiting your international pages, rendering your entire global site architecture invisible in local search results. </p>
<h4 class="wp-block-heading">Run this check: What a crawler resolves to on a non-US locale</h4>
<ol class="wp-block-list">
<li>Inspect a localized non-US URL using the live test tool in Google Search Console, or test via the command line:<br>curl -sI -A “Googlebot” [https://example.com/fr/produits/](https://example.com/fr/produits/) | head -n 3</li>
<li>Check the initial HTTP status code and response URL.</li>
<li>Diagnostic: Receiving a 301 or 302 redirect to a US URL confirms that automated IP routing is actively blocking search engines from indexing your international pages.</li>
</ol>
<p class="wp-block-paragraph">If you suspect your rendering pipeline is creating similar indexing blocks, review these <a href="https://www.google.com/search?q=https://prerender.io/blog/10-signs-that-you-have-javascript-rendering-problems/">10 signs that you have JavaScript rendering problems</a>.</p>
<h2 class="wp-block-heading">How Prerender.io Resolves the Rendering Layer of International SEO</h2>
<p class="wp-block-paragraph">International indexing failures frequently stem from a single delivery bottleneck: search engine bots and AI crawlers receive raw, unrendered HTML that lacks your localized signals. Prerender.io fixes this pipeline by serving fully pre-rendered static HTML directly to bots on the first request.</p>
<h3 class="wp-block-heading">Where Prerender.io Solves the Problem International SEO for Enterprise</h3>
<ul class="wp-block-list">
<li><strong>Hreflang delivery and JavaScript rendering:</strong> Googlebot receives complete, fully executed hreflang annotations instantly, eliminating the two-wave rendering queue and protecting your crawl budget.</li>
<li><strong>AI search visibility:</strong> Non-rendering bots (like GPTBot, ClaudeBot, and PerplexityBot) receive localized copy, translated metadata, and complete HTML rather than blank JavaScript templates.</li>
<li><strong>Schema localization:</strong> Regional structured data (including local currencies, stock availability, and language tags) arrives in the initial server payload, securing rich snippet eligibility across all markets.</li>
</ul>
<p class="wp-block-paragraph">On Running, a sportswear brand operating across more than 60 countries, demonstrated the impact of this mechanism. When they temporarily disabled Prerender.io in a single low-traffic international market for one month, organic traffic in that region plummeted below 10% of its baseline. Traffic recovered immediately once prerendering was restored. <a href="https://prerender.io/resources/case-studies/on-prerender/">Read On’s success story with</a> <a href="http://prerender.io">Prerender.io</a>.</p>
<p class="wp-block-paragraph">On Running traffic after Prerender.io adoption:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="742" height="612" src="https://prerender.io/wp-content/uploads/Screenshot-2026-09-17-at-11.16.41.png" alt="On Running traffic after Prerender.io adoption" class="wp-image-14522" srcset="https://prerender.io/wp-content/uploads/Screenshot-2026-09-17-at-11.16.41.png 742w, https://prerender.io/wp-content/uploads/Screenshot-2026-09-17-at-11.16.41-300x247.png 300w" sizes="(max-width: 742px) 100vw, 742px" /></figure>
<p class="wp-block-paragraph">On Running traffic when it paused Prerender.io:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="742" height="217" src="https://prerender.io/wp-content/uploads/Screenshot-2026-09-17-at-11.16.30.png" alt="On Running traffic when it paused Prerender.io" class="wp-image-14523" srcset="https://prerender.io/wp-content/uploads/Screenshot-2026-09-17-at-11.16.30.png 742w, https://prerender.io/wp-content/uploads/Screenshot-2026-09-17-at-11.16.30-300x88.png 300w" sizes="(max-width: 742px) 100vw, 742px" /></figure>
<h3 class="wp-block-heading">Where Prerender.io Assists (Sitemaps & Monitoring Still Required)</h3>
<ul class="wp-block-list">
<li><strong>Crawl budget management:</strong> Serving lightweight static HTML significantly lowers CPU load per fetch, helping search engines crawl deeper into large dynamic catalogs. However, organizing locale-segmented sitemaps and setting up per-market Search Console properties remains your responsibility.</li>
<li><strong>Template drift:</strong> Pre-rendered cache refreshes ensure that updated tags surface cleanly after deployments. However, automated post-release diff monitoring is still needed to catch CMS template regressions before deployment.</li>
</ul>
<h3 class="wp-block-heading">What Prerender.io Does Not Touch</h3>
<p class="wp-block-paragraph">Prerender.io operates specifically at the rendering layer. It does not resolve Core Web Vitals latency (a CDN and origin hosting challenge), URL architecture trade-offs (a domain strategy decision), or IP-based redirects (a geographic routing misconfiguration). Those infrastructure bottlenecks require edge-caching rules, site migration planning, and opt-in location banners.</p>
<h2 class="wp-block-heading">How to Prioritize International SEO Fixes</h2>
<p class="wp-block-paragraph">No team fixes nine things at once, and most international SEO best practices arrive as a flat checklist that offers no help in choosing. These four tiers rank the nine issues by how much revenue each one puts at risk against how fast the fix shows up in search.</p>
<h3 class="wp-block-heading">Tier 1: Blocks indexation, critical</h3>
<ul class="wp-block-list">
<li><strong>Hreflang errors (#1):</strong> one faulty template variable collapses the cluster, and several markets lose rankings in the same week.</li>
<li><strong>JavaScript rendering overhead (#2):</strong> deep locale pages never get allocated the crawl that would index them.</li>
<li><strong>IP-based redirects (#9):</strong> every non-US locale is unreachable to Googlebot and to every AI crawler at once.</li>
</ul>
<h3 class="wp-block-heading">Tier 2: Compounds on large catalogs</h3>
<ul class="wp-block-list">
<li><strong>AI crawler exclusion (#3):</strong> localized copy, schema, and metadata are absent from AI answers, no matter how correctly they are configured.</li>
<li><strong>Crawl budget waste (#4):</strong> new products surface in secondary markets monthly instead of daily, and the gap widens above roughly 100k pages.</li>
</ul>
<h3 class="wp-block-heading">Tier 3: Erodes authority without an obvious drop</h3>
<ul class="wp-block-list">
<li><strong>Template drift (#5): </strong>validated hreflang breaks on a front-end deploy, nobody flagged as SEO-relevant.</li>
<li><strong>Schema localization (#6):</strong> rich results get suppressed across every language version, including the ones nobody edited.</li>
</ul>
<h3 class="wp-block-heading">Tier 4: Plan rather than react</h3>
<ul class="wp-block-list">
<li><strong>Core Web Vitals by market (#7):</strong> slow markets are judged on their own field data and never on your global average, so this rewards ongoing attention.</li>
<li><strong>URL structure (#8):</strong> crawl budget and authority stay fragmented across markets that cannot lift each other, though migration risk means this belongs in your next replatform conversation</li>
</ul>
<h2 class="wp-block-heading">Final Thoughts on Technical International SEO Strategy</h2>
<p class="wp-block-paragraph">An international SEO strategy depends on infrastructure that most audits miss. Your hreflang, URL structure, and geotargeting can all be validated even when crawlers receive HTML that contains none of them, and no amount of configuration work fixes a delivery problem.</p>
<p class="wp-block-paragraph">Start where indexation is actively blocked, verify what crawlers receive rather than what your CMS believes it publishes, and treat every front-end deploy as a possible regression across all markets at once.</p>
<p class="wp-block-paragraph">Then test the rendering layer on your own locales before committing to anything. Prerender.io’s free 30-day trial includes 25,000 renders, enough to cover a meaningful slice of a multi-locale catalog and build enough Search Console history to see whether coverage in your weakest market moves.</p>
<p class="wp-block-paragraph"><a href="https://prerender.io/pricing/"><strong>Start a free Prerender.io trial</strong></a> and see exactly what crawlers receive from your international pages today.</p>
<h2 class="wp-block-heading">FAQs About International SEO</h2>
<h3 class="wp-block-heading">Is international SEO the same as multilingual SEO?</h3>
<p class="wp-block-paragraph">No. Multilingual SEO covers serving content in more than one language, while international SEO covers targeting more than one country, which brings currency, shipping, legal, and search engine differences on top of language. A single-language brand selling into Canada, Australia, and the UK is doing international SEO with no translation involved.</p>
<h3 class="wp-block-heading">Does hreflang still work if JavaScript injects it?</h3>
<p class="wp-block-paragraph">Google can read hreflang injected by JavaScript, though only once it renders the page, and that rendering competes for the same crawl budget as everything else on a large site. AI crawlers execute no JavaScript at all, so client-side hreflang is invisible to them, regardless of how correctly it is written. Serving annotations in the initial HTML response removes both constraints.</p>
<h3 class="wp-block-heading">How long should a new locale take to index?</h3>
<p class="wp-block-paragraph">Google aims to check and index pages in a reasonably timely manner, which for most sites means three days or more, and deep pages on large catalogs <a href="https://prerender.io/blog/10-ways-to-get-your-website-indexed-faster/">take considerably longer than that</a>. A locale showing almost no indexed pages after several weeks usually points to a blocking issue rather than a normal waiting period.</p>
<h3 class="wp-block-heading">Do I need a separate Search Console property for each market?</h3>
<p class="wp-block-paragraph">You need one per market to get usable data. A single property covering the whole site blends every locale into one coverage number, which hides the market that is actually failing. Separate properties also let you submit the matching locale sitemap and read crawl stats for that market alone, and ccTLDs require separate properties by definition.</p>
<h3 class="wp-block-heading">Is prerendering the same as cloaking?</h3>
<p class="wp-block-paragraph">No, provided the prerendered HTML matches what users see. <a href="https://prerender.io/blog/cloaking-vs-dynamic-rendering-explained/">Cloaking </a>means serving crawlers materially different content from users, while prerendering serves the same content in a form crawlers can read without executing JavaScript. Google’s guidance treats dynamic rendering as a workaround rather than a permanent recommendation, so the practical test is content parity between what bots and users receive.</p>
<h3 class="wp-block-heading">Can AI crawlers read hreflang and structured data?</h3>
<p class="wp-block-paragraph">AI crawlers can read both when the markup arrives in the initial HTML response. <a href="https://prerender.io/ai-search/">None of the large AI crawlers execute JavaScript</a>, so anything injected client-side remains invisible to them, no matter how well configured.</p>
<p class="wp-block-paragraph"></p>
]]></content:encoded>
</item>
<item>
<title>10 Signs That You Have JavaScript Rendering Problems</title>
<link>https://prerender.io/blog/signs-of-javascript-rendering-problems/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Sun, 23 Aug 2026 13:21:00 +0000</pubDate>
<category><![CDATA[Javascript SEO]]></category>
<category><![CDATA[Prerendering]]></category>
<guid isPermaLink="false">https://prerender.io/?p=14188</guid>
<description><![CDATA[Unindexed pages and blank link previews may point to JavaScript rendering problems. Learn how to diagnose and fix the underlying issues]]></description>
<content:encoded><![CDATA[
<p class="wp-block-paragraph">JavaScript rendering problems rarely announce themselves as rendering problems. Instead, they show up as familiar technical SEO issues: pages stuck in “Crawled, currently not indexed,” outdated product snippets, or your brand missing from AI search results. Because those symptoms have obvious, well-worn explanations, teams blame content quality, backlinks, or an algorithm update instead of the rendering layer.</p>
<p class="wp-block-paragraph">For websites built on modern JavaScript frameworks (like React, Vue, Next.js, Astro, etc.), that misdiagnosis costs months of wasted optimization while the real problem becomes lost traffic, leads, and revenue.</p>
<p class="wp-block-paragraph">In this article, our expert team at Prerender.io discusses 10 signs that rendering issues are hurting your visibility, shows you how to confirm each one, and explains how to fix JavaScript rendering issues at the rendering layer.</p>
<h2 class="wp-block-heading">TL;DR: Indications That Your Website Has Rendering Issues</h2>
<ul class="wp-block-list">
<li>JavaScript rendering problems occur when your server sends crawlers an HTML shell and relies on the browser to render the content, so crawlers see an empty page while users see a complete one.</li>
<li>These problems usually surface as ordinary SEO issues rather than obvious rendering failures, which is why they go undiagnosed for months.</li>
<li>Common warning signs include unindexed pages, blank rendered HTML, missing schema, deceptively fast crawl stats, unfollowed internal links, rendering errors and false soft 404s, AI search invisibility, broken social previews, Google Ads disapprovals, and Core Web Vitals spikes.</li>
<li>All ten share one root cause: a broken rendering layer, where bots receive an empty or incomplete version of pages that look perfect to human visitors.</li>
<li><a href="https://prerender.io/" type="link" id="https://prerender.io/">Prerender.io</a> closes the rendering gap by serving crawlers fully rendered HTML, without requiring a site rebuild.</li>
</ul>
<h2 class="wp-block-heading">Why JavaScript Rendering Problems Are Hard to Spot</h2>
<p class="wp-block-paragraph">JavaScript rendering problems are difficult to diagnose because your site appears healthy from a user’s perspective. Pages load in the browser, visitors can navigate the site and complete purchases, and internal dashboards continue to report healthy performance. Meanwhile, search engines and AI crawlers are receiving incomplete HTML, leaving important content unavailable for indexing.</p>
<p class="wp-block-paragraph">When the symptoms finally appear, teams often investigate the wrong causes. Indexation drops get attributed to algorithm updates or thin content, missing rich results are blamed on schema implementation, and inconsistent AI visibility gets written off as LLMs being unreliable. Every one of those explanations is plausible, which is why rendering rarely gets checked. <strong>The evidence exists in exactly one place: the HTML your server sends before any JavaScript runs.</strong></p>
<p class="wp-block-paragraph">So, if your site is built with <a href="https://prerender.io/blog/how-to-optimize-react-javascript-code-for-seo/">React</a>, <a href="https://prerender.io/blog/vue-js-pros-and-cons/">Vue</a>, <a href="https://prerender.io/blog/angularjs-pros-cons-and-optimization/">Angular</a>, client-rendered Next.js, Bolt.new, or another JavaScript framework, and several of the signs below look familiar, JavaScript rendering is the most likely cause.</p>
<h2 class="wp-block-heading">10 Signs Your Website Has JavaScript Rendering Problems</h2>
<p class="wp-block-paragraph">Each sign below indicates that bots are receiving less content than your visitors do. One issue alone could have another explanation, but multiple symptoms on your JS-heavy site strongly suggest a rendering problem.</p>
<h3 class="wp-block-heading">1. Google Search Console Shows Pages Stuck in “Discovered’ or “Crawled – Currently Not Indexed”</h3>
<p class="wp-block-paragraph">These two Google Search Console (GSC) statuses are the most common early warning of JavaScript rendering issues, and the mechanism behind them is Google’s two-wave rendering process (crawling the raw HTML first, then rendering the JavaScript later as computing resources become available).</p>
<ul class="wp-block-list">
<li>“<a href="https://prerender.io/blog/how-to-avoid-discovered-currently-not-indexed/" type="link" id="https://prerender.io/blog/how-to-avoid-discovered-currently-not-indexed/">Discovered – currently not indexed</a>” means Google knows the page exists but has delayed crawling it.</li>
<li>“<a href="https://prerender.io/blog/understanding-googles-crawled-currently-not-indexed-coverage-guide/">Crawled – currently not indexed</a>” means Google fetched the raw HTML, found a near-empty shell, and pushed the page into the slow rendering queue, where JS-dependent pages can sit for weeks or months.</li>
</ul>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="624" height="353" src="https://prerender.io/wp-content/uploads/Google-Search-Console-Page-Indexing-report.jpg" alt="Google Search Console Page Indexing report showing pages in "Discovered – currently not indexed"" class="wp-image-14195" srcset="https://prerender.io/wp-content/uploads/Google-Search-Console-Page-Indexing-report.jpg 624w, https://prerender.io/wp-content/uploads/Google-Search-Console-Page-Indexing-report-300x170.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>
</div>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Open the Page Indexing report in Google Search Console and review how many URLs fall into these two categories. A growing count on a JS-heavy site is a strong signal.</p>
<h3 class="wp-block-heading">2. Your URL Inspection Live Test Shows Blank Rendered HTML</h3>
<p class="wp-block-paragraph">The URL Inspection live test shows the exact HTML Google uses; if that view is a blank screen, a loading skeleton, or raw template brackets like {page.title} instead of real content, crawlers are evaluating an empty page. <a href="https://prerender.io/blog/how-to-optimize-single-page-applications-spas-for-crawling-and-indexing/">Single-page applications</a> (like Lovable) are especially prone to returning an empty shell that depends on JavaScript to populate the page.</p>
<p class="wp-block-paragraph">The damage extends beyond visible content. When titles, canonical tags, or hreflang tags are injected client-side by JavaScript, Google may miss those signals during its initial crawl.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="624" height="283" src="https://prerender.io/wp-content/uploads/URL-Inspection-live-test-returning-a-blank-rendered-HTML-shell.png" alt="URL Inspection live test returning a blank rendered HTML shell" class="wp-image-14196" srcset="https://prerender.io/wp-content/uploads/URL-Inspection-live-test-returning-a-blank-rendered-HTML-shell.png 624w, https://prerender.io/wp-content/uploads/URL-Inspection-live-test-returning-a-blank-rendered-HTML-shell-300x136.png 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>
</div>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Run <em>URL Inspection</em> in GSC, click “<em>Test live URL</em>,” then view the rendered HTML. Search for visible page copy and confirm that important metadata appears in the HTML. If those elements are visible in your browser but missing from the rendered HTML, JavaScript rendering is likely preventing Google from seeing the complete page.</p>
<p class="wp-block-paragraph"><strong>Related:</strong> <a href="https://prerender.io/blog/how-to-make-lovable-websites-seo-friendly/">How To Make Your Lovable Website SEO-Friendly</a>.</p>
<h3 class="wp-block-heading">3. Google is Missing Your Structured Data or Schema Markup Despite Correct Implementation</h3>
<p class="wp-block-paragraph">Many JavaScript sites inject JSON-LD schema through Google Tag Manager or client-side scripts. Although the markup may validate successfully in testing tools, Google may still fail to generate rich results if the structured data isn’t consistently available in the raw HTML when the page is crawled.</p>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Compare your page source (right-click, <em>View Source</em>) against what the <em>Rich Results Test</em> or the GSC <em>Enhancements </em>reports detect on the live URL. If your schema appears correctly in your implementation but Google behaves as though it doesn’t exist, client-side injection may be the problem.</p>
<p class="wp-block-paragraph">Our guide to <a href="https://prerender.io/blog/5-types-of-schema-markup-dynamic-websites-should-implement-including-a-tutorial/">schema markup for dynamic websites</a> covers implementations that remain accessible during crawling.</p>
<h3 class="wp-block-heading">4. GSC Crawl Stats Show a Fast Average Response Time While Indexation Tanks</h3>
<p class="wp-block-paragraph">At first glance, this combination looks like good news. Client-side rendered (CSR) sites often report response times under 200ms, because the server hands over a tiny, near-empty file instantly.</p>
<p class="wp-block-paragraph">But that file contains little meaningful content, so Google still has to spend additional resources rendering the page before it can evaluate it. That extra processing drains <a href="https://prerender.io/blog/crawl-budget-management-for-large-websites/">crawl budget</a>, slows page discovery, and reduces indexing efficiency.</p>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Open <em>GSC </em>→ <em>Settings </em>→ <em>Crawl Stats</em> and compare the average response time with your sitemap count and page discovery rates. Fast response times paired with declining indexation indicate that Google is receiving lightweight HTML.</p>
<h3 class="wp-block-heading">5. Internal Links Are Not Being Followed, and New Content Takes Weeks to Appear in Search</h3>
<p class="wp-block-paragraph">When internal links exist only after JavaScript runs, Googlebot will not discover them until the rendering stage, delaying how quickly it can understand your site’s structure and find new pages. New URLs then wait on sitemaps and the rendering queue for discovery, while your competitors with accessible links get discovered more efficiently.</p>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Compare <em>View Source</em> (the HTML your server sends) with <em>Inspect Element</em> (the page after JavaScript runs) in Chrome DevTools. For a broader audit, crawl your site in <a href="https://prerender.io/blog/screaming-frog-vs-prerender-for-javascript-seo-auditing/">Screaming Frog</a> with JavaScript disabled and enabled, then compare the internal link reports.</p>
<h3 class="wp-block-heading">6. Googlebot Triggers Blocked Resources, JS Console Errors, or False Soft 404s During Rendering</h3>
<p class="wp-block-paragraph">Rendering problems don’t always stem from missing content. A <a href="https://prerender.io/blog/robots-txt-and-seo/">robots.txt</a> rule blocking a critical script, an API request that times out, or a JavaScript error can leave Googlebot with an incomplete page. When that happens, Google may struggle to understand the page correctly and, in some cases, classify it as a <a href="https://prerender.io/blog/soft-404/" type="link" id="https://prerender.io/blog/soft-404/">soft 404</a> because the rendered content appears too thin, despite the page returning a normal HTTP status.</p>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Open <em>GSC URL Inspection</em> → <em>Live Test</em> → <em>View Tested Page</em> → <em>More Info tab</em> to review blocked resources and JavaScript errors. Also, check the Page Indexing report for unexpected soft 404s. If your browser shows a working page but Google doesn’t, rendering is likely the point of failure.</p>
<h3 class="wp-block-heading">7. AI Search Engines Hallucinate or Completely Omit Your Brand Content</h3>
<p class="wp-block-paragraph">Unlike Google, many <a href="https://prerender.io/blog/how-to-optimize-your-website-for-ai-crawlers/">AI search crawlers</a>, such as GPTBot, PerplexityBot, and ClaudeBot, currently don’t execute JavaScript. They read the raw HTML your server returns and nothing more. <strong>If your content isn’t in the raw HTML, it doesn’t exist to an AI crawler.</strong> So they omit your brand from answers, cite competitors instead, or answer with outdated information.</p>
<p class="wp-block-paragraph">Google’s AI shows failures differently, but boils down to the same thing. AI Overviews and Gemini draw on Google’s index, so pages stuck in the rendering queue simply aren’t available to be summarized yet.</p>
<p class="wp-block-paragraph">Missing structured data can make this problem worse. When schema isn’t available in the initial HTML, <a href="https://prerender.io/blog/how-to-get-indexed-on-ai-platforms/">AI systems</a> lose another valuable source of machine-readable context for understanding your products and content, costing you AI citations.</p>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Ask LLMs direct questions about your products, pricing, or features. Wrong answers, outdated information, or competitor citations on queries you should own all suggest that AI crawlers cannot access your pages. You can also review your server logs to confirm how AI bot user agents are accessing your site.</p>
<h3 class="wp-block-heading">8. Social Media Link Previews Appear Blank, Broken, or Stale</h3>
<p class="wp-block-paragraph">Most social platforms don’t execute JavaScript when generating link previews. When someone shares your URL on LinkedIn, X, Slack, or WhatsApp, the platform’s bot fetches the page once and reads the <a href="https://prerender.io/blog/benefits-of-using-open-graph/">Open Graph tags</a> available in the initial HTML. If those tags are injected only after JavaScript runs, shared links display missing images, incorrect titles, or no preview at all, reducing engagement before anyone even clicks.</p>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Paste a page URL into Facebook Sharing Debugger, LinkedIn’s Post Inspector, or X Card Validator. Missing images or incorrect metadata indicate your OG tags aren’t present in the HTML served to crawlers. </p>
<p class="wp-block-paragraph"><strong>Related:</strong> <a href="https://prerender.io/blog/how-to-fix-link-previews/">How to Fix Broken Social Media Link Previews</a>.</p>
<h3 class="wp-block-heading">9. Google Ads Quality Scores Drop or Campaigns Get “Destination Not Working” Disapprovals</h3>
<p class="wp-block-paragraph">Google Ads bot burns its crawl resources on unrenderable JS pages, as Googlebot does in sign 4, then concludes the landing page is broken. This results in a <a href="https://prerender.io/blog/google-ads-error-messages/">“Destination not working” disapproval</a> on a page that loads perfectly, or a lower landing page experience score, which increases cost per click. Unfortunately, teams rarely suspect rendering here because the ad platform frames everything as a page-quality issue.</p>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Review the <em>Google Ads Policy Manager</em> for ‘<em>Destination not working</em>’ disapprovals, and check the Quality Score column for ‘<em>Below average</em>’ landing page experience ratings. If the flagged pages work fine for users but rely heavily on client-side rendering, the rendering layer may be a possible cause. Our guide on <a href="https://prerender.io/blog/how-to-fix-disapproved-google-ads/">fixing disapproved Google Ads</a> explains the recovery process.</p>
<h3 class="wp-block-heading">10. Core Web Vitals Show Sudden Spikes in LCP and INP</h3>
<p class="wp-block-paragraph">The final sign is the one place where the rendering burden also touches real users. JavaScript-heavy websites often require the browser to download and execute significant amounts of JavaScript before displaying meaningful content. That extra work can delay Largest Contentful Paint (LCP) and increase Interaction to Next Paint (INP) through long-running JS tasks.</p>
<p class="wp-block-paragraph"><strong>How to spot it:</strong> Test important pages in <em>PageSpeed Insights</em> and compare the results with the <a href="https://prerender.io/blog/how-to-pass-core-web-vitals/">Core Web Vitals</a> report in Google Search Console. If LCP delays or poor INP scores are largely driven by JavaScript execution, your rendering architecture may be contributing to those performance issues. Prerendering resolves both at the source by delivering complete HTML to crawlers.</p>
<h2 class="wp-block-heading">What All These JavaScript Rendering Issues Have in Common</h2>
<p class="wp-block-paragraph"><strong>Every sign above points to the same underlying problem: crawlers aren’t evaluating the same version of your pages that human visitors see.</strong> Users get a fully rendered experience in the browser. Search engines, AI crawlers, social platforms, and ad bots get the initial HTML response, and if that response is incomplete, the content, metadata, and structured data they need simply aren’t there.</p>
<p class="wp-block-paragraph">So the fix isn’t more content, more links, or waiting out an algorithm update. It’s the rendering layer—one fix for all ten issues.</p>
<h2 class="wp-block-heading">How to Fix JavaScript Rendering Problems</h2>
<p class="wp-block-paragraph">There are two primary ways to solve the rendering problems.</p>
<p class="wp-block-paragraph">The first is changing how your site renders pages through JavaScript SEO best practices, such as <a href="https://prerender.io/blog/what-is-srr-and-why-do-you-need-to-know/">server-side rendering (SSR)</a> or static site generation (SSG). These are effective long-term solutions, especially for teams already planning a framework migration or major site rebuild, but they demand significant engineering time and resources.</p>
<p class="wp-block-paragraph">However, if you need bots and search engines to see your complete pages without rebuilding anything, an SEO prerendering infrastructure like <a href="http://Prerender.io">Prerender.io</a> is the practical route.</p>
<p class="wp-block-paragraph">Prerender.io renders each page in the background, waits for the JavaScript to finish loading, and serves the resulting HTML to crawlers while human visitors continue receiving the normal JavaScript experience.</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="How Does Prerender.io Work? A Quick Explainer" width="640" height="360" src="https://www.youtube.com/embed/OxNt36HhCP4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p class="wp-block-paragraph">With the rendering gap removed, search engines can index complete content on the first crawl, structured data becomes available for rich results, social platforms generate accurate link previews, advertising systems can better evaluate landing pages, AI crawlers can access the content they rely on, and your crawl budget goes toward discovering pages instead of rendering them.</p>
<p class="wp-block-paragraph">If you’ve confirmed your site’s diagnosis and are looking for a reliable JS rendering solution, <a href="https://prerender.io/pricing/">start your free trial at Prerender.io today</a>.</p>
<h2 class="wp-block-heading">FAQs About JavaScript Rendering Problems</h2>
<h3 class="wp-block-heading">1. What causes JavaScript rendering problems?</h3>
<p class="wp-block-paragraph">They occur when a site’s content is generated in the browser by JavaScript rather than included in the HTML the server sends. Search engine crawlers, AI bots, and social media bots either cannot execute that JavaScript or delay it in a rendering queue, so they see an incomplete version of the page.</p>
<h3 class="wp-block-heading">2. How do I know if my website has JavaScript rendering problems?</h3>
<p class="wp-block-paragraph">Start by comparing what your server sends with what users see in the browser. Run a URL Inspection Live Test in Google Search Console, compare View Source with Inspect Element, and check whether important content, metadata, or schema is missing from the initial HTML. Pages stuck in “Crawled – currently not indexed,” <a href="https://prerender.io/blog/how-to-fix-link-previews/">blank social previews</a>, and missing rich results are additional warning signs.</p>
<h3 class="wp-block-heading">3. Can JavaScript rendering problems affect AI search results like ChatGPT and Perplexity?</h3>
<p class="wp-block-paragraph">Yes. Many <a href="https://prerender.io/blog/understanding-web-crawlers-traditional-ai/" type="link" id="https://prerender.io/blog/understanding-web-crawlers-traditional-ai/">AI crawlers</a> rely primarily on the HTML your server returns. If important content is generated only after JavaScript runs, AI systems may omit your brand, surface outdated information, or cite competitors instead.</p>
<h3 class="wp-block-heading">4. Do JavaScript rendering issues affect Core Web Vitals scores?</h3>
<p class="wp-block-paragraph">Yes. JavaScript-heavy rendering can delay metrics such as Largest Contentful Paint (LCP) and Interaction to Next Paint (INP) because browsers must execute additional JavaScript before displaying or updating content.</p>
<h3 class="wp-block-heading">5. How do I fix JavaScript rendering issues without rebuilding my site?</h3>
<p class="wp-block-paragraph">Use a prerendering solution like <a href="https://prerender.io">Prerender.io</a> to generate and serve fully rendered HTML snapshots of your pages to bots, while preserving the existing JS experience for users. Prerender.io works through a middleware or CDN integration, so no framework migration or rebuild is required.</p>
]]></content:encoded>
</item>
<item>
<title>What Are The Different Types of Google Ads Error Messages? + What Causes Them</title>
<link>https://prerender.io/blog/google-ads-error-messages/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Wed, 05 Aug 2026 08:55:09 +0000</pubDate>
<category><![CDATA[Enterprise SEO]]></category>
<category><![CDATA[Prerendering]]></category>
<guid isPermaLink="false">https://prerender.io/?p=13419</guid>
<description><![CDATA[Explore our reference guide to Google Ads error messages to find out what causes them, and how to spot rendering-related crawl errors.]]></description>
<content:encoded><![CDATA[
<p class="wp-block-paragraph">Your ad landing page may look and work perfectly for shoppers while still triggering Google Ads error messages. You could be seeing a “destination not accessible” warning, a Shopping ad disapproved for an incorrect price, or a drop in landing page experience, even though everything appears fine in your browser.</p>
<p class="wp-block-paragraph">From the disapproval patterns the Prerender.io team sees on JavaScript-heavy sites, these Google Ads crawl errors are often caused by a crawl or rendering gap rather than the ad copy, product feed, or Google Ads policy.</p>
<p class="wp-block-paragraph">In this guide, we break down the types of Google Ads errors we encounter most often, what usually causes them, and which ones should prompt you to investigate whether AdsBot-Google can access and render the page correctly.</p>
<h2 class="wp-block-heading">First Up: Understanding How AdsBot-Google Crawls Your Landing Pages</h2>
<p class="wp-block-paragraph">Google doesn’t assess an ad destination exactly as a shopper does. It uses AdsBot-Google to crawl the landing page and evaluate the content it can access.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="624" height="304" src="https://prerender.io/wp-content/uploads/AdsBot-Google-user-agent-details.jpg" alt="AdsBot-Google user agent details from Google Search Central - different types of Google Ad errors and what causes them " class="wp-image-13422" srcset="https://prerender.io/wp-content/uploads/AdsBot-Google-user-agent-details.jpg 624w, https://prerender.io/wp-content/uploads/AdsBot-Google-user-agent-details-300x146.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>
</div>
<p class="wp-block-paragraph">If your landing page is a <a href="https://prerender.io/blog/other-rendering-options-vs-prerendering/" type="link" id="https://prerender.io/blog/other-rendering-options-vs-prerendering/" target="_blank" rel="noreferrer noopener">client-side-rendered or single-page application</a>, the initial HTML may contain little more than an empty framework. Important content (including the product name, price, availability, page copy, and navigation) is invisible to AdsBot-Google. It only appears after JavaScript runs.</p>
<p class="wp-block-paragraph">That basically means the page your team tests in a browser isn’t always the page AdsBot receives. When AdsBot can’t access the JS content reliably, it may interpret the destination as:</p>
<ul class="wp-block-list">
<li>Unavailable or broken.</li>
<li>Inconsistent with the ad or product feed.</li>
<li>Missing important product information.</li>
<li>Too thin to provide a strong landing page experience.</li>
</ul>
<p class="wp-block-paragraph">That is why Google Ads may give an error warning even though it loads normally for users.</p>
<p class="wp-block-paragraph">For enterprise advertisers, the problem is rarely limited to one URL. The same rendering setup may be used across hundreds of campaign landing pages, product listings, markets, and languages. One technical JS rendering gap can consequently produce Google Ads crawl errors and disapproved Google Shopping ads at scale.</p>
<h2 class="wp-block-heading">The Two Main Types of Google Ads Errors</h2>
<p class="wp-block-paragraph">Google Ads errors generally fall into two groups, depending on which Google system is evaluating the page and what it is trying to verify:</p>
<ol class="wp-block-list">
<li>AdsBot landing page errors and quality signals.</li>
<li>Google Shopping and Merchant Center errors.</li>
</ol>
<p class="wp-block-paragraph">We make the distinction between the two types because the same warning can have several possible causes.</p>
<h3 class="wp-block-heading">Google Ads Error Group 1: AdsBot Landing Page Errors and Quality Signals</h3>
<p class="wp-block-paragraph">These issues appear in the Google Ads interface and generally trace back to whether AdsBot-Google can fetch, read, and evaluate the landing page. Google groups many of the direct errors under its <a href="https://support.google.com/adspolicy/answer/6368661?hl=en" type="link" id="https://support.google.com/adspolicy/answer/6368661?hl=en" target="_blank" rel="noreferrer noopener nofollow">Destination Requirements</a> policy.</p>
<figure class="wp-block-table alignleft no_header_breaks"><table><thead><tr><th class="has-text-align-left" data-align="left">Google Ads Error Message</th><th class="has-text-align-left" data-align="left">What It Means</th><th class="has-text-align-left" data-align="left">Rendering-Related?</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Destination not working</strong></td><td class="has-text-align-left" data-align="left">AdsBot cannot reliably fetch or interpret the page. Google’s policy covers destinations that do not function or are configured incorrectly, but on JavaScript sites, the error is often triggered by empty initial HTML or content that only appears after scripts run.</td><td class="has-text-align-left" data-align="left">Often</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Destination not crawlable</strong></td><td class="has-text-align-left" data-align="left">Google cannot crawl the page to assess it. AdsBot may be blocked, or the page may return no usable HTML when fetched.</td><td class="has-text-align-left" data-align="left">Often</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Destination not accessible</strong></td><td class="has-text-align-left" data-align="left">AdsBot cannot reach the page from its crawling environment. Common causes include 403 or 404 responses, robots.txt rules, firewall settings, CDN configurations, or bot-protection tools.</td><td class="has-text-align-left" data-align="left">Sometimes</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Poor landing page experience</strong></td><td class="has-text-align-left" data-align="left">Google’s systems cannot clearly determine what the page contains or offers. Important headings, page content, navigation, or metadata may not be available when the page is fetched.</td><td class="has-text-align-left" data-align="left">Often</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Low Quality Score</strong></td><td class="has-text-align-left" data-align="left">Landing page experience is one of the factors that contributes to Quality Score. If AdsBot reads the page inconsistently, that component may suffer even when the ad copy and targeting are strong.</td><td class="has-text-align-left" data-align="left">Sometimes</td></tr></tbody></table></figure>
<h4 class="wp-block-heading">The Error Misdiagnosed Most Often: “Destination Not Accessible”</h4>
<p class="wp-block-paragraph">“<a href="https://support.google.com/adspolicy/answer/16428223" type="link" id="https://support.google.com/adspolicy/answer/16428223" target="_blank" rel="noreferrer noopener nofollow">Destination not accessible</a>” is the error teams most often misread as a JavaScript rendering failure.</p>
<p class="wp-block-paragraph">In many cases, it is an access problem instead. AdsBot is being blocked before it reaches the page, so changing the JavaScript will not solve it.</p>
<p class="wp-block-paragraph">Google suggests the following places as the first you should check:</p>
<ul class="wp-block-list">
<li><strong>403 and 404 responses.</strong></li>
<li><strong>Robots.txt rules.</strong></li>
<li><strong>Firewall or CDN configurations.</strong></li>
<li><strong>Bot-protection challenges blocking AdsBot-Google.</strong></li>
</ul>
<p class="wp-block-paragraph">Confirm that AdsBot can access the page before investigating how the content renders. It prevents teams from spending an entire debugging cycle fixing the wrong layer.</p>
<p class="wp-block-paragraph">The broader theme across this group is that Google is describing the symptom it observed, not the underlying cause. “<a href="https://support.google.com/adspolicy/answer/16428019" type="link" id="https://support.google.com/adspolicy/answer/16428019" target="_blank" rel="noreferrer noopener nofollow">Destination not working</a>” does not necessarily mean your website was down. It means AdsBot did not receive what it needed at the moment it evaluated the page.</p>
<p class="wp-block-paragraph"><strong>Learn how these crawl issues can affect landing page experience: <a href="https://prerender.io/blog/how-to-fix-disapproved-google-ads/" type="link" id="https://prerender.io/blog/how-to-fix-disapproved-google-ads/" target="_blank" rel="noreferrer noopener">How to Fix Disapproved Google Ads</a>.</strong></p>
<h3 class="wp-block-heading">Google Ads Error Group 2: Google Shopping and Merchant Center Errors</h3>
<p class="wp-block-paragraph">Google Shopping errors work differently from AdsBot landing page errors.</p>
<p class="wp-block-paragraph">Instead of assessing whether a landing page provides an acceptable ad experience, the Merchant Center crawler verifies the product information on the page. It reads details such as price, availability, and structured data, then compares them with the information submitted in your product feed.</p>
<p class="wp-block-paragraph">When those values do not match, the product may be disapproved.</p>
<figure class="wp-block-table alignleft no_header_breaks"><table><thead><tr><th class="has-text-align-left" data-align="left">Google Shopping Error</th><th class="has-text-align-left" data-align="left">What It Means</th><th class="has-text-align-left" data-align="left">Rendering-Related?</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Mismatched value (page crawl) [price]</strong></td><td class="has-text-align-left" data-align="left">The price Google reads on the landing page does not match the price submitted in the product feed.</td><td class="has-text-align-left" data-align="left">Frequently</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Availability mismatch</strong></td><td class="has-text-align-left" data-align="left">The availability shown in the page content or structured data does not match the value in the feed.</td><td class="has-text-align-left" data-align="left">Frequently</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Missing or incomplete product data</strong></td><td class="has-text-align-left" data-align="left">Google cannot find the product information or structured data it expects on the page.</td><td class="has-text-align-left" data-align="left">Frequently</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Intermittent product disapprovals</strong></td><td class="has-text-align-left" data-align="left">The crawler may be receiving different values across separate crawls because the page renders inconsistently or a cached version is outdated.</td><td class="has-text-align-left" data-align="left">Often</td></tr></tbody></table></figure>
<p class="wp-block-paragraph">Many of these disapprovals look like feed problems but begin at the rendering layer.</p>
<p class="wp-block-paragraph">If price, availability, or structured data is injected by JavaScript after the initial page response, the crawler may receive the pre-render state. It sees no price, an outdated price, or incomplete product data—even when the live page and feed appear to agree when checked by a person.</p>
<h4 class="wp-block-heading">Mismatched Value (Page Crawl) [Price]</h4>
<p class="wp-block-paragraph">Google disapproves the product because the price it reads on the landing page does not match the price attribute in the feed. The values in the HTML available to the crawler need to match the feed exactly.</p>
<p class="wp-block-paragraph">These 2 features make this error difficult to diagnose:</p>
<ol class="wp-block-list">
<li><strong>It can appear intermittent:</strong> Google automatically recrawls disapproved products, so a listing may move between approved and disapproved as the crawler encounters different render states.</li>
<li><strong>The price displayed to shoppers is usually correct:</strong> that sends teams into the product feed looking for an error that may not exist there.</li>
</ol>
<p class="wp-block-paragraph">When the visible price and feed match, the next question should be: <strong>What price is present in the HTML Google receives?</strong></p>
<h3 class="wp-block-heading">Other Google Ads Issues: Availability and Structured Data Mismatches</h3>
<p class="wp-block-paragraph">Google uses structured data, including schema.org and JSON-LD markup, to verify product attributes such as price and availability. If that markup is added client-side and is not available when the crawler fetches the page, Google may receive missing or inconsistent product information.</p>
<p class="wp-block-paragraph">The result can include:</p>
<ul class="wp-block-list">
<li>Availability mismatches.</li>
<li>Incomplete product listings.</li>
<li>Missing product attributes.</li>
<li>Disapprovals that point to the feed, even though it’s accurate.</li>
</ul>
<h3 class="wp-block-heading">The Stale-Cache Problem for Sites Already Using JavaScript Prerendering</h3>
<p class="wp-block-paragraph">JS prerendering with a tool like Prerender.io caches rendered pages for a period determined by your settings. If a product’s price or availability changes on the live site while the cached snapshot still contains the previous value, Google may read the stale version and report a mismatch.</p>
<p class="wp-block-paragraph">The fix is to recache the product page so that the rendered HTML contains the current price and availability.</p>
<p class="wp-block-paragraph">The most reliable approach is to connect Prerender.io’s /recache API endpoint to the same event that updates the product data. When a price or inventory value changes, trigger a fresh recache immediately rather than waiting for the next scheduled cache refresh.</p>
<p class="wp-block-paragraph"><strong>Related: <a href="https://prerender.io/blog/caching-in-javascript-and-how-it-affects-seo-performance/" type="link" id="https://prerender.io/blog/caching-in-javascript-and-how-it-affects-seo-performance/" target="_blank" rel="noreferrer noopener">Caching in JavaScript and How it Affects SEO Performance</a></strong></p>
<h2 class="wp-block-heading">How Will I Know if a Google Ads Error is Rendering-Related?</h2>
<p class="wp-block-paragraph">Every Google Ads error message we’ve discussed can have more than one cause. “Destination not working” might be a rendering issue, or it could be an actual server outage. A price mismatch might come from a stale render, but it could also be a real product feed error.</p>
<p class="wp-block-paragraph">Before rewriting copy or auditing every item in the feed, identify which layer is failing. Google’s error message tells you what its system observed. The <a href="https://docs.prerender.io/docs/status-codes" type="link" id="https://docs.prerender.io/docs/status-codes" target="_blank" rel="noreferrer noopener">response code in your Prerender.io dashboard</a> helps you identify where the underlying failure occurred.</p>
<figure class="wp-block-table alignleft"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">What You See</th><th class="has-text-align-left" data-align="left">Likely Cause</th><th class="has-text-align-left" data-align="left">Will a JS Rendering Fix Help?</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>4xx response, including 401, 403, 404, 409, 410, 422, or 429</strong></td><td class="has-text-align-left" data-align="left">Access or configuration issue. The crawler cannot reach the page successfully.</td><td class="has-text-align-left" data-align="left">No. Fix the authentication wall, firewall or CDN rule, bot-protection challenge, missing page, or request limit.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>5xx response, including 500, 502, 503, or 504</strong></td><td class="has-text-align-left" data-align="left">Rendering or upstream failure. The page could not be produced successfully.</td><td class="has-text-align-left" data-align="left">Often. Investigate the render and any API or service it depends on.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>200 response, but the page is still disapproved</strong></td><td class="has-text-align-left" data-align="left">The page is reachable, but important content, structured data, or current product values may be missing.</td><td class="has-text-align-left" data-align="left">Sometimes. Inspect the returned HTML and check for stale cache data.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Clean render and matching content, but the error remains</strong></td><td class="has-text-align-left" data-align="left">The problem is more likely related to policy, billing, ad configuration, or the product feed itself.</td><td class="has-text-align-left" data-align="left">No. Rendering is probably not the cause.</td></tr></tbody></table></figure>
<p class="wp-block-paragraph">A 200 response only confirms that Google received a page. It does not confirm that the page contained the price, availability, copy, or structured data the crawler needed.</p>
<h3 class="wp-block-heading">The Google Ads Rendering Error to Look Out For: A 504 Response</h3>
<p class="wp-block-paragraph">A 504 is the status code that most often points toward a rendering timeout rather than an access block.</p>
<p class="wp-block-paragraph">Common causes include:</p>
<ul class="wp-block-list">
<li>The page returning an empty HTML framework.</li>
<li>JavaScript errors preventing content from appearing.</li>
<li>Failed API calls during the render</li>
<li>Slow third-party dependencies</li>
<li>A render taking longer than the configured timeout.</li>
</ul>
<p class="wp-block-paragraph">Prerender.io’s default rendering timeout is 20 seconds and can be increased to 60 seconds under Advanced Settings. If a product page depends on slow API calls to populate its price or availability, the timeout is one of the first settings to inspect.</p>
<h3 class="wp-block-heading">The Google Ads Error Triage Rule</h3>
<p class="wp-block-paragraph">Read the status code before forming a theory about the Google Ads error. We have seen teams spend days rewriting ad copy in response to a “poor landing page experience” alert, only to find that AdsBot was receiving a 403 because of a firewall rule.</p>
<p class="wp-block-paragraph">The response code usually tells you where to begin:</p>
<ul class="wp-block-list">
<li>A <strong>4xx </strong>sends you to the access and configuration layer.</li>
<li>A <strong>5xx </strong>sends you to the rendering process and its dependencies.</li>
<li>A <strong>200 with missing or incorrect content</strong> sends you to the HTML, structured data, or cache.</li>
<li>A <strong>clean render with matching data</strong> sends you back to policy, ad configuration, or the feed.</li>
</ul>
<p class="wp-block-paragraph">These are different problems that may need to be handled by different teams. The status code helps you involve the right one first. For a closer look at how a crawler request moves from the initial fetch to fully rendered HTML, see our <a href="https://docs.prerender.io/docs/4-troubleshooting" type="link" id="https://docs.prerender.io/docs/4-troubleshooting" target="_blank" rel="noreferrer noopener">troubleshooting guide</a>.</p>
<h2 class="wp-block-heading">How Client-Side Rendering Impacts Google Tag Manager (GTM) Tracking</h2>
<p class="wp-block-paragraph">Landing page disapprovals are only the most visible symptom of rendering gaps. Client-side execution delays also silently degrade campaign tracking and attribution accuracy for enterprise PPC teams.</p>
<p class="wp-block-paragraph">When Single-Page Applications (SPAs) defer page loads to client-side scripts, Google Tag Manager (GTM) and dynamic remarketing scripts often suffer from:</p>
<ol class="wp-block-list">
<li><strong>Incomplete retargeting audiences:</strong> if product details (like product ID or price) take too long to load, your tracking tags fire empty. Google won’t know which product the user viewed, making dynamic retargeting ads far less effective.</li>
<li><strong>False “broken tracking” warnings:</strong> Google regularly sends automated bots to test if your conversion tags work. If the bot inspects a page before your JavaScript finishes loading, it assumes your tags are missing and flags your account with tracking errors.</li>
<li><strong>Lost conversion data:</strong> if a user clicks your ad and bounces quickly before your page scripts finish running, the tracking pixel never fires. You pay for the ad click, but lose out on the conversion data.</li>
</ol>
<p class="wp-block-paragraph">Pre-rendering ensures your tracking tags and product data are ready immediately when the page opens, keeping your tracking accurate and account health green.</p>
<h2 class="wp-block-heading">Why Google Ads Errors Get Worse at Enterprise Scale</h2>
<p class="wp-block-paragraph">On a small website, a rendering issue may affect one landing page and be noticed quickly. On a large JavaScript site, the same problem repeats across every URL built from the same templates and rendering logic. It can affect hundreds of campaign pages, thousands of product listings, and every locale or language variation.</p>
<p class="wp-block-paragraph">Teams managing several accounts through a Google Ads Manager account (MCC) or reviewing changes in Google Ads Editor may see errors spread across campaigns even though nothing obvious has changed in the copy or feed.</p>
<p class="wp-block-paragraph">What changed is often the page state the crawler encountered when it fetched each URL. The problem is not necessarily hundreds of separate errors; it may be one rendering behavior repeating hundreds of times.</p>
<p class="wp-block-paragraph"><strong>Related: <a href="https://prerender.io/blog/ssr-enterprise-seo/" type="link" id="https://prerender.io/blog/ssr-enterprise-seo/" target="_blank" rel="noreferrer noopener">Why SSR Alone Doesn’t Solve Enterprise SEO Problems</a></strong></p>
<h2 class="wp-block-heading">How On Fixed Google Ads Errors Caused by JavaScript Rendering</h2>
<p class="wp-block-paragraph">Ahead of a major frontend update in 2023, global sportswear brand On began experiencing problems across its digital marketing ecosystem. Its JavaScript-heavy pages were not rendering reliably for crawlers, contributing to:</p>
<ul class="wp-block-list">
<li>Continuous disapprovals across Google Shopping, display, and video advertising</li>
<li>Google indexing issues.</li>
<li>Broken social media previews.</li>
</ul>
<p class="wp-block-paragraph">What initially looked like several unrelated channel problems had the same underlying cause: <strong>crawlers couldn’t consistently read the content on On’s JavaScript pages.</strong></p>
<p class="wp-block-paragraph">On considered building server-side rendering in-house, but the project would have required months of development, additional infrastructure, and ongoing engineering support. Instead, the company integrated <a href="https://prerender.io" type="link" id="https://prerender.io">Prerender.io</a> without rebuilding its frontend architecture.</p>
<p class="wp-block-paragraph">Within days, visibility stabilized across key search and marketing channels. According to On, its Google Ads began running smoothly again, campaign delivery normalized, impression share returned, and spend could scale predictably. The company estimates that <strong>resolving the ad issues protected up to $1 million in annual revenue.</strong></p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://prerender.io/resources/case-studies/on-prerender/"><img loading="lazy" decoding="async" width="624" height="237" src="https://prerender.io/wp-content/uploads/On-image-traffic-results-1.jpg" alt="On’s image traffic results after implementing Prerender.io" class="wp-image-13437" srcset="https://prerender.io/wp-content/uploads/On-image-traffic-results-1.jpg 624w, https://prerender.io/wp-content/uploads/On-image-traffic-results-1-300x114.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a></figure>
</div>
<p class="wp-block-paragraph">On’s experience illustrates why Google Ads errors at scale should not always be treated as isolated campaign or feed problems. When disapprovals appear across paid advertising, Shopping, organic search, and social platforms, the rendering layer is one of the first shared systems to investigate.</p>
<div data-elementor-type="container" data-elementor-id="13438" class="elementor elementor-13438" data-elementor-post-type="elementor_library">
<div class="elementor-element elementor-element-277802ff e-con-full case_study_testimonial e-flex e-con e-child" data-id="277802ff" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[],"background_background":"classic"}">
<div class="elementor-element elementor-element-ba04e44 elementor-view-default elementor-widget elementor-widget-icon" data-id="ba04e44" data-element_type="widget" data-e-type="widget" data-widget_type="icon.default">
<div class="elementor-widget-container">
<div class="elementor-icon-wrapper">
<div class="elementor-icon">
<svg xmlns="http://www.w3.org/2000/svg" width="69" height="55" viewBox="0 0 69 55" fill="none"><path d="M22.5175 25.7206C25.1981 26.9069 27.289 28.6863 28.7902 31.0588C30.2914 33.4314 31.042 36.2353 31.042 39.4706C31.042 44.1078 29.5944 47.8824 26.6993 50.7941C23.8042 53.598 20.1049 55 15.6014 55C11.0979 55 7.34499 53.5441 4.34266 50.6324C1.44755 47.7206 0 44 0 39.4706C0 37.3137 0.268065 35.1569 0.804196 33C1.34033 30.8431 2.51981 27.6078 4.34266 23.2941L13.6713 0H29.5944L22.5175 25.7206ZM60.4755 25.7206C63.1562 26.9069 65.2471 28.6863 66.7482 31.0588C68.2494 33.4314 69 36.2353 69 39.4706C69 44.1078 67.5524 47.8824 64.6573 50.7941C61.7622 53.598 58.0629 55 53.5594 55C49.0559 55 45.303 53.5441 42.3007 50.6324C39.4056 47.7206 37.958 44 37.958 39.4706C37.958 37.3137 38.2261 35.1569 38.7622 33C39.2984 30.8431 40.4779 27.6078 42.3007 23.2941L51.6294 0H67.5524L60.4755 25.7206Z" fill="#66D756"></path></svg> </div>
</div>
</div>
</div>
<div class="elementor-element elementor-element-508dc7bb elementor-widget elementor-widget-text-editor" data-id="508dc7bb" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<p><strong>Prerender.io offers the strongest combination of stability, speed, and value.</strong></p> </div>
</div>
<div class="elementor-element elementor-element-76fbca11 e-con-full e-flex e-con e-child" data-id="76fbca11" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="elementor-element elementor-element-376f7870 e-con-full e-flex e-con e-child" data-id="376f7870" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="elementor-element elementor-element-10a53c32 elementor-widget elementor-widget-image" data-id="10a53c32" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
<div class="elementor-widget-container">
<img loading="lazy" decoding="async" width="150" height="150" src="https://prerender.io/wp-content/uploads/Marilena-Pixner-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-image-10076" alt="Marilena Pixner - On case study" srcset="https://prerender.io/wp-content/uploads/Marilena-Pixner-150x150.jpg 150w, https://prerender.io/wp-content/uploads/Marilena-Pixner-300x300.jpg 300w, https://prerender.io/wp-content/uploads/Marilena-Pixner.jpg 440w" sizes="(max-width: 150px) 100vw, 150px" /> </div>
</div>
</div>
<div class="elementor-element elementor-element-5454fe8e e-flex e-con-boxed e-con e-child" data-id="5454fe8e" data-element_type="container" data-e-type="container" data-settings="{"jet_parallax_layout_list":[]}">
<div class="e-con-inner">
<div class="elementor-element elementor-element-753e5296 elementor-widget elementor-widget-text-editor" data-id="753e5296" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
Marilena Pixner </div>
</div>
<div class="elementor-element elementor-element-6198e58e elementor-widget elementor-widget-text-editor" data-id="6198e58e" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container">
<p>Senior Organic Growth and SEO Specialist at On</p> </div>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="wp-block-paragraph"></p>
<p class="wp-block-paragraph"><strong>Read the full customer story: <a href="https://prerender.io/resources/case-studies/on-prerender/" type="link" id="https://prerender.io/resources/case-studies/on-prerender/" target="_blank" rel="noreferrer noopener">How On Saves Millions Per Year with Prerender.io</a></strong></p>
<h2 class="wp-block-heading">How Prerender.io Fixes Google Ads Crawl Errors at Enterprise Level</h2>
<p class="wp-block-paragraph">Prerender.io gives AdsBot-Google and other crawlers a fully rendered HTML version of each JavaScript page. Shoppers still receive the dynamic site experience, while crawlers immediately receive the landing page copy, prices, availability, structured data, and other content they need to evaluate the URL. </p>
<p class="wp-block-paragraph">This helps ensure that your Google Ads are approved, your link previews display properly, and your content shows up accurately in AI search results.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="624" height="395" src="https://prerender.io/wp-content/uploads/How-Prerender-fixes-visibility.jpg" alt="An image showing a before and after of using Prerender.io for LLM visibility: the brand's content shows up correctly, and the link preview is clear and visible." class="wp-image-13443" style="width:624px;height:auto" srcset="https://prerender.io/wp-content/uploads/How-Prerender-fixes-visibility.jpg 624w, https://prerender.io/wp-content/uploads/How-Prerender-fixes-visibility-300x190.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>
</div>
<p class="wp-block-paragraph">This fixes the rendering problem behind the Google Ads errors we’ve discussed. Because Prerender.io works at the rendering layer, the fix applies across pages built with the same JavaScript architecture. Enterprise teams can address the underlying issue across campaign URLs, product catalogs, markets, and languages instead of troubleshooting each disapproved ad individually — and without the budget waste that comes from campaigns running against landing pages crawlers can’t evaluate correctly.</p>
<h2 class="wp-block-heading">Fix the Google Ads Crawl Error, Not Just the Disapproval</h2>
<p class="wp-block-paragraph">A Google Ads error message tells you what Google encountered, not necessarily what caused it. Check whether AdsBot can access the page, inspect the HTML it receives, and confirm that important content is present before rewriting ads or rebuilding product feeds.</p>
<p class="wp-block-paragraph">When JavaScript rendering is the problem, Prerender.io helps resolve it across every affected page, not one disapproval at a time.</p>
<p class="wp-block-paragraph"><a href="https://auth.prerender.io/auth/realms/prerender/protocol/openid-connect/registrations?client_id=prerender-frontend&response_type=code&scope=openid%20email&redirect_uri=https://dashboard.prerender.io/integration-wizard&_gl=1*aax2d8*_gcl_au*OTc4MDM2ODM5LjE3ODE3Nzg2Mjk.*_ga*MTM3NDU1ODIzNC4xNzMxOTk4MzUx*_ga_5C99FX76HR*czE3ODQ4MDc3MTckbzMwOSRnMSR0MTc4NDgxMTIzMiRqNTkkbDAkaDE4MDUwNjQyMTU." type="link" id="https://auth.prerender.io/auth/realms/prerender/protocol/openid-connect/registrations?client_id=prerender-frontend&response_type=code&scope=openid%20email&redirect_uri=https://dashboard.prerender.io/integration-wizard&_gl=1*aax2d8*_gcl_au*OTc4MDM2ODM5LjE3ODE3Nzg2Mjk.*_ga*MTM3NDU1ODIzNC4xNzMxOTk4MzUx*_ga_5C99FX76HR*czE3ODQ4MDc3MTckbzMwOSRnMSR0MTc4NDgxMTIzMiRqNTkkbDAkaDE4MDUwNjQyMTU.">Start your 30-day free Prerender.io trial</a> to see what Google’s crawlers receive from your landing pages and find out whether rendering is contributing to your Google Ads errors.</p>
<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe48e5de wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-white-color has-text-color has-background has-link-color wp-element-button" href="https://auth.prerender.io/auth/realms/prerender/protocol/openid-connect/registrations?client_id=prerender-frontend&response_type=code&scope=openid%20email&redirect_uri=https://dashboard.prerender.io/integration-wizard&_gl=1*1elae8n*_gcl_au*MTI3NzU5MTg2OC4xNzgwMzA3NjA1*_ga*MzYwMTA2NTM1LjE3NTIyMzQyMTk.*_ga_5C99FX76HR*czE3ODYwOTM4NTkkbzM0NiRnMSR0MTc4NjA5NDE1MiRqNjAkbDAkaDQ4MDI5NjI0MA.." style="border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px;background-color:#1f8211">Start for Free</a></div>
</div>
<h2 class="wp-block-heading">FAQs About The Types and Causes of Google Ads Errors</h2>
<h3 class="wp-block-heading">1. Why does Google Ads say “destination not working” when the page loads fine in my browser?</h3>
<p class="wp-block-paragraph">Google Ads often shows a “destination not working error” error for JavaScript sites because AdsBot-Google doesn’t render your page the way your browser does. It evaluates the HTML available the moment it fetches the page and doesn’t wait for long-running JavaScript, so if your content loads a beat later, the crawler <a href="https://prerender.io/blog/how-to-fix-disapproved-google-ads/" type="link" id="https://prerender.io/blog/how-to-fix-disapproved-google-ads/" target="_blank" rel="noreferrer noopener">has already judged the page</a> as thin or broken.</p>
<h3 class="wp-block-heading">2. What does the “Mismatched value (page crawl) [price]” Google Shopping ad error mean?</h3>
<p class="wp-block-paragraph">Google read a price on your landing page that doesn’t match the <mark style="background-color:rgba(0, 0, 0, 0);color:#188038" class="has-inline-color"><code>price</code></mark> attribute in your feed. According to Google’s Merchant Center documentation, the crawler reads the price from the returned HTML, and if that price is injected by JavaScript after the page loads, it triggers a mismatch even when your feed and live site actually agree. Serving crawlers fully rendered HTML is what resolves this class of <a href="https://prerender.io/resources/industry-use-cases/ecommerce/" type="link" id="https://prerender.io/resources/industry-use-cases/ecommerce/" target="_blank" rel="noreferrer noopener">Google Shopping ad errors</a>.</p>
<h3 class="wp-block-heading">3. How do I know if a Google Ads error is a rendering-related problem?</h3>
<p class="wp-block-paragraph">Check the <a href="https://docs.prerender.io/docs/status-codes" type="link" id="https://docs.prerender.io/docs/status-codes" target="_blank" rel="noreferrer noopener">status code the crawler receives</a> in your Prerender.io dashboard. A 4xx means an access or configuration issue (often a sign that Google Ads AdsBot cannot access the page at all), a 5xx (especially 504) means the render failed, and a clean 200 that’s still disapproved points to content, structured data, or a stale cache rather than rendering.</p>
<h3 class="wp-block-heading">4. Why did my product get disapproved right after I fixed the price?</h3>
<p class="wp-block-paragraph">If you use prerendering, your cached snapshot may still hold the old price, so the crawler reads the stale cache rather than your live site. <a href="https://docs.prerender.io/docs/mismatched-prices" type="link" id="https://docs.prerender.io/docs/mismatched-prices" target="_blank" rel="noreferrer noopener">Recache the product page</a>, ideally by tying a <mark style="background-color:rgba(0, 0, 0, 0);color:#188038" class="has-inline-color"><code>/recache</code></mark> API call to the same event that updates the price, so the cached version and your live data stay in sync.</p>
<h3 class="wp-block-heading">5. Does AdsBot render JavaScript?</h3>
<p class="wp-block-paragraph">AdsBot cannot render JavaScript the way a real user’s browser can, and it prioritizes what’s immediately available at fetch time. This is why a <a href="https://prerender.io/blog/how-to-optimize-single-page-applications-spas-for-crawling-and-indexing/" type="link" id="https://prerender.io/blog/how-to-optimize-single-page-applications-spas-for-crawling-and-indexing/">Google Ads error for a single-page application is so common</a>: if your landing pages depend on client-side rendering to show their main content, that content is often invisible to the crawler.</p>
]]></content:encoded>
</item>
<item>
<title>AI Insights: Fix AI Crawler Issues Before They Hurt Your Bottom Line</title>
<link>https://prerender.io/blog/ai-insights/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Tue, 28 Jul 2026 09:12:03 +0000</pubDate>
<category><![CDATA[AI SEO]]></category>
<category><![CDATA[News and Updates]]></category>
<category><![CDATA[AI crawlers]]></category>
<category><![CDATA[ai insights]]></category>
<category><![CDATA[product updates]]></category>
<guid isPermaLink="false">https://prerender.io/?p=12865</guid>
<description><![CDATA[introducing AI Insights: prevent AI visibility issues before they hurt your bottom line.]]></description>
<content:encoded><![CDATA[
<p class="wp-block-paragraph">Showing up in AI answers starts with one overlooked question: can crawlers access your pages in the first place? <strong>If they can’t, those pages are invisible to your customers in AI search results, without you even knowing it.</strong></p>
<p class="wp-block-paragraph">Most tools measure AI visibility at the content quality or citation layer, such as whether you got mentioned in an answer. But none of that matters if crawlers can’t access your pages first. Prerender.io’s new AI Insights feature addresses this at the source. </p>
<p class="wp-block-paragraph">AI Insights works at the crawl layer, so you can catch problems before they escalate and impact your business. Read on to learn more.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="426" src="https://prerender.io/wp-content/uploads/with-without-prerender-ai-answers-1024x426.png" alt="with and without prerender.io - ai search results " class="wp-image-13036" srcset="https://prerender.io/wp-content/uploads/with-without-prerender-ai-answers-1024x426.png 1024w, https://prerender.io/wp-content/uploads/with-without-prerender-ai-answers-300x125.png 300w, https://prerender.io/wp-content/uploads/with-without-prerender-ai-answers-768x320.png 768w, https://prerender.io/wp-content/uploads/with-without-prerender-ai-answers-1536x640.png 1536w, https://prerender.io/wp-content/uploads/with-without-prerender-ai-answers.png 1988w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<h2 class="wp-block-heading">The Problem</h2>
<p class="wp-block-paragraph">If AI crawlers can’t reach your pages, none of your content or SEO efforts have an impact. It doesn’t matter how strong your content is, how well it’s written, or how relevant it is to the question being asked. <strong>If a page is unreachable to AI crawlers, it’s invisible to customers in AI search.</strong></p>
<p class="wp-block-paragraph">Sometimes, this isn’t actually a content problem. It’s an infrastructure one. And infrastructure problems are harder to pin down. That’s because a page can look perfectly fine to you and Google, yet be completely invisible to AI crawlers like GPTBot or Claudebot.</p>
<p class="wp-block-paragraph">It’s also becoming increasingly difficult to monitor this, largely because infrastructure issues are tough to catch early. And as a result, most infrastructure issues turn into <em>real</em> problems down the line, like lost citations or lack of brand mentions in AI search results. <strong>In the end, most SEO and growth leaders only catch it when traffic, signups, or sales dip and there isn’t a clear reason why.</strong></p>
<h2 class="wp-block-heading">Why This Happens</h2>
<p class="wp-block-paragraph">The AI crawler landscape is changing frequently, and most sites weren’t built with these crawlers in mind. <a href="https://prerender.io/blog/robots-txt-and-seo/">Robots.txt</a> (the file that tells crawlers which parts of your site they’re allowed to access) was written years ago with Googlebot in mind. It’s rarely revisited as <a href="https://prerender.io/blog/how-to-optimize-your-website-for-ai-crawlers/">new AI crawlers</a> like GPTBot, ClaudeBot, and PerplexityBot continue to show up.</p>
<p class="wp-block-paragraph">Infrastructure default settings compound the problem. A WAF (Web Application Firewall, the layer that filters incoming traffic for security threats) will sometimes block unfamiliar user agents by default, treating a new AI crawler the same way it’d treat a suspicious bot. <a href="https://prerender.io/blog/cdn-vs-prerender-enterprise-seo/">CDN</a> configurations can do the same thing. Some now block major AI crawlers out of the box, even before a request ever reaches your server or your robots.txt. None of these blocks are intentional on your part. They’re just what happens when infrastructure built for yesterday’s crawlers meets today’s, and platform defaults you never explicitly chose.</p>
<p class="wp-block-paragraph">It’s also worth knowing that AI crawlers aren’t one-size-fits-all. The same provider can run separate crawlers for training, real-time retrieval, and search indexing, and blocking the wrong one can do more harm than good. <strong>This removes you from AI answers entirely, rather than simply opting out of having your content used for training.</strong></p>
<h2 class="wp-block-heading">How to Fix AI Visibility Issues at the Source</h2>
<p class="wp-block-paragraph">That’s the gap AI Insights is built to close.</p>
<p class="wp-block-paragraph">It works at the crawl layer, checking whether AI crawlers like GPTBot, ClaudeBot, PerplexityBot, and Google Extended can actually reach your pages before an access problem turns into something bigger. AI Insights catches the cause at the source and tells you what’s blocking access and how you can fix it.</p>
<p class="wp-block-paragraph"><strong>Here’s what you get:</strong></p>
<ul class="wp-block-list">
<li>A daily health status showing if major AI crawlers can access your site</li>
<li>Warnings when certain crawlers can’t access a page</li>
<li>A prioritized, page-level breakdown of the pages that are hardest hit, so you know what to tackle first</li>
<li>Clear, step-by-step instructions on where access is blocked</li>
<li>How you can fix these problems</li>
<li>An exportable report you can share with your development team to fix it</li>
<li>Bi-weekly email status updates to prevent issues early</li>
</ul>
<p class="wp-block-paragraph">AI Insights is already included on current Prerender.io plans, with no extra setup or cost. Here’s a <a href="https://youtu.be/Gzq838gSg1s">short video demo</a> walking you through how it works.</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="AI Insights: Track, Monitor, and Fix Your AI Crawler Visibility Issues" width="640" height="360" src="https://www.youtube.com/embed/Gzq838gSg1s?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<h2 class="wp-block-heading">5 Benefits of Prerender.io’s AI Insights Feature</h2>
<p class="wp-block-paragraph">The practical outcome is time saved and problems caught earlier. Instead of noticing a traffic drop weeks after the fact and reverse-engineering what changed, you solve the problem at the source. </p>
<h3 class="wp-block-heading">1. You stop firefighting and start preventing. </h3>
<p class="wp-block-paragraph">Most teams only find out about a crawler access issue after it’s already cost them visibility, such as a dip in signups that no one can explain. AI Insights turns that into a daily check, so problems get caught while they’re still small and easy to fix.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="389" src="https://prerender.io/wp-content/uploads/pages-to-review-1024x389.png" alt="Pages to Review, a section of Prerender.io's new AI Insights feature in the Prerender.io dashboard." class="wp-image-13033" srcset="https://prerender.io/wp-content/uploads/pages-to-review-1024x389.png 1024w, https://prerender.io/wp-content/uploads/pages-to-review-300x114.png 300w, https://prerender.io/wp-content/uploads/pages-to-review-768x292.png 768w, https://prerender.io/wp-content/uploads/pages-to-review-1536x583.png 1536w, https://prerender.io/wp-content/uploads/pages-to-review.png 1670w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<h3 class="wp-block-heading">2. Instead of guessing, you know exactly where to focus your efforts.</h3>
<p class="wp-block-paragraph">Not every page carries the same weight. AI Insights prioritizes pages that crawlers actually want most, such as high-traffic blogs or revenue-driving product pages. That way, your team spends its time on the fixes that move the needle, rather than auditing your whole site page by page.</p>
<h3 class="wp-block-heading">3. You get a paper trail your dev team can act on. </h3>
<p class="wp-block-paragraph">When something is blocking access, you’re not stuck describing a vague symptom. You can export the exact diagnosis report and hand it straight to engineering, which cuts down the back-and-forth that usually stalls infrastructure fixes.</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="808" height="324" src="https://prerender.io/wp-content/uploads/diagnostics-ai-crawlers-1.jpg" alt="" class="wp-image-12765" srcset="https://prerender.io/wp-content/uploads/diagnostics-ai-crawlers-1.jpg 808w, https://prerender.io/wp-content/uploads/diagnostics-ai-crawlers-1-300x120.jpg 300w, https://prerender.io/wp-content/uploads/diagnostics-ai-crawlers-1-768x308.jpg 768w" sizes="(max-width: 808px) 100vw, 808px" /></figure>
<h3 class="wp-block-heading">4. It scales with the complexity of your setup. </h3>
<p class="wp-block-paragraph">AI Insights holds whether you’re managing a single site or a portfolio of twenty. The more properties, CDNs, and firewall rules you’re running, the more places something can break without you knowing it. The more valuable it is to catch that break before it costs you visibility, rather than after.</p>
<h3 class="wp-block-heading">5. You protect a channel that’s only going to matter more. </h3>
<p class="wp-block-paragraph">As more of your traffic and signups originate from AI answers instead of <a href="https://prerender.io/blog/traditional-search-vs-ai-powered-search-explained/">traditional search results</a>, crawler access starts being a revenue-protection concern. Catching these issues early means the investment you’re already making in content and SEO doesn’t go to waste on a technicality.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="479" src="https://prerender.io/wp-content/uploads/ai-crawler-activity-1024x479.png" alt="AI crawler activity chart in Prerender.io's new AI Insights feature " class="wp-image-13032" srcset="https://prerender.io/wp-content/uploads/ai-crawler-activity-1024x479.png 1024w, https://prerender.io/wp-content/uploads/ai-crawler-activity-300x140.png 300w, https://prerender.io/wp-content/uploads/ai-crawler-activity-768x360.png 768w, https://prerender.io/wp-content/uploads/ai-crawler-activity-1536x719.png 1536w, https://prerender.io/wp-content/uploads/ai-crawler-activity.png 1666w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<h2 class="wp-block-heading">How to Get Started with AI Insights</h2>
<p class="wp-block-paragraph">Already a Prerender.io user? AI Insights is included as standard if you’re on our <a href="https://prerender.io/pricing/">current pricing</a>. If you’re on an older plan and don’t see it yet, reach out and we’ll get you moved over.</p>
<ol class="wp-block-list">
<li>Log in to your dashboard, or <a href="https://prerender.io/pricing/">create your account</a></li>
<li>Open the AI Insights tab on the left-hand side</li>
<li>Check your daily health status across all of your domains</li>
<li>Run a diagnostics report on anything flagged</li>
<li>Follow the step-by-step fixes</li>
</ol>
<p class="wp-block-paragraph">Not a Prerender.io customer yet? <a href="https://prerender.io/pricing/">Sign up and get instant access</a>. For more details about the feature, check out our<a href="https://docs.prerender.io/docs/ai-insights"> knowledge base</a>.</p>
<h2 class="wp-block-heading">Fix Your AI Crawler Visibility</h2>
<p class="wp-block-paragraph">Check your dashboard today to see exactly where your site stands, fix any blocks, and prevent AI visibility problems before they escalate.</p>
<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe48e5de wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-white-color has-text-color has-background has-link-color has-text-align-center wp-element-button" href="https://auth.prerender.io/auth/realms/prerender/protocol/openid-connect/registrations?client_id=prerender-frontend&response_type=code&scope=openid%20email&redirect_uri=https://dashboard.prerender.io/integration-wizard&_gl=1*1m06q6w*_gcl_au*MTI3NzU5MTg2OC4xNzgwMzA3NjA1*_ga*MzYwMTA2NTM1LjE3NTIyMzQyMTk.*_ga_5C99FX76HR*czE3ODUyMjgxNjEkbzMyNyRnMSR0MTc4NTIyOTA2OSRqNjAkbDAkaDE1MDMyMzg5MzA." style="border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px;background-color:#1f8211">Explore AI Insights Today</a></div>
</div>
]]></content:encoded>
</item>
<item>
<title>Agentic AI Ecommerce: Why AI Agents Can’t Buy From Your Site</title>
<link>https://prerender.io/blog/agentic-ai-ecommerce-failures/</link>
<dc:creator><![CDATA[Prerender]]></dc:creator>
<pubDate>Tue, 28 Jul 2026 07:36:48 +0000</pubDate>
<category><![CDATA[AI SEO]]></category>
<category><![CDATA[agentic AI]]></category>
<category><![CDATA[ecommerce]]></category>
<guid isPermaLink="false">https://prerender.io/?p=12991</guid>
<description><![CDATA[Agentic AI ecommerce is unlocking sales your JS store can't serve. Learn why analytics misses it, and how prerendering fixes it.]]></description>
<content:encoded><![CDATA[
<p class="wp-block-paragraph">ChatGPT Operator, Google’s Buy for Me, and procurement assistants such as SAP Joule and Coupa already evaluate products, compare vendors, and then buy products for users. This is agentic AI ecommerce: a new channel in which agents shop on behalf of buyers, deciding in milliseconds whether your store is one they can buy from.</p>
<p class="wp-block-paragraph">If your site returns only a JS shell instead of usable HTML when an agentic commerce agent fetches a page, it’ll move on to a competitor that works. This is different from standard AI visibility: getting cited in an AI answer is a brand or SEO problem, but getting skipped by an AI agent is a transaction loss that won’t show up in your analytics.</p>
<p class="wp-block-paragraph">This piece explains where JS ecommerce catalogs lose agentic AI transactions, why that lost revenue stays invisible in standard analytics, and how prerendering solves the rendering layer without a stack migration.</p>
<h2 class="wp-block-heading">TL;DR: Why Ecommerce Sites Lose Agentic Transactions</h2>
<ol class="wp-block-list">
<li><strong>Agentic AI ecommerce agents cannot read JavaScript-dependent catalogs.</strong> They fetch the raw HTML and act on it immediately. If prices, variants, reviews, and other product data only appear after JavaScript runs, the agent sees an empty shell and moves on to a competitor it can read.</li>
<li><strong>These failures are largely invisible.</strong> GA4 and most monitoring tools depend on JavaScript, which the AI agent never executes. That means the visit leaves no client-side trace and may only appear in your server logs.</li>
<li><strong>The fix is server-readable HTML.</strong> Your product data must be present in the raw HTML before JavaScript runs, whether through server-side rendering, static generation, or prerendering.</li>
<li><strong>Prerender.io provides a faster path.</strong> Prerendering delivers agentic commerce readable HTML without requiring an SSR rebuild or framework migration, and can typically be set up in hours.</li>
</ol>
<h2 class="wp-block-heading">4 Reasons Why JavaScript Ecommerce Catalogs Fail AI Agents</h2>
<p class="wp-block-paragraph">On a JS-dependent ecommerce site, the first response to an agent’s HTTP request is near-empty: a thin HTML shell of framework bootstraps, script tags, and placeholder containers. The actual product data, such as product descriptions, pricing, or variant availability, loads only after JavaScript runs in the browser, which AI agents cannot do.</p>
<p class="wp-block-paragraph">Human shoppers never notice this gap because browsers execute the scripts instantly and render the full page experience. But an agent often gets no further than the initial response because it doesn’t execute JavaScript. This means the failure lies in the rendering layer, upstream of everything teams audit, not in your sitemap or content quality.</p>
<p class="wp-block-paragraph">Now, this is not a quirk of one or two agents. Vercel, working with MERJ, <a href="https://vercel.com/blog/the-rise-of-the-ai-crawler" type="link" id="https://vercel.com/blog/the-rise-of-the-ai-crawler" target="_blank" rel="noreferrer noopener nofollow">analyzed nearly 1.3 billion AI crawler fetches</a> and found that major non-Google AI crawlers (including GPTBot, ClaudeBot, and PerplexityBot) retrieve JavaScript files but do not execute them, leaving client-side rendered content entirely invisible. Google’s Gemini is the exception, inheriting Googlebot’s JavaScript rendering infrastructure.</p>
<p class="wp-block-paragraph">Google’s Gary Illyes made the same point recently, calling out the <a href="https://www.linkedin.com/posts/garyillyes_ai-agents-and-llms-in-general-would-have-share-7467219376010620928-1Rhf/?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAO-2RgBwEUClAQnxPdeVPLvjCj1b5wSmw0" type="link" id="https://www.linkedin.com/posts/garyillyes_ai-agents-and-llms-in-general-would-have-share-7467219376010620928-1Rhf/?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAO-2RgBwEUClAQnxPdeVPLvjCj1b5wSmw0" target="_blank" rel="noreferrer noopener nofollow">JS rendering problem specifically for agentic RAG systems</a>: AI agents and LLMs would have had an easier time interacting with the web if sites still relied on clean HTML and server-side rendering instead of JavaScript-heavy architectures.</p>
<p class="wp-block-paragraph">From what we’ve seen testing dynamic sites, AI agent transaction failures happen most regularly in these four patterns below, each a symptom of the same rendering-layer problem:</p>
<h3 class="wp-block-heading">Dynamic Pricing</h3>
<p class="wp-block-paragraph">If your price is populated by a <code><span style="color: #188038;">useEffect</span></code>, a GraphQL call, or any client-side fetch that fires after page loads, the initial HTML ships with an empty price slot. Without a visible price, the agent lacks one of the most important signals required for comparison and decision-making.</p>
<h3 class="wp-block-heading">Variant-Specific Pages</h3>
<p class="wp-block-paragraph">Many stores create separate URLs for each product variant (color, size, model, etc.). If those variant pages also rely on client-side JS, each variant URL may serve only a generic shell. An agent crawling a variant link sees nothing and skips the item.</p>
<h3 class="wp-block-heading">Filter and Faceted Navigation</h3>
<p class="wp-block-paragraph">When an agent builds a <a href="https://prerender.io/blog/the-good-and-bad-of-faceted-navigation-for-ecommerce-seo/" type="link" id="https://prerender.io/blog/the-good-and-bad-of-faceted-navigation-for-ecommerce-seo/">filtered category URL</a> to narrow to the right subset, and that filtering lives only in JavaScript state that never reaches the server response, the agent gets the unfiltered default or an empty grid. It cannot navigate your catalog to the thing it came for.</p>
<h3 class="wp-block-heading">Reviews and Ratings</h3>
<p class="wp-block-paragraph">Star ratings and review counts are trust signals many agents weigh alongside pricing, availability, and product specifications when comparing options. When those signals are absent from the raw HTML, they are invisible to agents evaluating your product.</p>
<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Pro tip:</strong> disable JavaScript in your Chrome DevTools > Settings, then reload your product page. If the price, variants, or reviews disappear, you can be sure that this is what agentic commerce agents also see.</td></tr></tbody></table></figure>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="358" height="479" src="https://prerender.io/wp-content/uploads/Example-of-what-agentic-commerce-bots-see.jpg" alt="Example of what agentic commerce bots see when JS is not rendered" class="wp-image-13003" srcset="https://prerender.io/wp-content/uploads/Example-of-what-agentic-commerce-bots-see.jpg 358w, https://prerender.io/wp-content/uploads/Example-of-what-agentic-commerce-bots-see-224x300.jpg 224w" sizes="(max-width: 358px) 100vw, 358px" /></figure>
</div>
<h2 class="wp-block-heading">Why AI Agent Transaction Failures Are Invisible in Your SEO and AI SEO Analytics</h2>
<p class="wp-block-paragraph">Agent failures don’t just cost sales; they hide the evidence. A human visitor who lands on a blank page bounces or hits a 404 error you can spot in your analytics, but an AI agent that encounters an invisible JS product page leaves no such trace.</p>
<p class="wp-block-paragraph">This is because GA4 and most monitoring tools run on JavaScript, and agents fetch raw HTML without executing JS, so they never trigger that tracking code. This simply means the request leaves no client-side trace, so your monitoring tools have nothing to catch or register.</p>
<p class="wp-block-paragraph">The result is silence: the loss appears as a flat line where agentic commerce revenue should be, not as a visible decline. That silence is expensive now that AI-referred traffic converts 42% better than non-AI traffic, per <a href="https://elogic.co/blog/chatgpt-commerce-statistics/" type="link" id="https://elogic.co/blog/chatgpt-commerce-statistics/" target="_blank" rel="noreferrer noopener nofollow">Adobe’s March 2026 data</a>—an 80-point swing from a year earlier, when it converted 38% worse.</p>
<p class="wp-block-paragraph">Server logs are the only reliable way to detect this failure. Logs capture every raw request before scripts run, including agent hits your analytics miss. Check for <code>GPTBot</code>, <code>ClaudeBot</code>, <code>PerplexityBot</code>, and <code>OAI-SearchBot</code> on your product detail pages.</p>
<p class="wp-block-paragraph">The caveat to log analysis is that agent traffic is only as visible as its user agent string. While some bots identify themselves, others mask as browsers or use proxies, so it’s best to treat your log count as a floor. The real gap is between agent requests to product URLs and agentic conversions. Every agent request with no downstream conversion means revenue going to a competitor—and from what we’ve seen, the gap is wider than most teams expect.</p>
<h2 class="wp-block-heading">What AI Agents Need From a Product Page</h2>
<p class="wp-block-paragraph">To capture these lost sales, <strong>product pages must first meet the agent’s expectations at the rendering layer, ensuring core information is present and accessible in the raw HTML before JavaScript runs</strong>, through server-side rendering, static site generation, or <a href="https://prerender.io/blog/other-rendering-options-vs-prerendering/" type="link" id="https://prerender.io/blog/other-rendering-options-vs-prerendering/">prerendering with Prerender.io</a>.</p>
<p class="wp-block-paragraph">When done right, every page in your agentic AI product catalog ships its product data in the first response. The key rendering-layer requirements for AI <a href="https://prerender.io/blog/ai-friendly-vs-ai-agent-friendly-websites/" type="link" id="https://prerender.io/blog/ai-friendly-vs-ai-agent-friendly-websites/">agent-ready ecommerce sites</a> include:</p>
<ul class="wp-block-list">
<li><strong>Complete HTML</strong>, with pricing, availability, product attributes, and breadcrumbs in the initial payload rather than populated afterward.</li>
<li><a href="https://prerender.io/blog/5-types-of-schema-markup-dynamic-websites-should-implement-including-a-tutorial/" type="link" id="https://prerender.io/blog/5-types-of-schema-markup-dynamic-websites-should-implement-including-a-tutorial/"><strong>Schema markup</strong></a> that ships in the initial response instead of being injected post-JS, so an agent reading raw HTML can parse it.</li>
<li><strong>Stable URL structure</strong>, either a distinct URL per variant or a correct parent and variant relationship, so an agent can navigate to the exact size or color it was sent to buy without ambiguity.</li>
</ul>
<p class="wp-block-paragraph">A perfectly rendered page can still be unreachable if your access rules turn the agent away. Strict <a href="https://prerender.io/blog/robots-txt-for-ecommerce-seo/" type="link" id="https://prerender.io/blog/robots-txt-for-ecommerce-seo/">robots.txt</a> written to block AI training crawlers can also block transactional agents, and filtered URLs that are noindexed to manage crawl budget can return an empty or redirected response by design.</p>
<p class="wp-block-paragraph">However, using a <a href="https://developer.chrome.com/docs/lighthouse/agentic-browsing/llms-txt" type="link" id="https://developer.chrome.com/docs/lighthouse/agentic-browsing/llms-txt" target="_blank" rel="noreferrer noopener nofollow">llms.txt</a> file can help distinguish the two; at minimum, confirm you aren’t disallowing AI user-agent strings such as GPTBot, ChatGPT-User, or OAI-SearchBot. We cover the full five-step failure sequence and the access-control setup in our <a href="https://prerender.io/blog/how-to-optimize-enterprise-site-for-agentic-ai/" type="link" id="https://prerender.io/blog/how-to-optimize-enterprise-site-for-agentic-ai/">guide to optimizing an enterprise site for agentic AI</a>.</p>
<h3 class="wp-block-heading">Why the Rendering Layer is the First Thing to Fix</h3>
<p class="wp-block-paragraph">Every other piece of agentic AI readiness assumes the agent can already read your page. Schema accuracy, entity signals, factual density, internal linking, and <a href="https://www.anthropic.com/news/model-context-protocol" type="link" id="https://www.anthropic.com/news/model-context-protocol" target="_blank" rel="noreferrer noopener nofollow">MCP integration</a> all operate on content that must first be present in the raw HTML. When the agent receives a blank shell, those optimizations have nothing to act on.</p>
<p class="wp-block-paragraph">Once your content reliably lands in the initial response, server logs should show agents successfully fetching complete product pages rather than empty HTML shells. That makes your prices, availability, variants, reviews, and product details eligible for citation, comparison, and selection, creating a measurable path from agentic AI traffic to product discovery and completed transactions.</p>
<h2 class="wp-block-heading">Prerender.io: The Reliable Rendering-Layer Solution</h2>
<p class="wp-block-paragraph">You have a few ways to close the rendering gap: an SSR rewrite or a framework migration, but both mean re-architecting your site, pulling engineering off the roadmap for months, and absorbing the risk that comes with rebuilding a working catalog. For most teams, that cost is hard to justify against a channel they’re only beginning to measure.</p>
<p class="wp-block-paragraph">Prerendering delivers the same readable HTML without requiring changes to your existing stack. For teams without the engineering runway for an SSR rewrite, Prerender.io is typically the faster, lower-cost path.</p>
<p class="wp-block-paragraph"><a href="https://prerender.io" type="link" id="https://prerender.io">Prerender.io</a> operates at the infrastructure layer, generating fully rendered HTML snapshots of JavaScript pages and serving them directly to agents and crawlers when they request a URL. As agentic AI ecommerce shifts more product discovery to autonomous shopping agents, this rendering solution ensures they receive your complete product data in the initial response, regardless of whether your site was built in <a href="https://prerender.io/framework/react/" type="link" id="https://prerender.io/framework/react/">React</a>, <a href="https://prerender.io/framework/angular/" type="link" id="https://prerender.io/framework/angular/">Angular</a>, <a href="https://prerender.io/framework/vue-js/" type="link" id="https://prerender.io/framework/vue-js/">Vue</a>, or any <a href="https://prerender.io/framework/others-js/" type="link" id="https://prerender.io/framework/others-js/">JS framework</a>. Human visitors still experience the normal JavaScript site.</p>
<p class="wp-block-paragraph"><a href="https://prerender.io/blog/how-to-install-prerender/" type="link" id="https://prerender.io/blog/how-to-install-prerender/">Prerender.io’s setup takes only a few hours</a>, integrates well with your existing JS stack, works with most CDN and backend configurations, and requires no code rewrite or ongoing maintenance burden.</p>
<h3 class="wp-block-heading">How Prerender.io Closed On’s Rendering Gap and the Revenue That Followed</h3>
<p class="wp-block-paragraph"><a href="https://www.on.com/" type="link" id="https://www.on.com/" target="_blank" rel="noreferrer noopener nofollow">On</a>’s most pressing problem was that Google could not reliably read its JavaScript-rendered product content. This led to <a href="https://prerender.io/blog/how-to-fix-disapproved-google-ads/" type="link" id="https://prerender.io/blog/how-to-fix-disapproved-google-ads/">disapproved ads across Google Shopping</a> and DV360, and limited the visibility of its catalog in organic search.</p>
<p class="wp-block-paragraph">Rather than rebuild the site with server-side rendering, On implemented Prerender.io to serve complete, readable HTML to search crawlers. This restored access to the product data Google needed to approve ads, surface listings, and index pages correctly—protecting both paid and organic acquisition channels.</p>
<p class="wp-block-paragraph">Over nearly three years, On recorded a 67% increase in Google traffic and a 98% increase in Bing traffic while avoiding an SSR migration and any changes to its core site code. The company also estimates that the implementation saves millions of dollars each year.</p>
<p class="wp-block-paragraph">Marilena Pixner, On’s Senior Organic Growth and SEO Specialist, said Prerender.io offered “<em>the strongest combination of stability, speed, and value</em>” for their site.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="624" height="237" src="https://prerender.io/wp-content/uploads/On-image-traffic-results.jpg" alt="On’s image traffic results after implementing Prerender.io." class="wp-image-13010" srcset="https://prerender.io/wp-content/uploads/On-image-traffic-results.jpg 624w, https://prerender.io/wp-content/uploads/On-image-traffic-results-300x114.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>
</div>
<p class="has-text-align-center wp-block-paragraph"><em>On’s image traffic results after implementing Prerender.io</em>.</p>
<p class="wp-block-paragraph">To validate the impact directly, the On team decided to run a test: they temporarily disabled Prerender.io for one month in a low-traffic market. Traffic dropped to less than 10% of its normal levels, then stabilized once it was turned back on. That single test is a clear signal that Prerender.io is a critical driver of On’s online discoverability. Read more about <a href="https://prerender.io/resources/case-studies/on-prerender/" type="link" id="https://prerender.io/resources/case-studies/on-prerender/">On’s success story with Prerender.io</a>.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="624" height="132" src="https://prerender.io/wp-content/uploads/On-image-traffic.png" alt="On’s image traffic after turning Prerender.io off in a controlled test" class="wp-image-13017" srcset="https://prerender.io/wp-content/uploads/On-image-traffic.png 624w, https://prerender.io/wp-content/uploads/On-image-traffic-300x63.png 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>
</div>
<p class="has-text-align-center wp-block-paragraph"><em>On’s image traffic after turning Prerender.io off in a controlled test</em></p>
<h2 class="wp-block-heading">Serve AI Agents a Readable Catalog Without Rebuilding Your Frontend</h2>
<p class="wp-block-paragraph">The user class for ecommerce sites is expanding beyond humans, and the agent share of traffic is predicted to keep climbing. This means a growing slice of your buyers now arrive as agents, and only the sites that get readable first will be the ones agents can buy from.</p>
<p class="wp-block-paragraph">To serve these transactional agents, the foundation begins at the rendering layer. With <strong>Prerender.io</strong>, you can serve agents complete, pre-rendered HTML on the first request without rebuilding your catalog, while human shoppers still enjoy the dynamic experience. That first readable response is what turns a potential AI agent transaction failure into a completed sale.</p>
<p class="wp-block-paragraph">Ready to make your ecommerce catalogs visible to AI agents? <a href="https://prerender.io/pricing/" type="link" id="https://prerender.io/pricing/">Get started with Prerender.io for free and see the impact firsthand.</a></p>
<h2 class="wp-block-heading">Frequently Asked Questions: Agentic AI Ecommerce</h2>
<h3 class="wp-block-heading">1. Does Fixing the Rendering Layer Affect Agentic Commerce and Other Traffic Channels?</h3>
<p class="wp-block-paragraph">Yes. The same rendered HTML that allows AI shopping agents to read your catalog also helps Google’s crawlers, shopping platforms, and paid media systems access your product content.</p>
<p class="wp-block-paragraph"><a href="https://prerender.io" type="link" id="https://prerender.io">More reliable rendering</a> can support complete indexing, reduce ad or feed disapprovals, and improve visibility across organic and paid channels. Any ranking gains are a downstream effect of making the page consistently accessible, rather than a direct result of prerendering itself.</p>
<h3 class="wp-block-heading">2. How Long Does It Take to Make a JS Catalog Agent-Ready?</h3>
<p class="wp-block-paragraph">With prerendering, it takes a few hours. Because <a href="https://prerender.io" type="link" id="https://prerender.io">Prerender.io</a> works at the infrastructure layer and serves rendered HTML to agents on request, there’s no framework migration or SSR rewrite, and it fits most existing CDN and backend setups. An SSR rebuild solves the same problem but takes months to pull off.</p>
<h3 class="wp-block-heading">3. How Can Ecommerce Sites Prepare for Agentic AI?</h3>
<p class="wp-block-paragraph">Ecommerce sites can prepare for agentic AI by ensuring agents can reach their site at all. Once access is clear, solve the rendering layer so JS-heavy pages return complete HTML. From there, add semantic structure so agents can navigate your agentic AI product catalog, clean up your content layer for machine readability, and expose procurement workflows through APIs or MCP. Each step builds on the one before it.</p>
]]></content:encoded>
</item>
</channel>
</rss>