Why SEO NEO
The case for SEO NEO over MarkupSEO and Seo Maestro: a modern, actively-maintained SEO module built on native ProcessWire fields.
The problem with the existing options
ProcessWire has two well-known SEO modules: MarkupSEO and Seo Maestro. Both work, and both have served sites well for years. But both have the same underlying problem: they haven't kept pace with how Google handles canonical URLs, paginated pages, and URL segments.
- MarkupSEO has a known bug where the canonical URL drops URL segments — so
/news/2024/my-article/collapses to/news/. Paginated pages have a similar issue. - Seo Maestro has the same canonical bug, and its
hreflangoutput doesn't preserve segments or pagination either. - Both modules are unmaintained or very slowly maintained. Open issues sit for months.
SEO NEO started because of those canonical bugs. The name is a reference to that origin: it's an SEO module that fixes what the existing ones get wrong.
What SEO NEO does differently
The short list of things that make SEO NEO worth switching to:
- Correct canonicals for URL segments and pagination.
/news/2024/my-article/stays/news/2024/my-article/./news/page2/stays/news/page2/. Configurable include/strip policy per site. - Correct hreflang. Segment strings and page numbers are preserved and translated per language. A final
hreflang="x-default"line is included pointing at the default-language URL. - Native PW fields, not custom storage. Every SEO value is a real ProcessWire field with full multi-language, selector, and import/export support. No custom database schema, no Fieldtype complexity.
- Smart-map fallback chain. Dotted paths into nested fields (
banner.image,matrix.first.body), ancestor walk with*fieldname, and pipe-separated fallbacks in template defaults. - OG image dimensions + secure_url + media type. Facebook silently rejects images on first share when width/height are missing. SEO NEO includes them.
- Full JSON-LD
@graphoutput. Organization, WebSite, WebPage, Article, Person, and BreadcrumbList — wired by canonical@idURIs so the graph is linked, not four separate blobs. (Beta.) - Granular Google directives.
max-snippet,max-image-preview,max-video-preview,unavailable_after, and AI opt-out (noai,noimageai) — all in a single<meta name="robots">tag. - Actively maintained. New releases track ProcessWire's own release cadence.
Feature comparison
| Feature | MarkupSEO | Seo Maestro | SEO NEO |
|---|---|---|---|
| Meta title, description, canonical | ✓ | ✓ | ✓ |
| Canonical preserves URL segments | ✗ (bug) | ✗ (bug) | ✓ |
| Canonical preserves pagination | Partial | ✗ (bug) | ✓ |
| hreflang preserves segments + pagination | ✗ | ✗ | ✓ |
| Open Graph (title, description, image, type) | ✓ | ✓ | ✓ |
| OG image width, height, secure_url, type | ✗ | ✗ | ✓ |
| OG image ancestor fallback | ✓ | Partial | ✓ |
| Twitter / X cards | ✓ | ✓ | ✓ |
| Robots (noindex / nofollow per page) | ✓ | ✓ | ✓ |
| Auto-noindex unpublished / hidden pages | ✗ | Partial | ✓ |
| Granular Google directives (max-snippet etc.) | ✗ | ✗ | ✓ |
| AI / LLM opt-out directives | ✗ | ✗ | ✓ |
| Smart-map fallbacks with ancestor walk | ✗ | ✗ | ✓ |
| Per-template SEO defaults with placeholders | ✗ | Partial | ✓ |
| JSON-LD @graph (Organization, WebPage, etc.) | ✗ | Partial | ✓ (Beta) |
| ProCache compatibility | Partial | Partial | ✓ |
| Native PW language-aware fields | ✓ | ✓ | ✓ |
| Template API — full render | n/a | $page->seo->render() |
$page->seoneo->render() |
| Fallback-chain visualiser in editor | ✗ | ✗ | PRO |
What SEO NEO intentionally does not do
SEO NEO is a focused module, not a Swiss Army knife. These features are deliberately out of scope (at the moment) — each is served by an alternative module:
- Sitemap.xml — use MarkupSitemap by Mike Rockett. It's hreflang-aware and integrates cleanly with SEO NEO's per-page noindex setting.
- 301/302 redirects — use Jumplinks2 or ProcessRedirects.
- robots.txt editing — use MarkupRobotsTxt or a simple
site/templates/robots.phpoverride. - Google Analytics / GTM injection — use MarkupGoogleTagManager or SimpleAnalytics. Analytics is its own discipline.
- Yoast-style content analysis (keyword density, readability scores) — deliberately absent. My thinking is that readability tools in a CMS admin rarely match how real editors work. Good content is a craft decision, not a green-light score.
See also
- Quickstart ⭐ — install SEO NEO in five minutes.
- Migrating from MarkupSEO or Seo Maestro — field-name mapping, API swap, and common gotchas.
- Getting Started — a tour of what SEO NEO outputs.
Last updated