Steeds meer mensen vragen ChatGPT, Claude of Perplexity "wat is de beste tool voor X?" in plaats van op Google te zoeken. Als je product niet in die antwoorden voorkomt, besta je voor dat publiek niet. Dit heet AEO (Answer Engine Optimization), en met AI gebouwde apps beginnen met een achterstand: door de manier waarop de tools ze genereren, laten de meeste aan AI-bots een lege pagina zien. Deze gids legt uit waarom het juist deze apps overkomt, hoe je het in twee minuten controleert en wat je moet repareren, afhankelijk van de tool waarmee je hebt gebouwd.
Waarom het juist met AI gebouwde apps overkomt
Lovable, Bolt, v0 en de meeste templates die Cursor gebruikt, genereren standaard een SPA: een single-page-applicatie met Vite en React waarbij de HTML die in de browser aankomt bijna leeg is en JavaScript daarna alles tekent. Het is de juiste architectuur voor een dashboard achter een login, maar die tools gebruiken het ook voor de landingspagina, de prijzenpagina en de blog. Drie gevolgen:
- De inhoud staat niet in de HTML. De server stuurt een
<div id="root"></div>en weinig meer. Wat jij ziet, bouwt de browser. - De metadata ook niet. Titel, beschrijving en deel-tags worden vanuit JavaScript gezet, dus een bot die het niet uitvoert, ziet de generieke titel van het template.
- Eén domein voor alles. Het publieke en het privédeel delen code, en niemand staat stil bij wat van buitenaf leesbaar zou moeten zijn.
De valkuil is dat veel AI-crawlers geen JavaScript uitvoeren, of met beperkingen. Googlebot rendert wel, zij het met vertraging en een beperkt budget; de bots van OpenAI, Anthropic of Perplexity lezen vooral de HTML zoals die binnenkomt. Voor hen is je app een leeg vel: ze kunnen niet begrijpen wat je doet en je niet citeren.
Wat een bot van je site ziet
Dit is, bijna letterlijk, wat een crawler ontvangt van een app die met een van deze tools is gegenereerd:
<!doctype html>
<html>
<head>
<title>Vite + React</title>
<script type="module" src="/assets/index-a1b2c3.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
Geen enkele zin over je product. Als het template bovendien een robots.txt meebrengt die crawlers blokkeert, of je CDN een anti-botmodus aan heeft staan, zit de deur dubbel op slot.
Hoe je weet of het jou raakt (twee minuten)
- Bron bekijken. Open je site, rechtermuisknop, "Paginabron weergeven" (niet "Inspecteren", dat toont het al gerenderde resultaat). Zoek je kop en een alinea. Staan ze er niet, dan zien de bots ze ook niet.
- Zonder JavaScript. Zet het uit in de browser en herlaad. Wat overblijft, is wat een basale bot ziet.
- Als de bot van ChatGPT. Vraag de pagina vanuit de terminal op met zijn user agent en tel de woorden die aankomen:
curl -s -A "GPTBot" https://jouwdomein.com/ | sed 's/<[^>]*>//g' | wc -w
Een paar dozijn betekent dat de inhoud in het JavaScript leeft. Enkele honderden betekent dat hij in de HTML aankomt. Welke bot wat doet, lees je in hoe je weet of ChatGPT je site kan zien.
De vijf dingen die het oplossen
1. Publieke inhoud die in de HTML aankomt
Je hoeft niet de hele app server-side te renderen; alleen de pagina's die de AI moet begrijpen: home, product, prijzen, blog, veelgestelde vragen. Drie routes, van weinig naar veel werk:
- Prerenderen bij de build. Een prerender-plugin voor Vite genereert bij het bouwen een complete HTML per publieke route. Werkt goed voor pagina's die niet bij elk bezoek veranderen.
- Website en product scheiden. Landing, prijzen en blog op een statische site (Astro, Webflow, Framer, zelfs Nuxt of Next in statische modus) op
jouwdomein.com, en de app als SPA opapp.jouwdomein.com. Het is de gezondste architectuur en lijkt het meest op wat volwassen producten doen. - Het publieke deel migreren naar een framework met SSR (Next.js, Nuxt, SvelteKit). Meer werk, maar het probleem is voorgoed weg.
2. Metadata in de HTML, niet in JavaScript
Titel, beschrijving en Open Graph-tags moeten in de initiële HTML staan. Als je prerendert of de site scheidt, krijg je dit gratis. Zo niet, zet dan in elk geval een echte titel en beschrijving in index.html in plaats van die van het template.
3. Gestructureerde data die zeggen wat je bent
Een JSON-LD-blok met Organization en SoftwareApplication geeft het model eenduidige feiten: naam, wat het doet, prijs, waar het staat. Heb je veelgestelde vragen, markeer ze dan als FAQPage. Het hoe staat in gestructureerde data: waarom AI sommige sites citeert en andere niet.
4. Een llms.txt
Een tekstbestand in de root van het domein dat in één zin samenvat wat je bent en je belangrijke pagina's opsomt. Niet verplicht en niet magisch, maar een schoon startpunt, en het dwingt je de zin te schrijven die je product definieert. Er is een gratis llms.txt-generator.
5. Bots niet per ongeluk blokkeren
Controleer robots.txt: een gekopieerd template of een Disallow: / uit de testfase sluit de deur voor GPTBot, ClaudeBot en consorten. En check de anti-botmodus van je CDN. Welke AI-crawlers je toelaat, zie je met de AI-crawlerchecker.
Wat niet nodig is
De AI hoeft je privédashboard niet te zien: wat achter een login zit, leest niemand, en zo hoort het. Je hoeft de app ook niet te herschrijven. Het doel is dat de vier of vijf pagina's die uitleggen wat je doet, zonder JavaScript leesbaar zijn, meer niet.
Hoe je het over tijd meet
Twee signalen. Filter in de logs van je server of CDN op de user agents van de AI-bots en kijk welke pagina's ze opvragen; komt er geen enkele voor, controleer dan eerst robots.txt. En vraag één keer per maand ChatGPT, Claude en Perplexity naar je categorie en je merk, en noteer of ze je noemen en goed beschrijven. Die ronde is je nulmeting; de rest is gissen.
Scanaris controleert het in 30 seconden
De pijler AI-zichtbaarheid van Scanaris controleert of je inhoud leesbaar is zonder JavaScript, of je metadata in de HTML aankomt, of je gestructureerde data en een llms.txt hebt, en of je AI-bots blokkeert in robots.txt. Voor elke fout krijg je een fix prompt om in Lovable, Bolt of Cursor te plakken met de exacte oplossing. En de zichtbaarheidstracker houdt elke dag bij of je verschijnt wanneer iemand om een aanbeveling in jouw categorie vraagt. Voor de volledige context begin je bij wat AEO is.
Veelgestelde vragen
Ziet Google mijn app ook leeg?
Google rendert JavaScript, maar in een tweede ronde die dagen kan duren en met een beperkt budget per site. Een app die leeg aankomt, wordt slechter en later geïndexeerd. Dit voor de AI oplossen verbetert ook je SEO.
Kunnen Lovable, Bolt of v0 server-side renderen?
Ze genereren standaard SPA's. De praktische oplossing is de publieke pagina's prerenderen of de marketingsite naar een aparte statische site verhuizen en de app op een subdomein laten.
Is een llms.txt publiceren genoeg?
Nee. Het is een nuttige aanvulling, maar als de HTML leeg aankomt, kan de bot je pagina's nog steeds niet lezen. Eerst de inhoud in de HTML, dan de rest.