
SEO
A practical SEO and CMS checklist for a blog or content site: what every page type needs, with example values and structured data.
SEO & CMS specification
7 page types
On-page SEO + JSON-LD
CMS fields for each
Global rules
Ten rules every page must meet
These apply to every URL on the site, whatever the page type.
HTTPS on every page
A self-referencing canonical tag on every page
Robots meta set to index, follow on public pages
sitemap.xml generated automatically and submitted to Google Search Console
robots.txt configured so crawlers can reach the site
Favicon and web manifest for mobile browsers
Open Graph tags on every public page
JSON-LD structured data for each page type
Alt text on every image
Internal links between related pages
Page types
Seven page types, one pattern
Each page type has a URL pattern, a fixed set of on-page elements and a matching structured-data type. The CMS fills them all in.
Home page
example.com/
Organization, WebSite (+ SearchAction)
About page
example.com/about/
AboutPage
Category page
example.com/{category}/
CollectionPage, BreadcrumbList
Article
example.com/{category}/{slug}/
Article, BreadcrumbList, Person (author)
Authors listing
example.com/authors/
CollectionPage with a list of Person
Author profile
example.com/authors/{slug}/
Person
Tag page
example.com/{tag}/
CollectionPage, BreadcrumbList
Home page
example.com
Title, description, H1, canonical, robots and the full Open Graph set.
<title>
Brand | What the site is
50–60 characters; brand first.
<meta description>
One sentence on what the site offers, covering its main topics.
150–160 characters; identical to og:description.
<h1>
Brand
Exactly one H1 per page.
Canonical
<link rel="canonical" href="https://example.com/" />
Self-referencing.
robots
<meta name="robots" content="index, follow">
Required on the home page.
og:title
Same as <title>
Identical to the title.
og:description
Same as meta description
Identical to the meta description.
og:image
https://example.com/og-home.jpg
Logo or key visual, 1200×630px.
og:url
https://example.com/
Full absolute URL.
og:type
website
Page type.
og:site_name
Brand
Name of the site.
Navigation
The main navigation links to every top-level category plus the About page, each as a real link to its own page: example.com/{category} … example.com/about.
About page
example.com/about
A standalone page in the navigation, not a content category.
One H1: About (or the name you choose)
A description of the site: concept, mission and what you offer
A list of authors or experts, each as an H2 with their full name
Each author has a short description (p) and links to example.com/authors/{slug}
Canonical: https://example.com/about/
Structured data: AboutPage (JSON-LD)
Category page
example.com/{category}
One template for every category. Each category gets its own unique title, description and Open Graph image.
<title>
Category | Brand
Format: {Category} | Brand; 30–55 characters.
<meta description>
Short, unique summary of what the category covers and who it helps.
150–160 characters; unique per category.
<h1>
Category name
One H1 only.
<h2> (posts)
Post title
Every listing card has its own H2 with the post title.
Canonical
https://example.com/category/
Self-referencing.
robots
index, follow
Public page.
og:title / og:description
Same as title / meta description
Identical values.
og:image
https://example.com/og-category.jpg
Category-specific, 1200×630px.
og:type
website
Listing pages use website.
Structured data
CollectionPage + BreadcrumbList
Both in JSON-LD.
Breadcrumb
Brand > Category
Visible on the page and in structured data.
Pagination
rel=”next” / rel=”prev”
Only if the listing is paginated.
Block 1 · Featured item (optional)
H2 with the title of the featured item
Free preview: an embed or a link
CTA to the rest, leading to sign-up or a paywall
Short description, 2–3 sentences
Presenter: full name, linking to their author page
Block 2 · Chronological listing
Every public post as a card: cover image, H2 title, short description, author and date
H2 titles must be unique
Publish date visible to users and in structured data
Cover image is required; alt text = post title
Each card links to example.com/{category}/{slug}
Pagination is optional at launch, but the URL structure must support it
Article
example.com/{category}/{slug}
Articles earn organic traffic, so they are public and need the most complete SEO setup.
<title>
Post title | Brand
50–65 characters.
<meta description>
Taken from the CMS field “Intro”
150–160 characters; also used as og:description.
<h1>
Post title
One H1 = the post title, entered in the CMS.
<h2>
Section headings in the body
Several H2 allowed; one per section.
Canonical
https://example.com/category/post-slug/
Self-referencing, no duplicates.
robots
index, follow
Public content.
og:title
Post title | Brand
Identical to the title.
og:image
Cover image, min. 1200×630px
From the CMS field “Cover image”.
og:type
article
Required for blog posts.
article:published_time
2025-09-01T10:00:00Z
ISO 8601; from the CMS field “Publish date”.
article:author
https://example.com/authors/jane-doe/
URL of the author page.
article:section
Category name
Name of the category.
article:tag
seo, content, guides
Tags from the CMS.
Breadcrumb
Home > Category > Post title
Visible and in structured data.
Internal links
At least 2–3 per article
Link to related posts and pages.
Authors
example.com/authors
A listing of every author, plus one profile page for each.
Authors listing
<title>
Authors | Brand
<meta description>
Meet the experts behind Brand who share practical knowledge.
150–160 characters.
<h1>
Authors
One H1.
<h2>
Jane Doe
Each author appears with their full name as an H2.
Canonical
https://example.com/authors/
Self-referencing.
og:type
website
Structured data
CollectionPage with a list of Person entities
Cards
Photo + H2 name + p description
Every card links to example.com/authors/{slug}.
Author profile · example.com/authors/jane-doe
<title>
Jane Doe | Brand
Format: {Full name} | Brand.
<meta description>
Short bio, 2 sentences
From the CMS field “Bio”.
<h1>
Jane Doe
The author’s full name.
Canonical
https://example.com/authors/jane-doe/
Self-referencing.
og:type
profile
Structured data
Person (JSON-LD)
See below.
LinkedIn link
rel=”noopener noreferrer”
If the author has a LinkedIn profile.
Post listing
All posts by the author
Same card format as the category page; bottom section.
Tag page
example.com/{tag}
Tags group content that cuts across categories. They are not categories.
Category
A fixed, predefined structure
Every post belongs to exactly one category
Visible in the main navigation
Tag
Flexible, created as needed
A post can have several tags
Found through internal search and content maps
Example: the tag “AI assistants” can sit on an article in one category and on another in a different category. The tag page links them together.
<title>
Tag name | Brand
Format: {Tag} | Brand; 30–50 characters.
<meta description>
From the CMS field “Tag description”
150–160 characters.
<h1>
Tag name
One H1.
<h2> (cards)
Title of each related article
Same format as the category listing.
Canonical
https://example.com/tag-slug/
Self-referencing.
robots
index, follow
noindex if the tag has fewer than 3 articles.
og:title / og:type
Same as title / website
Structured data
CollectionPage + BreadcrumbList
See below.
Breadcrumb
Brand > Tag
Two levels only for tags.
Interlinks
Each card links to its article
Whatever the category; the main advantage of tags.
Rules for tag listings
Each card shows the post’s category as a badge, so users get context before opening
Sort newest first
Every tag has a short description (p) that explains the topic; the admin enters it in the CMS
Tag pages must not be empty: with fewer than 3 articles the page is noindex
URL collision: tags vs. categories
Tag and category slugs share one namespace (example.com/{slug}). A tag slug must never equal a category slug. If the category is “guides”, a tag about the topic needs a different slug, such as “guides-and-tips”.
CMS fields
What the CMS needs to hold
Fields marked * are required. Each one maps directly to a meta tag or part of the page, so no extra logic is needed.
Blog post
Title *
Text (plain)
Maps to <h1> and <title>. Max 65 characters recommended.
Slug *
Text (auto)
Generated from the title; lowercase, dashes instead of spaces.
Intro *
Text (plain, multiline)
Maps to meta description and og:description. Max 160 characters.
Cover image *
Image upload
Min. 1200×630px for og:image. Alt text defaults to the post title.
Image alt text
Text (plain)
Optional custom alt; falls back to the post title.
Category *
Relation
One post, one category.
Author *
Relation
One author per post.
Publish date *
Date
Maps to article:published_time and is shown to users.
Tags
Multi-select
Free input; maps to article:tag.
Article body (rich text)
Paragraph (p) *
Rich text block
Standard <p>.
Heading 2 *
Rich text heading
H2 only inside the body; H1 is reserved for the post title.
Heading 3
Rich text heading
Optional; for deeper structure under an H2.
Bold / Italic
Inline marks
<strong> for key terms, <em> for foreign terms and emphasis.
Internal link
Rich text link
href is an internal URL; external links get rel=”noopener”.
Inline image
Image block
Alt text required; caption optional.
Quote / List
Blockquote, ul, ol
Optional.
SEO fields (CMS only, not shown to readers)
SEO title
Text (plain)
Falls back to Title + “ | Brand”. Max 65 characters.
SEO description
Text (plain)
Falls back to Intro. Max 160 characters.
og:image override
Image upload
Falls back to the cover image.
Canonical URL
Text (plain)
Always self-referencing.
Modified date
Date (auto)
Updates on every edit; maps to dateModified.
Category
Name *
Text (plain)
H1 of the category page and the navigation label.
Slug *
Text (plain)
URL segment: example.com/{slug}.
Description *
Text (plain)
Meta description. Max 160 characters.
og:image
Image upload
1200×630px.
Author
Full name *
Text (plain)
H2 on the listing, H1 on the profile.
Slug *
Text (auto)
From the name: example.com/authors/{slug}.
Photo *
Image upload
Shown on the profile and article cards. Alt = name.
Short description *
Text (plain, multiline)
The p on the listing and the profile meta description. Max 160 characters.
Biography
Rich text
Longer text; profile page only.
LinkedIn URL
URL
Opens in a new tab with rel=”noopener noreferrer”.
Tag
Name *
Text (plain)
Shown as H1 on the tag page.
Slug *
Text (auto)
Auto from the name: example.com/{slug}.
Description *
Text (plain, multiline)
Maps to meta description and the p under H1. Max 160 characters.
og:image
Image upload
Optional; falls back to the default OG image.
robots override
Select
index,follow or noindex,nofollow. Set noindex automatically below 3 articles.
Implementation
Notes for whoever builds it
Auto-generate meta
Build every meta field (title, description, og:*) from CMS fields.
Generate JSON-LD
Produce structured data for each page from CMS data, automatically.
Keep the sitemap fresh
Update sitemap.xml whenever a post is published or edited.
Transliterate slugs
Generate slugs from titles with accents removed (é→e, č→c, ß→ss), lowercase, spaces to dashes. “What is a startup?” becomes “what-is-a-startup”.
Fall back to the cover
Use the post’s cover image as og:image unless an override is set.
Track dates
Track publish and modified dates automatically; show both in the CMS.
Before you publish


