← All work

Case study · GEO · AEO · Structured data

A website built
to be cited by AI.

People were starting to ask ChatGPT and Google's AI answers where to find a coworking space in Málaga. The old site couldn't take part: it told every crawler, human or AI, to go away.

Client
Innovation Campus, coworking in Málaga
Role
Growth engineer (freelance)
Tools
robots.txt, llms.txt, schema.org JSON-LD, Search Console, GA4, DataForSEO
When
Jun – Oct 2026
0 → 5
AI crawlers explicitly allowed (was: everything blocked)
6
schema.org types, all generated from the page itself
1
source of truth, so structured data can’t drift from the page

Summary

Problem

The old WordPress site blocked every crawler in robots.txt and still sent a leftover noindex header. To an AI answer engine, the business barely existed.

Solution

A site AI agents can read, parse and quote: crawlers welcomed, a machine-readable summary, structured data generated from the visible page, and AI-referred traffic measured as its own channel.

Step 1 · Let the machines in

The old site's robots.txt said Disallow: /, and a pre-launch noindex header survived the migration. Both went. robots.txt now explicitly welcomes the AI crawlers by name: GPTBot, ChatGPT-User, ClaudeBot, Google-Extended and PerplexityBot.

Later, when bot traffic had to be blocked, I checked that the protection only targeted unverified bots, so the AI crawlers the site deliberately invites stayed allowed.

Step 2 · Say who you are, in a form AI can read

An llms.txt file describes the business and its key pages in plain, structured text: the summary an answer engine needs, without having to parse layouts and menus.

Step 3 · Structured data that can't lie

Answer engines quote specifics: addresses, prices, opening details, answers to common questions. So every JSON-LD block is generated from the same data that renders the visible page, never a second copy someone has to keep in sync.

  • LocalBusiness with full addresses on the home, coworking and location pages. It used a schema type that doesn't exist, so Google rejected it; replaced with the real one.
  • FAQPage on six service pages, built from the same file as the visible FAQ accordion: question-and-answer pairs, the format AI answers lift most easily.
  • Offer with real prices for the coworking plans and business registration.
  • Event on every event page, with location, dates and organiser, fixed field by field as Search Console flagged gaps.
  • Organization scoped to the two sites that really are one business, so AI doesn't merge unrelated locations into one entity.
What I removed on purpose

Review stars on the business's own site. Google has ignored self-serving review markup for years; it only produced errors. Being trusted by machines starts with not overclaiming.

Step 4 · Measure AI as its own channel

Visits from ChatGPT, Gemini and Perplexity were hidden inside generic channels. In GA4 they now sit in an AI Assistant channel, with Perplexity split out, so AI-referred traffic and its conversions can be read on their own. On pages competing for AI answers, titles and headings were rewritten to state plainly what the page is: “Hourly meeting room rental in Málaga”, not a generic label.

Still open, honestly

Search Console's AI Overview report has no API, so citations can't be tracked from there. The plan: DataForSEO's AI Overview flag and LLM Mentions API, added to the keyword tracking that already runs daily into the same database, to measure citation rate and share of voice across ChatGPT and Google's AI answers. Researched and costed, not built yet.

“Ranking is being found. Being cited is being trusted.”