AI-crawlers en JavaScript: waarom ChatGPT je pagina leeg kan zien
Kort antwoord: Bij AI-crawlers en JavaScript geldt een eenvoudige regel: een bot die geen scripts uitvoert, ziet alleen de HTML die je server stuurt. Bouwt je pagina haar tekst pas in de browser op, dan kan die HTML een lege schil zijn. In een meting van Vercel en MERJ van december 2024 voerde geen van de grote AI-crawlers JavaScript uit, terwijl de crawler van Google en AppleBot dat wel deden. Dat is een momentopname uit 2024. Test dus je eigen pagina’s en zorg dat de hoofdtekst al in de HTML staat: aan de serverkant gerenderd of vooraf gegenereerd.
Hoe komt een crawler aan je pagina?
Elk ophaalverzoek begint op dezelfde manier: een verzoek aan je server, beantwoord met HTML. Wat daarna gebeurt, bepaalt hoeveel van je pagina aankomt.
Een browser laadt de scripts waarnaar de HTML verwijst, voert ze uit en toont het resultaat. Een crawler kan na de eerste HTML stoppen. Of hij rendert: dan voert hij de scripts uit, wacht even en leest pas daarna.
Stuurt de server de tekst mee, dan leiden beide wegen naar dezelfde inhoud. Wordt de pagina pas in de browser opgebouwd, dan staat er in de eerste HTML nauwelijks iets. De documentatie van Google noemt dit het “app shell”-model. Een bot zonder JavaScript ontvangt dan ongeveer dit:
<body>
<div id="root"></div>
<script src="/app.js"></script>
</body>
Kop, tekst, productlijst en links verschijnen pas nadat /app.js is uitgevoerd. Niet elke crawler voert dat uit, en dat is precies het probleem.
Wat Google met JavaScript doet
Google is het makkelijke geval. In de documentatie over de basis van JavaScript-SEO staat:
- Google Search voert JavaScript uit met een “evergreen” versie van Chromium, dus een die actueel wordt gehouden.
- Een pagina doorloopt drie fasen: crawlen, renderen en indexeren.
- Een pagina met status 200 komt in een wachtrij om te worden gerenderd, en dat kan seconden of langer duren. Bij een andere status dan 200, zoals een 404, kan het renderen worden overgeslagen.
- Title, metabeschrijving en canonical mogen met JavaScript worden gezet.
Dezelfde pagina geeft ook de reden voor dit artikel. Google schrijft dat server-side rendering of prerendering nog steeds een goed idee is, omdat het de pagina sneller maakt voor gebruikers en crawlers en omdat niet alle bots JavaScript kunnen uitvoeren. “Google indexeert mijn pagina” betekent dus niet dat elke bot haar kan lezen.
AI-crawlers en JavaScript: wat is er bekend
De bekendste meting komt van Vercel en MERJ en verscheen in december 2024 onder de titel The rise of the AI crawler. De conclusie: geen van de grote AI-crawlers voerde JavaScript uit. De studie noemt daaronder GPTBot, OAI-SearchBot, ChatGPT-User en ClaudeBot. Googlebot (in de studie vermeld voor Gemini) en AppleBot renderden JavaScript.
Bij dit resultaat horen twee kanttekeningen. Ten eerste is het een momentopname uit 2024, en we hebben geen nieuwere meting om te noemen. Crawlers veranderen, dus zie het als waarschuwing en niet als wet. Ten tweede zegt het wat een bot leest, niet of een pagina in een antwoord wordt genoemd. Een vermelding kan niemand beloven, met of zonder JavaScript.
De bots hebben verschillende taken. Zo beschrijven de aanbieders ze:
| Aanbieder | Bot | Doel volgens de aanbieder |
|---|---|---|
| OpenAI | GPTBot | Training van generatieve basismodellen |
| OpenAI | OAI-SearchBot | Zoeken in ChatGPT |
| OpenAI | ChatGPT-User | Haalt pagina’s op verzoek van een gebruiker op, bijvoorbeeld bij een vraag in ChatGPT |
| Anthropic | ClaudeBot | Verzamelt webinhoud die kan bijdragen aan training |
| Anthropic | Claude-SearchBot | Verbetert de kwaliteit van zoekresultaten |
| Anthropic | Claude-User | Haalt pagina’s op wanneer een gebruiker Claude iets vraagt |
| Perplexity | PerplexityBot | Toont en linkt websites in de zoekresultaten van Perplexity |
De bronnen zijn OpenAI, Anthropic en Perplexity. Perplexity heeft daarnaast een aparte bot voor ophalen op verzoek van een gebruiker. Lezen de bots achter AI-zoekantwoorden alleen HTML, dan heeft een pagina met een lege schil voor hen niets om uit te citeren. Welke van deze bots scripts uitvoeren, heeft de studie uit 2024 gemeten, en dat moet je ook op je eigen pagina’s controleren.
Wie wordt erdoor geraakt?
Je wordt geraakt als de tekst of de links van je pagina’s niet voorkomen in de HTML die je server stuurt:
- Pagina’s die helemaal in de browser worden opgebouwd. De server antwoordt met een schil en een scriptbundel, en het script schrijft kop, tekst en navigatie.
- Inhoud die scripts achteraf laden. Productlijsten, prijzen, beoordelingen, tabbladen of “meer laden”-onderdelen die na het laden van de pagina via een API-aanroep komen.
- Links die pas bestaan nadat scripts zijn uitgevoerd. Een crawler zonder JavaScript kan alleen links volgen die in de HTML staan. Ook de Websitedoorloop van SEOgrinder loopt hier tegenaan: hij vermeldt dat links die pas in de browser ontstaan, niet te volgen zijn.
- Title, beschrijving, canonical en Open Graph-tags die een script zet. Google accepteert dat. Een bot die scripts overslaat, ziet ze nooit.
Je wordt niet geraakt als de server de tekst al meestuurt. Interactieve extra’s zoals een menu, een grafiek of een rekentool mogen nog steeds in de browser worden gebouwd. SEOgrinder meldt pagina’s die alleen in de browser bestaan als “De pagina wordt pas in de browser opgebouwd”, omdat veel AI-crawlers daar geen JavaScript uitvoeren en een bijna lege pagina zien.
Drie tests van een minuut
Je hebt geen tool nodig om het te weten. Alle drie de tests beantwoorden dezelfde vraag: staat mijn tekst in de HTML die de server stuurt?
- Paginabron weergeven. Open je pagina en kies “Paginabron weergeven” (Ctrl+U, op een Mac Cmd+Option+U). Gebruik niet “Inspecteren”: de ontwikkelaarstools tonen de pagina nadat de scripts zijn uitgevoerd. Zoek in de bron naar een zin die je op de pagina kunt lezen.
- De pagina ophalen met curl. Voer in een terminal
curl -sL https://example.com/jouw-pagina | grep -io "een korte zin van je pagina"uit, met een korte zin van je eigen pagina. Wordt die afgedrukt, dan staat hij in de HTML, tenzij hij alleen binnen eenscript-element voorkomt: dat telt niet. Komt er niets, controleer dan eerst spelling en speciale tekens; anders staat hij niet in de HTML. - JavaScript uitzetten. Open de ontwikkelaarstools, open het opdrachtenmenu (Ctrl+Shift+P, op een Mac Cmd+Shift+P), typ “JavaScript”, kies de optie die JavaScript uitschakelt (in een Engelstalige interface “Disable JavaScript”) en laad de pagina opnieuw. Is de hoofdinhoud weg, dan ziet een bot zonder JavaScript hetzelfde.
Zo lees je het resultaat:
| Wat je ziet | Wat het betekent |
|---|---|
| De zin staat in de bron en in de curl-uitvoer | De tekst zit in de geleverde HTML. Dit deel is in orde. |
| De zin ontbreekt in de bron, maar is wel in de browser te zien | De pagina wordt in de browser opgebouwd. Bots die scripts overslaan, zien geen tekst. |
Twee beperkingen: curl toont wat je server naar curl stuurt, niet wat hij naar een bepaalde bot stuurt, bijvoorbeeld als een firewall bots anders behandelt. En om te zien wat Google heeft gerenderd, gebruik je de URL-inspectie in Google Search Console.
Zo los je het op: de inhoud in de HTML zetten
Het doel is dat koppen, lopende tekst en interne links in de bron zichtbaar zijn. Daarvoor zijn twee gangbare wegen:
- Server-side rendering (SSR). De server bouwt voor elk verzoek de kant-en-klare HTML.
- Prerendering, ook statische generatie (SSG) genoemd. De pagina’s worden vooraf gegenereerd, bijvoorbeeld bij het bouwen van de site, en de server levert alleen nog de bestanden uit.
Beide zetten de inhoud in het eerste antwoord. Verder geldt:
- Begin bij de belangrijke pagina’s. Een complete verbouwing is zelden nodig. Begin met de pagina’s die moeten scoren of geciteerd moeten worden.
- Zet het wezenlijke in de eerste HTML. Dat zijn title, metabeschrijving, canonical, Open Graph-tags, de hoofdtekst en navigatielinks als echte
<a href>-elementen. - Geef crawlers en bezoekers dezelfde inhoud. Google noemt “dynamic rendering”, waarbij bots een vooraf gebouwde versie krijgen, alleen als noodoplossing. Crawlers iets anders laten zien dan bezoekers is cloaking.
- Controleer het resultaat in de bron. Herhaal na de wijziging de drie tests.
Niets hiervan is een garantie voor rankings. Je ruimt een technische belemmering op, meer niet.
Zo herkent SEOgrinder pagina’s die pas in de browser ontstaan
SEOgrinder kijkt naar de HTML die je server levert, niet naar wat een browser ervan maakt. Voer een adres in, start de analyse, en de taken verschijnen in het tabblad Taken, gesorteerd op effect. Drie bevindingen horen bij dit onderwerp:
- “De pagina wordt pas in de browser opgebouwd”. De bevinding noemt hoeveel woorden, koppen en interne links in de geleverde HTML staan, en merkt op dat Google zulke pagina’s met vertraging rendert en dat veel AI-crawlers een bijna lege pagina zien.
- “N pagina’s worden pas in de browser opgebouwd”. De Websitedoorloop meldt hoeveel van de doorlopen pagina’s een bijna lege HTML-schil leveren. Pagina’s met noindex en inlog- of registratiepagina’s tellen niet mee.
- “N inlog- of registratiepagina’s ontstaan pas in de browser”. Dat is meestal prima, omdat zulke pagina’s voor bezoekers ook zonder server-side rendering werken. Moet zo’n pagina scoren, render hem dan op de server.
Klik na een reparatie op Opnieuw controleren: rapporten blijven maximaal 24 uur in de cache, en deze knop forceert een nieuwe controle (een paar keer per uur). Overdragen aan AI maakt van het rapport een werkopdracht in Markdown voor een programmeeragent als Claude Code, Cursor of GitHub Copilot, met per bevinding één controleerbare doelvoorwaarde.
Wat SEOgrinder niet doet: het meet niet of ChatGPT, Gemini of Perplexity je merk werkelijk noemen. Het controleert de technische basis, dus of de inhoud te lezen is.
Veelgemaakte fouten
- Testen met “Inspecteren” in plaats van “Paginabron weergeven”. De ontwikkelaarstools tonen het resultaat nadat de scripts zijn uitgevoerd, en dat is precies wat een bot zonder JavaScript niet krijgt.
- Concluderen: “Google indexeert het, dus elke bot kan het lezen”. Google voert JavaScript uit, en in de eigen documentatie staat dat niet alle bots dat doen.
- Title en metatags alleen met een script zetten. Google staat het toe, maar een bot die geen scripts uitvoert, ziet ze nooit. Zet ze in de eerste HTML.
- Links die alleen klik-handlers zijn. Gebruik echte
<a href>-links, zodat een crawler ze kan volgen zonder scripts uit te voeren. - Dynamic rendering tot permanent plan maken. Google noemt het een noodoplossing.
- Elk onbekend adres beantwoorden met de schil en status 200. Client-side gerenderde apps doen dit vaak, en zulke pagina’s kunnen als soft-404 worden gezien.
- Bots in de robots.txt toestaan en bij de firewall weigeren. De tekst is er, maar de bot krijgt een foutmelding. Daarvoor heeft SEOgrinder een eigen bevinding: “AI-crawlers toegestaan maar door de server geweigerd — controleren”. Lees ook ons artikel over robots.txt voor AI-crawlers.
Veelgestelde vragen
Ziet Google mijn JavaScript-pagina?
Meestal wel, maar later. Google voert JavaScript uit met een evergreen Chromium, en pagina’s met status 200 wachten in een rij om te worden gerenderd. Indexering is nooit gegarandeerd. De URL-inspectie in Google Search Console toont wat Googlebot ziet.
Is een sitemap genoeg?
Nee. Een sitemap vertelt crawlers welke adressen er bestaan. Ze brengt geen tekst in de HTML van die pagina’s.
Voeren ChatGPT en Claude JavaScript uit?
In de meting van Vercel en MERJ uit 2024 deden de daarin genoemde crawlers van OpenAI en Anthropic dat niet. Een nieuwere meting kunnen we niet noemen, dus test je eigen pagina’s in plaats van op het ene of het andere antwoord te vertrouwen.
Moet ik mijn hele website ombouwen?
Niet per se. Server-side rendering of prerendering voor de pagina’s die moeten scoren of geciteerd worden, is meestal de eerste stap. Interactieve onderdelen kunnen in de browser blijven.
Word ik door AI-assistenten genoemd als ik op de server render?
Dat kan niemand beloven. Je haalt wel een technische belemmering weg: de tekst kan dan gelezen worden. Of een assistent je noemt, beslist hij zelf.
Je volgende stap
Kies één belangrijke pagina en doe de drie tests. Ontbreekt de tekst in de bron, start dan de gratis scan in SEOgrinder en open het tabblad Taken. Verhelp de belangrijkste pagina’s door ze op de server te renderen of vooraf te genereren, en klik daarna op Opnieuw controleren.