HUBSPOT CMS SEO AUDIT · CONTENT HUB · HUBL TEMPLATES
Free HubSpot CMS SEO Audit
HubSpot CMS has a built-in SEO panel for meta tags and auto-generates sitemaps — but JSON-LD structured data, hreflang for multi-language sites, and AI visibility signals require HubL template code and custom module implementation. DeepSEOAnalysis audits your live HubSpot-powered site: meta tag output, HubL template structured data, sitemap coverage, real CrUX Core Web Vitals, and all five AI visibility signals — with HubL code examples for every finding. No signup needed.
WHAT WE CHECK
6 HubSpot CMS-specific SEO checks
HubSpot CMS SEO auditing covers the built-in SEO panel configuration and meta tag output, URL slug quality and domain settings, JSON-LD in HubL templates and custom modules, the auto-generated sitemap, Core Web Vitals from real CrUX field data on HubSpot-hosted infrastructure, and AI visibility — with HubL code examples and HubSpot editor paths for each finding.
HubSpot page settings and meta tag output
HubSpot CMS gives every page an SEO panel in the page editor — but the default output quality depends on whether fields are filled in or left to HubSpot\'s auto-generated fallbacks. The audit checks: title tag quality and uniqueness across crawled pages (HubSpot uses the meta title field if set, otherwise falls back to the page name — page names are often too generic for SEO; check that every content page has a custom meta title set in the SEO panel rather than relying on the page name fallback); meta description presence (HubSpot has no auto-generated meta description — if the field is empty, Google generates its own from page content; the audit flags pages where the meta description is absent or shorter than 50 characters); canonical URL correctness (HubSpot outputs a self-referential canonical by default — the canonical override field in the SEO panel should only be used when there is a specific reason to point to a different URL; any canonical override is flagged for review); Open Graph tag quality (HubSpot uses the meta title and description for og:title and og:description by default, and the featured image for og:image — verify that the og:image is set and is an absolute URL returning a 2xx response); noindex implementation (pages with "Don\'t index this page" enabled in HubSpot\'s SEO panel should output `meta name="robots" content="noindex"` in the rendered HTML — the audit confirms this is applied correctly, particularly for thank-you pages, gated content, and form confirmation pages); and robots.txt configuration (HubSpot auto-generates a robots.txt at /robots.txt — verify it doesn\'t block important sections of the site, and add `Sitemap: https://yourdomain.com/sitemap.xml` via HubSpot\'s robots.txt editor in Settings → Website → Domains & URLs).
URL structure and domain configuration in HubSpot CMS
HubSpot URL structure is primarily controlled by the page URL slug set in each page\'s settings, and by the domain configuration in HubSpot\'s domain manager. The audit checks: URL slug quality (every HubSpot page has a manually configurable URL slug — unlike some CMSs that auto-generate from the page title, HubSpot requires you to set a keyword-descriptive slug in the page settings; the audit flags pages with generic or non-descriptive URL slugs like /page-1 or /untitled); blog URL structure (HubSpot blog posts default to /blog/[year]/[month]/[post-title] — this date-based structure is common for news but creates deep URL hierarchies for evergreen content; consider switching to /blog/[post-title] in Blog Settings for better URL depth management); HubDB table URL configuration (if using HubDB for programmatic content, each row\'s URL is configured via a URL or URL Slug field in the HubDB table — verify slug quality across dynamically generated pages); 301 redirect management (HubSpot\'s URL Redirects tool in Settings → Website → URL Redirects manages redirects — the audit checks that pages returning 4xx or no-longer-valid URLs have appropriate 301 redirects configured, particularly for pages that have had URL slug changes); and primary domain configuration (if the HubSpot site has multiple connected domains, verify the primary domain is correctly set and all secondary domains redirect to the primary to avoid duplicate content across domains).
JSON-LD structured data in HubL templates
HubSpot CMS requires JSON-LD to be implemented in HubL templates or custom modules — it is not available via a point-and-click interface on most HubSpot plans. The audit checks structured data presence and correctness in the server-rendered HTML. For blog posts: `Article` JSON-LD with `headline` from `{{ content.meta_title }}`, `datePublished` from `{{ content.publish_date | datetime(\'%Y-%m-%dT%H:%M:%SZ\') }}`, `dateModified` from `{{ content.updated | datetime(\'%Y-%m-%dT%H:%M:%SZ\') }}`, `author` from `{{ content.blog_post_author.full_name }}`, `image` from `{{ content.featured_image }}`, and `publisher` as the site Organisation. For landing pages and service pages: `WebPage` or page-type-specific schema. For FAQ content: `FAQPage` JSON-LD using a custom module with repeating question/answer fields — the module.html outputs the FAQPage JSON-LD from `{{ module.faq_items }}` loop. For local business pages: `LocalBusiness` JSON-LD with address, phone, and geo coordinates from a custom module or page-level fields. For e-commerce pages using HubSpot\'s Commerce Hub: `Product` JSON-LD with price, availability, and currency. Critical: JSON-LD must be output in the HubL template\'s HTML and rendered server-side — not added via HubSpot\'s marketing email embed code, tracking pixels, or a client-side script appended after page load. The audit\'s raw HTML crawl distinguishes server-rendered from client-side injected structured data.
HubSpot XML sitemap and crawl settings
HubSpot auto-generates an XML sitemap at /sitemap.xml that includes all published, indexable pages, blog posts, landing pages, and (if configured) HubDB-driven pages. The audit checks: sitemap accessibility (the HubSpot sitemap must return a 200 response at /sitemap.xml and not be blocked by robots.txt — the `Sitemap:` directive should be present in the robots.txt file); URL coverage (all published HubSpot pages not marked "Don\'t index" should appear in the sitemap — the audit cross-references crawled page URLs against sitemap URLs to identify coverage gaps); `lastmod` population (HubSpot includes `lastmod` dates in the sitemap based on the page\'s last published date — verify that updated pages show current lastmod values, not the original publish date from months ago); HubDB dynamic page inclusion (if HubDB tables generate dynamic pages like /products/[product-name], these pages must be registered in HubSpot\'s sitemap via the HubDB table settings → include in sitemap toggle); blog pagination exclusion (HubSpot blog listing page pagination — /blog/page/2, /blog/page/3 — should ideally be noindexed or excluded from the sitemap to avoid diluting crawl budget on paginated archives with no unique content); and GSC sitemap submission (verify the sitemap URL is submitted in Google Search Console for the connected domain property).
Core Web Vitals for HubSpot CMS sites
HubSpot-hosted sites run on HubSpot\'s CDN infrastructure, which handles base delivery performance. The audit uses real CrUX field data (Chrome User Experience Report) for LCP, INP, and CLS. **LCP** — for HubSpot sites, the hero image is typically the LCP element. HubSpot\'s image hosting automatically serves WebP for supported browsers. In HubL templates, use the `resize_image_url` filter for proper image sizing: `{{ module.hero_image.src | resize_image_url(1200, 600) }}`. The `fetchpriority` attribute for the hero image can be set in the HubL template\'s `img` tag: `img src="{{ hero_image.src }}" fetchpriority="high" loading="eager" width="1200" height="600" alt="{{ hero_image.alt }}"`. **INP** — HubSpot sites often have significant third-party script load from HubSpot\'s analytics tracking, chat widget (HubSpot Conversations), and form scripts. These scripts can block the main thread and inflate INP. In HubSpot\'s Settings → Tracking & Analytics → Tracking Code, the HubSpot analytics tracking code loads asynchronously — but third-party integrations (Intercom, Drift, Hotjar) added via the tracking code manager may be synchronous. Review all scripts in the `head` block of HubSpot templates and defer non-critical third-party scripts. **CLS** — HubSpot\'s image modules output `width` and `height` attributes when set in the image module settings; custom HTML with `img` tags must include explicit dimensions. Web fonts loaded via HubSpot\'s @import CSS rules can cause FOUT — use `font-display: swap` in HubSpot\'s custom CSS editor (Settings → Design Manager → Custom CSS).
AI visibility for HubSpot CMS sites
HubSpot CMS sites have several paths to implementing AI visibility signals. For `llms.txt`: HubSpot does not provide a direct way to serve a file at /llms.txt. The recommended approach for HubSpot CMS is to create a new HubSpot page with the URL slug set to `llms` and no template header/footer (plain text content only). Set the Content-Type header via HubSpot\'s custom HTTP headers in Settings if available, or use a Cloudflare Worker / CDN layer to serve llms.txt at the root path. Alternatively, if the domain is behind Cloudflare, a Cloudflare Worker can intercept requests to /llms.txt and return the file content. For `robots.txt` AI crawler access: HubSpot allows editing robots.txt in Settings → Website → Domains & URLs → Robots.txt — verify the file does not contain `Disallow:` rules for GPTBot, ClaudeBot, or PerplexityBot. HubSpot\'s default robots.txt does not block AI crawlers. For `FAQPage` JSON-LD: implement via a custom HubSpot module with repeating question/answer fields (module.html outputs FAQPage JSON-LD from the field values). Add this module to HubSpot blog post templates and landing page templates where FAQ sections appear. For question-heading ratio: in HubSpot\'s rich text editor (HubDB fields and blog post body), structure FAQ sections with H2 or H3 headings phrased as questions — ensuring ≥20% of headings on the page are question-format. The audit checks all five GEO signals — llms.txt, AI crawler access, FAQPage/HowTo JSON-LD in server-rendered HTML, question-heading ratio, and content chunkability — with HubL template code for each fix.
HOW IT WORKS
Audit your HubSpot CMS site in 60 seconds
- Enter your published HubSpot site URL. Use the live domain (yourdomain.com), not the HubSpot editor preview URL (app.hubspot.com/...). No HubSpot account access, API keys, or portal ID needed. Works with all HubSpot Content Hub plans and the legacy CMS Hub plans.
- We crawl and analyse. The engine validates HubSpot\'s meta tag output across crawled pages, checks for JSON-LD structured data in HubL template HTML, reviews the auto-generated sitemap URL coverage, measures CrUX Core Web Vitals from real Chrome user field data, and evaluates all five AI visibility signals in the server-rendered HTML.
- You get a prioritised report. HubSpot-specific findings first — missing custom meta titles (pages using page name fallback), absent JSON-LD in HubL templates, sitemap coverage gaps, Core Web Vitals issues from third-party scripts and unsized images — then general SEO, each with the HubL code or HubSpot editor path for the fix.
FAQ
Questions about the HubSpot CMS SEO audit
Does HubSpot CMS have built-in SEO features?
Yes. HubSpot CMS Hub (now part of HubSpot\'s Content Hub) includes native SEO tools at multiple levels. At the page level: every page in HubSpot has an SEO panel in the page editor with fields for meta title, meta description, canonical URL override, and a toggle for "Don\'t index this page" (noindex). HubSpot automatically populates the page title from the page name if the meta title field is left empty. At the site level: HubSpot\'s SEO Recommendations tool (available in Marketing Hub Professional and above) crawls the connected domain and surfaces technical SEO issues — missing meta descriptions, duplicate titles, broken links, large images, missing alt text. HubSpot also auto-generates an XML sitemap at /sitemap.xml that includes all published pages, blog posts, and landing pages not marked noindex. What HubSpot CMS does not include natively: JSON-LD structured data beyond basic WebSite and WebPage schema (FAQPage, Article, Product, HowTo, LocalBusiness require custom HubL template code or custom module implementation); hreflang for multi-language sites (HubSpot\'s multi-language groups generate hreflang tags automatically when pages are linked as language variants); and direct Core Web Vitals reporting inside HubSpot (CrUX data must be accessed via GSC or PageSpeed Insights).
How do I add structured data to a HubSpot CMS site?
HubSpot CMS structured data is implemented in HubL templates (the HubSpot Markup Language used in HubSpot\'s design tools). There are two main approaches: (1) **Custom module with JSON-LD output**: Create a custom module in HubSpot\'s Design Tools (Design Manager) with a module.html file that outputs a `script type="application/ld+json"` block. Use HubL variables to populate the JSON-LD from the page\'s content fields — for example, `{{ content.meta_title }}` for the `headline`, `{{ content.publish_date | datetime }}` for `datePublished`, `{{ content.featured_image }}` for `image`. This module is added to blog post and landing page templates. (2) **Template-level head injection**: For site-wide or page-type schema (Organization, WebSite, BreadcrumbList), add the JSON-LD directly in the `head` section of the base template\'s HTML. In HubL: `{% if content.page_type == \'blog-post\' %}{% include \'path/to/article-schema-module\' %}{% endif %}`. For FAQPage schema: create a repeating field group module in HubSpot\'s custom module builder with "question" and "answer" text fields, then output the FAQPage JSON-LD from the field values in the module.html. The audit checks that JSON-LD appears in the server-rendered HTML response from HubSpot — not injected via HubSpot\'s JavaScript embed or a client-side tracking script.
How does HubSpot handle multi-language SEO?
HubSpot CMS has a built-in multi-language content management system available on CMS Hub Professional and above (now Content Hub Pro). When you create a language variant of a page, HubSpot automatically: (1) Groups the page variants together as language alternates. (2) Generates hreflang tags for all linked language variants — outputting `link rel="alternate" hreflang="en" href="..."` tags for each variant in the `head` of every linked page. (3) Serves each variant at the correct URL (typically using path prefixes like /de/ for German or /fr/ for French, or sub-domains). Important limitations: HubSpot\'s hreflang implementation uses language codes but may need review for regional variants (en-us vs en-gb requires verifying the language code settings in each variant). The audit checks that: hreflang tags are present on all language variant pages; the href values are absolute URLs; the tags include an x-default variant where appropriate; and the hreflang implementation is bidirectional (every variant must reference all other variants, including itself — a missing self-referencing hreflang tag is a common error).
Is the HubSpot CMS SEO audit free?
Yes. The complete audit is free with no signup and no email gate. Enter your HubSpot-powered site\'s URL (the published domain, not the HubSpot editor preview URL). The audit validates the rendered HTML output — the same HTML that Googlebot crawls — regardless of which HubSpot plan the site is on. Paid DeepSEOAnalysis plans add saved report history, scheduled monitoring, larger crawls (up to 1,000 pages), and agency workflows.