Menu

/ Zagreb, Croatia -

9:42 PM

Menu

/ Zagreb, Croatia -

9:42 PM

logo
logo

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.

JSON-LD · Organization
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Brand",
  "url": "https://example.com",
  "logo": "https://example.com/logo.png",
  "description": "One-line description of the organization.",
  "sameAs": []
}
JSON-LD · WebSite
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Brand",
  "url": "https://example.com",
  "potentialAction": {
    "@type": "SearchAction",
    "target": "https://example.com/search?q={search_term_string}",
    "query-input": "required name=search_term_string"
  }
}

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

JSON-LD · CollectionPage
{
  "@context": "https://schema.org",
  "@type": "CollectionPage",
  "name": "Category",
  "url": "https://example.com/category/",
  "description": "Short description of the category.",
  "breadcrumb": {
    "@type": "BreadcrumbList",
    "itemListElement": [
      { "@type": "ListItem", "position": 1, "name": "Brand", "item": "https://example.com/" },
      { "@type": "ListItem", "position": 2, "name": "Category", "item": "https://example.com/category/" }
    ]
  }
}

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.

JSON-LD · Article
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Post title",
  "image": "https://example.com/uploads/cover.jpg",
  "author": {
    "@type": "Person",
    "name": "Jane Doe",
    "url": "https://example.com/authors/jane-doe/"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Brand",
    "logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }
  },
  "datePublished": "2025-09-01T10:00:00Z",
  "dateModified": "2025-09-01T10:00:00Z",
  "description": "Short description of the post.",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://example.com/category/post-slug/"
  },
  "breadcrumb": {
    "@type": "BreadcrumbList",
    "itemListElement": [
      { "@type": "ListItem", "position": 1, "name": "Brand", "item": "https://example.com/" },
      { "@type": "ListItem", "position": 2, "name": "Category", "item": "https://example.com/category/" },
      { "@type": "ListItem", "position": 3, "name": "Post title", "item": "https://example.com/category/post-slug/" }
    ]
  }
}

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.

JSON-LD · Person
{
  "@context": "https://schema.org",
  "@type": "Person",
  "name": "Jane Doe",
  "url": "https://example.com/authors/jane-doe/",
  "image": "https://example.com/uploads/jane-doe.jpg",
  "description": "Short biography of the author.",
  "sameAs": [
    "https://www.linkedin.com/in/jane-doe"
  ]
}

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”.

JSON-LD · Tag page
{
  "@context": "https://schema.org",
  "@type": "CollectionPage",
  "name": "Tag name",
  "url": "https://example.com/tag-slug/",
  "description": "All articles about this topic.",
  "breadcrumb": {
    "@type": "BreadcrumbList",
    "itemListElement": [
      { "@type": "ListItem", "position": 1, "name": "Brand", "item": "https://example.com/" },
      { "@type": "ListItem", "position": 2, "name": "Tag name", "item": "https://example.com/tag-slug/" }
    ]
  }
}

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

A last check for every page

0 of 6 done
image

LOCATION

WESPA, Zagreb, Croatia

image
image

The selective, results-based growth platform for startups ready to scale.

Newsletter

By subscribing, you agree to our Privacy Policy

© 2026 Forge. Precision Scale Systems.

Zagreb, Croatia -

9:42 PM

LOCATION

WESPA, Zagreb, Croatia

image
image

The selective, results-based growth platform for startups ready to scale.

Newsletter

By subscribing, you agree to our Privacy Policy

© 2026 Forge. Precision Scale Systems.

Zagreb, Croatia -

9:42 PM

LOCATION

WESPA, Zagreb, Croatia

image
image

The selective, results-based growth platform for startups ready to scale.

Newsletter

By subscribing, you agree to our Privacy Policy

© 2026 FORGE. Precision Scale Systems.

Zagreb, Croatia -

9:42 PM