Product support

Get help in the plugin support forum.

  • Added on Aug 13, 2026
  • Current version: 1.7.0
  • Platform Compatibility
    v4.x 1.7
    v3.x 1.7
    v2.x not tested
    v1.x not tested
  • License: Regular / Extended
  • Created by

Categories

One field instead of six. Add type: powersystems_seofields to any blueprint or model and editors get meta title, meta description, canonical URL, noindex/nofollow toggles and Open Graph title, description and image in a single field. The image picker reuses October's own Media Manager popup rather than reimplementing one.

See it before you publish. The field renders a live Google search result and a Facebook/LinkedIn share card as the editor types, with character counters on both. No more publishing to find out the description was truncated.

Render it in one line. The seoMeta Twig filter outputs the meta description, robots directive, canonical link, Open Graph tags and a Twitter Card tag. Pass fallbacks for anything the editor left blank:

{{ post.seo|seoMeta({
    title: post.title,
    description: post.summary_text,
    url: this.page.baseFileName|page,
    image: post.banner.path
})|raw }}

Values stored as raw JSON by Tailor's EntryRecord are handled automatically.

JSON-LD without a schema library. Four Twig functions build plain schema.org arrays — schemaLocalBusiness, schemaBreadcrumbList, schemaFaqPage and schemaArticle — and the schema filter wraps the result in a ready-to-output <script type="application/ld+json"> tag. Nothing is guessed or auto-filled: only your theme knows the business details, so you pass them in.

sitemap.xml, served automatically. Static CMS pages and RainLab.Pages entries are discovered from the active theme, skipping pages that are hidden, marked noindex, or have required :param placeholders in their URL. Utility paths (/api/*, /404, /components, anything ending /search or /rss) are excluded by default and the pattern list is editable. Dynamic content contributes through the powersystems.seo.sitemap.extend event.

Redirect manager with wildcards. A backend list of 301/302 redirects with an enabled toggle and a hit counter per rule. Wildcards are supported (old-blog/*/blog/*, with the captured segment substituted), and an exact match always wins over a wildcard one. Redirects are only consulted for requests that would otherwise 404, so existing pages are never affected.

Editable robots.txt. Served at /robots.txt, edited from the backend, defaults to allowing everything and pointing at the sitemap.

SEO Health dashboard. Flags missing meta titles and descriptions, titles or descriptions that are too long (or descriptions too short), missing share images, the same meta title used on more than one page, and pages marked noindex. Extensible through the powersystems.seo.health.extend event.

Requirements

  • October CMS 3.0 or newer (3.x and 4.x)
  • PHP 8.1+ (October 4 itself requires 8.2+)

The October APIs this plugin builds on are identical across the 3.x and 4.x lines. Runtime-tested on October 3.7 / PHP 8.1 and on 4.x.

What you get

  • Every future update in the 1.x line
  • Bug fixes and October compatibility updates
  • Support by email for the plugin itself

Integrating the plugin into your own theme or blueprints is your own work; the documentation covers the wiring step by step. If you would rather not do it yourself, see below.

About Power Systems

This plugin is developed and maintained by Power Systems, an October CMS development studio. We build it for the sites we deliver ourselves, which is why it exists and why it keeps getting updates.

Beyond the plugin itself we offer:

  • Support on the plugin — included in the purchase price.
  • Customisation — adjustments so it fits the way your site actually works.
  • Custom features — extensions built specifically for your project.
  • Installation and integration on your own October CMS site, including wiring the SEO fields into your blueprints and the meta output into your theme.

Customisation, custom features and installation are paid services, quoted per project. Get in touch at support@psaruba.com.

Installation via Command Line

php artisan plugin:install PowerSystems.Seo

Installation

Add the plugin to your project on the marketplace, then install it:

composer require powersystems/seo-plugin

Or install it from the backend under Settings → Updates & Plugins. The migration that creates the redirect table runs automatically.

Configure it under Settings → Power Systems → SEO (robots.txt and sitemap) and Settings → Power Systems → Redirects. The SEO Fields widget and the JSON-LD helpers need no configuration — you only wire them into a blueprint and theme, as below.

The SEO Fields widget

Add one field to any blueprint or model:

seo:
    label: SEO
    type: powersystems_seofields

This covers meta title, meta description, canonical URL, noindex/nofollow, and Open Graph title, description and image. It stores an array:

[
    'meta_title' => '...',
    'meta_description' => '...',
    'canonical_url' => '...',
    'noindex' => false,
    'nofollow' => false,
    'og_title' => '...',
    'og_description' => '...',
    'og_image' => '/path/to/image.jpg',
]

Rendering it in a theme

Use the seoMeta filter in your layout <head>, passing fallbacks for anything an editor leaves blank:

{{ post.seo|seoMeta({
    title: post.title,
    description: post.summary_text,
    url: this.page.baseFileName|page,
    image: post.banner.path
})|raw }}

This outputs the meta description, robots directive, canonical link, Open Graph tags and a Twitter Card tag. It does not output a <title> tag — October's own meta_title/title viewBag convention already covers that for CMS pages. Content types that store the field as raw JSON (e.g. Tailor's EntryRecord) are handled automatically.

JSON-LD schema.org helpers

Four Twig functions build plain schema.org arrays; the schema filter wraps the result in a <script type="application/ld+json"> tag:

{{ schemaLocalBusiness({
    name: 'Bohemian Bar & Restaurant',
    type: 'Restaurant',
    url: 'https://example.com',
    telephone: '+297 2808448',
    address: { streetAddress: '...', addressLocality: '...', addressCountry: 'AW' }
})|schema|raw }}

{{ schemaBreadcrumbList([
    { name: 'Home', url: '/' },
    { name: post.title, url: post.url }
])|schema|raw }}

schemaFaqPage and schemaArticle follow the same pattern. Nothing is guessed — only your theme knows the business details, so you pass them in.

sitemap.xml and robots.txt

Both are served automatically and configured under Settings → Power Systems → SEO. The sitemap includes static CMS pages and RainLab.Pages entries, skipping hidden, noindex, and parameterised URLs. Contribute dynamic content (blog posts, Tailor entries) through an event:

Event::listen('powersystems.seo.sitemap.extend', function () {
    return Blog\Post::isPublished()->get()->map(function ($post) {
        return ['loc' => $post->url, 'lastmod' => $post->updated_at];
    })->toArray();
});

Redirect manager

Under Settings → Power Systems → Redirects: a list of 301/302 redirects with an enabled toggle and a hit counter. Wildcards are supported (old-blog/*/blog/*); an exact match always wins over a wildcard one. Redirects are only consulted for requests that would otherwise 404, so existing pages are never affected.

SEO Health dashboard

Under Settings → Power Systems → SEO Health: flags missing or too-long meta titles and descriptions, missing share images, duplicate titles, and noindex pages. Feed it your dynamic content the same way as the sitemap, through powersystems.seo.health.extend.

Adding it to a new site — checklist

  1. Add type: powersystems_seofields as a new field on the content type(s) that need SEO — don't repurpose an existing field.
  2. If the site uses Tailor, run php artisan tailor:migrate so the new field gets a column (additive, safe on existing content).
  3. Wire seoMeta into the theme's layout <head> with fallbacks.
  4. Add JSON-LD where relevant — schemaLocalBusiness on the homepage, schemaBreadcrumbList on inner pages, schemaArticle on blog templates.
1.7.0

Add a site-wide Default social share image setting (Settings > SEO > Social). The seoMeta filter falls back to it for og:image when a page has none of its own, so every page gets a share preview, and SEO Health stops flagging pages for a missing share image once it's set.

Aug 04, 2026

1.6.0

SEO Health now audits the theme's own static pages (native CMS and RainLab.Pages) automatically - the same set the sitemap lists - so the dashboard is useful out of the box instead of empty until a content type registers via the event. A missing meta title on a page that still has a page title is reported as advice (it falls back to the page title) rather than a hard miss. Sitemap and audit now share one page-discovery helper.

Aug 04, 2026

1.5.2

Fix the Sitemap toggle showing as off while the sitemap was still being served. A never-set value now consistently reads as on (matching the route), so the switch and the actual behaviour agree.

Aug 04, 2026

1.5.1

Fix an empty sitemap.xml on multisite installs. The sitemap is served from a plain route (outside the CMS request lifecycle), where the active-theme lookup returns nothing because the theme is bound to the resolved site definition - so no pages were ever listed. The generator now falls back to the current/primary site's theme (then the edit theme). Single-site installs are unaffected.

Aug 04, 2026

1.5.0

Detect and safely take over a static robots.txt / sitemap.xml (or an .htaccess rule) that shadows the plugin's dynamic routes. SEO Health gains a serving-status panel with a one-click, reversible "import & disable" that renames the static file to a .bak backup - it never deletes and never edits .htaccess (that's detect-and-instruct only). The robots.txt editor now pre-fills from an existing static file so nothing already published is lost, and a Sitemap line is added automatically when the imported file doesn't already have one.

Aug 04, 2026

1.4.1

Fix "Undefined array key" (PHP 8.x) in the seoMeta filter when a record's SEO Fields value is empty/never saved - key reads are now null-safe so fallbacks render correctly.

Aug 04, 2026

1.4.0

Include RainLab.Pages static pages in sitemap.xml, filtered the same way as native CMS pages.

Aug 04, 2026

1.3.2

Support the October CMS 3.x line alongside 4.x (PHP floor lowered to 8.1). Core classes that moved between releases (MediaLibrary, ResizeImages) are now resolved at runtime instead of being imported directly.

Aug 04, 2026

1.3.1

Add wildcard support to the redirect manager (e.g. old-blog/* -> blog/*), with exact matches still taking precedence over wildcard ones.

Aug 04, 2026

1.3.0

Add an SEO Health dashboard flagging missing/too-long meta titles & descriptions, missing share images, duplicate titles, and noindex pages.

Aug 04, 2026

1.2.0

Add a live Google/social share preview (with character counters) to the SEO Fields widget, updating as you type.

Aug 04, 2026

1.1.0

create_redirects_table.php

Aug 04, 2026

1.0.0

SEO Fields widget (meta title/description, canonical, robots, Open Graph) and a JSON-LD schema.org helper library (LocalBusiness, BreadcrumbList, FAQPage, Article).

Aug 04, 2026

Upgrading

Updates install through Composer or the backend Settings → Updates & Plugins screen; database changes run automatically on update.

1.x

The 1.x line is backward compatible throughout — no breaking changes, no manual migration steps. Field data, settings, redirects and the seoMeta/schema* Twig API are stable across all 1.x releases, so you can update freely.

Version 1.3.2 lowered the minimum requirement to October CMS 3.0 / PHP 8.1; there is nothing to change on an existing install when moving to it.