Generative Engine Optimization for small sites, so Perplexity and ChatGPT-Search cite you
Solo site, service site or portfolio. You want AI assistants to find and cite you when someone asks about your topic. Ten steps from inventory to citation tracking.
Classic SEO was for ten years the question "how do I rank on Google for the keyword". That still works, but next to it a second discipline has emerged that is just as important and that almost nobody serves cleanly: Generative Engine Optimization. So the question "how do Perplexity, ChatGPT-Search, Gemini-Mode and Claude-Web cite me when someone asks about my topic".
I have done this for three sites that I actively maintain. A service site (studiomeyer.io), the Academy (studiomeyer.academy) and a brand new workshop site (aifinca.es). What I noticed: AI search is different from Google. It is not about building a keyword page that ranks. It is about building a site that is machine-readable enough for a crawler to even make a statement about you at all. If it does not understand you, it does not cite you.
Here is the order I have run ever since. Ten steps, once through is a short hour of work, after that you have a baseline you can measure from.
Step 1, make an inventory of the discovery surfaces
Before you optimize anything you need to know what is already there. Look in your repo and search for the usual suspects:
find . -maxdepth 3 \( \
-name "robots.txt" -o \
-name "llms.txt" -o \
-name "sitemap.xml" -o \
-name "humans.txt" \
\) -not -path "*/node_modules/*"
If you use Next.js or another SSR framework these files are probably generated. In Next.js they live as app/robots.ts, app/sitemap.ts, app/llms.txt/route.ts. Write down what you have and what is missing. For me all three sites had robots.txt and sitemap.xml at the start. Nobody had llms.txt. That is the default state for small sites in 2026.
Step 2, robots.txt with explicitly allowed AI bots
The default is usually User-agent: * and that is rubbish because many sites unknowingly block AI bots via Cloudflare or a crawler blocker. You want to explicitly allow these bots if you want to be cited:
User-agent: GPTBot
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: anthropic-ai
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Google-Extended
Allow: /
Sitemap: https://example.com/sitemap.xml
GPTBot is training crawl, OAI-SearchBot is the live retrieval crawler behind ChatGPT-Search, ChatGPT-User is what happens when a user clicks a link in ChatGPT. The source is the official OpenAI doc at developers.openai.com/api/docs/bots. If you exclude any one of them, you exclude a concrete citation source.
A common mistake: Cloudflare Bot-Fight-Mode is set to "block all bots" and that also blocks OAI-SearchBot by default. Check the WAF rules. If you have cf_managed_rulesets active and it explicitly blocks AI crawlers, then your robots.txt does not matter because Cloudflare cuts them off first.
Step 3, write an llms.txt a human can read
llms.txt is a Markdown file at /llms.txt that gives crawlers a quick overview. The spec is at llmstxt.org. The format is simple:
# StudioMeyer Academy
> Lern-Plattform fuer AI-Praxis. Kostenlose Lessons, Playbooks und Recipes ueber Claude Code, MCP, Memory-Setups und Agent-Building.
## Levels
- [Level 1, Grundlagen](https://studiomeyer.academy/levels/1): Was ist AI, Halluzinationen, Prompting-Basics
- [Level 4, Memory und MCP](https://studiomeyer.academy/levels/4): MCP-Server verstehen, Memory einrichten
## Playbooks
- [Erster MCP-Server in 90 Minuten](https://studiomeyer.academy/playbooks/erster-mcp-server-in-90-minuten)
## Wer
StudioMeyer, gefuehrt von Matthias Meyer. Standort Mallorca. Fokus auf praktische AI-Werkzeuge fuer Solo-Founder und Career-Changer.
Keep it short. At most one A4 page. What you write in there is basically the "if you do not want to crawl me, at least read this" pitch. Do not write anything in there that is not also on the website. Drift in llms.txt is the most common source of hallucinations in AI citations about you.
Step 4, JSON-LD schema on every relevant page
Schema.org is the second trick. JSON-LD in the <head> of every page tells the crawler exactly what the page is. For a service site you need at least three schema types:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "StudioMeyer",
"url": "https://studiomeyer.io",
"logo": "https://studiomeyer.io/logo.png",
"founder": {
"@type": "Person",
"name": "Matthias Meyer"
},
"sameAs": [
"https://github.com/studiomeyer-io",
"https://www.linkedin.com/in/matthiasmeyer"
]
}
</script>
On blog posts and lessons you set @type: Article with headline, datePublished, author, mainEntityOfPage. On FAQ pages or sections with questions you put @type: FAQPage with mainEntity as an array of Question/Answer. Schema markup helps Perplexity and Google AI Overviews build structured answer snippets directly. If your schema is missing, the crawler builds its own synthesis and that often goes wrong.
Test tool: validator.schema.org. Paste the URL in, see what it recognizes. For me the hero headline on the service site was not recognized as headline because there was a wrapper div in between. Half an hour of work, after that every page was machine-readable.
Step 5, FAQ schema for the top 3 questions per page
Crawlers love question-answer structures because they can be reused directly as a citation block. Pick your three most important pages and write three to five questions per page that a user would type into Perplexity. The answer comes from the page itself, shortened to two or three sentences.
Example on a service page "AI consulting Mallorca":
{
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "Was kostet eine AI-Beratung bei StudioMeyer?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Pricing variiert je Format. Solo-Workshops ab 2.990 EUR pro Person, Inhouse-Team-Workshops zwischen 18.000 und 25.000 EUR pauschal."
}
}]
}
Important: what is in the FAQ schema must be visible in the DOM on the page. Crawlers compare JSON-LD with the rendered DOM, and schema that has nothing to do with the page is ignored or rated as manipulation.
Step 6, branch out author profiles with sameAs
AI assistants weight citations by author authority. If you only have a logo and no author, you are an anonymous brand. If a concrete author is behind the content, who has a LinkedIn, a GitHub, a Wikipedia entry, another site, then the probability that you get cited as a source rises.
Per author page one Person schema block with a sameAs array to all profiles. I created my own author pages for each area (/about on the service site, /team on the Academy). In the first two weeks that measurably raised the probability of appearing as a source in Perplexity answers.
Step 7, sitemap.xml and IndexNow setup
A complete sitemap.xml is mandatory. If you use Next.js, have it generated in app/sitemap.ts. Important: every entry needs lastModified, otherwise the crawler thinks the site is static.
On top of that IndexNow. IndexNow is a push protocol from Microsoft with which you notify Bing and Yandex directly when something changes. Bing in turn is the source for ChatGPT-Search and Copilot. If you do not have IndexNow running, it can take days until Bing has your new page.
curl "https://api.indexnow.org/IndexNow?url=https://example.com/blog/new-post&key=YOUR_KEY"
The key is a random UUID that you host as a file at https://example.com/YOUR_KEY.txt. A cron job that pings the new URLs on every deploy. Done. I have been pushing every new Academy post automatically since mid-April and since then the indexing latency on Bing is under two hours.
Step 8, measure citations instead of guessing
Without measurement you do not know whether your GEO work is paying off. Three measurement points you need:
First, server logs. Filter by the user-agent strings GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot, anthropic-ai. If these do not appear at all, you are not crawlable at all (Cloudflare blocks, robots.txt blocks, or the site returns 404).
Second, brand searches. Once a week you type your main searches into Perplexity, ChatGPT-Search and Gemini and check whether you are listed as a source in the answer. Example queries: "AI Workshops Mallorca", "Claude Code Lernpfad", "MCP Server Tutorial DE". If after three weeks of GEO work you do not show up in at least one answer, something is broken.
Third, referrer traffic. In Umami, GA or Plausible you filter referrers by perplexity.ai, chatgpt.com, gemini.google.com, bing.com, claude.ai. These are real user clicks from AI answers. For me, currently between 4 and 8 percent of total traffic comes from AI referrers. Trend rising.
Step 9, content format AI likes to cite
What crawlers dislike citing: pages with only a hero, lots of image, little text. Pages with long marketing blocks without fact density. Pages in listicle format but without clear statements.
What crawlers like to cite: pages that answer a concrete question in the first 200 words, with numbers, with names, with a date. Pages with clear headings (H2/H3) that themselves contain a statement ("Pricing range for inhouse workshops" instead of "Our prices"). Pages you sign with your name as the author.
Go through your most important ten pages and rewrite the first paragraph so that the main statement is in the first two sentences. For me, on the Academy homepage paragraph one was a marketing block without facts. I replaced it with two sentences that say: "47 lessons in six levels. All free. Focus on Claude Code, MCP and memory setups." Within two weeks exactly that sentence showed up in a Perplexity answer. The crawler had read the hero and cited it verbatim.
Step 10, what is next
Three things I now do regularly and that belong in a monthly rhythm: once a month repeat the brand searches and log who is cited where (or not). Once a quarter go through the llms.txt to check that everything is still correct. And before every larger pivot or rebrand: comb through all discovery files at once, because otherwise the old bio gets stuck in some JSON-LD and after three weeks shows up again in a Grok citation.
If you want to keep discovery files consistent, read the playbook Discovery-Files konsistent halten. If you want to track what AI crawlers do on your site and detect drift automatically, look at the recipe bundle GEO-Crew Hook Bundle. If you first want to understand at all what discovery surfaces and MCP marketplaces are, read Level 4 Lesson 6, MCP Discovery und Marketplaces beforehand.
Source
- OpenAI crawler docs: https://developers.openai.com/api/docs/bots
- llms.txt spec: https://llmstxt.org
- Schema.org Article type: https://schema.org/Article
- IndexNow API: https://www.indexnow.org/documentation
- Anthropic crawler docs: https://support.anthropic.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler