Technical SEO used to mean writing for one audience, Googlebot. Now your HTML is read by classic crawlers, LLM training scrapers, real-time retrieval bots, and whatever new fetcher ships next quarter. The fundamentals did not change, but the tolerance for a messy site dropped to zero.

Technical SEO for AI search is the practice of making your site easy for machines to parse and safe for them to quote. Everything worth doing follows from that sentence: HTML that arrives fully rendered from the server, entity markup that pins down who you are, canonical URLs that agree with each other, and content shaped so a model can lift a clean answer with your name still attached. None of it is exotic work.

People keep asking me what SEO for LLMs involves, expecting a secret. After ten years of technical SEO, my answer is that it is the SEO you should have been doing all along, done more strictly, because the new readers are less forgiving than Googlebot ever was.

Does JavaScript rendering hurt AI visibility?

Yes, and it hurts you more than it does in Google. Googlebot will eventually render your JavaScript, because it has had years and a rendering farm to get decent at it. Most AI crawlers will not. GPTBot, ClaudeBot, and PerplexityBot take your raw HTML and move on, so if your content only exists after a framework hydrates, you do not exist to them.

Server-rendered
Request Full HTML in the response content already present Every reader gets the page crawlers, fetchers, browsers
Client-rendered
Request Empty shell arrives content waits on a bundle Most AI crawlers move on GPTBot, ClaudeBot, PerplexityBot
The same page through two rendering strategies, as seen by a reader that executes no JavaScript. Googlebot eventually renders; most AI fetchers take the raw response and leave.

The fix is server-side rendering or static generation, and nothing cleverer than that. My own site is a statically rendered Astro build. Every sentence you are reading arrived in the initial HTML response, and a bot that executes no JavaScript gets the same page you do.

Is structured data wasted on LLMs?

The skeptic’s version goes like this: models read prose, not JSON-LD, so schema is dead. That is half right at best. A model generating a sentence is not parsing your markup, but the systems feeding that model are. Google’s AI Overviews sit on top of Google’s index and knowledge graph, and Bing feeds Copilot. The retrieval pipelines behind the assistants run on crawl infrastructure that has consumed structured data for a decade.

I think of structured data for AI as entity declaration rather than rich-snippet bait. Organization and Person markup with a stable @id and a reconciled sameAs set tells every machine reading your site which real-world thing it is looking at. That disambiguation is what keeps an assistant from confusing you with the other company that shares your name.

My own site carries a full entity graph for this reason: one Person node, one stable identifier, repeated identically on every page. The one rule I would hold anyone to is never to mark up claims the visible page does not make, because contradictions cost more trust than the markup earns.

How do you structure content so an AI can cite it?

Models quote whatever is easiest to extract, which in practice means:

  • Answer first. Put a direct answer in the first two sentences under every heading, and the nuance after it.
  • Headings as questions, phrased the way people ask assistants.
  • Steps as numbered lists and definitions as single sentences. If a process has an order, show the order.
  • Sections that stand alone. Retrieval systems chunk pages, and a paragraph that needs three earlier paragraphs of context will not survive the chunker.

That covers the technical half of the problem. The strategy half, deciding what to write and how to earn mentions across the web, is covered in my breakdown of generative engine optimization.

Do Core Web Vitals still matter?

Core Web Vitals were never the ranking jackpot the tools industry sold, and AI crawlers do not care about your layout shift. What matters is server response time, because a slow time to first byte burns crawl budget and times out the real-time fetches that happen while an assistant is writing an answer.

Flip the priority and chase fast, complete HTML responses that are cheap to serve. A Lighthouse score of 100 on a client-rendered page counts for very little next to a plain 200 response with all the content in it. I have watched teams spend a quarter shaving layout-shift decimals while their category pages quietly returned soft 404s.

Duplicate URLs have always split signals, and in classic SEO that meant diluted link equity. In AI search it is worse. Retrieval systems deduplicate aggressively, so when the same content lives at four URLs, you can lose to your own copies or be discarded as near-duplicate noise. Every canonical conflict tells machines that you are not sure which version is real either.

Clean architecture concentrates that signal. Fewer, stronger URLs mean clearer entity mapping and internal links that build authority. The technical rebuild at Zomee, which was mostly consolidation, rendering fixes, and canonical cleanup, pushed organic traffic up 300%. It is unglamorous work, and it moves the graph more than anything else on this list.

Should you create an llms.txt file?

llms.txt is a proposal, not a standard. It is a curated markdown map of your site for language models. The idea is reasonable on paper, but no major AI provider has confirmed using it, Google’s own people have publicly compared it to the keywords meta tag, and when site owners check their logs, AI bot requests for the file round to zero.

It costs almost nothing, so add one if you want to, but treat it as a low-probability bet. If an agency’s “AI SEO package” turns out to be an llms.txt file and an invoice, look elsewhere. What moves AI visibility is everything above this section. If the ecosystem ever adopts the file, generating one takes an afternoon.

How do you measure AI search referrals?

There are two layers, because clicks only tell half the story.

Referral traffic. ChatGPT, Perplexity, Gemini, and Copilot pass referrers often enough to track. In GA4, build a custom channel group or a segment for session source matching chatgpt.com, perplexity.ai, gemini.google.com, and copilot. The volumes will look small next to organic, but check conversion rates before you shrug, because visitors who arrive pre-sold by an answer tend to behave like warm leads.

Presence. Most AI influence never sends a click, so you have to measure the answers themselves. Sample the assistants with real buyer questions on a schedule, then track how often you are mentioned and cited. This is what I build in production at Tandem Interactive: AI visibility measurement that treats every prompt as a distribution and only flags movement when it is statistically real.

Also search your access logs for GPTBot, ClaudeBot, PerplexityBot, and Google-Extended. Crawl activity is the leading indicator, and referrals lag behind it.

Signal Where it shows What it tells you
Crawl activity Access logs: GPTBot, ClaudeBot, PerplexityBot, Google-Extended Leading indicator; you’re being read
Presence Sampled answers, tracked as rates with intervals Whether engines mention and cite you
Referral traffic GA4 segment on chatgpt.com, perplexity.ai, gemini.google.com The click-through slice, arrives last

Do these in this order

  1. Curl your most important pages. If the content is not in the initial HTML, fix rendering before touching anything else.
  2. Get time to first byte down. Fast, complete responses beat lab-score perfection.
  3. Consolidate duplicates. One canonical URL per topic, with redirects and canonical tags that agree with your sitemap.
  4. Ship entity markup. Organization and Person with stable @id and sameAs links, plus Product or Article where they apply.
  5. Restructure key pages for extraction. Question headings, direct answers up top, numbered steps, FAQ at the end.
  6. Stand up measurement. A GA4 segment for AI referrals plus bot activity monitoring in your logs.
  7. Then llms.txt, if you want it. It is last for a reason.

Stop doing this

  • Shipping content behind client-side JavaScript and assuming “Google renders JS” covers you. Google is not the only reader anymore.
  • Blocking every AI crawler on the strength of a blog post. Blocking GPTBot means opting out of being the answer, so make that call deliberately.
  • Chasing Lighthouse 100s while your server takes over a second to respond.
  • Buying “AI SEO” packages where the deliverable is an llms.txt file.
  • Marking up entities and claims your visible pages don’t support.

FAQ

Can ChatGPT read JavaScript-rendered pages?

Mostly not. GPTBot and the on-demand browsing fetchers pull server HTML and do not execute your bundle. Content that only appears after client-side rendering is invisible to them, which is why rendering sits at the top of my checklist.

Is llms.txt an official standard?

No. It is a community proposal with no confirmed adoption from any major AI provider. It is harmless to add, but it is a red flag whenever it is sold as the core deliverable of an “AI SEO” engagement.

Do AI crawlers respect robots.txt?

The documented ones say they do, and the majors mostly behave. But robots.txt has no enforcement behind it, and the long tail of scrapers ignores it. Check your access logs instead of trusting anyone’s documentation.

Organization and Person with stable identifiers and sameAs links do most of the entity work. Add Product, Article, FAQPage, or LocalBusiness where they apply. Deep, accurate markup on a few types beats a scattering of half-filled ones.

How much traffic does AI search send?

It is small next to organic today, but it converts unusually well, because visitors arrive pre-qualified by the answer that sent them. The bigger effect never shows in referral reports: answers that shape decisions without a click. That is why presence tracking matters more than the referral count.

Most of this work is unglamorous, and most of it rarely gets done. If you would rather hand it to someone else, here is what I do.