Schema Markup Audit
Audit the structured data (schema markup) of a website and produce an actionable SEO report.
When to use this skill
Use this skill when the user asks to:
- Audit or validate schema markup / structured data on a website
- Check rich result eligibility (e.g., Product, Article, FAQ, Review snippets)
- Find missing, invalid, or incomplete JSON-LD, Microdata, or RDFa
- Recommend which schema types to add to which pages
- Fix errors or warnings reported by Google's Rich Results Test or Search Console
Inputs to collect
Before starting, confirm with the user:
- Site URL or local files — a live site root URL (e.g.,
https://example.com), a sitemap URL, a list of URLs, or a local folder of HTML files.
- Scope — full site, a specific section (e.g.,
/products/), or a list of URLs.
- Crawl limits — max pages (default 200) for live crawls.
- Business context — site type (e-commerce, blog, local business, SaaS, etc.) so page-type-to-schema-type expectations can be set.
Workflow
Step 1: Gather the page set
- If a sitemap is available (
/sitemap.xml), fetch it to get the canonical page list.
- Otherwise, crawl from the homepage following only same-host links.
- For local HTML folders, enumerate all
.html files.
Step 2: Extract structured data
Use scripts/extract_schema.py to fetch pages and extract all structured data (JSON-LD, Microdata, RDFa) into a JSON inventory:
python3 scripts/extract_schema.py https://example.com --max-pages 200 --output schema_inventory.json
# already crawled once (e.g. in a full SEO audit)? skip the crawl and reuse the shared cache:
# python3 scripts/fetch_pages.py https://example.com --output page_cache.json
# python3 scripts/extract_schema.py --from-cache page_cache.json --output schema_inventory.json
For every page, record:
- Each structured data block: format (
json-ld, microdata, rdfa), @type, raw parsed object
- JSON parse errors in
<script type="application/ld+json"> blocks
- Page metadata: title, canonical URL, meta robots
Step 3: Run the audit checks
Use scripts/validate_schema.py to validate the inventory:
python3 scripts/validate_schema.py schema_inventory.json --output audit_report.json
Evaluate each check defined in references/audit-checks.md. The core checks are:
| Check |
Severity |
| Invalid JSON-LD (parse errors) |
High |
| Missing required properties for the declared type |
High |
| Missing schema on key page types (e.g., Product pages without Product schema) |
High |
| Missing recommended properties for rich results |
Medium |
| Schema/content mismatch (markup describes content not on the page) |
Medium |
| Conflicting or duplicate schema blocks on one page |
Medium |
Deprecated types or properties (e.g., HowTo rich results retired) |
Medium |
Missing Organization / WebSite schema on the homepage |
Medium |
| Mixed formats for the same entity (JSON-LD + Microdata duplicates) |
Low |
Missing optional enhancements (sameAs, BreadcrumbList, etc.) |
Low |
Step 4: Verify against external validators
When the site is live, recommend the user confirm key templates with:
- Google Rich Results Test (
https://search.google.com/test/rich-results)
- Schema.org validator (
https://validator.schema.org/)
Validate one representative URL per page template rather than every page.
Step 5: Produce the report
Write a report following the structure in references/report-template.md:
- Summary — pages scanned, schema blocks found, types in use, issue counts by severity
- Coverage map — page types vs. expected schema types, showing gaps
- Issues — one section per failing check, listing affected page, schema type, property, and a specific fix
- Opportunities — schema types worth adding for rich result eligibility
- Prioritized action list — ordered by severity and estimated impact
Step 6: Recommend fixes
For each issue, give a concrete, copy-pasteable recommendation, e.g.:
- Fix the JSON syntax error in the JSON-LD block on
/products/widget (trailing comma at line 14)
- Add the required
offers property to the Product schema on all product pages, including price, priceCurrency, and availability
- Provide a complete corrected JSON-LD snippet for the page template, using real values from the page content
Always recommend JSON-LD as the implementation format (Google's preferred format) when adding new markup.
Optional: export the report
As a Word document (.docx)
If the user wants the report as a .docx (for example, to share with stakeholders or attach to a ticket), save the Markdown report to a file and convert it:
python3 scripts/md_to_docx.py report.md --output report.docx
scripts/md_to_docx.py uses only the Python standard library (no pip install) and renders headings, tables, lists, links, bold/italic, and code blocks. Offer this whenever a user asks for a Word doc, a .docx, or a shareable/downloadable report.
As a CSV of findings (.csv)
If the user wants the raw findings as a spreadsheet (for filtering, sorting, or triage in Sheets or Excel), convert the audit's audit_report.json directly:
python3 scripts/findings_to_csv.py audit_report.json --output findings.csv
scripts/findings_to_csv.py is also standard-library only. It writes one row per finding, with check and severity columns prepended and list fields (e.g. the pages sharing a duplicate value) joined with ; . Unlike the .docx, which reformats the written report, the CSV is a direct dump of the structured findings — offer it whenever a user wants the data itself, a spreadsheet, or to slice findings by check or severity.
Resources
scripts/md_to_docx.py — convert the Markdown report into a Word (.docx) document (standard library only)
scripts/findings_to_csv.py — flatten the audit findings JSON into a CSV, one row per finding (standard library only)
references/audit-checks.md — full definitions, severities, and rationale for every audit check, plus required/recommended properties per schema type
references/report-template.md — report output structure
scripts/extract_schema.py — crawl pages and extract all structured data into a JSON inventory
scripts/validate_schema.py — run audit checks against a schema inventory JSON file
1---2name: schema-markup-audit3description: Audit a website's structured data (schema markup) for SEO. Extracts JSON-LD, Microdata, and RDFa from pages, validates it against schema.org and Google rich result requirements, and finds missing, invalid, or incomplete markup. Use when the user asks to audit, validate, fix, or improve schema markup, structured data, JSON-LD, or rich result eligibility of a website.4---56# Schema Markup Audit78Audit the structured data (schema markup) of a website and produce an actionable SEO report.910## When to use this skill1112Use this skill when the user asks to:1314- Audit or validate schema markup / structured data on a website15- Check rich result eligibility (e.g., Product, Article, FAQ, Review snippets)16- Find missing, invalid, or incomplete JSON-LD, Microdata, or RDFa17- Recommend which schema types to add to which pages18- Fix errors or warnings reported by Google's Rich Results Test or Search Console1920## Inputs to collect2122Before starting, confirm with the user:23241. **Site URL or local files** — a live site root URL (e.g., `https://example.com`), a sitemap URL, a list of URLs, or a local folder of HTML files.252. **Scope** — full site, a specific section (e.g., `/products/`), or a list of URLs.263. **Crawl limits** — max pages (default 200) for live crawls.274. **Business context** — site type (e-commerce, blog, local business, SaaS, etc.) so page-type-to-schema-type expectations can be set.2829## Workflow3031### Step 1: Gather the page set3233- If a sitemap is available (`/sitemap.xml`), fetch it to get the canonical page list.34- Otherwise, crawl from the homepage following only same-host links.35- For local HTML folders, enumerate all `.html` files.3637### Step 2: Extract structured data3839Use `scripts/extract_schema.py` to fetch pages and extract all structured data (JSON-LD, Microdata, RDFa) into a JSON inventory:4041```bash42python3 scripts/extract_schema.py https://example.com --max-pages 200 --output schema_inventory.json43# already crawled once (e.g. in a full SEO audit)? skip the crawl and reuse the shared cache:44# python3 scripts/fetch_pages.py https://example.com --output page_cache.json45# python3 scripts/extract_schema.py --from-cache page_cache.json --output schema_inventory.json46```4748For every page, record:4950- Each structured data block: format (`json-ld`, `microdata`, `rdfa`), `@type`, raw parsed object51- JSON parse errors in `<script type="application/ld+json">` blocks52- Page metadata: title, canonical URL, meta robots5354### Step 3: Run the audit checks5556Use `scripts/validate_schema.py` to validate the inventory:5758```bash59python3 scripts/validate_schema.py schema_inventory.json --output audit_report.json60```6162Evaluate each check defined in `references/audit-checks.md`. The core checks are:6364| Check | Severity |65|---|---|66| Invalid JSON-LD (parse errors) | High |67| Missing required properties for the declared type | High |68| Missing schema on key page types (e.g., Product pages without Product schema) | High |69| Missing recommended properties for rich results | Medium |70| Schema/content mismatch (markup describes content not on the page) | Medium |71| Conflicting or duplicate schema blocks on one page | Medium |72| Deprecated types or properties (e.g., `HowTo` rich results retired) | Medium |73| Missing `Organization` / `WebSite` schema on the homepage | Medium |74| Mixed formats for the same entity (JSON-LD + Microdata duplicates) | Low |75| Missing optional enhancements (`sameAs`, `BreadcrumbList`, etc.) | Low |7677### Step 4: Verify against external validators7879When the site is live, recommend the user confirm key templates with:8081- Google Rich Results Test (`https://search.google.com/test/rich-results`)82- Schema.org validator (`https://validator.schema.org/`)8384Validate one representative URL per page template rather than every page.8586### Step 5: Produce the report8788Write a report following the structure in `references/report-template.md`:89901. **Summary** — pages scanned, schema blocks found, types in use, issue counts by severity912. **Coverage map** — page types vs. expected schema types, showing gaps923. **Issues** — one section per failing check, listing affected page, schema type, property, and a specific fix934. **Opportunities** — schema types worth adding for rich result eligibility945. **Prioritized action list** — ordered by severity and estimated impact9596### Step 6: Recommend fixes9798For each issue, give a concrete, copy-pasteable recommendation, e.g.:99100- Fix the JSON syntax error in the JSON-LD block on `/products/widget` (trailing comma at line 14)101- Add the required `offers` property to the `Product` schema on all product pages, including `price`, `priceCurrency`, and `availability`102- Provide a complete corrected JSON-LD snippet for the page template, using real values from the page content103104Always recommend JSON-LD as the implementation format (Google's preferred format) when adding new markup.105106## Optional: export the report107108### As a Word document (.docx)109110If the user wants the report as a `.docx` (for example, to share with stakeholders or attach to a ticket), save the Markdown report to a file and convert it:111112```bash113python3 scripts/md_to_docx.py report.md --output report.docx114```115116`scripts/md_to_docx.py` uses only the Python standard library (no `pip install`) and renders headings, tables, lists, links, bold/italic, and code blocks. Offer this whenever a user asks for a Word doc, a `.docx`, or a shareable/downloadable report.117118### As a CSV of findings (.csv)119120If the user wants the raw findings as a spreadsheet (for filtering, sorting, or triage in Sheets or Excel), convert the audit's `audit_report.json` directly:121122```bash123python3 scripts/findings_to_csv.py audit_report.json --output findings.csv124```125126`scripts/findings_to_csv.py` is also standard-library only. It writes one row per finding, with `check` and `severity` columns prepended and list fields (e.g. the pages sharing a duplicate value) joined with `; `. Unlike the `.docx`, which reformats the written report, the CSV is a direct dump of the structured findings — offer it whenever a user wants the data itself, a spreadsheet, or to slice findings by check or severity.127128## Resources129130- `scripts/md_to_docx.py` — convert the Markdown report into a Word (.docx) document (standard library only)131- `scripts/findings_to_csv.py` — flatten the audit findings JSON into a CSV, one row per finding (standard library only)132- `references/audit-checks.md` — full definitions, severities, and rationale for every audit check, plus required/recommended properties per schema type133- `references/report-template.md` — report output structure134- `scripts/extract_schema.py` — crawl pages and extract all structured data into a JSON inventory135- `scripts/validate_schema.py` — run audit checks against a schema inventory JSON file