← All skills
SEOv1.0.0 · 2026-08-07
Seo Metadata Generator
The optimizer step: the draft in, every findability field out, as one JSON the publisher consumes. Written for AEO and GEO, not just blue links — the fields feed Google's snippet, the social card, and the answer engines that quote you.
What it does
- Generate the field set
- Verify the budgets mechanically
- Align the set to one intent
- Package for the publisher
SKILL.md
---
name: seo-metadata-generator
description: Generate a post's complete SEO metadata in one pass — 60-character title, 155-character meta description, focus keyword, slug, categories, tags, a deliberately different H1, schema recommendations and Open Graph — written for answer engines, not just blue links. Use when asked to write SEO titles and meta descriptions, set a focus keyword or slug, pick categories and tags, fix truncated snippets, prepare Rank Math fields, or someone says 'the post is written, make it findable'. For the draft itself, see blog-content-writer. For publishing the fields, see wordpress-publisher.
metadata:
version: 1.0.0
---
# SEO metadata generator
The optimizer step: the draft in, every findability field out, as one JSON the
publisher consumes. Written **for AEO and GEO, not just blue links** — the
fields feed Google's snippet, the social card, and the answer engines that
quote you.
The one structural rule people miss: **the H1 is deliberately different from
the SEO title.** The title is written for the results page; the H1 for the
reader who already clicked. Same promise, different jobs.
## Before you start
| Input | Why |
| --- | --- |
| The finished draft | Metadata describes what exists, never what was intended |
| The focus keyword (from research) | Fields align to one primary intent |
| The site's category IDs and existing tags | The publisher works in IDs; tags get reused before created |
| Where the URL will live | Slug decisions are permanent; renames break links |
## Step 1 — Generate the field set
| Field | Budget | Rule |
| --- | --- | --- |
| **SEO title** | 60 characters | The results-page promise, keyword present, no clickbait cheque the post can't cash |
| **Meta description** | 155 characters | The reason to click, stated plainly — it is ad copy for the result |
| **Focus keyword** | one | The primary intent; variants live in the body, not this field |
| **Slug** | short, keyword, no dates | Dates in slugs age the URL; the refresh strategy depends on stable URLs |
| **H1** | deliberately ≠ SEO title | Reader-facing; the title's promise, restated for someone already here |
| **Categories** | existing IDs | The cluster structure depends on right categorisation |
| **Tags** | 7–10 | Search-first: reuse existing tags before inventing near-duplicates |
| **Schema recommendation** | per content type | Article always; FAQ schema when the FAQ block exists; HowTo when steps are the content |
| **Open Graph** | title/description/image | The social card is part of metadata, not an afterthought |
## Step 2 — Verify the budgets mechanically
Count the characters — do not eyeball. A 64-character title truncates to an
unfinished promise; a 170-character description gets cut mid-reason. Under
budget beats over: cut to the whole thought that fits.
## Step 3 — Align the set to one intent
Title, description, H1, slug and focus keyword all serve the same search
intent. A title promising a pricing guide over a description promising a
tutorial splits the click. Read the five as one pitch before shipping.
## Step 4 — Package for the publisher
One JSON block, field names matching what wordpress-publisher sends — including
the Rank Math fields it must write through the plugin's own endpoint. Metadata
that lives in prose gets retyped; metadata in JSON gets published.
## Output
```json
{
"seo_title": "…", // ≤60 chars, count stated
"meta_description": "…", // ≤155 chars, count stated
"focus_keyword": "…",
"slug": "…",
"h1": "…", // ≠ seo_title, deliberately
"category_ids": [33, 536],
"tags": ["…"], // 7-10, reuse-first
"schema": ["Article", "FAQPage"],
"og": { "title": "…", "description": "…", "image": "featured" }
}
```
Plus one line each: character counts, the intent statement all fields serve,
and which tags were reused vs newly proposed.
## When it breaks
| What you see | What it means | The fix |
| --- | --- | --- |
| Title truncated with … in results | Over 60 characters | Cut to the whole promise that fits |
| Snippet reads generic | Description written as summary, not reason-to-click | It is ad copy for the result — sell the click honestly |
| H1 identical to the SEO title | The two jobs conflated | Rewrite the H1 for the reader already on the page |
| Post uncategorised or miscategorised | Names used instead of IDs, or defaults | Existing category IDs, explicitly |
| Tag list is 30 near-duplicates | Created before searched | Reuse-first; 7–10 total |
| SEO fields empty after publish | Rank Math written to standard post meta | The plugin has its own endpoint — the publisher's job, flagged here |
| Slug argument after launch | Renamed post-publish | Slugs are permanent decisions; get it right pre-publish |
| Clicks fine, instant bounces | Title promises what the post doesn't deliver | The metadata pitch and the post's content are one contract |
Never write metadata from the topic instead of the draft. The fields describe
the post that exists — a title promising sections the writer cut is a bounce
generator with good CTR.
## Rules
- **Budgets are counted, not estimated**, because truncation cuts promises
mid-word in the one place you cannot afford it.
- **H1 ≠ SEO title, on purpose**, because the results page and the article page
are different readers at different moments.
- **One intent across all fields**, because a split pitch splits the click.
- **Tags reuse before creating**, because near-duplicate tags fragment the
cluster structure they exist to serve.
- **Slug decisions are permanent**, because the refresh strategy that preserves
rankings depends on URLs that never move.
## Related skills
- **blog-content-writer** — produces the draft this describes.
- **wordpress-publisher** — sends these fields, including Rank Math via its own
endpoint.
- **answer-engine-optimisation** — the deeper AEO/GEO layer these fields feed.
- **keyword-research** — where the focus keyword came from.
Reviews
Sign in to leave a review.
