Every check Wrendex runs, in 27 categories
The full catalog of technical SEO checks Wrendex runs on every audit. Browse by category, drill into any individual check, and see the synthetic before/after we use to validate it. Every check ships on every plan - no asterisks, no add-ons.
Jump to a category
- Title (5)
- Meta Description (5)
- Headings (3)
- HTTP Status (6)
- Indexability (6)
- Markup (2)
- Content (1)
- Performance (4)
- Internal Links (13)
- Images (5)
- Social (3)
- Redirects (10)
- Security (5)
- Hreflang (10)
- Canonical (8)
- Duplicates (1)
- CSS (3)
- JS (3)
- External Links (6)
- Render-Blocking (2)
- Robots.txt (1)
- Cross-Crawl Changes (6)
- Sitemap (10)
- Structured Data (10)
- Structured Data (Google) (9)
- AMP (3)
- Duplicate Code (2)
Title (5 checks)
| Check | Description | Severity |
|---|---|---|
Page title missingTITLE_MISSING |
The page has no <title> tag. Search engines fall back to the URL or a fragment of body text, which hurts click-through. | error |
Title too longTITLE_TOO_LONG |
Titles wider than what Google shows (~580px on desktop) are truncated in search results, hiding the part that converts. Truncation depends on the rendered width of the characters, not just their count. | warning |
Title too shortTITLE_TOO_SHORT |
Very short titles miss ranking-relevant keywords and look thin in SERP listings. | notice |
Multiple title tagsTITLE_MULTIPLE |
More than one <title> tag was found. Browsers and crawlers pick one inconsistently. | warning |
Duplicate title across pagesDUPLICATE_TITLE |
Two or more pages share the same title, making them compete in search results. | warning |
Meta Description (5 checks)
| Check | Description | Severity |
|---|---|---|
Meta description missingMETA_DESCRIPTION_MISSING |
Without a meta description, search engines auto-generate a snippet, which is rarely flattering for click-through. | warning |
Meta description too longMETA_DESCRIPTION_TOO_LONG |
Descriptions wider than what Google shows (~985px on desktop) get truncated in SERP snippets, losing your final call to action. Truncation depends on the rendered width of the characters, not just their count. | notice |
Meta description too shortMETA_DESCRIPTION_TOO_SHORT |
Very short descriptions waste prime SERP real estate and miss keywords. | notice |
Multiple meta descriptionsMETA_DESCRIPTION_MULTIPLE |
More than one meta description tag is present; crawlers pick one unpredictably. | warning |
Duplicate meta descriptionDUPLICATE_META_DESCRIPTION |
Multiple pages share the same meta description, weakening relevance signals. | notice |
Headings (3 checks)
| Check | Description | Severity |
|---|---|---|
H1 missingH1_MISSING |
The page has no H1. Crawlers and screen readers rely on it as the primary topic signal. | warning |
Multiple H1 tagsH1_MULTIPLE |
More than one H1 dilutes the primary topic signal and confuses screen readers. | notice |
Duplicate H1 across pagesDUPLICATE_H1 |
Multiple pages share the same H1, suggesting overlapping topics or templating gaps. | notice |
HTTP Status (6 checks)
| Check | Description | Severity |
|---|---|---|
404 Not FoundHTTP_404 |
The page returns 404. Search engines drop it from the index and inbound links waste their authority. | error |
403 ForbiddenHTTP_403 |
The server refused the request. Crawlers and users alike see a wall instead of content. | error |
409 ConflictHTTP_409 |
The server reports the request conflicts with current state. Often a deployment or data race issue. | error |
4xx client errorHTTP_4XX |
The page returned a 4xx response other than 403/404/409. The URL is unreachable for crawlers. | error |
500 Internal Server ErrorHTTP_500 |
The server crashed handling this URL. Repeated 500s deindex the page over time. | error |
5xx server errorHTTP_5XX |
The page returned a 5xx response. Search engines treat repeated 5xx as a removal signal. | error |
Indexability (6 checks)
| Check | Description | Severity |
|---|---|---|
Page is noindexNOINDEX_PAGE |
The page sets robots noindex. Search engines will not include it in results. | warning |
Page-level nofollowNOFOLLOW_PAGE |
All outbound links on this page are flagged nofollow at the page level, breaking internal link equity. | notice |
noindex, followNOINDEX_FOLLOW |
The page is noindex but follow. Often intentional, occasionally a leftover that hides ranking content. | notice |
noindex, nofollowNOINDEX_NOFOLLOW |
The page blocks both indexing and link following. Inbound link authority is wasted. | warning |
Conflicting noindex signalsNOINDEX_CONFLICT |
Different sources (meta robots, X-Robots-Tag, sitemap) disagree on whether the page should be indexed. | warning |
Conflicting nofollow signalsNOFOLLOW_CONFLICT |
Meta robots and X-Robots-Tag disagree on follow / nofollow. | notice |
Markup (2 checks)
| Check | Description | Severity |
|---|---|---|
Invalid lang attributeINVALID_LANG |
<html lang> is missing or not a valid BCP-47 tag. Search engines and screen readers cannot determine the page language. | notice |
Missing viewport metaMISSING_VIEWPORT |
No <meta name="viewport"> tag. Mobile rendering will be broken and Google flags the page as non-mobile-friendly. | warning |
Content (1 checks)
| Check | Description | Severity |
|---|---|---|
Thin contentLOW_WORD_COUNT |
The page has very few words. Thin content rarely ranks and may be classified as low quality. | notice |
Performance (4 checks)
| Check | Description | Severity |
|---|---|---|
Slow page responseSLOW_PAGE |
Total response time is high. Slow pages cost rankings and conversions. | warning |
Oversized HTMLOVERSIZED_HTML |
The HTML payload is unusually large, slowing parsing and hurting Core Web Vitals. | notice |
No HTTP compressionNO_COMPRESSION |
The response is not gzip / br compressed, wasting bandwidth and slowing time-to-first-byte for clients. | warning |
Slow time-to-first-byteSLOW_TTFB |
TTFB is high, indicating server or origin latency. This drags every other metric. | warning |
Internal Links (13 checks)
| Check | Description | Severity |
|---|---|---|
No outgoing internal linksNO_OUTGOING_LINKS |
The page links to nothing else on the site. Crawlers cannot use it as a hub. | notice |
Double-slash in URLDOUBLE_SLASH_URL |
The URL contains a doubled slash, often produced by a templating bug, and can split crawl signals. | notice |
Too many URL parametersTOO_MANY_URL_PARAMS |
The URL stacks many query parameters, which can fragment crawl coverage and confuse canonicalisation. | notice |
Orphan pageORPHAN_PAGE |
No internal page links here. Search engines reach it only via the sitemap, with weak ranking signals. | warning |
Links to broken pageLINKS_TO_BROKEN |
This page links to a 4xx / 5xx URL on the site. Users hit dead ends and equity is wasted. | error |
Links to redirected pageLINKS_TO_REDIRECT_INDEXABLE |
The link target redirects to an indexable page. Working but wastes a hop and a little crawl budget. | notice |
Links to non-indexable redirectLINKS_TO_REDIRECT_NON_INDEXABLE |
The link redirects to a URL the crawler cannot index. Equity is lost. | warning |
Links to broken non-indexableLINKS_TO_BROKEN_NON_INDEXABLE |
The link target is both broken and non-indexable, so neither users nor crawlers can use it. | warning |
Only nofollow incoming linksNOFOLLOW_ONLY_INCOMING |
Every internal link to this page is nofollow. Search engines do not pass authority through. | warning |
Mixed follow / nofollow incomingMIXED_FOLLOW_INCOMING |
Internal links to this page mix follow and nofollow, which is usually a templating accident. | notice |
Nofollow on internal linkNOFOLLOW_OUTGOING_INTERNAL |
An internal link is marked rel=nofollow, blocking authority flow on your own site. | notice |
Only one dofollow incomingSINGLE_DOFOLLOW_INCOMING |
Just one internal page passes equity here. Single points of failure for crawl and rank. | notice |
Redirect with no incomingREDIRECT_NO_INCOMING |
A redirect endpoint with no inbound internal links is dead weight in the link graph. | notice |
Images (5 checks)
| Check | Description | Severity |
|---|---|---|
Missing alt textMISSING_ALT_TEXT |
An image has no alt attribute. Screen readers and image search cannot describe it. | warning |
Broken imageBROKEN_IMAGE |
The image URL returns an error. Users see a placeholder, search engines drop it from image results. | error |
Oversized imageOVERSIZED_IMAGE |
The image file is much larger than its rendered size, slowing the page. | warning |
Image URL redirectsIMAGE_REDIRECT |
The image src redirects, costing an extra round-trip on every load. | notice |
Missing image dimensionsMISSING_IMAGE_DIMENSIONS |
The image has no width / height attributes, which causes layout shift (bad CLS). | notice |
Social (3 checks)
| Check | Description | Severity |
|---|---|---|
Missing Open Graph tagsMISSING_OG_TAGS |
The page is missing og:title / og:description / og:image. Social shares fall back to ugly auto-snippets. | notice |
og:url and canonical disagreeOG_CANONICAL_MISMATCH |
og:url does not match the canonical URL. Shares may land on the wrong variant. | notice |
Missing Twitter CardMISSING_TWITTER_CARD |
twitter:card is absent. Twitter / X falls back to a plain link preview. | notice |
Redirects (10 checks)
| Check | Description | Severity |
|---|---|---|
302 temporary redirectREDIRECT_302 |
The URL serves a 302. Crawlers may keep crawling the source if they expect it to come back. | notice |
3xx redirectREDIRECT_3XX |
The URL returns a non-301/302 redirect status. Browsers follow it but crawlers handle it inconsistently. | notice |
Broken redirectBROKEN_REDIRECT |
The redirect target is a 4xx / 5xx response. Users land on an error. | error |
Redirect chainREDIRECT_CHAIN |
More than one redirect hop before the final URL. Wastes crawl budget and slows users. | notice |
Redirect chain too longREDIRECT_CHAIN_TOO_LONG |
The redirect chain has too many hops. Some crawlers stop following before the destination. | warning |
Redirect loopREDIRECT_LOOP |
The redirect chain points back to itself. Browsers and crawlers give up. | error |
HTTPS redirects to HTTPHTTPS_TO_HTTP_REDIRECT |
An HTTPS URL redirects to HTTP. This is a security and SEO regression. | error |
HTTP to HTTPS redirectHTTP_TO_HTTPS_REDIRECT |
An HTTP URL redirects to HTTPS. Expected, but every internal link should target HTTPS directly to skip the hop. | notice |
Meta refresh redirectMETA_REFRESH_REDIRECT |
The page uses a <meta http-equiv="refresh"> tag. Crawlers may treat it as a soft 200 instead of a redirect. | warning |
Request timed outTIMEOUT |
The crawl request timed out. The URL is effectively unreachable for crawlers and slow users. | error |
Security (5 checks)
| Check | Description | Severity |
|---|---|---|
HTTPS page links to HTTPHTTPS_LINKS_TO_HTTP |
An HTTPS page contains a plain HTTP link. Triggers mixed-content warnings on click-through. | warning |
HTTP page links to HTTPSHTTP_LINKS_TO_HTTPS |
An HTTP page links to HTTPS. Usually fine, but suggests the page itself should also be HTTPS. | notice |
HTTPS page loads HTTP CSSHTTPS_CSS_TO_HTTP |
Stylesheet loaded over HTTP from an HTTPS page. Browsers block it as mixed content. | error |
HTTPS page loads HTTP JSHTTPS_JS_TO_HTTP |
Script loaded over HTTP from an HTTPS page. Blocked as mixed content; the page may break. | error |
HTTPS page loads HTTP imageHTTPS_IMG_TO_HTTP |
Image loaded over HTTP from an HTTPS page. Causes mixed-content warnings. | warning |
Hreflang (10 checks)
| Check | Description | Severity |
|---|---|---|
Invalid hreflang codeINVALID_HREFLANG |
An hreflang attribute has an invalid language / region code. | warning |
hreflang language mismatchHREFLANG_LANG_MISMATCH |
The hreflang language does not match the actual page language. | notice |
Missing self-referential hreflangHREFLANG_MISSING_SELF_REF |
An hreflang cluster must include a self-reference for each locale. This page omits its own. | notice |
Missing x-default hreflangHREFLANG_MISSING_X_DEFAULT |
No x-default fallback is defined for users whose locale does not match any listed variant. | notice |
hreflang target brokenHREFLANG_POINTS_TO_BROKEN |
An hreflang entry points at a 4xx / 5xx URL. | error |
hreflang target redirectsHREFLANG_POINTS_TO_REDIRECT |
An hreflang entry redirects to another URL. Search engines may discount it. | notice |
Missing reciprocal hreflangHREFLANG_MISSING_RECIPROCAL |
Page A links to page B via hreflang, but B does not link back. Without reciprocity, the cluster is ignored. | warning |
hreflang target non-canonicalHREFLANG_POINTS_TO_NON_CANONICAL |
An hreflang entry points at a URL whose canonical is something else. | notice |
Multiple languages on one pageHREFLANG_MULTI_LANG_SINGLE_PAGE |
The page declares hreflang for multiple language codes pointing at itself. | notice |
One language across many pagesHREFLANG_MULTI_PAGE_SINGLE_LANG |
Several pages claim to be the canonical for the same language code. | notice |
Canonical (8 checks)
| Check | Description | Severity |
|---|---|---|
Canonical points to 4xxCANONICAL_POINTS_TO_4XX |
The canonical URL returns a 4xx error. The page has no valid canonical. | error |
Canonical points to 5xxCANONICAL_POINTS_TO_5XX |
The canonical URL returns a 5xx error. | error |
Canonical points to redirectCANONICAL_POINTS_TO_REDIRECT |
The canonical URL redirects. Search engines may follow it but the signal is weakened. | warning |
Canonical has no incoming linksCANONICAL_NO_INCOMING_LINKS |
The canonical URL is not linked anywhere internally, suggesting the cluster is fragmented. | notice |
Canonical http to httpsCANONICAL_HTTP_TO_HTTPS |
The page is HTTP but its canonical is HTTPS. Expected during a migration; should not persist. | notice |
Canonical https to httpCANONICAL_HTTPS_TO_HTTP |
The page is HTTPS but the canonical is HTTP. Search engines may demote the page. | error |
Non-canonical declared as canonicalNON_CANONICAL_AS_CANONICAL |
The page sets itself as canonical but other pages declare a different canonical for the same content. | warning |
Duplicates without canonicalDUPLICATES_NO_CANONICAL |
Multiple pages share the same content but none declare a canonical. | warning |
Duplicates (1 checks)
| Check | Description | Severity |
|---|---|---|
Identical contentIDENTICAL_CONTENT |
Two or more pages serve identical body content. | warning |
CSS (3 checks)
| Check | Description | Severity |
|---|---|---|
Broken stylesheetBROKEN_CSS |
A linked stylesheet returns an error response. The page renders without its styles. | error |
Oversized stylesheetOVERSIZED_CSS |
A stylesheet is unusually large, slowing page render. | warning |
Stylesheet redirectsREDIRECTED_CSS |
A linked stylesheet URL redirects, costing an extra round-trip. | notice |
JS (3 checks)
| Check | Description | Severity |
|---|---|---|
Broken scriptBROKEN_JS |
A linked script returns an error. The page may behave incorrectly. | error |
Oversized scriptOVERSIZED_JS |
A script bundle is unusually large, hurting time-to-interactive. | warning |
Script redirectsREDIRECTED_JS |
A script URL redirects, adding a round-trip on every page load. | notice |
External Links (6 checks)
| Check | Description | Severity |
|---|---|---|
External link redirectsEXTERNAL_LINK_3XX |
An outbound external link redirects, costing user time. | notice |
External link broken (4xx)EXTERNAL_LINK_4XX |
An outbound external link returns a 4xx error. | warning |
External link blockedEXTERNAL_LINK_BLOCKED |
The external host blocked our crawler. Could be intentional bot blocking. | notice |
External link 5xxEXTERNAL_LINK_5XX |
An outbound external link returned a 5xx error. | warning |
External link timeoutEXTERNAL_LINK_TIMEOUT |
The external link timed out during the crawl. | notice |
External redirect to 5xxEXTERNAL_LINK_5XX_REDIRECT |
The external link redirects to a server-error response. | warning |
Render-Blocking (2 checks)
| Check | Description | Severity |
|---|---|---|
Render-blocking CSSRENDER_BLOCKING_CSS |
A stylesheet blocks first paint. Hurts Largest Contentful Paint and perceived speed. | warning |
Render-blocking JSRENDER_BLOCKING_JS |
A script in the <head> blocks rendering until parsed and executed. | warning |
Robots.txt (1 checks)
| Check | Description | Severity |
|---|---|---|
robots.txt inaccessibleROBOTS_TXT_INACCESSIBLE |
robots.txt could not be fetched. Crawlers may treat the entire site as disallowed. | error |
Cross-Crawl Changes (6 checks)
| Check | Description | Severity |
|---|---|---|
Title changedTITLE_CHANGED |
The page title changed since the previous crawl. | notice |
Meta description changedMETA_DESCRIPTION_CHANGED |
The meta description changed since the previous crawl. | notice |
H1 changedH1_CHANGED |
The H1 changed since the previous crawl. | notice |
Word count changedWORD_COUNT_CHANGED |
The page word count moved meaningfully between crawls. | notice |
Redirect target changedREDIRECT_TARGET_CHANGED |
A redirect now points at a different URL than in the previous crawl. | warning |
Page became non-indexableBECAME_NON_INDEXABLE |
A previously indexable page is now blocked from indexing. | warning |
Sitemap (10 checks)
| Check | Description | Severity |
|---|---|---|
Sitemap URL redirectsSITEMAP_3XX_REDIRECT |
A URL listed in the sitemap redirects. | notice |
Sitemap URL returns 4xxSITEMAP_4XX |
A URL in the sitemap is broken. | error |
Sitemap URL forbiddenSITEMAP_403_FORBIDDEN |
A URL in the sitemap returns 403. Search engines cannot index it. | error |
Sitemap URL returns 5xxSITEMAP_5XX |
A URL in the sitemap returns a server error. | error |
Sitemap URL is noindexSITEMAP_NOINDEX |
A URL in the sitemap is marked noindex. The two signals contradict each other. | warning |
Sitemap URL non-canonicalSITEMAP_NON_CANONICAL |
A URL in the sitemap is not the canonical version of its page. | notice |
Sitemap URL timed outSITEMAP_TIMEOUT |
A URL in the sitemap timed out during the crawl. | warning |
Invalid sitemap formatINVALID_SITEMAP_FORMAT |
The sitemap could not be parsed as valid XML / sitemap protocol. | error |
URL missing from sitemapMISSING_FROM_SITEMAP |
A linked, indexable URL is not present in any sitemap. | notice |
Duplicate URL in sitemapsDUPLICATE_IN_SITEMAPS |
The same URL appears in more than one sitemap or more than once in the same sitemap. | notice |
Structured Data (10 checks)
| Check | Description | Severity |
|---|---|---|
JSON-LD parse errorJSON_LD_PARSE_ERROR |
A JSON-LD script block could not be parsed as valid JSON. | error |
JSON-LD missing @typeJSON_LD_MISSING_TYPE |
A JSON-LD object has no @type. Search engines cannot interpret it. | warning |
JSON-LD invalid @typeJSON_LD_INVALID_TYPE |
The @type does not exist on schema.org or is misspelled. | warning |
JSON-LD invalid propertyJSON_LD_INVALID_PROPERTY |
A property on the JSON-LD object is not defined for the declared @type. | notice |
JSON-LD wrong property typeJSON_LD_UNEXPECTED_PROPERTY_TYPE |
A property's value type does not match the schema.org expected type (for example, string instead of Date). | notice |
JSON-LD unexpected propertyJSON_LD_UNEXPECTED_PROPERTY |
An unrecognised property appeared on a JSON-LD object. | notice |
JSON-LD invalid valueJSON_LD_INVALID_VALUE |
A property's value is not in the expected format (for example, malformed URL). | notice |
JSON-LD duplicate propertyJSON_LD_DUPLICATE_PROPERTY |
The same property is declared more than once on a JSON-LD object. | notice |
JSON-LD deprecated typeJSON_LD_DEPRECATED_TYPE |
The JSON-LD object uses a schema.org type that has been deprecated. | notice |
JSON-LD deprecated propertyJSON_LD_DEPRECATED_PROPERTY |
The JSON-LD object uses a property that has been deprecated. | notice |
Structured Data (Google) (9 checks)
| Check | Description | Severity |
|---|---|---|
Google rich result missing required fieldJSON_LD_GOOGLE_MISSING_REQUIRED |
A field Google requires for the rich result is missing. The page is ineligible until it is added. | warning |
Google rich result missing one-of requiredJSON_LD_GOOGLE_MISSING_ONE_OF_REQUIRED |
Google requires at least one of a set of fields and none are present. | warning |
Google rich result property missing typeJSON_LD_GOOGLE_PROPERTY_MISSING_TYPE |
A nested object that Google expects to be typed has no @type. | notice |
Google rich result missing imageJSON_LD_GOOGLE_MISSING_IMAGE |
Google's rich result for this type requires an image and none was provided. | warning |
Google rich result invalid dateJSON_LD_GOOGLE_INVALID_DATE |
A date field is not in ISO 8601 format. | notice |
Google rich result unrecognised propertyJSON_LD_GOOGLE_UNRECOGNIZED_PROPERTY |
A property is not recognised by Google for this rich-result type. | notice |
Google rich result unresolved @idJSON_LD_GOOGLE_UNRESOLVED_ID |
An @id reference does not match any object on the page. | notice |
Google rich result empty fieldJSON_LD_GOOGLE_EMPTY_FIELD |
A field that should hold a value is empty. | notice |
Google rich result invalid valueJSON_LD_GOOGLE_INVALID_VALUE |
A field's value is outside the format Google expects. | notice |
AMP (3 checks)
| Check | Description | Severity |
|---|---|---|
AMP validation errorsAMP_VALIDATION_ERRORS |
The AMP variant has validation errors and is ineligible for AMP-specific surfaces. | warning |
AMP canonical mismatchAMP_CANONICAL_MISMATCH |
The AMP page and its canonical disagree on the canonical URL. | notice |
AMP excessive CSSAMP_EXCESSIVE_CSS |
The AMP page exceeds the CSS budget allowed by the AMP spec. | notice |
Duplicate Code (2 checks)
| Check | Description | Severity |
|---|---|---|
Duplicate JavaScriptDUPLICATE_JS_CODE |
Multiple script bundles ship the same code, wasting bandwidth and parsing time. | notice |
Duplicate CSSDUPLICATE_CSS_CODE |
Multiple stylesheets ship the same rules, inflating CSS payload. | notice |
Run it on your site
Wrendex catches every check above on every audit. Run a free audit, no credit card.