How To Make All Text Visible to AI

Your report found text visitors can see that your page did not send when it first loaded. What it means, whether it matters on your page, what causes it, and what to change.

What this means

Every page arrives in two stages. The first response is what your server sends the moment the page is requested, before any code runs. Then the browser runs the page’s JavaScript, which can fetch more content and add it in. Visitors see the finished result, so nobody notices there were two stages.

Most systems that read pages at scale take the first response and stop. When your report says text is missing from it, the page sent one version of itself to our request and a fuller version to a browser.

Stage one · what the server sent

<div id="root"></div>
<script src="/app.js"></script>

No readable text.

Stage two · what the visitor read

Custom aluminium enclosures

Machined to your drawing, anodised in twelve finishes, shipped in five working days.

Minimum order one unit. No tooling charge.

Added by JavaScript, after the response above.

An example of a client-rendered page. Everything the visitor reads is added in the second stage, so the first response carries no words at all.

The percentage is the share of the words a browser rendered that were not in the first response. At 53%, just over half the words on the page arrived in the second stage.

How we tested it. We request the page the way an AI crawler would. This shows what our test received, not what any AI product actually used.

When this is actually a problem

Not every difference matters, and the report does not assume it does.

Worth acting on — the missing text is something a person would come to the page for: what you sell, what it costs, what is included, how it works, the answers in your FAQ, the substance of an article.

Usually not worth acting on — cookie notices, legal boilerplate, navigation and footer links repeated site-wide, social feeds, decorative captions, or text that already appears elsewhere in the first response.

What the report does for you. Headings and substantial paragraphs are separated from incidental text, and the summary counts them for you: 3 long paragraphs affected means something different from thirty missing link labels. On a pricing page specifically, a missing price is raised as its own finding rather than being averaged into the total.

What it does not do. It does not rank each missing item by importance. Open the list and read it — you know which sentences on your page are load-bearing, and a word count cannot.

Common causes

Missing text is almost always one of these. The first group is a component; the second is the whole page.

One part of the page

  • pricing tables that load their figures after the page appears;
  • carousels and sliders that fetch each slide’s text as it comes into view;
  • tabs, accordions and “read more” sections that do not load their contents until opened;
  • product grids, comparison tables, reviews and testimonials served by a third-party widget;
  • availability, shipping, region, currency, or anything personalised to the visitor;
  • consent or cookie walls that change what the page sends until they are dismissed;
  • A/B testing or personalisation scripts that swap content in after load.

The whole page

  • single-page apps and AI app builders that send an empty shell and draw everything in the browser;
  • framework components marked client-only;
  • data fetched in the browser rather than on the server.

Check it yourself

Four ways, in order of effort.

View the page source. Press Ctrl+U on Windows or Cmd+Option+U on a Mac, then Ctrl+F and search for a sentence you know is on the page. If it is not there, it was not in the first response.

View source is not Inspect. Inspect shows the page after everything has run, so the missing text always appears there. That single confusion is the most common reason people conclude the report is wrong.

From the command line.

curl -s https://example.com/your-page | grep -i "a sentence from the page"

No output means the sentence was not in the first response.

Turn JavaScript off. In Chrome, press F12, then Ctrl+Shift+P, type “JavaScript”, and choose Disable JavaScript. Reload. What is left is roughly what a system reading only the first response gets.

Read the document response. In Chrome, open DevTools → Network, reload, click the first row — the document itself, not the scripts — and open its Response tab. That is the first response, exactly as sent. Use this one when you need to see what came back rather than search for one sentence.

Why your check may disagree with the report

Your request is not our request. Yours carries your IP address, your browser’s identity, your cookies, your region and your consent state. A CDN rule, a geographic redirect, a logged-in session, a personalisation layer or a consent wall can each produce a first response that is yours alone. We request from our own infrastructure while identifying as a named AI crawler, and compare that against a full browser render of the same page.

These tools only find text; they do not weigh it. A search box tells you whether one sentence is present. It cannot tell you that the sentence was your pricing, or that the forty missing words were a cookie banner.

When they disagree, that is the finding. Something is serving different first responses to different requesters. Work out what before you change anything.

Fix it based on how the page is built

Start by working out which of these you have.

Hosted platforms and site builders — WordPress, Shopify, Wix, Squarespace, Webflow put your main text in the first response by default. When text goes missing here it is a component setting, not the platform: find the block that lazy-loads, animates on scroll, or loads on click, and set it to load with the page. In Shopify and WordPress this usually means a theme section or a plugin option rather than a code change.

Third-party widgets — reviews, ratings, availability and booking embeds render in the browser by definition. Ask the vendor whether they offer a server-side or static output. If they do not, keep the substance of what the widget shows as ordinary text on the page as well: the rating summary, the top reviews, the key facts.

Pricing, product grids and comparison tables — these are worth treating separately even when the rest of the page is fine, because they are usually the reason the page exists. Prices belong in the first response even if the surrounding interactivity does not.

Single-page apps — React, Vue, Angular or Svelte used on their own send an empty shell and draw the page in the browser, exactly as in the example above. This is an architectural change, not a setting: the page needs server rendering, static generation, or pre-rendering. See the table below.

Server-rendering frameworks — Next.js, Nuxt, Astro, SvelteKit and Remix send fully-formed pages by default. When text is missing here it is usually one component opting out: marked client-only, or fetching its data in the browser rather than on the server. Your developer is looking for one component.

The three ways to get text into the first response

All three send the same content a visitor would see, which is what separates them from the next section.

Approach Right when The trade-off
Static generation
Built ahead of time as a finished file.
The content does not change per visitor: articles, marketing pages, documentation. Needs a rebuild to publish a change. Fastest of the three to serve.
Server rendering
Built fresh on every request.
The content depends on who is asking, or changes constantly: stock levels, personalised pricing, dashboards. Every request costs server time, so it needs caching to stay fast.
Pre-rendering
A service in front of the site renders each page once and serves the saved copy to automated requests.
Changing the application is not realistic. Another service to run and pay for, and it serves stale pages if its cache is not managed.

What is not a fix

  • Serving different content to automated requests. Pre-rendering the same page is fine. Writing a separate version for machines is not, and every major search and AI provider treats it as deception.
  • A hidden duplicate of the text. Same problem, and the page now carries its content twice.
  • A <noscript> block. It is not read the way people assume, and a hand-maintained second copy of your content goes stale fast.

Confirm the fix

  1. Check the page source again. Your own search finding the sentence that was missing is the fastest confirmation there is.
  2. Re-run the audit. Content Visibility compares the two versions again.
  3. Check the list, not just the number. The percentage can fall while the item you cared about is still missing. Open the missing-text list and confirm the specific content is gone from it.

If you are tracking the page, the change lands in its history with a date.