Need help?Jamie

AI Search

JavaScript and AI Crawlers: Can They Read Your Pages?

Google renders JavaScript before it indexes a page, but the most detailed public data on AI crawlers says many of them read only the HTML your server sends. Here's what that means for your pages and how to check them.

Connected blocks linked by orange cables on a dark surface

See how I'd approach this

Choose a question
to look at with me.

The path from campaign investment to a useful inquiryCampaign & audienceRelevant visitUseful inquiryFollow up
  1. Campaign and audience
  2. Relevant visit
  3. Useful inquiry
  4. Follow up
The path from campaign investment to a useful inquiry

Some AI crawlers can read text that JavaScript adds to a page, and many can't. Google renders JavaScript before it indexes a page, though that step can happen a while after the crawl. The most detailed public data on AI crawlers, a post from the hosting company Vercel, found that the major ones it tracked read pages without running the scripts on them. If the words on your service pages only show up after JavaScript runs, some of the tools people now use to find a local business may be looking at a nearly empty page. The safe fix is to put your words in the HTML your server sends. At Trojan Digital Marketing in Indianapolis, we hold our own site to that rule, and our website scanner, powered by Jev, has a check counted by code for it.

Why text that loads with JavaScript can go missing

Every web page reaches a visitor in two stages. First the server sends a file of HTML. Then the browser runs any JavaScript on the page, and that code can add headings, paragraphs, prices and reviews that weren't in the file. A person with a normal browser sees the finished page and never notices the difference.

A crawler sees whatever it's built to see. One that reads the HTML file and stops there gets only what the server sent. On a site where the server sends a thin shell and a script fills in everything else, that shell might hold a logo, a menu and a line asking the visitor to turn on JavaScript. The copy you paid someone to write lives in the part the crawler skipped.

Custom web apps aren't the only sites with this problem. Page builders, tabbed sections, sliders, FAQ accordions and third party review widgets can all load their text with scripts, so a site that mostly works fine can still hide a few important blocks. You won't know which case you're in until you look at the raw HTML.

What does Google say about rendering JavaScript?

Google says it does run JavaScript, in a separate step after it crawls a page. Its JavaScript SEO basics guide describes three phases: crawling, rendering and indexing. Pages that return a 200 status code go into a render queue unless a robots meta tag or header tells Google not to index them, and once Google's resources allow, a headless Chromium browser renders the page and runs its JavaScript. Google says a page may wait in that queue for a few seconds and that it can take longer.

The same guide still recommends server-side rendering or pre-rendering, because it makes a site faster for users and crawlers and because not all bots can run JavaScript. Google's page on dynamic rendering, the older trick of handing bots a pre-built copy of each page, calls that approach a workaround and recommends server-side rendering, static rendering or hydration in its place. So even the search engine that does render JavaScript tells site owners to put the content in the HTML.

Do AI crawlers render JavaScript?

Most of the major AI crawlers didn't when they were measured, according to the most detailed public data we could find. Vercel published The rise of the AI crawler using request data from its own network. Its headline finding was that none of the major AI crawlers it studied rendered JavaScript, and it named crawlers from OpenAI, Anthropic, Meta, ByteDance and Perplexity. It also reported that the ChatGPT and Claude crawlers did download JavaScript files but didn't execute them.

The post described two exceptions. Google's Gemini uses Googlebot's infrastructure, which gives it full JavaScript rendering, and Apple's crawler renders JavaScript through a browser-based crawler. Vercel's advice to site owners was to render critical content on the server.

We'd keep the limits of that evidence in mind. It comes from traffic on Vercel's own network at the time the post was written, and any of these crawlers could change how it works without announcing it. The cautious reading matches what Google already says: some bots can't run scripts, so your most important words shouldn't depend on them. Whether your robots.txt lets those bots in at all is a separate question, and AI crawler access controls covers it.

How can you check a page yourself?

Give each part of the page a jobOfferEvidenceAction
Offer
Explain what the customer can get.
Evidence
Support the offer.
Action
Make the next step easy to use.
Give each part of the page a jobThe offer, evidence and contact route should work together on a small screen.

View the page source and search it for a sentence you can see on the page. The source is the HTML the server sent, before any script ran, so it shows you roughly what a crawler that skips JavaScript gets.

  1. Open the page in your browser and pick a sentence from the middle of the main text, something specific like a price range or a town name.
  2. Press Ctrl+U in Chrome, Edge or Firefox on Windows, or Cmd+Option+U in Chrome on a Mac, to open the page source.
  3. Press Ctrl+F, or Cmd+F on a Mac, and search the source for your sentence.
  4. If the sentence is there, a crawler that doesn't run JavaScript can read it. If it's missing, that text arrives by script.

Don't right click and choose Inspect for this test. The inspector shows the page after JavaScript has run, so your text will be there either way. If you want to see what Google in particular ends up with, the live test in Search Console's URL Inspection tool lets you view the HTML Google rendered. That answers the question for Google, and it tells you nothing about crawlers that skip the render step.

How the Jev Website Scanner flags words that need JavaScript

The Jev Website Scanner runs this test on every page it reads, up to 100 on a site's free first scan. The check is called Words load without JavaScript, and it's one of the 27 technical facts code counts on every page, next to things like title length, a single H1, schema and tap to call links. Here's what it does.

  • It fetches each page the way a plain crawler does and doesn't run the page's scripts.
  • It strips out script, style, noscript, SVG, template and iframe blocks, along with the navigation and the site header and footer, so the count reflects the page itself.
  • It counts the words that are left. A page fails when it has fewer than 50 and its HTML looks like a shell a script is meant to fill, like an empty app container or a notice that the site needs JavaScript, so a page that's simply short doesn't fail.
  • A page that fails is marked Fix now in the report, with the finding Words only load with JavaScript and a short fix for your developer: render the page's words in the HTML from the start.

Code counts this one exactly, with no model involved. That matters for everything else on the page, too. Jev, the TypeSafe model that answers 48 set questions about each page, reads the same server HTML text the code counted. When a page fails this check, its scores from Jev on proof, local detail and answers will likely look thin as well, and for the same reason. Fix the rendering first. Until the words are in the HTML, Jev's findings on that page tell you little about the copy. If you can't tell where your words load, bring the report to the free strategy call. Our founder, Jeff Clerisier, works out the scope of any fix with you directly.

The first scan of a site is free and reads up to 100 pages, starting with your home page and the pages that sell, like services, towns, about and contact. You enter an email so the report link can be sent to you. It follows your robots.txt, and when a site shows the scanner a bot check, it stops and reports that page as an error. You get the report as a PDF and a CSV. For a closer look at a page's HTML, such as crawl directives, images and links, the free SEO, AEO and GEO audit is the separate tool built for that.

What to ask your developer for

Ask for the page's real words to be in the HTML the server sends, before any script runs. Developers have a few standard ways to get there, and the terms Google uses are a good shared vocabulary. If you need help with that repair, our SEO implementation for crawlable service pages explains the scope to discuss.

  • Server-side rendering builds the full HTML on the server for each request, so the words are there when the page arrives.
  • Static rendering builds each page's HTML ahead of time, which suits pages that look the same for every visitor, like most service and town pages.
  • Hydration sends the finished HTML first and then attaches the interactive parts with JavaScript, so buttons and forms still work.

The web.dev guide to rendering on the web explains these options and their tradeoffs if your developer wants a reference to work from. Ask them to cover more than the paragraphs. Headings, prices, your phone number, your service area, internal links and structured data all belong in that first HTML response. Review widgets and FAQ accordions deserve a second look, since they're common places for text to load late.

When the change is live, repeat the view source test on a couple of pages, then scan the site with the Jev Website Scanner to confirm no page fails the check. The first scan of a site is free, and the $99 audit includes one rescan after your fixes. If a page passes and still doesn't appear where you'd expect, the cause lies somewhere else, and why a page may be missing from AI Overviews walks through the other reasons worth ruling out.

Questions, answered.

Does Googlebot run JavaScript?

Yes. Google's JavaScript SEO basics guide says a headless Chromium browser renders pages and runs their JavaScript after crawling, once Google's resources allow. A page can wait in that render queue for a few seconds or longer, and Google still recommends server-side rendering or pre-rendering because not all bots can run JavaScript.

Do ChatGPT and Claude crawlers read text that JavaScript adds?

Probably not, based on Vercel's published crawler analysis, which found that the ChatGPT and Claude crawlers downloaded JavaScript files without executing them. That's one company's data from its own network, and crawlers can change, so the dependable move is to have your words in the HTML your server sends.

How do I check whether my page's text needs JavaScript?

Open the page source with Ctrl+U, or Cmd+Option+U in Chrome on a Mac, and search it for a sentence you can see on the page. If the sentence isn't in the source, it's loading by script. The Jev Website Scanner runs the same kind of check on every page it reads, up to 100 on a site's free first scan, and marks a page Fix now when its server HTML has fewer than 50 words and looks like a shell a script fills in.

Does text inside a noscript tag count?

Not in the Jev Website Scanner's count. The scanner strips noscript blocks along with scripts and styles before it counts words, so a message asking visitors to turn on JavaScript won't pass the check. The fix it's looking for is the page's real words in the HTML.

Is the Jev Website Scanner the same tool as the free audit?

No. The Jev Website Scanner reads up to 100 pages on a site's free first scan, asks Jev 48 set questions about each one and has code count 27 technical facts, including the JavaScript check. The free audit is a separate tool for technical HTML checks such as crawl directives, images and links.

Sources & further reading

Need our help with this on your own site?

Request a free strategy call

The first strategy call is free, and during business hours we aim to reply within five minutes.

Pick the service passages a release must keep

A release checklist should protect the service facts a buyer needs, wherever the design places them. We would choose those passages before changing the page template.

Hypothetical example A fictional booking-page refresh with a missing condition

Before

  • Imagine a business replacing a long service section with a polished booking panel. The old page says an assessment is required before the final price. The new panel shows a strong booking action but drops that condition.
  • The sentence might still live in an old text record or a script's data. Neither helps a reader who receives the new public page without the limit. This is an invented publishing problem, without a claimed client result.

After

  • Our checklist would name the assessment condition as required service text. The refreshed page must state it near the relevant offer, even if the layout and wording change with approval.
  • The booking panel may add convenience after it loads. It should not become the sole place to learn that the first step is an assessment. The business approves the meaning before the team accepts the design.

Start with what a stranger needs to decide whether to contact the business. We would ask the service owner which exclusions, preparation steps and availability conditions prevent an unsuitable inquiry. Those details are easy to lose when a designer shortens a page. Protect them by meaning and placement, rather than insist that every old sentence must remain unchanged through every future revision.

Give each required passage a short name in the release notes. Our list might use service limits, preparation or next step. These labels are for the team, so they need not become customer-facing headings. They let a developer and editor discuss the same item when the page moves from an article layout into cards, tabs or another component.

Build a sample that follows text paths

A strong sample follows the different ways service text reaches a page. We would choose examples by publishing path and customer task, rather than visual appearance alone.

  1. Name each publishing path List the text sources the web team confirms, such as a page record, a shared service field or an approved embedded component. We would avoid guessing the architecture from how the site looks.
  2. Choose a sample page for each path A simple page and one with a separate booking panel may need different checks. Our list should explain why each was selected and identify untested page families.
  3. Include a page with important conditions Choose a real approved passage that limits the offer. We would check that its limit survives along with the attractive headline, since a shorter claim can change the customer's understanding.
  4. Record the actual public route Keep the service address and a public page that links to it. Our sample then supports both a direct visit and the path a reader is likely to take.
  5. Keep the same sample after the change Compare the chosen pages under the same conditions. If the project adds a new publishing path, add it explicitly. We would not quietly replace a failing sample with a simpler page.
  • Assign an editor to identify the current approved meaning. A technical check can find text, but it cannot determine whether an old service exclusion is still correct. Our sample needs both checks.
  • Keep photographs, captions and linked documents in the inventory when they carry required instructions. The page should not depend on a small image to state a condition someone needs to read.
  • Mark optional enhancements separately from required service text. We would allow an animation or convenience widget to load later while the approved offer and its immediate contact route remain clear.

Test the page people actually arrive on

Direct entry and navigation can produce different page states. We would check the chosen service through its real public links as well as its typed address.

  • Open the saved service address in a fresh public visit. Record the final page address and visible offer. Our result should identify any redirect that changes which service the reader reaches.
  • Follow a real menu or related-service link from the recorded starting page. A working direct address does not establish that the link points there or that the browser transition displays the same service.
  • If a campaign query is in the agreed sample, keep it through the check. We would compare the approved service facts without treating every tracking variation as a separate page that needs new text.
  • Try the fragment link a reader uses to reach preparation or service-fit facts. Its target should exist in the delivered page. A heading visible only after a separate script action needs its own explanation in the final notes.
  • Record a mismatch before refreshing it away. We would keep the starting page, followed link and resulting service state so the web team can reproduce the transition that failed.

A site change can fix a direct request while leaving a browser route on an older template. It can also update a menu label while keeping the old destination. We would compare the real arrival path with the chosen text item. This catches a different class of error from checking whether one saved sentence appears somewhere in a large returned file.

Keep the device and starting conditions visible, without assuming that a screenshot describes every visitor. A narrow-screen check may expose an overlapping panel that obscures the service conditions. A wider-screen check may use another navigation control. Our checks should follow the task on both layouts included in the project, while stating any environments that were not checked.

Compare meaning without demanding identical files

Text checks should keep the approved offer while allowing harmless changes in delivery. We would compare important facts and relationships before treating every file difference as a defect.

What to compare in the public service HTML
ItemMeaning to keepA misleading shortcut
Service boundaryThe reader can identify which work is included and which request needs a separate conversation. Our editor checks that the limits sit with the relevant offer.Counting words alone can pass a page that retained a long introduction but lost its exclusion.
Preparation requirementThe required input or assessment remains clear before the person takes the next step. We would trace it through the actual service route.Finding the same phrase inside an unused data object does not prove the passage is presented as usable text.
Contact expectationThe action still states whether it requests a conversation, an estimate or an actual reservation. Our check follows the business's approved process.An attractive button is not proof that the wording around it sets the correct expectation.
Related destinationA link leads to the page that explains the named next question. We would retain the relationship even when the layout changes.Matching only the anchor label can miss a destination that was changed accidentally.
Public page identityThe service title, page purpose and preferred address remain aligned with the approved change. Our notes identify any intentional adjustment.A visual similarity check can miss a template that now introduces a different service.

Allow for harmless differences such as generated element identifiers or spacing. The web team can explain which differences are expected for the framework in use. We would avoid creating a broad ignore rule that also hides the service passage being protected. If the comparison is too noisy to interpret, narrow it to meaningful regions while keeping the original public response available for investigation.

Keep a widget from becoming the only source

An enhancement should add convenience to an already clear service page. We would keep essential facts available when a third-party panel is delayed or unavailable.

A review panel, map or booking tool can fail independently of the service page. We would list which facts each panel contributes and ask whether the same facts are needed before a customer can choose the next step. If the panel alone explains eligibility, the design has made a key business answer depend on a separate delivery path. That dependency belongs in the release plan.

The fallback must be truthful. An unavailable review widget cannot support writing an invented rating into the page. A booking tool that cannot confirm times should not show fictional openings. We would ask the business to approve a plain explanation and a real contact route for that state. Keep any uncertainty visible rather than use a polished placeholder that looks like a confirmed offer.

Should every page control work without scripts?
The agreed task determines what must remain available. A calendar may need scripts, while the page can still explain the service and how to ask about availability. We would document that boundary and test the normal fallback rather than promise that every advanced action works in every client.
Can we hide all preparation details in a closed panel?
A visual panel can organize detail, but required preparation should remain reachable through a clear control and exist in the delivered text. Our check should confirm the actual markup and interaction. A label alone does not establish that its answer is present.
What if the vendor owns the displayed facts?
Confirm which facts the business may publish elsewhere and how they stay current. We would avoid copying a vendor's changing availability into permanent text without an owner. Essential service conditions should come from an approved maintained source.

Agree on an honest state for unavailable text

An upstream failure should not silently replace an offer with misleading certainty. We would agree on the customer message and recovery path before the release.

What should happen if the service record cannot be read?
Ask the owner and web team to choose the intended behavior for that system. We would test the agreed outcome. It might keep a known valid published version or show a clear temporary problem, depending on how the site's text is managed.
Can the page invent a generic service summary?
No. A fallback must stay within the business's approved facts. We would rather mark an unavailable detail clearly than fill a gap with a plausible promise about coverage, price or service fit. The customer should be able to tell what remains unconfirmed.
How do we test this without damaging production?
The web team should use an authorized test environment or another agreed method that avoids disrupting real customers. Our publishing checklist describes the intended result; it does not authorize disconnecting a live data service to create an outage.
Does returning a normal status settle the question?
No. The text still needs to fulfill the intended reading task. Google's status guidance explains that a successful response can carry an empty page or error message. We would check what the customer actually receives alongside the response code.

Keep fallback checks separate from the successful path. A page may work well when every vendor responds yet become confusing during an ordinary timeout. We would ask for the expected message, retry behavior and real contact alternative, where those belong in the agreed project. State which conditions were simulated and which were only discussed. That prevents a design conversation from being reported as a completed resilience test.

Publish the HTML and its resources as a matching set

Service text can drift when a new page uses older browser files. We would ask the web team how the release keeps those parts compatible.

  • Keep the old public capture before replacing a template. We would retain the HTML and the requested filenames needed to explain a later mismatch, without keeping private session details.
  • Check that the new page's linked scripts and styles can be retrieved through the normal public route. A file present in a developer's build folder may still be missing from the actual serving path.
  • Ask how returning visitors obtain a compatible set of resources. Our plan should include a previously loaded browser state when the system's release process makes that condition relevant.
  • When a problem appears only after an update, identify the served HTML and resource versions together. We would avoid attributing every missing sentence to poor writing when an incompatible bundle could be changing the page.

This check should remain specific to the release. The operator can explain which assets are fingerprinted and which caching rules apply. We would not prescribe one cache setting for every platform. The practical requirement is a testable public outcome: the selected service passages remain correct, and the controls that act on them use compatible code. Any untested return-visit conditions should stay visible in the final note.

Walk through a hypothetical service-page refresh

A fictional refresh helps turn the checklist into a sequence a team can follow. We would protect the offer first, then accept the added interaction.

  1. Freeze the approved service meaning In this hypothetical case, the service owner names an assessment requirement and an excluded job type. Our starting record shows how the current page communicates both. No real business or completed project is implied.
  2. Define the redesigned task The designer proposes a compact offer panel with an appointment request panel. We would ask where the two conditions remain readable before a visitor submits anything, including when the appointment enhancement is unavailable.
  3. Inspect the returned service text The web team captures the approved preview's public HTML under the agreed access arrangement. Our editor checks whether the current offer and both conditions appear as actual page text, rather than only in a script payload.
  4. Follow the customer's route A tester enters from the related service page, reaches the refreshed offer and opens the preparation link. We would keep any mismatch with the direct-address visit instead of refreshing until both look alike.
  5. Check the interaction with approved test input If submission testing belongs in the project, the business names a recipient and test record. Our text check alone does not establish that a request reaches staff or that a booking has been confirmed.
  6. Accept only the checked result The final note names the approved conditions and the paths tested. We would record untested vendor outages and later search processing separately. No ranking or customer outcome is invented to complete the example.

The sequence lets a design change while the offer stays honest. If the new layout hides a key condition, fix that before adding more sales copy. Our check can then show a clear benefit. The approved limit stays beside the service, and the reader can reach the intended next step through the tested path.

Add checks around facts that can change

A text check earns its place when it catches a meaningful publishing fault. We would target changing service facts and their dependent passages, rather than mirror every implementation detail.

Choose a check with a business reason
Change triggerContent check to retainWhy it matters
A service is added or removedOur selected page should name only approved current services and keep the correct route for related work.A stale menu can invite a request the business no longer accepts, even while the new main page is accurate.
Coverage conditions changeConfirm the new conditions appear beside the relevant offer and in the contact introduction when needed.A broad promise in an older component can conflict with a carefully limited service description.
A template is replacedOur sample should retain the required passages across the new server HTML and the completed browser state.Moving text into a component can change when it becomes available or which route includes it.
A vendor panel changesCheck the panel's failure message and the maintained service explanation around it under agreed test conditions.The page should not imply confirmed availability merely because a panel has not loaded.
A publishing connection changesVerify the public page reflects the approved current record through the supported publishing path.A successful save in an editor does not by itself establish which record the public visitor receives.

Keep the chosen checks understandable to the people who approve service facts. We would explain what customer misunderstanding each check guards against. That lets a future editor update an intentional service change without simply deleting a failing assertion. Technical details can stay in the build notes, while the test statement continues to describe the business fact that must survive.

Close the release with a portable text record

A text record keeps what was checked and why it passed. We would leave the next web team enough context to repeat the task after a later change.

  • Record the approved service passages and the public addresses checked. Our summary should name the service facts kept, without presenting a list of internal component files as the customer's outcome.
  • Keep direct-entry and followed-link results together. If the paths behaved differently before the fix, note which saved condition reproduced the difference and which check established the accepted behavior.
  • Separate initial HTML checks, completed-browser checks and any actual Google inspection. We would label each by the method used. Passing one view cannot establish how every other crawler processes the page.
  • Retain unresolved limits, including unavailable accounts, vendor states that were not simulated and page families outside the sample. Our report should let the owner judge those limits without guessing what a broad pass label includes.
  • Name the next event that should trigger a check, such as a service change or template replacement. We would connect future work to a changed condition rather than promise a permanent pass for an evolving site.

Readable server HTML is a foundation for access to service facts. It does not compel a search engine or assistant to select, rank or cite the page. Our release receipt should claim the tested publishing outcome and stop there. Later search observations can be collected under their own dates and filters, while the business continues to maintain the offer customers actually receive.

Give the owner a short set of questions to ask at the handover. Can a reader tell which job the service covers? Can they find the limit that may rule their request out? Do they know what happens when they use the main link? We would show those answers on the live page, then show where the team keeps the source text. That ties the test to the service the business sells.

Keep a copy of that agreed text with the change notes. When a later edit seems to remove a key fact, our team can compare it with the last accepted version. The old copy is a record of what passed then. It should not freeze the offer for good. A service owner can change the offer, but the web team needs to know which linked parts must change with it.

Sources