GEO (generative engine optimization) and AEO (answer engine optimization) are the work of getting your content quoted and cited when AI tools such as ChatGPT, Gemini, Perplexity and Google's AI Overviews answer a question. On a HubSpot site that work has four parts: structured data in the page head, robots.txt rules that let AI crawlers in, pages that state answers plainly, and tracking of what the engines say about you. HubSpot CMS has no WordPress-style plugins for structured data, so JSON-LD goes in through head HTML, templates, modules and HubL, and HubSpot sells its own tracking tool, HubSpot AEO.

This guide covers each part, shows how to add JSON-LD to a blog template, compares the options and where each one falls short, and ends with a setup checklist and a way to measure results. It is current as of November 2026.

What do GEO and AEO mean on a HubSpot site?

Both terms describe the same job: making a page easy for an AI system to find, read, trust and quote. HubSpot's own product is called HubSpot AEO, and other writers use GEO for the same work. Our guide to AEO vs GEO vs SEO covers where the terms came from and how they differ.

Two limits apply. Google says optimizing for its AI features is still SEO, that structured data isn't required for generative AI search, and that there is no special schema.org markup to add (Google Search Central). And no engine publishes how it picks the pages it quotes. So the steps below aim to make a HubSpot site easier to read and to trust, and the last section shows how to check whether they changed anything.

How does structured data work on HubSpot CMS?

Structured data is a block of machine-readable facts about a page, usually JSON-LD using schema.org types. HubSpot CMS has no plugin layer that adds it for you. A page gets JSON-LD in one of five ways, all documented by HubSpot:

RouteWhere you set itScopeNotes
Blog Structured Data settingBlog settings, General tabEvery post in one blogAdds BlogPosting. On by default for blogs created after Aug. 4, 2022
Head HTML on one pageContent editor, Settings, Advanced, Additional code snippetsOne page, landing page, blog post or knowledge base articlePaste a JSON-LD script. Needs Edit and Publish permission
Site Header HTMLSettings, Content, Pages, then pick a domainEvery page on that domainSuits Organization and WebSite. Needs Website settings permission
Template with HubLThe coded templateEvery page that uses the templateFills values from page fields. Needs someone who writes HubL
Custom moduleA local or global moduleWherever the module is placedEditors choose the schema per page. Suits mixed types such as Event

Sources: HubSpot's Knowledge Base on blog settings and on code snippets, and HubSpot's developer blog on structured data (May 31, 2022).

A few details from those pages decide which route to use:

  • HubSpot lists code snippets as available with all products and plans, though editing options vary by subscription and content type. Footer HTML is not available on blog posts or knowledge base articles.
  • If a domain uses "Override default settings" in the Site Header HTML section, code in the default settings no longer applies to that domain.
  • HubSpot's developer blog recommends putting JSON-LD in a template when every page shares one schema, such as Article on a news blog, and in a custom module when types are mixed. It puts the script in the head with the require_head HubL tag, which moves what is inside it into the head.
  • The HubL reference describes require_head as the tag for meta and link tags and sends scripts and stylesheets to require_js and require_css. HubSpot's own post still uses require_head for JSON-LD. Check the rendered source to confirm where your block lands.
  • Third-party schema tools sit on top of these routes. One vendor guide describes a tool that deploys a single embed script through Site Header HTML.

Worked example: BlogPosting in a blog post template

This block follows the pattern in HubSpot's developer blog. It uses the content tokens that post lists for title, featured image, dates and author.

{% require_head %}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": {{ content.title|striptags|tojson }},
  {% if content.use_featured_image %}
  "image": {{ content.featured_image|tojson }},
  {% endif %}
  "datePublished": {{ content.publish_date|datetimeformat('%Y-%m-%dT%H:%M:%S')|tojson }},
  "dateModified": {{ content.updated|datetimeformat('%Y-%m-%dT%H:%M:%S')|tojson }},
  "author": {
    "@type": "Person",
    "name": {{ content.blog_post_author.full_name|tojson }}
  }
}
</script>
{% end_require_head %}

Notes on the example:

  • HubSpot's 2022 post uses datetimeformat to turn timestamps into dates. The HubL filter reference now marks that filter deprecated in favor of format_datetime, so confirm in the rendered source that both dates come out in ISO 8601 form, such as 2026-11-02T09:30:00.
  • The tojson filter writes each value as a quoted JSON string, and striptags removes HTML from the title, so a title with markup or quotes does not break the block.
  • Do not run this next to the blog's Structured Data setting. HubSpot advises against enabling the setting when custom schema exists, because duplicate schema may cause issues in search engines. Turn the setting off when you add your own.
  • HubSpot's developer post also cautions that search engines may not display the data.

What does HubSpot add to a page by default?

HubSpot's documentation supports three statements:

  • Blog posts get BlogPosting schema when the blog's Structured Data setting is on. HubSpot says blogs created after Aug. 4, 2022 have it on by default, so an older blog may have it off.
  • Every coded template that editors use must output standard_header_includes, which adds jQuery, layout CSS, attached stylesheets, a viewport meta tag, Google Analytics tracking code, other page meta information and any head code set at the domain, template or page level. HubSpot also canonicalizes URLs automatically. Templates print the page title and meta description with the page_meta.html_title and page_meta.meta_description variables (HubL variables).
  • Content on HubSpot system domains that contain hs-sites is always set to noindex, so a test site on that domain will not appear in search.

We found no HubSpot documentation of default JSON-LD for website pages or landing pages. Themes can add their own markup, so do not assume either way. View the source of a page and search for application/ld+json.

The two vendor guides we read for this article, from JSON Schema App and Schema Pilot, cover head HTML, modules and HubL, but neither mentions the blog Structured Data setting. Both also point readers to the vendor's own tool, which is worth remembering when you compare their advice.

Which schema types should you add on HubSpot?

Add types that describe what the page already shows. Google's policy is that structured data must be a true representation of the page and that you should not mark up content readers cannot see (Google structured data policies). It also recommends keeping structured data in line with the visible text (Google AI features).

PageSchema typeWhere to put itNote
Every pageOrganization and WebSiteSite Header HTMLName, URL, logo and official profiles. Write it once per domain
Blog postsBlogPostingBlog setting or templateAuthor, headline and dates should also appear on the page
Product and service pagesProduct, Service or SoftwareApplicationHead HTML or moduleOnly facts the page states, such as name, description and price
Pages with a visible Q&A sectionFAQPageModuleGoogle stopped showing FAQ rich results on May 7, 2026, so expect no rich result

Google's FAQ documentation says the FAQ rich result no longer appears in Search from May 7, 2026 (Google FAQ structured data). The two vendor guides above still recommend FAQ markup, and neither mentions the change. Visible questions and answers still help readers, so keep them. Just don't add FAQ markup in the hope of a result that no longer exists.

Validate every block with Google's Rich Results Test, which reports on markup Google uses for rich results, and the Schema Markup Validator, which checks schema.org syntax in general.

What are HubSpot AEO and the AI Search Grader?

HubSpot sells two tools for AEO. Both measure how AI engines describe your brand. Neither is documented as changing your pages' markup or crawler access.

HubSpot AEO

HubSpot AEO tracks how a brand appears in answers from ChatGPT, Gemini and Perplexity. HubSpot's product page and Knowledge Base both label it Beta. You enter a brand, domain, competitors, products and ideal customer profiles, then review suggested prompts. Tracked prompts run daily.

The dashboard shows a brand visibility score and its trend, sentiment, share of voice against competitors and which domains and content types the answers cite. Recommendations come from those citation patterns. The product page's examples include a new blog post, an update to an existing page, outreach to third-party sites and a technical gap.

As of November 2026, HubSpot's pages give this pricing and these limits:

  • The standalone product costs $50 per month, or $45 per month billed annually, with 25 prompts included. HubSpot says you can buy more prompts.
  • It is included with Marketing Hub Professional and Enterprise.
  • The Knowledge Base mentions a 28-day free trial. The product page offers 25 prompts free with no credit card.
  • It works regardless of where your website is hosted, so you do not need HubSpot CMS.
PlanTracked promptsAnswers per monthEngines
HubSpot AEO, including the free trial252,5003
Marketing Hub Professional252,5003
Marketing Hub Enterprise505,0003

The table comes from the Knowledge Base. The product page says Marketing Hub plans get an expanded number of prompts, so check the current limits for your plan before you rely on them.

Based on those pages, HubSpot AEO measures and recommends. They do not describe it editing your markup, and the product page does not mention schema markup, llms.txt or crawlers. The Knowledge Base adds that citations are tracked separately from brand mentions, so a source can be cited without naming you, and that each brand needs its own setup.

HubSpot AI Search Grader

The AI Search Grader is a free, one-time check. You enter a company name, location, product or service and industry, and it returns a score out of 100 across five dimensions: sentiment, presence quality, brand recognition, share of voice and market competition. HubSpot says it asks ChatGPT, Perplexity and Gemini, that the snapshot takes under two minutes and that no account is needed. The page says the full report needs a short form.

Read it as a snapshot of what the engines say from their training data, which is how HubSpot describes it. It does not audit your site. HubSpot also says its recommendations are AI-generated and have not been reviewed by a human.

Can AI crawlers read a HubSpot site?

They can unless robots.txt, or something in front of your site, tells them not to. HubSpot lets you edit robots.txt in Settings, then Content, then Pages. Choose a domain, open the SEO & Crawlers tab and edit the Robots.txt section. "Default settings for all domains" is selected by default, and you can override it for one domain (HubSpot Knowledge Base). The same page lists these limits:

  • Each rule has a user agent. The default is an asterisk, which covers every crawler, and you can name specific bots.
  • Only content on a domain connected to HubSpot can be blocked.
  • Robots.txt does not remove pages that are already indexed. HubSpot recommends a noindex meta tag for that, and says not to combine the two, because crawlers then cannot see the tag.
  • If you use HubSpot's site search module, HubSpot says to allow the HubSpotContentSearchBot user agent so the search feature can crawl your pages.

We found no HubSpot documentation of what the default robots.txt says about AI bots. Open yourdomain.com/robots.txt and read it. The main AI crawlers split into search, training and user-requested fetches, and you can treat each differently:

CrawlerRun byPurpose, per its operatorIf you block it
OAI-SearchBotOpenAISurfaces sites in ChatGPT searchYour site is not shown in ChatGPT search answers, though it can still appear as a navigational link. Changes can take about 24 hours
GPTBotOpenAICrawls content that may train OpenAI modelsSignals that your content should not be used for training
ChatGPT-UserOpenAIVisits pages when a user asks ChatGPT somethingNot used for automatic crawling, and robots.txt rules may not apply
Claude-SearchBotAnthropicImproves the quality of Claude search resultsMay reduce your visibility and accuracy in Claude search results
Claude-UserAnthropicFetches pages when a user asks Claude a questionPrevents retrieval for user queries
ClaudeBotAnthropicCollects content that may train Anthropic modelsSignals that future material should be excluded from training
PerplexityBotPerplexitySurfaces and links sites in Perplexity results, not used to train modelsPerplexity recommends allowing it
Perplexity-UserPerplexityVisits pages for a user's questionGenerally ignores robots.txt, because a user started the request
GooglebotGoogleCrawls for Google SearchGoogle names robots.txt for Googlebot as its crawl control

Sources: OpenAI, Anthropic, Perplexity and Google.

Three practical points follow from those documents:

  • Blocking a training bot and blocking a search bot are different decisions. OpenAI says a site that blocks OAI-SearchBot is not shown in ChatGPT search answers, while blocking GPTBot only signals a training opt-out.
  • Anthropic says to add a rule for each subdomain. HubSpot's per-domain override lets you set different rules for each connected domain.
  • Perplexity also asks sites to permit its published IP ranges, which matters if a firewall or CDN sits in front of your domain.

A training opt-out in HubSpot's Robots.txt section looks like this:

User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

Whether to use it is a policy choice for your company. Google says a page must be indexed and eligible to show in Search with a snippet to be used in its AI features, so keep Googlebot and indexing in order whatever you decide about the others.

Can you add llms.txt to a HubSpot site?

llms.txt is a plain-text file at the root of a site that lists pages for AI tools to read. Our llms.txt guide explains the format and who reads it. We found no native llms.txt setting in HubSpot's documentation. You have two routes:

  • Serve a hand-written file. One way is to host it in HubSpot's files tool and redirect /llms.txt to it, the same mechanism the app below uses. The HubSpot pages we read do not cover this route, so test it. A static file goes stale when your pages change.
  • Install a Marketplace app. The llms.txt app from Built By SEO generates the file from your published pages and blog posts, leaves out noindex pages and serves it through a HubSpot URL redirect. Its listing shows a price of $8.33 per month on the pro plan, says that price is for display only, and shows 10+ installs and no reviews.

Set the expectation before you spend time on it. Google says its Search does not use llms.txt files, so creating one neither helps nor harms visibility in Google Search (Google Search Central). Other services may read the file. HubSpot itself publishes an llms.txt index for its developer documentation. Because both routes above serve the file through a redirect, request the URL after you set it up and confirm it returns the text.

What content structure do AI engines quote?

No engine publishes quoting rules, so the evidence is thin and worth stating exactly.

The research that named GEO tested several methods on GEO-bench, a 10,000-query benchmark. Citing sources, adding quotations and adding statistics each raised visibility by roughly 30 to 40 percent relative on one of its two metrics, position-adjusted word count. Keyword stuffing gave little to no improvement. The authors ran this on their own engine (gpt-3.5-turbo reading the top five Google results) and on a 200-query sample from Perplexity, in 2023 and 2024, so treat it as a lab result (GEO paper). Google's guide says you do not need to split content into small pieces, rewrite it for AI or follow any special format. It asks for unique, helpful content with important information available as text.

That supports a short list of habits that cost little and that readers like anyway:

  • Put a question in the heading and answer it in the first one to three sentences, with the term defined, so the answer stands alone if someone quotes only that.
  • Use a real table for comparisons, with plain text in the cells.
  • Back numbers with a dated source, and link the primary source rather than a blog about it.
  • Show the author, the published date and a "last updated" date on the page.
  • Name your brand, products and categories the same way on every page.
  • Keep answers in the page text, not in images or in widgets that load through JavaScript.

The last point needs a check on HubSpot, because modules, embeds and third-party widgets do not all render the same way. View the page source (not the browser inspector) and search for a sentence from your answer. If it is missing from the source, crawlers that do not run scripts will not see it either. Google makes the same point about keeping important content in text form.

A skeleton for one HubSpot blog post or landing page:

H2: What is [term]?
Answer: one to three sentences that stand alone, with the term defined.
Table: two to four options compared, plain text cells.
H3 steps: a numbered list for any how-to.
Sources: two or three primary links, each dated.
FAQ: four questions, each answered in two to four sentences.
Near the top: author, published date, last updated date.

How does bot.optimizer work with HubSpot?

bot.optimizer connects to a CMS, 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 in the page head. Your team reviews, edits and locks blocks in a dashboard, then approves pages for publishing through the CMS. It also tracks AI crawler visits on connected pages.

As of November 2026 the HubSpot integration is live and set up together with the customer. The WordPress integration is self-serve, and HubSpot is not. Optimizer is included in the Brand and Agency plans. Each connected domain gets 30 free days, after which live pages cost €0.19 per page per month, excluding VAT (pricing).

Know its limits before you choose it:

  • Setup is assisted, so it is not a self-serve install.
  • Its documented output is JSON-LD, the AI Appendix and crawler visit tracking. It is not documented to edit robots.txt or serve llms.txt, so those stay with you.
  • The AI Appendix is an extra section at the end of each page. Some teams will not want that on every page.
  • The content is generated by AI, so someone has to review it. Nothing publishes without approval.
  • Google says its AI features need no special markup, so we do not claim that the output raises your citations. Measure it, as described below.

Which option fits, and where does each fall short?

OptionWhat it coversWhere it falls short
Blog Structured Data settingBlogPosting on every post in a blogOnly BlogPosting and only blog posts. Pages and landing pages get nothing. Conflicts with custom schema
Hand-written JSON-LD in head HTML, templates and modulesAny type, full controlSomeone must write, test and maintain it. Head HTML snippets are static and drift from the page. HubL needs developer skill
Third-party schema tools and Marketplace appsJSON-LD generated and deployed across many pagesAdds a vendor and, for some, plan limits. Can duplicate the blog setting or your own code. Check the rendered output
HubSpot AEOTracks prompts on ChatGPT, Gemini and Perplexity, with recommendationsBeta. Three engines. Measures and recommends. Its product page does not mention schema, llms.txt or crawler access
HubSpot AI Search GraderFree one-time score from three enginesOne snapshot. Based on training data. Not a site audit. Recommendations are not human reviewed
llms.txt Marketplace appServes an llms.txt file from published pagesPaid. Served through a redirect. Google does not use llms.txt in Search
bot.optimizerAI Appendix and JSON-LD for every connected page, with review and crawler trackingAssisted setup. Does not edit robots.txt or serve llms.txt. Adds an on-page section. Per-page pricing after the free period. Output needs review

Most sites combine options. One workable split is the blog setting or a template for posts, Site Header HTML for Organization and WebSite, and a tool for the pages in between. Whatever mix you pick, keep one source of truth for each page type so the markup does not duplicate.

What is the setup checklist for HubSpot?

  1. Open the page source for three page types (home page, a blog post, a landing page) and search for application/ld+json. Write down what each already outputs, including anything your theme adds.
  2. Pick one owner of schema for each page type: the blog setting, a template, a module or a tool. Turn the blog's Structured Data setting on if you have no custom BlogPosting, and off if you add your own.
  3. Add Organization and WebSite JSON-LD in Site Header HTML. Mind "Override default settings" on any domain that has its own.
  4. Add BlogPosting through the setting or a template, and add Product or Service markup only where the page states those facts.
  5. Validate a sample page of each type in the Rich Results Test and the Schema Markup Validator. Check that every value in the markup also appears on the page.
  6. Open yourdomain.com/robots.txt for every connected domain. Confirm that Googlebot, OAI-SearchBot, Claude-SearchBot and PerplexityBot are not blocked, and decide on GPTBot and ClaudeBot. Allow up to a day for OpenAI to pick up changes.
  7. View the source of your top pages and confirm the answer text is in the HTML.
  8. Rewrite your most important pages in the answer-first structure above, with dated primary sources, a named author and a last-updated date.
  9. Optional: add llms.txt by app or redirect, and request the URL to confirm it returns text.
  10. Choose 20 to 50 questions your buyers ask AI assistants and record your baseline on every engine you care about. Make changes in small batches, then recheck the same questions after a few weeks.

How do you measure results on a HubSpot site?

No single report covers AI search, so use three sources.

  1. Search Console and your web analytics show what happened on your site. Google's Search Generative AI performance report, announced June 3, 2026 and rolled out to all websites by August 31, 2026, counts impressions of your URLs in AI Overviews, AI Mode and Discover. It covers impressions only (Google). Report visits from AI assistants as their own segment, and expect them to undercount your presence, because many answers are read without a click. Our AEO vs GEO vs SEO guide covers that.
  2. Answer tracking shows what happens inside AI answers: whether you are named, cited and ranked against competitors, per engine. On HubSpot you can use HubSpot AEO for three engines, or run a handful of checks by hand. A single manual check is one sample, so it cannot show a trend.
  3. Your change log shows which pages you touched and when, so you can line changes up with movement in the first two.

bot.radar is a third option for answer tracking. It generates the questions a brand's buyers ask AI assistants, runs them 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. It reports visibility rate, average position, share of voice and citation rate, and links each metric to the raw answer and the cited URLs. Unlike HubSpot AEO, which covers three engines, it sits outside HubSpot. It only measures: it does not change your pages or replace Search Console, and like any answer tracker it samples what engines show and does not read their internals.

Frequently asked questions

Does HubSpot support schema markup?

Yes. HubSpot CMS accepts JSON-LD through head HTML, Site Header HTML, templates and custom modules, and its blog settings include a Structured Data option that adds BlogPosting schema. There is no WordPress-style plugin layer, so you or a tool add the code. HubSpot documents the default only for blogs, so check the source of your other pages.

How do I add JSON-LD to a HubSpot page?

For one page or post, open the content editor, go to Settings, then Advanced, and paste the script into Head HTML under Additional code snippets. For every page on a domain, go to Settings, then Content, then Pages, choose the domain and use Site Header HTML. For dynamic values, put the script in a template inside require_head, then validate the result.

What is HubSpot AEO and how much does it cost?

HubSpot AEO is a beta tool that tracks how a brand appears in ChatGPT, Gemini and Perplexity answers and recommends actions. As of November 2026 the standalone product costs $50 per month, or $45 billed annually, with 25 prompts included. It is also included with Marketing Hub Professional and Enterprise.

Is the HubSpot AI Search Grader free?

Yes. HubSpot describes it as a free, one-time check of what ChatGPT, Perplexity and Gemini say about a brand, and no account is needed. It returns a score out of 100 based on the engines' training data, and the full report needs a short form. For ongoing tracking HubSpot points to HubSpot AEO.

Does HubSpot support llms.txt?

We found no native llms.txt setting in HubSpot's documentation. You can host a file and redirect /llms.txt to it, or use a Marketplace app that serves one through a redirect. Google says it does not use llms.txt in Search, so treat the file as optional.

How do I let AI crawlers read my HubSpot site?

Open Settings, then Content, then Pages, choose your domain and edit Robots.txt in the SEO & Crawlers tab. Make sure OAI-SearchBot, Claude-SearchBot, PerplexityBot and Googlebot are not blocked. Blocking GPTBot or ClaudeBot is a separate training opt-out. Then view each page's source to confirm your answers are in the HTML.

Summary

HubSpot CMS has no plugin layer for structured data. JSON-LD goes in through the blog Structured Data setting, head HTML, Site Header HTML, templates or modules, and HubSpot documents a default only for blog posts. HubSpot AEO and the AI Search Grader measure how three engines describe your brand, and neither is documented as changing your markup or crawler access. The work you control is valid markup that matches the page, robots.txt that lets search crawlers in, answer-first pages with dated sources, and a before-and-after check on a fixed set of questions. Google says none of this needs special markup for its AI features, so measure what changes rather than assume it.