Hvad tre dages crawler-logs viste, efter jeg lagde en llms.txt ud
Jeg byggede det tekniske fundament for GEO på micci.dk: en llms.txt, bevidste robots-regler og én loglinje pr. crawler, og læste derefter loggen. Assistenterne henter robots.txt og sitemap.xml langt oftere end sider, og en user-agent viser sig at være en påstand, ikke en identitet.
Det her website har offentliggjort sine priser i et år. Alle tilbud har et offentliggjort prisinterval, serviceområdet er i markupet, og FAQ'erne er maskinlæsbare. Alt det var bygget til én forbruger: Google.
Så fortalte en potentiel kunde mig, at de havde spurgt ChatGPT om en udvikler i Vejle før de fandt mig, og jeg indså, at jeg ikke kunne besvare det åbenlyse opfølgende spørgsmål. Havde nogen assistent nogensinde hentet en side på det her website? micci-web udsendte slet ingen access log. Analyticsen jeg havde, var et browser-script, så de så mennesker og intet ellers. Jeg havde brugt måneder på at gøre websitet citérbart og havde ingen måde at se på, om noget var kommet for at citere det.
Så brugte jeg en dag på kloakarbejdet, og derefter tre dage på at læse det der kom tilbage.
GEO er teknisk SEO med en anden forbruger#
Akronymet der går rundt er GEO, generative engine optimisation: at være synlig i et svar snarere end i en liste af resultater. Det meste af det den kræver er arbejde jeg allerede sælger som teknisk SEO, rettet mod en klient der opfører sig anderledes.
Den forskel der betyder noget er JavaScript. Google kører det, på et senere pass og ikke altid. De fleste assistent-crawlers kører det slet ikke. De henter HTML'en, parser det der er i den, og svarer på det. Et website der sammensætter sit indhold i browseren giver dem et tomt skal, og assistenten fortæller ingen at den ikke fik noget - den svarer bare ud fra noget helt tredje.
Den anden forskel er, at der er ingen ranking at købe, læse af eller rapportere om. Ingen kan sælge dig en plads i et AI-svar. Det du kan gøre er at fjerne grundene til at en side bliver sprunget over, hvilket er en kortere og mindre spændende liste end det lyder.
Fælden i robots.txt#
Det første jeg ændrede var at navngive assistenten-crawlers eksplicit. Funktionelt ændrede det intet - mit wildcard-gruppe tillod dem allerede - men "blokér AI-scraperne" er en en-linjes redigering nogen gør i hastværk, og på et website der offentliggør sine priser for at blive citeret, ville den redigering være selvskade.
Mens jeg skrev det læste jeg specifikationen igen og fandt det der stille ødelægger det for andre. En navngivet user-agent-gruppe får den bot til at ignorere * gruppe helt. Den samler dem ikke. Så sådan her:
User-agent: *
Allow: /
Disallow: /admin
Disallow: /api/
User-agent: GPTBot
Allow: /giver GPTBot /admin og /api/, fordi GPTBot nu læser kun sin egen gruppe og disallow'erne ligger i en gruppe som den ikke længere ser på. Hver navngivet gruppe skal gentage disallow-linjerne:
User-agent: GPTBot
User-agent: ClaudeBot
User-agent: PerplexityBot
Allow: /
Disallow: /admin
Disallow: /api/
Disallow: /wsDet er nu fastgjort af en test, fordi det er præcis den slags korrekthed der overlever til næste hastværk redigering.
llms.txt, og sektionen der tjener sin plads#
/llms.txt er ét hent der angiver hvad studiet er, hvor det er, hvad det koster, hvilke stacks det virker i, og hvor de vigtige URL'er er. Om konventionen holder, ved jeg ikke. Det tog en time.
Den sektion jeg ville beholde selvom resten forsvandt er den der lister hvad jeg ikke sælger. "SEO" matcher "SEO-agentur" så hårdt at en assistent muntert vil opfinde link-building packages til et studie der ikke sælger dem, og en lead der kommer på den præmis spilder en eftermiddag for begge sider. Så filen siger direkte: ingen marketing SEO, ingen annoncering, ingen ranking-garantier, én udvikler med en reel grænse på concurrency.
Hver figur i det er genereret fra det samme tabel der prissætter websitet. En håndskrevet pris i den fil ville være værre end en forældet pris på en side - det er et tal en model vil citere tilbage længe efter det ændrede.
Én log-linje pr. crawler#
Så delen der gjorde resten tjekbar:
crawler ai/ClaudeBot GET /robots.txtÉn linje pr. genkendt crawler-hent, og intet for nogen anden. At matche et kendt crawler-token først betyder at menneskelig trafik aldrig når log-linjen, så et website med en privatside ikke starter med at logge anmodninger om sine besøgende.
Ordningen af de tokens er adfærd snarere end orden og renlighed. Stringene nestes: Claude-SearchBot indeholder Claude, og Google-Extended bliver slugt af et simpelt Googlebot test. Første match vinder, så en kosmetisk omordning stille mærker traffiken på ny.
Hvad loggen faktisk sagde#
Tre dage senere indeholdt de sidste tusinde log-linjer 697 crawler-hent. Pr. klient:
ClaudeBot 91, GPTBot 68, OAI-SearchBot 59, ChatGPT-User 59, Amazonbot 50
Claude-User 38, Perplexity-User 30, meta-externalagent 28, Claude-SearchBot 26, PerplexityBot 22, Google-Extended 20
Googlebot 51, Applebot 19, bingbot 11
De sociale unfurlers - Twitter, WhatsApp, Discord, Slack, LinkedIn, Facebook - omkring 15 hver
To ting stak ud. Det første er, at assistent-crawlers langt overskygget søge-crawlers på et lille dansk forretningswebsite, hvilket jeg ikke forventede efter tre dage.
Det andet er hvad de bad om. Af assistent-hentene var de to mest ønskede stier /robots.txt (48) og /sitemap.xml (37). Egentlige indholdsider var i enkeltcifrede hver. Det meste af det en assistent-crawler gør er rekognoscering: tjek hvad den må tage, tag kortet, kom tilbage senere. Hvis din robots.txt er forkert, er det hele besøget.
/llms.txt blev hentet engang, af GPTBot. Ét hent er ikke et resultat. Det er forskellen mellem en fil ingen har set på og en fil noget har set på, hvilket er det eneste jeg vil påstå om det denne uge.
En user-agent er en påstand, ikke en identitet#
Loggen fangede også noget jeg ikke ledte efter. Sorteret efter sti indeholdt assistent-trafikken /.env, /.env.local, /.env.production, /wp-config.php.bak, /@vite/env og et dusin varianter.
Assistenter gør ikke det. Nogen kører en credential scanner og roterer velkendte crawler user-agents mens de gør det. I min log er der en WhatsApp-bot der spørger efter /.env, en Slackbot der spørger efter /.env.openai, og en Perplexity-User der spørger efter /.env.docker.
Det er en nyttig korrektion at have skrevet ned. En user-agent string er selv-erklæret. Hvis du vil vide at et hent virkelig kom fra OpenAI eller Anthropic, verificerer du det mod deres offentliggjorte IP-områder eller via reverse DNS, på samme måde som du ville verificere Googlebot. For mine formål - læser noget det her website - er den uverificeret log nok. For noget du ville handle på, er det ikke, og tallene ovenfor skal læses med den rabat anvendt.
Hvad jeg kan måle, og hvad jeg stadig ikke kan#
Der er ingen ranking at læse, så GEO måles på tre måder her. Et fastsat sæt af spørgsmål, dem en kunde ville stille, sat til ChatGPT, Perplexity og Googles AI-svar før arbejdet og igen efter, med svarene gemt. Trafik henvist fra assistenterne, splittet ud i analyticsen. Og crawler-loggen, som besvarer retrieval-halvdelen direkte.
Hvad jeg ikke kan fixe fra koden er bekræftelse. Sprogmodeller forankrer entity-påstande i kilder andet end dig, og næsten alt det her website siger om MICCI er offentliggjort af MICCI. Der er en Proff-notering, genereret fra CVR-registret, som er den tredjepartspost der allerede eksisterede uden nogen skabte den - den er nu i sameAs listen. Der er stadig ingen Google Business Profile. Den kløft er ikke et teknisk problem og jeg skal ikke lade som om det er på en side hvor jeg sælger den tekniske halvdel.
Hvis dit website er client-rendered#
Det ene ting der er værd at tjekke i dag, på ethvert website: sluk JavaScript og indlæs din mest kommercielt vigtige side. Hvis det der bliver tilbage er en spinner, er det hvad en god del af assistenterne arbejder ud fra, og no mængde skrift fixet det.
Fixet er sjældent en omskrivning. Det er sædvanligvis server-rendering eller pre-rendering de få sider der skal findes - forsiden, tjenesterne, priserne, kataloget - mens resten af applikationen bliver præcis som den er bag login'et. Det arbejde, plus markupet og crawler-adgangen, er hvad jeg sælger som teknisk SEO og GEO. Priserne er på siden, som sædvanligt.
Brug for hjælp med det her? Teknisk SEO og GEO
Var dette nyttigt?
Flere noter
Hvad et teknisk SEO-tjek faktisk finder
Ikke keywords. Mest sider, Google ikke kan se, sider den ser to gange, og sider der er for langsomme på en telefon til at gøre en forskel. De fund, der går igen på små danske virksomheders hjemmesider.
Hvorfor er min WooCommerce-webshop langsom?
En langsom WooCommerce-webshop har sjældent én årsag. Her er de steder, jeg kigger først, når en butik er blevet tung, fra hosting og database til billeder og tredjepartsscripts, og hvordan du måler, før du ændrer noget.