Mktg.Tech
  • TOOLS ▾
    • TOAD Technical On-Page & Auditing Dashboard Learn More →
    • AGENT ACTION Visualization for Agent-Ready Interfaces Learn More →
  • RANKINGS
TOAD
TOAD Testing Lab

Use the tabs and toggles below to inject “good” and “bad” SEO, HTML, and accessibility patterns into this live page so your extension can be tested against them.

100%



36 / 36 passing



META

Meta Title 9

pass

Injects a clean title tag.

fail

Title exists but is empty.

fail

Removes all title tags.

fail

Injects two conflicting <title> tags.

fail

Title text runs well past the 60-character SERP guideline.

fail

Places the <title> tag in <body> instead of <head>.

Meta Description 3

pass

Adds a normal meta description.

fail

Description tag exists, but content is empty.

fail

Removes the meta description.

fail

Injects two conflicting meta description tags.

fail

Places the description tag in <body> instead of <head>.

fail

Description text runs well past the 155-character guideline.

fail

Description text is unusually short (thin-content signal).

fail

Real canvas-measured text that exceeds a 985px SERP width budget.

fail

Real canvas-measured text that’s under a 400px SERP width budget.

Canonical 8

pass

Sets canonical to location.origin + location.pathname.

fail

Points canonical to a different URL (simulates mismatch).

fail

Removes all canonical tags.

fail

Places the canonical link tag in <body> instead of <head>.

fail

Injects two identical canonical tags (still a validation flag even when they agree).

fail

Sets the canonical href to a relative path instead of an absolute URL.

fail

Injects two canonical tags pointing at different URLs.

Pagination Head Tags 2

pass

Serves no prev/next tags, which is correct for a page that is not part of a paginated sequence — and the only honest state now that this fixture is in the HTML response. The old ?page=1/?page=3 targets both redirect.

fail

Both prev and next target /page-1 — a common copy-paste bug.

fail

prev → page-3 and next → page-1.

none

Removes rel=prev/next link tags. Most pages are not paginated — absence of these tags is normal, not a failure.

hreflang Cluster Tests 2

pass

Serves a self-referencing en + x-default pair. Both point at this page, which is valid — the old es/fr alternates were 404s, and this fixture is now in the HTML response rather than injected.

fail

Omits the current language self hreflang entry.

fail

Swaps en → /es/ and es → /en/.

fail

Adds codes like en-UKK and pt_BR.

fail

Two fr hreflang entries with different URLs.

fail

x-default → a “weird” page to trigger findings.

none

Removes all hreflang alternates.

fail

Valid self + alternates, but no x-default entry at all.

fail

One alternate points at a URL that returns a real 404.

fail

Places hreflang link tags in <body> instead of <head>.

Open Graph / Twitter 2

pass

Adds og:title/description/image + twitter:title/description/image.

fail

Removes all OG/Twitter meta tags.

fail

Sets og:image/twitter:image to a relative path (commonly flagged).

fail

Removes only og:title, keeping every other OG/Twitter tag present.

fail

Removes only og:description, keeping every other tag present.

fail

Removes only og:image, keeping every other tag present.

fail

Removes only twitter:title, keeping every other tag present.

fail

Removes only twitter:description, keeping every other tag present.

fail

Removes only twitter:image, keeping every other tag present.

Favicon Validation 2

pass

Uses the icon set this site really serves in its HTML response. The readout below is measured, not asserted: the file is fetched, its intrinsic size is read, the live robots.txt is parsed and the homepage is requested.

fail

Removes every icon relationship from the head. The browser falls back to /favicon.ico, so the page has no declared icon at all.

fail

Declares rel="favicon", which is not a registered link relationship. Browsers ignore it entirely, so the icon the markup names and the icon that actually loads are different files.

fail

A well-formed rel="icon" tag whose href is empty — present enough to look configured, pointing at nothing.

fail

Points at a real, reachable 64×32 PNG. Every surface that renders a favicon assumes a square, so a wide one is cropped or letterboxed.

fail

A real, square, reachable 4×4 PNG. Square and valid, and far too small to render as anything but a smudge.

fail

The tag is well-formed and the file genuinely does not exist, so the declared icon never resolves.

fail

Points at a real 80×80 square PNG under /wp-admin/, which this site’s live robots.txt disallows. It loads perfectly in a browser and cannot be fetched by a crawler — the one failure mode that is invisible from the page itself.

fail

Appends a fresh cache-busting token each time. Nothing about the image changes, but its address does, so every cache re-fetches it and no crawler can trust the URL it stored.

PASS — /wp-content/uploads/dark-icon128.png · 267×267 square · reachable · crawlable · homepage 200.

DIRECTIVES

robots.txt 9

pass

Removes any Disallow rule for this page from robots.txt.

fail

Adds Disallow: /toad/functionality/ to robots.txt.

Currently not blocked in the live robots.txt.

Meta Robots 9

pass

Adds meta robots = index, follow.

fail

Adds noindex,follow.

none

Removes any meta robots tag.

X-Robots-Tag 5

Meta tag (simulated)

pass

Adds meta http-equiv="X-Robots-Tag" content="index, follow".

fail

Sets X-Robots-Tag to noindex.

none

Removes the tag.

HTTP header (real)

pass

Serves this page with no X-Robots-Tag response header.

fail

Sends a real X-Robots-Tag: noindex HTTP response header.

Currently sending no X-Robots-Tag header.

Sitemap 5

Link tag (simulated)

pass

Adds link rel="sitemap" href="/sitemap.xml".

fail

Removes sitemap link tags.

Live sitemap inclusion (real)

pass

Clears the noindex flag so this page appears in /sitemap_index.xml.

fail

Marks this page noindex and removes it from /sitemap_index.xml.

Currently included in /sitemap_index.xml.

Links 3

Nofollow Link

pass

Injects nothing — the page carries no nofollow links.

fail

Adds one <a rel=”nofollow”> test link.

Pages With High External Links (100+)

pass

Adds 5 real external test links.

fail

Adds 105 real external test links to the page.

Pages With High Internal Links (200+)

pass

Adds 5 real internal test links.

fail

Adds 205 real internal test links to the page.

Internal Nofollow Outlinks

pass

Adds an internal link with no rel=”nofollow”.

fail

Adds an internal link with rel=”nofollow”, blocking link equity to your own page.

Internal Links With No Anchor Text

pass

Adds an internal link with real, descriptive anchor text.

fail

Adds an internal link with completely empty text content, e.g. <a href="/test-internal-page/"></a>.

URL 3

pass

Links to /example-page/.

fail

Links to /example//page/ — the double slash sits in the path. The // in https:// is protocol syntax and never counts.

fail

Links to a URL with a literal space in the path.

fail

Links to a URL containing accented characters.

fail

Links to /Example-Page/ instead of an all-lowercase path.

fail

Links to /blog/blog/blog/post/.

fail

Links to a URL carrying query-string parameters.

fail

Links to /example_page_here/ instead of using hyphens.

fail

Links to a URL path well past the 115-character guideline.

SCHEMA

JSON-LD Schema 4

pass

Adds a valid application/ld+json block.

fail

Adds malformed JSON (common parse failure), e.g. { "@context": "https://schema.org", "@type": "Product", name: Broken JSON.

fail

Removes any JSON-LD blocks.

fail

Valid JSON, valid shape, wrong values: every string is HTML-escaped twice, so &amp;amp; survives one unescape pass as &amp; and prints literally in a rich result. A parser must unescape once — decoding until the string stops changing silently repairs the display and hides the defect.

Image EXIF Data 1

pass

Loads a real photo with genuine embedded camera/GPS/timestamp EXIF data.

fail

Loads an identical photo with its EXIF data stripped — a real photo that lost its metadata in the upload pipeline.

none

Removes the photo entirely. Pages built from designed graphics have no EXIF to carry — absence is normal, not a failure.

EXIF data found — Camera: TOAD Camera Co. TOAD-1000 | Captured: 2026:07:15 14:22:03 | GPS: 47.6062, -122.3321

Video 2

pass

Adds a real, playable video element, e.g. <video controls><source src="toad-test-video.mp4" type="video/mp4"></video>.

fail

Embeds the same real video WITHOUT a <video> tag, e.g. <embed src="toad-test-video.mp4" type="video/mp4"> — video content is present but nothing in the markup identifies it as video.

none

Removes the test video entirely. Most pages have no video — absence is normal, not a failure.

1 native <video> element(s) found on this page:
Video 1 — source: https://mktg.tech/wp-content/uploads/toad-test-video.mp4 | resolution: 640×360 | duration: 5s | settings: controls

ON-PAGE

H1 7

pass

Injects one clean H1.

fail

Removes the H1 entirely.

fail

Injects two H1 elements with different text.

fail

Injects two H1 elements with identical text.

fail

Adds an alt attribute directly on the H1 tag — invalid; alt belongs on <img>.

fail

Injects an H2 before the H1, so the H1 no longer opens the outline.

fail

H1 text runs well past the 70-character guideline.

H2 3

pass

Injects one clean H2.

fail

Removes the H2 entirely.

fail

Injects two H2 elements with different text.

fail

Injects two H2 elements with identical text.

fail

Injects an H4 where an H2 was expected, skipping a level.

fail

H2 text runs well past the 70-character guideline.

Semantic HTML 4

Header

pass

No injection — relies on the page’s real, single top-level <header>. Only a <header> that is not inside an <article>, <aside>, <main>, <nav> or <section> maps to the banner landmark, so scoped headers inside sections are valid and must not be counted.

fail

Appends a second <header> as a direct child of <body>, so the page really does carry two banner landmarks. A header nested inside a section would not be a defect, which is why this one is injected at the top level.

Main

pass

No injection — relies on the page’s real, single <main>. This is the one landmark the HTML spec genuinely limits to one per document: no more than one <main> without the hidden attribute.

fail

Adds a second visible <main> alongside the page’s real one — a genuine spec violation. Note that additional <main> elements carrying the hidden attribute are legal, and single-page apps routinely keep inactive routes that way.

Nav

pass

Adds one <nav aria-label>.

fail

Adds two <nav> blocks with no aria-label.

Footer

pass

No injection — relies on the page’s real, single <footer>.

fail

Adds a second <footer> alongside the page’s real one.

Images 3

pass

Injects an image with alt + dimensions, e.g. <img src="..." alt="Test image description" width="200" height="120">.

fail

Image has no alt attribute.

fail

Image has alt but no explicit width/height.

fail

Loads a real, unoptimized ~10.7 MB GIF (mktg-tech-brain-1.gif) — image weight far over a reasonable budget (well beyond 200KB).

Validation 3

HTML Document Over 2mb

pass

No extra weight added.

fail

Adds ~2.2 MB of real (hidden) text, genuinely inflating total document size.

Resource Over 2mb

pass

No extra resource loaded.

fail

Loads the real ~10.7 MB test GIF as a page resource.

Multiple <head> Tags

pass

No extra <head> element added.

fail

Adds a second, real <head> element to the document via the DOM API.

Multiple <body> Tags

pass

No extra <body> element added.

fail

Adds a second, real <body> element to the document via the DOM API.

Invalid HTML Elements In <head>

pass

No extra element added to <head>.

fail

Adds a real <div> directly inside the document’s real <head>.

PASS — <head> is present and first, <body> is present and second, nothing precedes <html>.

Mobile 3

pass

Adds a standard meta viewport tag, e.g. <meta name="viewport" content="width=device-width, initial-scale=1">.

fail

Removes the meta viewport tag entirely.

Rendered 8

pass

Injects nothing and rewrites nothing, so every tag, heading, word, image, link and structured-data entity a reader sees is already in the server response.

fail

Writes a <meta> tag into <head> after load. A crawler reading the server response never sees it.

fail

Deletes a <meta> tag the server did send, so the crawler reads a directive the rendered page no longer carries.

fail

Promotes an existing server-rendered paragraph to a heading. The wording is identical either way, so only the heading outline moves — not the word count.

fail

Demotes a server-rendered heading to a plain paragraph. Again the words are untouched; the page just loses a level of its outline after render.

fail

Writes two paragraphs into the page after load. That copy is genuinely absent from the HTML the server returns, so a crawler that does not execute scripts never sees a word of it.

fail

Deletes a paragraph the server did send. The mismatch runs the other way: the crawler indexes copy no reader ever sees.

fail

Inserts an <img> that is not in the HTML response. It carries no text and no href, so only the images dimension moves.

fail

Deletes an image the server did send, so the crawler indexes an image the reader never gets.

fail

Wraps existing server-rendered words in a link that is not in the HTML. The word count does not move at all; only the link count does.

fail

Strips the href off a link the server did send. The crawler follows a destination the reader can no longer reach, and not one word changes.

fail

Writes a microdata entity into the page after load. Rich results built on it may never be earned, because the entity is absent from the HTML a crawler fetches.

fail

Deletes a microdata entity the server did send, so the crawler reads markup the rendered page cannot back up.

fail

Stages every dimension together — metadata, headings, text, images, links and structured data all move in both directions at once. This is what “Set All to FAIL” selects, so the button exercises the whole check rather than one corner of it.

Served in the raw HTML

100%of the rendered page was already in the HTMLnothing was added or removed after render
  • metadata100%
  • headings100%
  • text100%
  • images100%
  • links100%
  • structured data100%

green marks what JavaScript added, red marks what it removed — direction of the change, not a pass or fail. Both are gaps between the HTML and the rendered page; the card’s own badge above is what says whether this check passes.

Test content is injected into the page so your extension can “see” it. If your theme hides things visually, inspect DOM to verify.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 1.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 2.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 3.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 4.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 5.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 6.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 7.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 8.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 9.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 10.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 11.

This paragraph is part of the HTML the server returns, so a crawler reads it on the first fetch. The text-removed failure deletes it after load. Paragraph 12.

These words sit in a paragraph in the server response; the headings-added failure promotes them to a heading. Line 1.

These words sit in a paragraph in the server response; the headings-added failure promotes them to a heading. Line 2.

These words sit in a paragraph in the server response; the headings-added failure promotes them to a heading. Line 3.

These words sit in a paragraph in the server response; the headings-added failure promotes them to a heading. Line 4.

These words sit in a paragraph in the server response; the headings-added failure promotes them to a heading. Line 5.

These words sit in a paragraph in the server response; the headings-added failure promotes them to a heading. Line 6.

These words sit in a paragraph in the server response; the headings-added failure promotes them to a heading. Line 7.

These words sit in a paragraph in the server response; the headings-added failure promotes them to a heading. Line 8.

Server-rendered heading 1

Server-rendered heading 2

Server-rendered heading 3

TOAD logo 1 delivered in the server HTMLTOAD logo 2 delivered in the server HTMLTOAD logo 3 delivered in the server HTML

These words are plain text in the server response, with no link around them; the links-added failure wraps them. Line 1.

These words are plain text in the server response, with no link around them; the links-added failure wraps them. Line 2.

These words are plain text in the server response, with no link around them; the links-added failure wraps them. Line 3.

These words are plain text in the server response, with no link around them; the links-added failure wraps them. Line 4.

These words are plain text in the server response, with no link around them; the links-added failure wraps them. Line 5.

These words are plain text in the server response, with no link around them; the links-added failure wraps them. Line 6.

This line carries server link 1, whose href the links-removed failure strips.

This line carries server link 2, whose href the links-removed failure strips.

This line carries server link 3, whose href the links-removed failure strips.

Test link 1 Test link 2 Test link 3 Test link 4 Test link 5
Test link 1 Test link 2 Test link 3 Test link 4 Test link 5
Test internal link
Test internal link with real anchor text
Test URL pattern link

Test Heading H1

Test Heading H2

Test link
Test image description
Your browser does not support video.
Test photo with embedded EXIF metadata
Mktg.Tech

Independent reviews of the marketing tools reshaping the industry.

  • Mktg.Tech on LinkedIn

Explore

  • TOAD
  • Agent Action Optics
  • Rankings
  • For Developers & Agents

Company

  • About
  • Contact
  • Methodology
  • Submit Your Product

Legal

  • Terms & Conditions
  • Privacy Policy
  • Corrections & Updates
  • Media Kit

All systems online

© Mktg.Tech 2026. All rights reserved. This is proprietary software. Unauthorized reproduction or distribution is prohibited.