Hopp til innholdet

Hvorfor ChatGPT ikke ser nettsiden din: JavaScript og AI-roboter

Apper som tegnes i nettleseren, sender en tom HTML-fil til AI-robotene, og her ser du hvordan du oppdager og retter det.

Oppdatert . 5 minutter å lese.

Robotene som henter nettsider for ChatGPT, Claude og Perplexity, leser HTML-en serveren sender, og kjører ikke JavaScript slik en nettleser gjør. Er nettsiden din en klientrendret app, for eksempel bygget med React og Vite, Lovable eller Bolt, får de en nesten tom fil. Rettingen går ut på å få teksten inn i HTML-en før JavaScript kjører, med serverrendering, forhåndsrendering eller statisk reserveinnhold.

Hva får en AI-robot fra en klientrendret side?

I en klientrendret app sender serveren et skall og en JavaScript-fil. Nettleseren laster ned skriptet og kjører det, og først da dukker overskrifter og tekst opp. En AI-robot stopper etter første steg. Dette er alt den får:

<!doctype html>
<html lang="en">
  <head>
    <title>Vite + React</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/assets/index-4f2a.js"></script>
  </body>
</html>

Her finnes verken brødtekst eller lenker til undersidene. Tittelen er den malen kom med. Roboten har ingenting å sitere.

Hvorfor ligger siden fint på Google likevel?

Googlebot kjører JavaScript. Den henter siden, bygger den ferdig slik en nettleser ville gjort, og indekserer resultatet. Derfor kan en klientrendret side rangere godt og se helt fin ut i Search Console.

Det er dette som gjør feilen vanskelig å oppdage. Kundene ser en ferdig side og Google melder ingen problemer, mens ChatGPT, Claude og Perplexity får en tom fil.

Hvordan sjekker jeg om innholdet finnes i HTML-en?

Den enkleste testen gjør du i nettleseren. Åpne forsiden, høyreklikk og velg «Vis kildekode» (Ctrl+U i Windows, Cmd+Option+U på Mac). Søk etter en setning du vet står på siden. Finner du den, er innholdet i HTML-en.

Bruk ikke «Inspiser» til dette. Det verktøyet viser siden etter at JavaScript har kjørt, altså det nettleseren har bygget. Du vil se det serveren sendte.

Har du en terminal, gir curl samme svar som en robot får:

# Finnes hovedoverskriften i HTML-en?
curl -s https://dinbedrift.example/ | grep -i "<h1"

# Hvor mange linjer inneholder en setning fra forsiden?
curl -s https://dinbedrift.example/ | grep -c "Fast pris"

Gir den første kommandoen ingen linjer, og den andre 0, tegnes siden i nettleseren.

Svaret er sjelden alt eller ingenting. Mange sider har overskrift og meny i HTML-en, mens priser, produktlister eller anmeldelser hentes inn etterpå. Søk derfor etter akkurat de opplysningene du vil at en assistent skal kunne gjengi.

Agentsjekk gjør samme kontroll ved å telle ord i HTML-en uten JavaScript. Fra 250 ord gir den full uttelling, 12 av 100 poeng. Ingen annen enkeltsjekk teller mer.

Hvordan får jeg innholdet inn i HTML-en?

Det finnes tre veier, og hvilken som passer, avhenger av hvordan nettstedet er bygget.

Serverrendering betyr at serveren bygger ferdig HTML hver gang noen ber om siden. Rammeverk som Next.js, Nuxt, SvelteKit og Astro gjør dette. Bruker du allerede et av dem, sjekk at innholdet ikke ligger i komponenter som bare kjører i nettleseren. En serverrendret side som henter prisene fra et API etter at den er lastet, har samme problem for akkurat de opplysningene.

Forhåndsrendering betyr at HTML-filene lages én gang, når nettstedet bygges. Det passer for sider som er like for alle besøkende, som forsiden og prissiden. For en ren Vite-app finnes det tillegg som forhåndsrendrer sidene ved bygging, for eksempel Vike.

Statisk reserveinnhold er strakstiltaket. Du skriver overskrift, ingress og lenker rett inn i rot-elementet i index.html. Appen erstatter innholdet når JavaScript har lastet, mens roboter leser det som står der:

<div id="root">
  <main>
    <h1>Regnskap for småbedrifter på Vestlandet</h1>
    <p>
      Fjordregnskap AS fører regnskap, lønn og årsoppgjør
      til fast pris fra 1 490 kr i måneden.
    </p>
    <nav aria-label="Hovedsider">
      <a href="/priser">Priser</a>
      <a href="/tjenester">Tjenester</a>
      <a href="/kontakt">Kontakt</a>
    </nav>
  </main>
</div>

Reserveinnholdet har to begrensninger. I en ren klientapp deler alle adresser samme index.html, så teksten blir lik uansett hvilken underside roboten ber om. Den må også stemme med det besøkende faktisk ser. Skriv ikke noe til robotene som du ikke viser til mennesker.

Har du bygget siden i Lovable eller Bolt, kan du be verktøyet legge inn reserveinnhold eller forhåndsrendering. Vær konkret: be om at teksten og lenkene på forsiden skal finnes i HTML-en uten JavaScript, og kontroller med curl etterpå. Begynn med sidene en kunde ville spurt en assistent om, som forsiden og prissiden.

Gjelder det samme for tittel, metadata og lenker?

Ja. Alt som settes inn med JavaScript, er borte for roboten. Det gjelder sidetittel og metabeskrivelse, og det gjelder JSON-LD som legges inn via et skript eller en tag manager. Står det fortsatt «Vite + React» i tittelen i kildekoden, er det den merkelappen en assistent får. Guiden om strukturerte data viser hva som bør ligge i <head>.

Lenker må være vanlige <a href="…">-elementer. En knapp som bytter side med JavaScript, er ingen lenke for en robot, og da finner den ikke undersidene.

Når innholdet er på plass, gjenstår det å sjekke at robotene slipper inn. Se robots.txt for AI-roboter og guiden om brannmur og AI-roboter. Vil du se hvor mange ord en robot finner på forsiden din, kan du kjøre en gratis sjekk.

Spørsmål og svar

Kjører ChatGPT JavaScript når den leser en nettside?

Nei. Robotene som henter sider for ChatGPT, Claude og Perplexity, leser HTML-en serveren sender, og kjører ikke JavaScript slik en nettleser gjør. Innhold som først dukker opp etter at JavaScript har kjørt, finnes ikke for dem.

Hvorfor vises siden min på Google, men ikke i ChatGPT?

Googlebot kjører JavaScript og ser den ferdige siden. AI-robotene gjør ikke det. En klientrendret side kan derfor være indeksert i Google og samtidig være en tom fil for ChatGPT, Claude og Perplexity.

Hvordan ser jeg hva en AI-robot får fra nettsiden min?

Velg «Vis kildekode» i nettleseren, eller kjør curl mot adressen i en terminal. Det du ser der, er det roboten får. Verktøyet «Inspiser» viser siden etter at JavaScript har kjørt, og egner seg ikke til denne testen.

Er nettsider laget med Lovable eller Bolt usynlige for AI?

Ofte, ja. Verktøyene lager som regel en React-app som tegnes i nettleseren, og da er HTML-en fra serveren nesten tom. Det kan rettes med forhåndsrendering, serverrendering eller statisk reserveinnhold i index.html.

Hva er forskjellen på serverrendering og forhåndsrendering?

Med serverrendering bygger serveren HTML-en hver gang noen ber om siden. Med forhåndsrendering lages HTML-filene én gang, når nettstedet bygges. Begge gir roboten ferdig tekst, og forhåndsrendering er som regel nok for sider som sjelden endres.

Sjekk nettstedet ditt mot alt dette

Gratis, uten registrering. Du får poengsum, terningkast og en liste over hva som bør rettes.

Gi tilbakemelding

Hva gjelder det?