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 Free does not include
SEO NEO Free is a focused output module, not a Swiss Army knife. Operational tooling lives in SEO NEO Pro:
- Sitemap.xml — SEO NEO Pro Sitemaps builds offline XML sitemaps from SEO NEO canonicals and noindex. Small sites can still use a free third-party sitemap module in the meantime.
- 301/302 redirects — SEO NEO Pro Redirects handles rules, 404 triage, and CSV migration.
- Frontend SEO inspection — the SEO Preview Bar shows resolved SEO data side by side with the page on the frontend, plus the Field Mapping Visualiser in the page editor.
These remain outside the free module by design:
- 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.
- Free vs PRO — what Pro adds on top of the free engine.
- SEO NEO Pro — companion modules for editors and site managers.
- 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