GEO and AEO on Drupal is the work of making a Drupal site easy for AI search tools to crawl, read and cite. Generative engine optimization (GEO) and answer engine optimization (AEO) both aim to get your content used in answers from ChatGPT, Gemini, Perplexity, Claude and Google's AI features. On Drupal that comes down to four jobs: JSON-LD structured data from Schema.org Metatag, deliberate crawler rules in robots.txt, page text that matches the markup, and measurement. As of November 2026, Metatag and Schema.org Metatag both support Drupal 10 and 11.
Searches for "Drupal GEO" mostly return geolocation modules such as Geocode. This guide is about generative engine optimization, not maps. It compares the structured data modules, covers robots.txt rules for AI crawlers, llms.txt modules and the Drupal AI module, then gives a setup checklist and ways to measure the result. Module versions come from the drupal.org project pages as read on November 2, 2026.
What do GEO and AEO mean on a Drupal site?
The two terms are close to interchangeable. Our guide to AEO vs GEO vs SEO covers where each came from and how they differ. For a Drupal team, the useful question is what to change on the site.
Google's own guidance is short. A page has to be indexed and eligible to show a snippet. Google says you do not need new machine-readable files, AI text files or markup to appear in AI Overviews and AI Mode, and that there is no special schema.org structured data to add. It also says structured data should match the visible text on the page. We could not find comparable statements from OpenAI, Anthropic or Perplexity about how their products use JSON-LD.
So treat the work below as groundwork, not a ranking lever. Structured data gives machines an accurate description of a page. Crawler rules decide which AI products can fetch it. Neither replaces a page that answers the question in plain text near the top.
Which Drupal modules add structured data?
Most Drupal sites combine two contributed modules: Metatag for page-level tags and Schema.org Metatag for JSON-LD. Other modules cover content modeling, REST output and AI-generated markup. Google recommends JSON-LD for structured data when your setup allows it. The table lists each option with the status its drupal.org page reports and where it falls short, including ours.
| Option | What it does | Status as of November 2026 | Where it falls short |
|---|---|---|---|
| Metatag | Manages the page title, description and canonical URL, plus Open Graph and Twitter Cards through submodules | 2.2.5 (October 31, 2026), Drupal 10.3, 11 and 12, security covered, 426,679 sites | Does not output JSON-LD itself. Schema.org Metatag adds that. |
| Schema.org Metatag | Extends Metatag to output JSON-LD in the page head from field tokens. Types include Article, FAQPage, Organization, Product and WebSite | 3.1.0 (October 6, 2026), lists Drupal 10 and 11 but not 12, security covered, 86,030 sites | You map each property for each content type by hand. It describes what your fields hold, so thin fields give thin markup. Empty values need handling. |
| Schema.org Blueprints | Builds content types from Schema.org types and properties, with JSON-LD output | 1.0.0-alpha39 (September 8, 2026), Drupal 10.3 and 11, no supported stable release, 475 sites | Alpha. Its author says a Schema.org-first content model still takes significant work to set up and maintain. |
| JSON-LD module | Adds a JSON-LD format to Drupal's REST layer, built from RDF mappings | 3.0.5 (February 9, 2026), Drupal 10.3 and 11, security covered, 972 sites | Serves entity data at a URL such as node/1?_format=jsonld. Its description does not mention adding markup to the page head. |
| AI Schema.org JSON-LD | Sends page content to an AI provider and stores the returned JSON-LD in a field a person reviews | 1.0.0-alpha1 (April 30, 2026), Drupal 11.3 and later, no security coverage, 13 sites | Alpha, and no Drupal 10 support. Needs a configured AI provider. Its author says default prompts are still an open community task. |
| AI JSON-LD Schema Generator | Uses the AI module to generate JSON-LD from page content or internal URLs, with preview and validation | 1.0.0 (March 17, 2026), Drupal 11, security covered, 4 sites | Drupal 11 only, with a very small install base. Output depends on the model and prompt. |
| bot.optimizer Drupal module | Retrieves generated page content and structured data from bot.spot and injects it into Drupal pages as server-rendered HTML | 1.2.0 (October 2, 2026), Drupal 10 and 11, not covered by the Drupal security advisory policy | Needs a bot.spot workspace and is set up together with us, not self-serve. The content is held in bot.spot, not in your Drupal fields. |
How do you choose between them?
- On an established site with a developer, start with Schema.org Metatag. It reads fields you already maintain, which keeps the markup in step with the page. Droptica makes the same case: map JSON-LD from content fields instead of hand-written scripts, which drift from the page.
- On a new site or a content model rebuild, look at Schema.org Blueprints, knowing it is still alpha. Its author says a Schema.org-first model still takes significant work to set up and maintain.
- On Drupal 11, the AI modules can draft markup. Review each output against the visible page, because a model can add properties the page does not support.
- Do not run two modules that emit JSON-LD for the same type on the same page. Open the rendered source and check for duplicate blocks.
How do you set up Schema.org Metatag?
The steps below follow Droptica's walkthrough and the Schema.org Metatag project page. Examples use a Product content type.
- Install the modules with Composer and enable the base module plus the type modules you need.
- Open Configuration, then Search and metadata, then Metatag (
/admin/config/search/metatag). Metatag applies values in this order: global, entity, bundle, then entity-level overrides. Set most mappings at the bundle level so every node of that type inherits them. - Map each Schema.org property to a field token, as in the table below. Use the "Browse available tokens" link to confirm token paths. Nested objects such as Offer and Brand are entered through the nested inputs in the form, not as raw JSON.
- Export the configuration with
drush cexand commit it. The Product mapping is stored inmetatag.metatag_defaults.node__product.yml. - Handle empty values. Do not output an Offer with an empty price. Either require the price field or remove the nested object, for example with
hook_metatags_alter(). - Test each language URL separately on multilingual sites, because tokens resolve in the context of the rendered entity.
- Validate the rendered page. Parse the
application/ld+jsonblock in the page source, run the Schema.org validator and Google's Rich Results Test, and compare values with what visitors see. Valid markup does not guarantee a rich result.
composer require drupal/metatag drupal/schema_metatag
drush en schema_metatag schema_product schema_organization schema_web_site -y
drush crThe field names below, such as field_summary and field_sku, are examples. Use the machine names your site defines.
| Schema.org property | Drupal source |
|---|---|
| @type | Fixed value Product |
| @id | [node:url:absolute]#product |
| name | [node:title] |
| description | [node:field_summary] |
| url | [node:url:absolute] |
| sku | [node:field_sku] |
| offers.price | Raw value of the decimal price field |
| offers.priceCurrency | Stored value of the currency list |
| offers.availability | Full Schema.org status URL from a stored value |
Other type modules include schema_article and schema_service. Enable only the types your pages need.
How do you let AI crawlers in with robots.txt on Drupal?
Drupal core ships a default robots.txt. The version in the 11.x branch has a single User-agent: * group. It hides paths such as /admin/, /user/login and /search/, and it allows CSS, JavaScript and image files under /core/ and /profiles/. It has no rules for AI crawlers and no Sitemap line, so AI crawlers are allowed by default.
Each AI company runs more than one crawler, and the crawlers do different jobs. Decide per crawler.
| Crawler | Operator | What it is for | What blocking it does |
|---|---|---|---|
| OAI-SearchBot | OpenAI | Surfaces sites in ChatGPT search | The site is not shown in ChatGPT search answers, though it may still appear as a navigational link |
| GPTBot | OpenAI | Crawls content that may be used to train OpenAI models | Signals that your content should not be used for training |
| ChatGPT-User | OpenAI | Visits made when a user acts in ChatGPT or a Custom GPT | OpenAI says robots.txt rules may not apply, because a user starts the action |
| Claude-SearchBot | Anthropic | Improves the quality of Claude search results | Content is not indexed for search, which may reduce visibility and accuracy in search results |
| Claude-User | Anthropic | Fetches pages when a user asks Claude a question | Stops retrieval for user queries, which may reduce visibility for user-directed search |
| ClaudeBot | Anthropic | Collects web content that could contribute to training | Signals that future material should be excluded from training datasets |
| PerplexityBot | Perplexity | Surfaces and links sites in Perplexity search results. Perplexity says it is not used to train foundation models | Perplexity recommends allowing it so your site appears in results |
| Perplexity-User | Perplexity | Visits a page when a user asks a question | Perplexity says it generally ignores robots.txt, because a user requested the fetch |
| Googlebot | Crawls for Search, including AI Overviews and AI Mode | Its robots.txt rules control crawling for Search and its AI features. Use nosnippet, max-snippet or noindex to limit what appears | |
| Google-Extended | A robots.txt token that controls use of crawled content for training future Gemini models and for grounding in Gemini Apps and Vertex AI | No effect on inclusion in Google Search or on ranking |
The table follows the vendor pages for OpenAI, Anthropic, Perplexity and Google. Two points are easy to miss. OpenAI says that if you allow both OAI-SearchBot and GPTBot, it may use the results of one crawl for both purposes. And because Google-Extended also covers grounding in Gemini Apps, blocking it is more than a training opt-out.
How do you edit robots.txt without losing changes?
Drupal's Composer scaffold copies robots.txt into the web root, and by default scaffold files overwrite whatever is already there. A direct edit can be lost the next time scaffolding runs. Two routes avoid that.
The first keeps the core file and appends your rules. Add this to composer.json:
{
"extra": {
"drupal-scaffold": {
"file-mapping": {
"[web-root]/robots.txt": {
"append": "assets/my-robots-additions.txt"
}
}
}
}
}The second is the RobotsTxt module (8.x-1.6, August 13, 2024, Drupal 9.3, 10 and 11, security covered, 50,899 sites). It serves robots.txt dynamically and lets you edit it in the admin, which also helps with multisite setups where each site needs its own file. You must delete or rename the physical robots.txt for it to work. Its latest release is more than two years old, so check it against your Drupal version.
Here is an example assets/my-robots-additions.txt. It opts out of training crawlers and keeps AI search crawlers in. It is one policy, not a recommendation.
# Specific groups are not combined with the "User-agent: *" group,
# so repeat any paths you want hidden from these crawlers.
User-agent: GPTBot
User-agent: ClaudeBot
Disallow: /
User-agent: OAI-SearchBot
User-agent: Claude-SearchBot
User-agent: PerplexityBot
Disallow: /admin/
Disallow: /user/login
Disallow: /search/
Sitemap: https://www.example.com/sitemap.xmlThe comment reflects how Google reads robots.txt: a crawler uses only the most specific group that matches it, and specific groups are not combined with the * group. The Sitemap line is not tied to any user agent and must be a full URL. Simple XML Sitemap (4.2.3, Drupal 10.3 and 11, security covered, 170,440 sites) generates the sitemap file.
How do you check that crawlers can reach the site?
If a CDN or web application firewall sits in front of Drupal, check its rules too. Perplexity advises allowing its published IP ranges and says a firewall may need explicit allowances for its bots. Anthropic warns that blocking by IP address can stop its crawlers from reading your robots.txt at all. OpenAI, Anthropic and Perplexity each publish crawler IP ranges. Robots.txt changes can take time: OpenAI says search-related changes take about 24 hours.
A quick test shows whether a user-agent rule is blocking requests. It does not test IP-based rules.
curl -s -o /dev/null -w "%{http_code}\n" -A "OAI-SearchBot/1.4" https://www.example.com/A 200 response means your server did not block that user agent. Then check your access logs for real visits.
Does Drupal need an llms.txt file?
Not to appear in Google's AI features: Google says they need no AI text files. Publishing one is optional. Our llms.txt guide explains the format, who reads the file and how to write one, so you can decide with the facts.
If you publish one on Drupal, the choice is a static file in the web root or a module. We checked three drupal.org projects.
| Module | Status as of November 2026 | Where it falls short |
|---|---|---|
| llms.txt (llms_txt) | 1.1.1 (August 16, 2026), Drupal 10.3+ and 11.1+, stable, security covered, 6,311 sites | You write the content yourself, and menus can be embedded by token. The web server must be set up to serve /llms.txt directly. Its own comparison says it has no alteration API. |
| llmstxt | 1.0.0-alpha1 (April 10, 2025), Drupal 9.3, 10 and 11, no security coverage, 350 sites | Alpha with one release listed. Content is edited in a single admin form. |
| LLMs.txt AI Generator (llms_txt_ai) | 0.0.3 alpha (January 8, 2026), Drupal 10 and 11, no security coverage, 7 sites | Alpha. Requires the AI module, and a model rewrites page descriptions, so the text needs review. Nginx needs a config addition. |
| Static file in the web root | No module needed | Nothing keeps it in step with your site. You update it by hand. |
The llms.txt module is the only one of the three that is stable and security covered. After installing it, configure the web server. The project page gives an Nginx location = /llms.txt block that uses try_files $uri @drupal;, so the server handles the path itself. Then write the content under Administration, Content, llms.txt. The llmstxt and LLMs.txt AI Generator projects are alpha and not covered by the security advisory policy.
bot.optimizer's listed outputs are JSON-LD, an AI Appendix and crawler tracking. llms.txt is not among them.
What does the Drupal AI module add?
The AI module is the framework other Drupal AI features build on. It is not an SEO tool. As of November 2026 the current line is 1.5.2 (October 28, 2026), covered by the security advisory policy, for Drupal 10.5+ or 11.2+, with 27,603 sites reporting use. It connects Drupal to model providers, including OpenAI, Anthropic, Google Gemini, AWS Bedrock and Azure. Its core submodules include AI Automators and AI Observability, and standalone projects such as AI Content Suggestions and AI Translate extend it. We did not test those for SEO use.
For GEO and AEO it matters because some of the options above run on it: the AI Schema.org JSON-LD module, the AI JSON-LD Schema Generator and the LLMs.txt AI Generator all need it. They share two limits. A model can state something the page does not say, and Google asks that structured data match the visible text. The author of AI Schema.org JSON-LD describes the design as keeping a human in the loop, with the output reviewed before it is saved. Follow that rule for any AI-generated markup.
What does the bot.optimizer Drupal module do?
bot.optimizer connects to a content management system, imports every page, classifies each page by type and generates an AI Appendix for it: a summary, key facts, frequently asked questions and technical details. The same content is compiled into JSON-LD structured data in the page head. In the dashboard, a team reviews, edits and locks blocks before approving pages for publishing through the CMS. It also records visits from identifiable AI crawlers on connected pages.
Drupal is live and is set up together with the customer. The module on drupal.org describes itself like this: it connects a Drupal website to the bot.spot platform, retrieves optimized page information and injects it into Drupal pages as server-rendered HTML, so search engines and AI crawlers can read it without running JavaScript. As of November 2026 the latest release is 1.2.0 (October 2, 2026), and it works with Drupal 10 and 11.
What to know before you use it:
- It needs a bot.spot workspace with Optimizer enabled, valid credentials, and outbound HTTPS access from the Drupal server to the bot.spot API. It needs no other contributed modules.
- The project page notes that the module is not yet covered by Drupal's security advisory policy.
- Depending on configuration, the requesting user agent may be sent to bot.spot for delivery diagnostics. The project page advises reflecting this in your privacy documentation.
- Brand and Agency plans include Optimizer access. Each connected domain gets a 30-day free period, then live pages cost €0.19 per page per month, excluding VAT. See the pricing page for current terms.
- If you also run Schema.org Metatag, both can emit JSON-LD for a page. Decide which one owns each type, and check the rendered source for duplicates.
What is the setup checklist for GEO and AEO on Drupal?
- Confirm your Drupal version and the versions each module supports. Metatag lists Drupal 10.3, 11 and 12. Schema.org Metatag lists 10 and 11.
- Open a key page with "view source", not the browser inspector, and confirm the answer text is in the HTML the server sends.
- Install Metatag and Schema.org Metatag. Enable only the type modules you need.
- Set site-wide defaults for Organization and WebSite, then map one content type at a time at the bundle level.
- Export the configuration and commit it, so mappings are reviewed like code.
- Handle empty values, and test each language of a multilingual site.
- Validate with the Schema.org validator and Google's Rich Results Test, and compare the markup with the visible page. Check for duplicate JSON-LD blocks.
- Decide your policy for each crawler in the table above. Add the rules through the Composer scaffold append or the RobotsTxt module.
- Add a full Sitemap URL to robots.txt, using Simple XML Sitemap or another generator.
- Check any CDN or firewall against the crawlers you allowed, then watch your access logs.
- Decide on llms.txt. If you publish one, keep it in step with the site.
- Put the answer under the question in the page text, and cite your sources on the page. Google says no special format is required, so this is good writing, not a trick.
- Record a baseline before you change anything, then repeat the same checks after the changes have been live for a few weeks.
How do you measure the results?
Use four sources together, because none covers everything.
- Access logs show which AI crawlers fetch your pages. Filter your web server or CDN logs by the user-agent tokens in the crawler table, and compare source IPs with the ranges the vendors publish. A fetch shows access, not citation.
- Search Console shows Google's side. Google's Search Generative AI performance report counts impressions of your URLs in AI Overviews, AI Mode and Discover. It was announced on June 3, 2026, and Google says it reached all websites by August 31, 2026. Impressions are the only metric listed. After you ship markup, Google also advises watching the rich result status reports, because templating changes can break pages.
- Analytics referrals show visits that arrive from AI products. They undercount, because a citation can influence a buyer who never clicks.
- Answer tracking shows what AI engines say about you. bot.radar runs the questions your buyers ask on AI engines every day and records which brands are named, cited and ranked. Every plan includes all seven engines: ChatGPT, Google AI Overview, Google AI Mode, Gemini, Perplexity, Claude and Copilot. Plans are counted in units, where one unit is one question tracked on one engine for a month: Brand includes 150 units and Agency 450, pooled across its workspaces. A manual check of one question on one engine is a single sample, so it cannot show a trend.
Change one thing at a time where you can, such as one content type's markup or one crawler rule, so you know what moved a number.
Frequently asked questions
Which Drupal module adds schema.org markup?
Schema.org Metatag is the module most Drupal sites use. It extends Metatag to output JSON-LD in the page head from field tokens, and it supports types such as Article, FAQPage, Organization, Product and WebSite. Version 3.1.0 (October 6, 2026) is covered by Drupal's security advisory policy.
Does Schema.org Metatag work with Drupal 11?
Yes. Versions 3.1.0, 3.0.4 and 8.x-2.6 list Drupal 11 on the drupal.org project page, and Metatag 2.2.5 lists Drupal 10.3, 11 and 12. As of November 2026 the Schema.org Metatag page does not list Drupal 12.
Does Drupal support llms.txt?
Not in core. The llms.txt module (1.1.1, stable, for Drupal 10.3+ and 11.1+) serves /llms.txt from content you write in the admin, and a static file in the web root also works. Google says its AI features need no AI text files, so publishing one is optional.
How do I edit robots.txt in Drupal without losing changes?
Composer scaffold overwrites robots.txt by default, so a direct edit can be lost the next time scaffolding runs. Use an append entry in the scaffold file mapping in composer.json to add your rules to the core file. The RobotsTxt module is the other route, and it requires deleting the physical file.
Should I block GPTBot or ClaudeBot on Drupal?
That is your policy choice. OpenAI says disallowing GPTBot signals that your content should not be used for training, and that OAI-SearchBot controls ChatGPT search. Anthropic describes ClaudeBot as a training crawler and lists Claude-SearchBot and Claude-User separately. Decide per crawler instead of blocking every AI bot.
Do I need the Drupal AI module for GEO?
No. Nothing in Google's guidance requires it. The AI module connects Drupal to model providers, and some markup and llms.txt generators build on it. Their output needs human review before it goes live.
Summary
GEO and AEO on Drupal is mostly groundwork: accurate JSON-LD from Schema.org Metatag, per-crawler rules in robots.txt, and page text that matches the markup. Google says its AI features need no special markup or AI text files, so treat llms.txt as optional. The AI modules can draft markup, but they are young and need human review. The bot.optimizer Drupal module is another route, set up together with us, for teams that want a reviewed summary, FAQs and JSON-LD on every page. Measure with logs, Search Console, referrals and answer tracking together, and repeat the same checks after each change.