Technical SEO Audit
FreeOfficialAudit crawlability, rendering, metadata, and structured data with evidence-backed fixes. Use for indexing problems, migrations, or pre-launch SEO checks.
frontendseocrawlabilitystructured-datametadatarenderingauditยท by SkillingMain
What you get
- โ10-step procedure
- โ1 ready-to-run code block
- โ7-point quality checklist
- โ9 pitfalls to avoid
- โInstalls into 6 tools
- Version
- v1 โ
- Last updated
- today
- Length
- 6 min read
- Requires
- Works with any modern AI assistant
Works in: Claude Code, Codex, Cline, opencode, OpenClaw, Hermes
The full playbook
When to use
Use when asked to audit crawlability or indexation, diagnose "page not indexed" or ranking drops, review metadata or structured data, verify that a JavaScript-heavy site renders for bots, or run a pre-launch or pre-migration SEO check. Do not use for content strategy or keyword research โ this skill covers the technical layer only.
Inputs to gather
- Domain plus one representative URL per template (home, listing/category, detail, article).
- Rendering mode per route (SSG, SSR, CSR, hybrid) and the framework.
- Search Console access or exported coverage data, if available.
- Target locales and whether hreflang is in scope.
- Any recent migration or URL-structure change, with dates.
- Locations of robots.txt and the sitemap(s).
Procedure
- Crawl fundamentals:
curl -sI https://<domain>/โ expect 200.- Test all four origin variants (http/https x www/non-www) plus a trailing-slash variant with
curl -sIL, counting hops: every variant must 301 (not 302) directly to the canonical origin in ONE hop, no chains. - Fetch robots.txt: confirm it does not block CSS/JS/asset paths, has no accidental
Disallow: /, and references the sitemap. - Fetch the sitemap: valid XML, only 200-status canonical indexable URLs, under 50,000 URLs and 50MB per file.
- Verify
lastmodreflects real content changes, not the deploy timestamp.
- Indexation controls per template:
- Check BOTH the
X-Robots-Tagresponse header and the meta robots tag; they can conflict, and the more restrictive one wins. - Canonical: absolute URL, self-referencing on canonical pages, appears exactly once, and agrees with the sitemap and internal links.
- Decision point for faceted/parameter pages: use
noindexor a canonical โ never block them in robots.txt, because a blocked page's noindex can never be seen.
- Check BOTH the
- Rendering audit โ the highest-risk area on JS-heavy sites. For one URL per template, compare
curl -s <url>raw HTML against the rendered DOM:- If the title, meta description, canonical, main content, or internal links exist only after JavaScript runs, flag the route as at-risk: search-engine rendering is delayed and inconsistent, and most non-Google crawlers (including LLM crawlers) never execute JS.
- Recommend SSR, SSG, or prerendering for every indexable route.
- Flag client-side injection that CHANGES server-sent metadata โ conflicting signals are worse than missing ones.
- Metadata per template:
- Unique title of roughly 50-60 characters with the differentiating keyword front-loaded.
- Meta description of 120-160 characters written for click-through โ it is not a ranking factor and search engines rewrite most of them; its job is CTR.
- Open Graph and Twitter card tags on shareable templates.
- Duplicate titles across URLs almost always indicate a template bug โ report the root cause, not a URL list.
- Structured data:
- Prefer JSON-LD delivered in the initial HTML, not injected post-load.
- Match types to templates:
OrganizationandWebSitesitewide,BreadcrumbListon hierarchical pages,Productwithofferson product pages,Articlewith author and dates on editorial pages. - Validate with the schema.org validator or Rich Results Test โ presence is not validity.
- Confirm every marked-up value is visible on the page; invisible markup violates spam policy.
- Status-code hygiene:
- Missing content returns a real 404/410, never a 200 "not found" page (soft 404).
- Removed pages 301 to a RELEVANT equivalent, not the homepage.
- Internal links point at final URLs so crawlers never pay for internal redirect hops.
- If multilingual:
- hreflang must be bidirectional โ every page in the cluster lists all alternates plus itself โ and include
x-default. - Each page's canonical must be self-referencing within its own locale; a canonical pointing across locales silently invalidates the cluster.
- hreflang must be bidirectional โ every page in the cluster lists all alternates plus itself โ and include
- Architecture and discovery:
- Key pages reachable within 3 clicks of home.
- Check for orphans: URLs in the sitemap that no internal link points to.
- Pagination and "load more" use real
<a href>links, not JS-only handlers, or deep items are undiscoverable.
- Page-experience layer: viewport meta present, HTTPS everywhere with no mixed content, no intrusive interstitials. Summarize Core Web Vitals status but delegate deep performance work to a dedicated performance audit.
- Prioritize findings: P0 blocks crawling or indexing entirely; P1 causes wrong-page indexing or duplication; P2 costs rich results or CTR; P3 is hygiene.
Output format
### Verdict
One paragraph: can the site be crawled, rendered, and indexed correctly today?
Name the single biggest risk.
### Findings by priority
[P0-P3] Title
- Affected: templates/URLs with counts
- Evidence: the actual command output, header, or tag observed
- Fix: the exact change (header value, tag, redirect rule, or code)
- Validation: the command or tool check that confirms the fix
### Template matrix
Table: template โ title | description | canonical | robots | structured data (OK / issue ID)
### Post-fix monitoring
What to watch in Search Console (coverage states, enhancement reports) and for how long.
Quality checklist
- Every claim is backed by a fetched response or a code reference โ nothing asserted from assumption.
- Raw vs. rendered HTML compared for at least one URL per template, with the differences listed.
- All four protocol/host variants tested for redirect behavior and hop count.
- Canonical tags, sitemap entries, and internal links cross-checked for agreement.
- Structured data validated by a tool, not just observed to exist.
- Findings reference templates and root causes, not enumerations of individual URLs.
- No recommendation anywhere to robots.txt-block a page that needs deindexing.
Common pitfalls
- Blocking URLs in robots.txt to remove them from the index. Blocked pages cannot be crawled, so their noindex is never seen โ they linger as "indexed, no content". Deindex first, block later if ever.
- A canonical that points to a URL which redirects or 404s โ the signal is discarded and the duplicate cluster resolves unpredictably.
- Sitemap
lastmodauto-set to build time on every deploy: once it proves unreliable, crawlers ignore the field sitewide and recrawl prioritization suffers. - One-directional hreflang: a missing return tag invalidates that pair silently. No error is surfaced anywhere โ it just stops working.
- SPA route changes that update content but not title/canonical โ every client-side route must own its metadata, or all routes compete as one page.
- Soft 404s from empty states: a category page returning 200 with "0 results" gets classified as soft 404 and drags down crawl efficiency for the whole section.
- Auditing only the homepage. Template-level bugs live on listing and detail pages, which is where the traffic is.
- Treating a passing homepage
curlas proof the site renders for bots when half the routes are CSR โ always sample every template. - Recommending a blanket
Disallowfor staging cleanup on the production robots.txt โ migrations have shipped this exact mistake; diff robots.txt as part of every deploy check.