CMS SEO Checklist: 10 Features Your CMS Must Handle in 2026
The 10 SEO capabilities to verify before you commit to any CMS — and what breaks when they're missing
Google's index doesn't care how polished your admin panel looks. If your CMS can't manage meta tags, redirects, and structured data without a stack of third-party plugins, you're either doing SEO work by hand or skipping it entirely.
This checklist covers the 10 CMS SEO features that should ship in the box — why each one matters, and what breaks when it's missing. Full disclosure: we build UnfoldCMS, so we'll use it as the worked example throughout. But the checklist applies to any CMS you're evaluating, and it pairs well with our guide on how to evaluate a CMS beyond the marketing page.
TL;DR — the 10 CMS SEO features to check before you commit:
- Editable meta title and description per page
- Clean, editable URL slugs with configurable permalink patterns
- Automatic slug history (old URLs redirect when slugs change)
- A redirect manager — 301/302, hit tracking, optional expiry
- Dynamic XML sitemap
- robots.txt control
- JSON-LD structured data (Article, Organization, Breadcrumb)
- Image optimization — WebP conversion and alt text
- Scheduled publishing
- AI discoverability — llms.txt and llms-full.txt
If a CMS makes you install a plugin for items 1 through 7, that's not a feature gap. That's a design decision — and you'll pay for it in maintenance.
1. Editable meta title and description per page
Every page needs its own meta title and description fields, separate from the visible headline. The meta title is what ranks and gets clicked in search results; the description drives click-through rate. A CMS that auto-generates both from the page title gives you zero control over your strongest on-page signals.
The failure mode is subtle. Auto-generated titles often title-case proper nouns ("WordPress" becomes "Wordpress") or truncate at awkward points. And a missing description means Google picks a random sentence from your page — usually not the one that sells the click.
In UnfoldCMS, every post and page carries seo_title and meta_desc columns, rendered through the ralphjsmit/laravel-seo package. You set them in the editor, they ship in the <head>. No plugin, no theme function, no template hack. This matters double if you ever go headless — headless setups make meta handling your problem unless the CMS exposes these fields cleanly.
2. Clean, editable URL slugs and permalink patterns
You need two things: per-page slug editing (change /blog/post-1 to /blog/cms-seo-checklist) and site-wide permalink patterns (decide whether posts live at /blog/{slug}, /posts/{slug}, or /{slug}). URLs are a ranking signal, a UX signal, and the hardest thing to change later.
Watch out for systems that bolt query strings or numeric IDs into URLs (?p=123), or that hardcode the URL structure so deeply that changing it means rewriting routes. If you're migrating an existing site, you must be able to match your old URL structure exactly — otherwise every inbound link breaks on day one. Our CMS migration guide for developers covers why URL parity is step zero of any migration.
UnfoldCMS auto-generates slugs from titles but keeps them editable, and a PermalinkService lets admins set the URL pattern for posts, pages, and categories from the admin panel — no code changes.
3. Automatic slug history and old-URL redirects
When you rename a slug, the old URL should keep working — automatically, without you remembering to add a redirect. Every slug change without this creates a 404, and every 404 burns whatever link equity that page earned. This is the feature people don't know they need until they've lost rankings to it.
Here's the typical sequence without slug history: an editor improves a post title, updates the slug to match, and ships it. Three weeks later, traffic to that post is down 60% because the version Google indexed — and the version other sites linked to — now returns 404. Nobody connects the two events.
UnfoldCMS records every slug change in a PostSlugHistory table. Old slugs resolve to the current post with a redirect. Editors can rename slugs freely; the CMS keeps the paper trail. WordPress does this too (via wp_old_slug_redirect), which is the right call — but plenty of headless and flat-file systems leave it to you.
4. A real redirect manager
Slug history covers renames, but you also need manual redirects: merged pages, killed product lines, campaign URLs, restructured sections. A proper redirect manager gives you 301 vs 302 choice, hit tracking (so you know which redirects still earn traffic), and bulk import for migrations. Without one, redirects live in server config files only developers can touch.
Nginx and .htaccess redirects work, but they have real costs: every change needs a deploy, content editors can't manage them, and nobody ever audits the list. Five years in, you're carrying 400 redirect rules and no idea which 350 are dead.
The UnfoldCMS redirect module (at /admin/seo/redirects) tracks hits and last_hit_at per redirect, supports CSV import for migrations, and adds something we haven't seen elsewhere: an optional expires_at field. A temporary redirect — say, a seasonal campaign pointing /sale at this year's landing page — stops firing after its expiry date instead of lingering forever. Expired redirects hide from the admin table by default so the list stays readable. Details are in the docs.
5. Dynamic XML sitemap
Your sitemap should regenerate itself. Publish a post, it's in the sitemap. Delete a page, it's gone. A static sitemap file — or worse, one you regenerate by hand — drifts out of sync within weeks, and Google starts crawling URLs that 404 while missing your new content entirely.
The checklist for a good sitemap implementation: it includes posts, pages, and category/archive pages; it excludes drafts and noindexed content; it serves accurate lastmod dates; and it's referenced from robots.txt. Skip any of these and you're sending Google mixed signals about what to crawl.
UnfoldCMS serves /sitemap.xml dynamically through a SitemapService — posts, pages, the blog index, and category pages, always current, never a cron job to babysit. You can verify this on any UnfoldCMS site by just opening the URL.
Want to see all of this wired together? Browse the full feature list — every item in this checklist ships in Core, not as a paid add-on.
6. robots.txt control
You should be able to edit crawl directives without SSH access. robots.txt controls which paths crawlers touch, points them at your sitemap, and — increasingly — declares policy for AI crawlers like GPTBot and ClaudeBot. When it's a static file on the server, every change becomes a developer ticket.
The classic disaster: a site launches with Disallow: / left over from staging, and nobody with server access notices for a month. A CMS-managed robots.txt makes the file visible to the people responsible for traffic, not just the people with deploy keys.
UnfoldCMS generates /robots.txt dynamically through the same SitemapService that builds the sitemap, so the sitemap reference is always correct and the file always reflects current site state.
7. JSON-LD structured data
Structured data tells Google what your content is — an article, an organization, a breadcrumb trail — and unlocks rich results: author bylines, dates, breadcrumbs in the SERP. With AI Overviews now appearing on a large share of informational queries (Semrush measured 13%+ of all queries and climbing through 2025), machine-readable context is how your content gets cited rather than skipped.
The minimum viable set is three schemas: Article on posts (headline, author, dates, publisher), Organization site-wide (name, logo, social profiles), and BreadcrumbList on anything nested. Hand-writing these in templates works until someone changes a field name and your structured data silently breaks for six months. Validation errors don't throw exceptions; they just quietly cost you rich results.
UnfoldCMS ships a @jsonld() Blade directive plus helpers — schema_article($post), schema_organization(), schema_breadcrumb_list(), schema_webpage() — that build valid JSON-LD from live model data. Custom schema arrays are supported when you need something beyond the helpers.
8. Image optimization — WebP and alt text
Images are usually the heaviest thing on a page, and page speed is a confirmed ranking factor. Your CMS should convert uploads to WebP at multiple sizes automatically, and the editor should make alt text a first-class field — because alt text is both an accessibility requirement and the main way image search understands your visuals.
"We'll optimize images later" is the most-broken promise in web development. If conversion isn't automatic at upload time, your media library fills with 4 MB PNGs and your Largest Contentful Paint suffers on every post.
UnfoldCMS handles this through Spatie Media Library: every featured image gets three WebP conversions on upload — thumbnail (300×200), medium (600×400), and large (1200×800). SVGs pass through untouched. Alt text lives with the media item, not buried in markup.
9. Scheduled publishing
Scheduling sounds like a convenience feature, but it's an SEO feature: consistent publishing cadence signals an active site, and a queue of scheduled posts is how small teams actually maintain that cadence. Write five posts on Sunday, drip them through the week. No CMS scheduling means no cadence — just bursts and silence.
The implementation detail that bites people: many systems schedule via queue workers or external cron services that fail silently. The post stays in limbo, nobody notices, the publishing calendar quietly collapses.
UnfoldCMS schedules with posted_at + a published flag, and a blog:publish-scheduled-posts command runs every minute via the Laravel scheduler — synchronously, no queue worker required, which means it works on shared hosting. One honest caveat from running it ourselves: a scheduled post reports as published via the API before it's publicly visible, so verify the URL returns 200 before you syndicate it anywhere.
10. AI discoverability — llms.txt and llms-full.txt
The newest item on the list. llms.txt is a proposed standard — a Markdown summary of your site at a fixed URL that AI crawlers can read without parsing your HTML, navigation, and cookie banners. llms-full.txt is the expanded version with full content. As AI assistants answer more queries directly, being legible to them is the new being indexed.
Is llms.txt guaranteed to matter in five years? No — it's an emerging convention, not a ratified standard. But the cost of serving it is near zero, and the audience asking AI assistants "what's a good lightweight Laravel CMS" is real and growing. Gartner projected traditional search volume dropping 25% by 2026 as users shift to AI chat; you want a seat at that table.
UnfoldCMS serves both /llms.txt and /llms-full.txt as routes, generated from site content — not static files someone has to remember to update. Almost no CMS does this out of the box today, which is exactly why it belongs on a 2026 checklist.
Built-in vs plugin-based SEO: does it matter?
Yes — but not because plugins are bad. WordPress with Yoast or Rank Math covers most of this checklist, and tens of millions of sites run that way successfully. The problem is structural: when SEO is a plugin, it's a dependency with its own update cycle, its own pricing tiers, its own conflicts, and its own attack surface. We've written before about why plugin stacks become a liability — SEO plugins are no exception.
| Concern | Built-in SEO (core CMS) | Plugin-based SEO |
|---|---|---|
| Meta fields | Native columns, always present | Added via plugin meta boxes; data lives in plugin tables |
| Redirects | Core module, one source of truth | Often a second plugin (or the premium tier) |
| Sitemap | One generator, matches routing exactly | Plugin guesses at custom post types and routes |
| Structured data | Built from live model data | Template-based; can drift from content |
| Updates | Ships with CMS releases | Separate update cycle; can break on CMS upgrades |
| Cost | Included | Free tier + $99–$499/yr for full features |
| Failure mode | CMS bug → fixed in CMS | Plugin conflict → you debug the stack |
The practical test when evaluating: install the CMS bare, with nothing added, and check how many of the 10 items above work. That number tells you how much ongoing dependency management you're signing up for.
How to run this checklist on any CMS
You can verify most of these in 15 minutes without reading a single docs page:
- Create a test post. Look for separate SEO title and meta description fields — not just the post title.
- Edit the slug. Then visit the old URL. Does it redirect or 404?
- Find the redirect manager. Check for 301/302 choice and hit counts.
- Open
/sitemap.xmland/robots.txt. Publish a post and reload — does the sitemap update? - View source on a post. Search for
application/ld+jsonand validate it with Google's Rich Results Test. - Upload a 3 MB JPEG. Check what format and sizes actually get served.
- Schedule a post 5 minutes out. Does it actually go live without manual help?
- Open
/llms.txt. Most systems fail this one today.
Run this exact checklist against the UnfoldCMS demo — open the sitemap, the robots file, and llms.txt on a live install and check every box yourself.
FAQ
Does WordPress with Yoast cover all 10 of these?
Most of them, yes. Yoast or Rank Math handles meta fields, sitemaps, robots.txt editing, and structured data well. You'll typically need a second plugin for redirect management with hit tracking (or the premium tier), and llms.txt support is still patchy across the plugin ecosystem. The capability is there; the cost is maintaining the stack.
Is llms.txt actually used by AI crawlers yet?
Adoption is early and uneven — it's a proposed convention, not a ratified standard, and the major AI labs haven't formally committed to it. But serving it costs nothing, the file doubles as a clean machine-readable site summary, and early adopters get cited in AI answers while competitors wait for certainty.
What's the difference between slug history and a redirect manager?
Slug history is automatic: rename a post's slug and the CMS silently maps the old URL to the new one. A redirect manager is manual: you create rules for merged pages, retired URLs, campaigns, and migration mappings. You need both — automation for the renames you forget, and tooling for the moves you plan.
Do 301 redirects pass full link equity?
Google has said since 2016 that 301s pass PageRank without loss, and 302s are treated similarly when they persist. The real equity killer isn't the redirect type — it's redirect chains (A→B→C) and 404s from slug changes nobody caught. Keep redirects single-hop and audit hit counts yearly.
Sources and methodology
UnfoldCMS implementation details in this post come from the shipped codebase as of June 2026: the seo_title/meta_desc post columns, PermalinkService, PostSlugHistory, the redirect module with hits/expires_at fields, SitemapService (sitemap + robots.txt), the @jsonld() schema helpers, Spatie Media Library WebP conversions (300×200 / 600×400 / 1200×800), the every-minute blog:publish-scheduled-posts scheduler, and the /llms.txt + /llms-full.txt routes. Feature claims are verifiable in the documentation or on the live demo.
External figures: AI Overviews appearing on 13%+ of Google queries (Semrush AI Overviews study, 2024–2025, share rising since); Gartner's projection of a 25% drop in traditional search engine volume by 2026 (Gartner, Feb 2024); Google's statement that 3xx redirects don't lose PageRank (Gary Illyes, 2016). The llms.txt convention is documented at llmstxt.org. Yoast/Rank Math premium pricing reflects published 2025–2026 rates for full feature sets.
Free & Open Source
Own your CMS. No subscriptions.
Unfold CMS is free to download and self-host. Built on Laravel + React, full source code included.
Share this post: