OCTOBER CMS SEO AUDIT · RAINLAB PLUGINS · TWIG TEMPLATES · LARAVEL
Free October CMS SEO Audit
October CMS SEO depends on RainLab.Pages and RainLab.Blog plugin field configuration, Twig layout meta tag output, JSON-LD in CMS partials, RainLab.Sitemap XML sitemap generation, and Laravel-based PHP performance. DeepSEOAnalysis audits your live October CMS site — validating meta tag output, structured data, sitemap coverage, real CrUX Core Web Vitals, and AI visibility — with Twig template code, plugin configuration paths, and Backend field references for every finding.
WHAT WE CHECK
6 October CMS-specific SEO checks
October CMS SEO auditing covers RainLab plugin field configuration and Twig layout meta tag output, URL routing and slug configuration, JSON-LD in Twig partials, RainLab.Sitemap XML sitemap generation, Core Web Vitals from real CrUX data, and AI visibility — with Twig template code, plugin paths, and Backend field references for each finding.
RainLab plugin SEO fields and meta tag output
October CMS SEO relies on the RainLab plugin ecosystem — primarily RainLab.Pages for static content pages and RainLab.Blog for blog posts. The audit checks: meta title output across crawled pages (RainLab.Pages meta_title field, RainLab.Blog post meta_title field, and CMS page Settings meta_title — the Twig layout must use `{{ this.page.meta_title | default(this.page.title) }}` to fall back to the page title when the meta title field is empty; pages relying on the title fallback may have non-keyword-descriptive meta titles); meta description presence and length (the meta_description fields in RainLab.Pages and RainLab.Blog must be filled per page/post — the audit detects empty description fields across crawled pages and flags them as missing); canonical tag correctness (`{{ this.page.canonicalUrl }}` in October CMS with RainLab.Pages, or a custom canonical implementation in the layout Twig — pages without canonical tags may accumulate duplicate content from URL parameter variants or multi-language configurations); Open Graph tags for social sharing (og:title, og:description, og:image — particularly important for RainLab.Blog posts where social sharing is expected); and robots meta tag configuration (noindex for pages that should be excluded — utility pages, backend redirects, empty category archives).
URL structure and October CMS routing
October CMS URL structure is configured through: CMS page URLs (set in the Backend editor\'s URL field for each CMS page — these can be static like `/about` or dynamic with parameters like `/blog/:slug`), RainLab.Pages URL configuration (the URL field per static page in the Pages editor), and RainLab.Blog post URL (configured via the Blog component `postPage` property and the post slug). The audit checks: URL slug quality (October CMS slugs are set in the Backend — non-descriptive or auto-generated slugs like `post-12` or `untitled-page` should be updated to keyword-descriptive paths); URL structure depth (deeply nested CMS page hierarchies create long URL paths — the audit checks average URL depth across crawled pages); parameter-based URL patterns (October CMS component parameters can create dynamic URLs like `/blog/tag/php-development` — verify these have canonical tags pointing to the base blog page or a specific canonical); multi-language routing (if using RainLab.Translate for multi-language October CMS: each language version should have its own URL prefix or subdomain, with hreflang `link rel="alternate"` tags in the layout template for each language variant); and redirect configuration (October CMS\'s Routes file or the RainLab.Redirect plugin for managing 301 redirects when slugs are changed — slug changes without redirects create broken external links and lose ranking equity).
JSON-LD in October CMS Twig partials
October CMS\'s Twig template system provides direct access to page and component variables for building JSON-LD output. The audit checks JSON-LD presence and correctness in the server-rendered HTTP response regardless of implementation method. For `Article`/`BlogPosting` on RainLab.Blog posts: `headline` from `{{ post.title }}`, `datePublished` from `{{ post.published_at | date("c") }}` (ISO 8601), `dateModified` from `{{ post.updated_at | date("c") }}`, `author` as a nested `Person` with `name: "{{ post.user.name }}"` and optionally `url` linking to an author profile page, `publisher` as a site `Organization` with name and logo URL, `image` from the featured image component: `{{ post.featuredImage.getThumb(1200, 630, {\'mode\': \'crop\'}) }}`. For `FAQPage`: iterate over a Repeater field or a component data source in the Twig partial — `{% for faq in faqs %}` to build the `mainEntity` array. For `BreadcrumbList`: map the RainLab.Pages breadcrumb array or manually construct the hierarchy from the URL structure. For `Product` on October CMS e-commerce pages (using OFFLINE.Mall or similar): include `name`, `description`, `image`, `offers` with price and availability, and `aggregateRating` if reviews are implemented. Common issues the audit catches: JSON-LD output that uses Twig variables that resolve to empty strings (e.g., `{{ post.featuredImage }}` when no featured image is set produces an invalid empty image URL), and schema blocks loaded via JavaScript AJAX after the initial page render.
RainLab.Sitemap XML sitemap configuration
The RainLab.Sitemap plugin generates an XML sitemap for October CMS sites at `/sitemap.xml`. It includes RainLab.Pages static pages, RainLab.Blog posts, and any other content registered with the sitemap plugin via `Event::listen(\'pages.menuitem.listTypes\')`. The audit checks: sitemap accessibility at `/sitemap.xml` (verify the plugin is installed and the Sitemap directive in `robots.txt` points to the correct URL); `lastmod` population (RainLab.Sitemap uses the page or post `updated_at` timestamp for `lastmod` — verify content updates trigger `updated_at` changes); content coverage (all public, non-draft RainLab.Blog posts and published RainLab.Pages should appear; draft posts, pages set to `is_hidden`, and backend utility pages should be excluded); custom content type registration (if October CMS is used with custom plugins that have their own URL-accessible content — products, events, portfolio items — those must be explicitly registered with RainLab.Sitemap via the event listener, otherwise they won\'t appear); and priority configuration (RainLab.Sitemap supports configuring priority by page type — the homepage should have higher priority than individual blog posts). The `Sitemap:` directive should be present in the site\'s `robots.txt` file pointing to the full absolute URL of the sitemap.
Core Web Vitals for October CMS
October CMS is built on the Laravel framework and outputs server-rendered HTML — pages are PHP-generated and returned as complete HTML responses, with no JavaScript rendering gap for content. Performance varies by theme, plugin count, caching configuration, and hosting. **LCP** — October CMS page layouts typically include a hero image or featured post image as the LCP element. Add `fetchpriority="high"` and `loading="eager"` to the LCP image in the Twig layout: `img src="{{ hero_image }}" fetchpriority="high" loading="eager" width="{{ hero_width }}" height="{{ hero_height }}"`. Use Laravel\'s built-in image manipulation or Intervention Image for WebP serving with appropriate responsive sizes. **INP** — October CMS themes that include jQuery, Bootstrap, or heavy animation libraries can delay INP. Use `{% put scripts %}` / `{% scripts %}` blocks to load theme JavaScript in the footer (after content) and add `defer` or `async` attributes. Third-party embeds (contact forms, live chat) are the most common INP culprits on OctoberCMS sites. **CLS** — specify explicit `width` and `height` attributes on images in Twig templates to prevent layout shift during image load. **TTFB** — enable October CMS\'s built-in page caching in `config/cache.php` (setting the cache driver to Redis or APCu for fast page delivery) and configure nginx-level caching or a Cloudflare caching rule for public pages. OctoberCMS\'s built-in `cms.enableCsrfProtection` and `cms.enableCaching` settings control page cache behaviour. The audit uses real CrUX field data for LCP, INP, and CLS on mobile and desktop.
AI visibility for October CMS
Add `llms.txt` to the October CMS web root (the `public/` directory for standard October CMS installations — the same directory as `index.php`). The file should list the site\'s main content sections, blog categories, and key pages in plain text, accessible at `/llms.txt`. For `robots.txt`: October CMS generates a default `robots.txt` via the `cms.robotsTxt` config key or serves a static `robots.txt` from the public root — verify that GPTBot, ClaudeBot, and PerplexityBot are not blocked by any broad `Disallow:` rule. AI crawlers should have access to all public content. For `FAQPage` JSON-LD: add a Repeater field to pages that contain FAQ content (the Backend form builder lets you add repeater fields with question/answer columns), then iterate in the Twig partial to output FAQPage structured data. For RainLab.Blog posts that contain Q&A sections: add a structured `faqs` repeater to the blog post model extension and include FAQPage schema in the blog post page template. For question-format H2 headings: encourage editors in the Backend to phrase section headings as questions for FAQ-style content; October CMS\'s RichEditor (TinyMCE) allows H2 headings in post body content. The audit checks all five AI visibility signals — llms.txt, AI crawler access, FAQPage/HowTo JSON-LD in server-rendered HTML, question-heading ratio (≥20%), and content chunkability (avg section ≤400w) — with October CMS Twig partial code, plugin configuration paths, and Backend field settings for each fix.
HOW IT WORKS
Audit your October CMS site in 60 seconds
- Enter your October CMS site URL. No Backend access, database credentials, or server access needed — the audit crawls the public HTTP output as Googlebot would. Works with October CMS v1, v2, and v3 (with any combination of RainLab plugins and custom themes).
- We crawl and analyse. The engine checks meta tag output across crawled pages, validates JSON-LD in the raw server HTTP response, checks sitemap coverage and URL format, measures CrUX Core Web Vitals from real Chrome field data, and evaluates all five AI visibility signals.
- You get a prioritised report. October CMS-specific issues first — missing RainLab plugin SEO fields, meta tag output gaps, missing JSON-LD, RainLab.Sitemap configuration issues — then general SEO, each with the Twig template code, Backend field path, or plugin configuration setting for the fix.
FAQ
Questions about the October CMS SEO audit
Does October CMS have built-in SEO features?
October CMS (OctoberCMS) does not have built-in SEO features in its core — SEO functionality is provided through official and community plugins. The primary SEO plugins for October CMS: (1) RainLab.Pages — the official static pages plugin includes meta title, meta description, and meta keywords fields per page, plus canonical URL support; it\'s the standard way to manage content pages in October CMS and includes basic SEO controls. (2) RainLab.Blog — the official blog plugin includes per-post meta title and meta description fields. (3) RainLab.Sitemap — the official XML sitemap plugin generates a sitemap from RainLab.Pages, RainLab.Blog posts, and other content registered by plugins. For structured data (JSON-LD), October CMS uses its Twig/Blade template system — JSON-LD must be added to CMS layouts or page templates via `{% partial "seo/schema" %}` partials using the October CMS component variable system. The audit validates what\'s present in the server-rendered HTTP response regardless of whether a plugin or custom template provides it.
How do I configure meta tags in October CMS?
October CMS meta tags are configured differently depending on how the site is structured: (1) For RainLab.Pages static pages: open the page in the Backend editor, navigate to the SEO section, and fill in the "Meta Title" and "Meta Description" fields. The RainLab.Pages plugin outputs these in the page layout via `{% page %}` — verify that your layout Twig template includes `title>{{ this.page.meta_title | default(this.page.title) }} | {{ this.site.name }}</title` and the meta description tag. (2) For CMS pages (non-RainLab.Pages): add meta tag fields directly in the page\'s Settings section in the backend, or define them in the page\'s `[viewBag]` component properties. In the Twig template: `title>{{ this.page.meta_title }}</title`. (3) For RainLab.Blog posts: edit the post in the backend, scroll to the SEO section, and fill in the Blog meta title and meta description fields. In the blog post page template: `title>{{ post.meta_title | default(post.title) }}</title`. For canonical URLs: add `link rel="canonical" href="{{ this.page.canonicalUrl | default(this.request.url) }}"` to the layout. The audit checks that title and description tags are present, unique, and correctly populated across all crawled page types.
How do I add JSON-LD structured data in October CMS?
JSON-LD in October CMS is added via Twig partial templates. Create a partial at `partials/seo/schema.htm` and include it in your main layout: `{% partial "seo/schema" %}`. In the schema partial, access page variables using October CMS\'s Twig variables: `{{ this.page.title }}` for the page title, `{{ post.published_at | date("Y-m-d") }}` for a blog post date, `{{ post.featuredImage.path }}` for the featured image URL. For `Article` schema on blog posts: use the post component variables (`{{ post.title }}`, `{{ post.user.name }}` for author, `{{ post.published_at }}`). For `FAQPage`: create a structured repeater component or use October CMS\'s Repeater widget in the Backend form with question/answer columns, then iterate in the partial: `{% for faq in this.components.faqList.getItems() %}`. For BreadcrumbList: use the page hierarchy from `this.page.breadcrumb` (if using RainLab.Pages with breadcrumb support). For the site-wide `WebSite` and `Organization` schema: add once to the main layout Twig file. The audit checks that JSON-LD is in the server-rendered HTML (not JavaScript-injected) and validates all required properties.
Is the October CMS SEO audit free?
Yes. The complete audit is free with no signup and no email gate. Paid plans add saved history, scheduled monitoring, larger crawls (up to 1,000 pages), and agency workflows.