← Work

Colab SoWhat · Grupo Boticário

Eight AI engines read the report. I have the logs.

A corporate sustainability report, rebuilt so language models could read it and cite it accurately. Then instrumented, so the claim could be checked instead of asserted.

Role
Product lead & builder
Stack
Next.js App Router · JSON-LD · llms.txt · Vercel
The shift

Search used to return a list. Now it returns an answer.

When someone asks an assistant about a company's climate targets, the assistant answers from whatever it can read. If the official report is unreadable to it, the answer comes from somewhere else — a summary, a news article, a figure from two years ago. For a company whose ESG position is the point, being cited with the wrong number is worse than not being cited.

So the brief was not to rank. It was to be the source the model reaches for, and to be correct when it is.

What I built

Six mechanisms, each one a thing in the repository.

Server-rendered throughout, so crawlers receive real HTML instead of waiting on JavaScript they will not run.

An explicit invitation, not a default

A dynamically generated robots file granting full access to the wildcard and to 17 named AI agents. It also fixed a fault that was returning an error to the ones that asked.

GPTBot · ClaudeBot · PerplexityBot · Google-Extended · Applebot-Extended · CCBot

Meaning, marked up

Schema.org JSON-LD on every page, across the types the content actually has — not one generic blob.

Organization · Report · FAQPage · Dataset · DefinedTermSet · Person · Brand · TechArticle

A plain-text brief for models

An llms.txt generated from the same data files that render the visible pages, so it cannot drift out of sync with what a person reads.

/llms.txt — dynamic, zero manual upkeep

72 questions, in the shape models use

An aggregated FAQ hub, dynamic pages per portfolio brand, and an editorial section documenting the data corrections openly.

/faqs · /faqs/brand/[brand] · /faqs/editorial

Humans and bots routed apart

Middleware serves presentation pages directly to crawlers so they can be indexed, while people keep the navigation flow. AI optimisation without compromising the experience.

middleware — user-agent aware

One source of verified truth

Every figure, target and answer lives in shared data files feeding the pages, the structured data and the llms.txt at once. Chapter 4 was re-checked target by target against the official report; summarised numbers were restored to literal.

3 languages · 10 sections · 100% reconciled

The measurement

I didn't want to claim it worked, so I instrumented it.

A Vercel log drain writing to a database, capturing two different signals: a fetch, meaning a crawler read the content, and an AI-referred click, meaning a person arrived from a citation. Most GEO work sells a story. This is the part that holds it up.

1,427AI crawler fetches
8Distinct AI engines
60Clicks from AI citations
113Report PDF downloads

Fetches by engine

  • OpenAI668
  • Anthropic341
  • Microsoft185
  • Other crawlers135
  • Perplexity29
  • Apple27
  • Meta25
  • ByteDance17

Why they came

Not every fetch means somebody asked.

The user-agent tells you which. On-demand agents fetch the page at the moment a person puts a question to the assistant. The rest sweep the site on their own schedule, because we invited them to. Separating the two is the difference between traffic and demand.

55338.8% · a person asked

Fetched in the moment someone put a question to an assistant. Evidence of a real reader behind the request.

ChatGPT-UserClaude-UserPerplexity-User
55338.8% · autonomous sweep

General collection and training crawlers, reading because the site offers itself. No question behind them.

GPTBotClaudeBotBytespiderCCBotGoogle-ExtendedAmazonbotApplebot
32122.5% · search index

Crawlers feeding the search indexes the assistants query. Autonomous, but on a real retrieval path.

OAI-SearchBotbingbotPerplexityBot

Citations that became visits

SourceClicksPDF downloads
ChatGPT5712
Copilot2—
Perplexity1—

Window: 29 Aug 2026, 17:13 → 13 Sep 2026. 8,047 requests logged in total, 1,427 of them AI crawler fetches.

What this does and doesn't prove

The honest reading of these numbers

The collector went live after the site did, so there is no before-and-after. These are absolute reads inside a closed window, not a measured lift — if I were starting again, instrumentation would ship with the first deploy, not after it.

A fetch is ingestion, not citation: it proves a model read the page, not that it used it in an answer. Only the 60 referred clicks prove a citation reached a person and brought them back. That is the smallest number on the page and the one I'd defend first.

Want this for a report of your own?

The same build and the same instrumentation, so you can see who read it and what came back.