Your site ranks on Google. ChatGPT cannot read a word of it.
Most modern React and Node sites ship an empty shell and paint the page with JavaScript. Google runs that JavaScript. GPTBot, ClaudeBot and PerplexityBot do not. They read the raw HTML your server returned, find nothing in it, and move on. You can rank first on Google and be completely absent from the answer an AI gives about your industry.
One disambiguation first. On this page GEO means Generative Engine Optimization — getting cited by generative AI. It does not mean geospatial. We do geospatial work too, and it is a completely different discipline with a completely different toolchain. The acronym collision is unfortunate and we would rather name it than let you read three sections before noticing.
Three jobs, often confused, priced as if they were one
Agencies increasingly sell all three under the word “SEO”. They share research and writing, but they are measured differently and they fail differently. Here is the honest split.
Search Engine Optimization
- Goal
- Rank in a list of blue links
- Where
- Google, Bing
- Unit
- Position
The original job, and it has not gone away. Someone types a query, gets ten links, and clicks one. You are competing for a position on a page a human reads.
Answer Engine Optimization
- Goal
- Be the answer, not a link to it
- Where
- Featured snippets, AI Overviews, voice
- Unit
- Appearance
The engine answers the question on the page and the user never clicks. You win by being the passage worth lifting — a direct answer in the first two sentences, under a heading that matches the question as asked.
Generative Engine Optimization
- Goal
- Be cited inside a generated answer
- Where
- ChatGPT, Claude, Perplexity, Copilot, Grok
- Unit
- Citation
A model composes prose and names its sources. You are not ranking, you are being quoted. Which means the model has to have been able to read you in the first place — and that is where most sites quietly fail.
Who runs your JavaScript
The single technical fact that decides whether GEO is even possible for you
Search crawlers and AI crawlers are not the same software and do not behave the same way. Google has run a rendering pipeline for years. The AI crawlers, as measured in crawler-log studies, fetch HTML and stop.
| Crawler | Feeds | Runs JavaScript |
|---|---|---|
| Googlebot | Google Search, AI Overviews | Yes |
| Bingbot | Bing, Microsoft Copilot | Yes |
| GPTBot / OAI-SearchBot | ChatGPT | No |
| ClaudeBot / Claude-User | Claude | No |
| PerplexityBot | Perplexity | No |
| Applebot-Extended | Apple Intelligence | No |
Why this is easy to miss: Google renders, so your analytics look fine and your rankings hold. The loss is invisible — it shows up as never being mentioned when somebody asks ChatGPT for a shortlist in your category. Checked October 2026; crawler behaviour can change, and the test below is how you confirm it for yourself rather than taking our word for it.
Test your own site in ten seconds
Fetch your page the way an AI crawler does — no JavaScript, no browser — and look for your actual headline in the output:
curl -A "GPTBot" -s https://yoursite.com/ | grep -i "<h1"
Nothing back, or a bare <div id="root">? Then that is exactly what ChatGPT, Claude and Perplexity see.
The fix: inject the HTML back in
You do not have to rewrite the app — you have to change what the server hands over first
A React or Vite single-page app can keep every bit of its interactivity and still serve a complete HTML document on the first byte. The work is in the build and the server, not the components.
Prerender the routes that matter
A build step renders each public route to a real HTML file with the headings, copy and links already in it. The app still hydrates and behaves identically for people — the crawler just no longer gets an empty shell. This is the single change that moves the needle.
Generate the sitemap from the routes
A sitemap written by hand goes stale the day a route is added. Generated from the router at build time, it cannot drift — and every AI crawler that does read a sitemap gets the full set without spidering.
Structured data per page
Organization, Service, FAQPage and BreadcrumbList as JSON-LD in the served HTML. This is the part that survives being chunked and embedded — it states facts about you in a form that does not depend on prose parsing.
Answer-shaped headings
Headings phrased as the question a person actually asks, with the answer in the first two sentences beneath. This is the AEO half, and it is writing work rather than engineering work.
An explicit crawler policy
robots.txt that names GPTBot, ClaudeBot, PerplexityBot, Google-Extended and Applebot-Extended by name. Google-Extended in particular is opt-in by absence — silence is a no.
Parity checks in CI
A test that fetches each route with a bot user-agent and fails the build if the H1 is missing. Prerendering silently breaking is the normal failure mode, and nobody notices for months.
What we will not oversell: llms.txt. It is the fashionable recommendation right now. The measured reality as of October 2026 is that AI crawlers almost never fetch it, no study has found a link between having one and being cited, and Google has said plainly that it does not use it. We still ship one — it costs an hour and coding assistants like Cursor and Copilot genuinely do read it when pulling docs. But anyone selling llms.txt as the thing that gets you into ChatGPT is selling you a file, not an outcome.
Ai for agents — the part nobody else is building
Being quoted is table stakes. Being transacted with is the next thing.
Every GEO agency on the market is optimising to be mentioned. That is a 2025 goal. The assistants are already moving from answering questions to completing tasks — booking the table, filling the cart, paying the invoice. A site that can only be read is about to be worth a lot less than a site that can be used.
So we build every property a second front door: an /ai page written for machines rather than people. Plain HTML, no JavaScript required, stating what the business does, what can be booked or bought, what the rules are, and where the live endpoints live.
A page a model can act on
What you offer, in what units, with what constraints — written as fact rather than marketing. Served as static HTML so every crawler gets it, not just the two that render.
Machine contracts beside it
An OpenAPI document and an MCP tool manifest, so an assistant can discover your operations and call them without anyone writing a bespoke integration.
Identity before money
An agent acts for a person. The person is the principal, the agent is the actor, and every record names both. No anonymous tier.
Booking that is idempotent
Replaying a request with the same key returns the same result, never a second booking. Agents retry — this is not optional.
Micropayments for agent work
In development — not yet liveThe missing piece in agentic commerce is not moving money, it is proving a human agreed to a specific spend and bounding what the agent can do if it loops or is manipulated. We are building that bridge on Geeks — a human-to-AI rail for small payments, so creators and operators can earn from machine traffic instead of absorbing the hosting cost of it.
- Scoped keys, hard caps. Per-call ceiling, per-day ceiling, allowed-payee list, expiry. An uncapped agent key is the only genuinely dangerous object in the system.
- A shut-off valve. Runaway and loop detection that trips automatically, plus a visible kill switch per key. Designed before the first unit of value moves, not after the first incident.
- The human stays the principal. An agent spends its person's balance under a mandate. Anything above the standing cap goes back to a human for a fresh decision.
See it from the other side
Cyazer is our own search index — built so both people and machines can query it directly. Search a company or a category and watch what a structured index returns compared with a page of ten blue links.
Opens cyazer.com in a new tab.