All promptsTechnical SEO

An SEO audit prompt for Claude, built on the two things it will actually do

An audit prompt that pastes the whole page source in at once and requires a verbatim quote behind every finding. The rest goes in what it could not determine.

Works in
Claude
You need
The full raw HTML of one page, from view source · The response headers, and your robots.txt if you have it
Written for
claude prompt for seo audit
98A

Scored by our own engine

This page, run through the audit we sell. Measured 4 August 2026.

Score your own page →

Most prompts labelled for one assistant are the same prompt with a different name at the top. This one is not, and the honest version of why is short: Claude will take a whole page source in one message, and it will keep an instruction to say “I cannot tell from this” instead of quietly filling the gap. Everything below is built on those two behaviours.

The rule that does all the work

Every finding must carry a verbatim quote from the source, with its location. Anything that cannot be quoted goes in Part 2, the section listing what could not be determined. There is no other place to put it.

That single constraint removes most of what makes audit output useless. Generic advice about title length and Core Web Vitals has no quote behind it, so it has nowhere to go. What survives into Part 1 is a set of statements you can verify by searching the source for the quoted string, which takes about ten seconds each and is the only check on the audit that actually matters.

What it is required to admit

An assistant cannot crawl, cannot see your server response unless you paste it, and cannot see Search Console. Those are not caveats to put in a footer. They decide what a page audit can honestly claim.

So the prompt makes the limits productive. Part 2 is not an apology, it is a list of artefacts: send the response headers and it can check X-Robots-Tag, send robots.txt and it can check crawler access. Every gap you fill moves a line from Part 2 into Part 1, and the audit gets shorter and more true at once.

The limit it handles most carefully is JavaScript. What you paste is the pre-render response, so a near empty root element with a hydration payload means the page might be complete for a browser and incomplete for a crawler that never renders. The prompt marks that unresolved rather than calling it a defect, because it is a measurement question. Settle it with the render gap checker, which counts the words in the raw HTML a non rendering crawler actually receives, and paste the number back.

If you want the version that reads a crawl export across many URLs rather than one page in full, that is the crawl export audit prompt. This one goes deep on a single page. That one goes wide, and neither can do the other’s job.

The prompt 524 words
You are auditing a single web page. I am pasting the complete raw HTML of the
page as it came off the server, before any JavaScript ran, plus the response
headers. Audit what is in front of you.

The rule the whole audit rests on:

Every finding in Part 1 must include a verbatim quote from what I pasted,
inside quote marks, exactly as it appears, with a note of where it came from:
the head, the body, a header, robots.txt. If you cannot produce that quote,
the observation does not go in Part 1. It goes in Part 2. There is no third
option and no partial credit.

Further rules:

1. What you have is the pre-JavaScript response. You cannot see the rendered
   DOM, so anything a framework injects on the client is invisible to you.
   When the source shows a near empty root element and a hydration payload,
   say that the page may be complete for a browser and is not complete for a
   crawler that does not render, and mark it as unresolved rather than as a
   defect.
2. You cannot crawl. You have one page. Do not describe site wide patterns,
   internal linking health, duplicate content or crawl depth. Those need
   pages you do not have.
3. You cannot see Search Console, analytics or rankings. Do not say a page
   is or is not performing, and do not attribute any traffic outcome to
   anything you found.
4. If I did not paste response headers or robots.txt, say which checks that
   removes and name them, rather than treating those areas as clean.
5. Do not repair the page in prose. For each finding give the exact
   replacement value or the exact line to change, and where in the document
   it goes.
6. Rank by consequence, not by how easy the fix is.

Output in three parts, as headed sections rather than a table:

PART 1: DETERMINED FROM THE SOURCE
For each finding, exactly four lines:
  Finding:
  Quote and location:
  Why it matters here, on this page:
  The change, stated precisely:

PART 2: NOT DETERMINABLE FROM WHAT YOU SENT
One line each, in the form "I cannot tell X, because Y is not in what you
pasted. Send Z and I can." Include the things you would normally assume.

PART 3: WHAT I WOULD LOOK AT FIRST IF I COULD FETCH THE PAGE
Three things, one sentence each, and say what each one would settle.

Constraints:
- Never paraphrase a quote and present it as one. If the quote is long, cut
  it with an ellipsis rather than rewording it.
- Do not count anything you did not count. If you say there are eleven
  images without alt text, that number came from counting img tags in what I
  pasted and you can say so.
- If the source was truncated, say where it stops and audit only up to there.

What this page is for: [ONE SENTENCE ON THE PAGE AND WHAT IT IS MEANT TO DO]
Response headers: [PASTE THEM, OR WRITE "not captured"]
robots.txt: [PASTE IT, OR WRITE "not fetched"]
The page source: [PASTE THE FULL VIEW SOURCE OUTPUT]

What to change

Everything in square brackets is yours to replace. Nothing else needs editing.

[ONE SENTENCE ON THE PAGE AND WHAT IT IS MEANT TO DO]
Something like "this is the pricing page, it is meant to get people into the demo form". The same defect has a different severity on a pricing page and on a tag archive, and without this line every finding is ranked as though the page were generic. It also stops the model recommending schema types that make no sense for what the page is.
[PASTE THEM, OR WRITE "not captured"]
Run curl -I on the URL, or copy the response headers from the network tab in your browser devtools. This is where X-Robots-Tag, the caching headers and the security headers live, and none of them are visible in the HTML. Writing "not captured" is a real answer: rule 4 then names the checks it had to drop.
[PASTE IT, OR WRITE "not fetched"]
Your robots.txt from the root of the domain, pasted as plain text. It is usually under thirty lines and it decides whether any of the rest matters. If you skip it, the audit is silent on crawler access rather than clean on it, which is the distinction the whole prompt exists to preserve.
[PASTE THE FULL VIEW SOURCE OUTPUT]
Ctrl+U in the browser, select all, paste. The whole thing, not the Elements panel in devtools, which shows the rendered DOM after JavaScript and is a different document. This is the paste that needs the context window: a real page source runs to tens of thousands of tokens and chunking it is what breaks the audit.

How to run it

  1. 01
    Take the source, not the rendered DOM

    Press Ctrl+U or U on a Mac to open view source, then select all and copy. Do not use the Elements tab in developer tools. Elements shows you the DOM after JavaScript has run, which no non rendering crawler ever sees, and auditing it tells you about the page a browser built rather than the page a bot received.

  2. 02
    Capture the response headers alongside it

    Run curl -I on the URL from a terminal, or open the network tab, reload, click the document request and copy the response headers. X-Robots-Tag, Cache-Control and the security headers exist only here. A page can carry a noindex that nobody working in the template can see, and this is the only place it shows up.

  3. 03
    Paste everything in one message

    Fill the four variables and send the whole thing as a single message rather than splitting the source across several. The point of running this in Claude is that the source, the headers and robots.txt sit in the same context, so a header can contradict a meta tag and the model notices. Split across messages, it stops noticing.

  4. 04
    Check the quotes before you read the findings

    Take three findings from Part 1 and search the page source for the quoted string. They should be there character for character. This takes a minute and it is the only verification that matters, because a finding with a quote you can locate is a fact and a finding with a paraphrase is an opinion wearing a fact costume.

  5. 05
    Treat Part 2 as the shopping list

    Part 2 is what the audit could not reach, with the artefact that would fix each gap. Work through it: capture the headers you skipped, fetch robots.txt, grab a rendered snapshot. Every item you supply moves a line out of Part 2 and into Part 1, and the audit gets shorter and truer at the same time.

  6. 06
    Settle the JavaScript question with a measurement

    If Part 2 says it cannot tell whether the page is complete without rendering, that is the one question you should not answer by argument. Run the URL through the render gap checker, which counts the visible words in the raw HTML the way a non rendering crawler sees them, and paste the number back in.

Questions people ask

Is there any real difference between a Claude prompt for an SEO audit and a ChatGPT one?

Two, and both are differences of degree rather than capability. Claude will hold an instruction to abstain, which is what keeps Part 2 honest instead of empty, and its context window comfortably takes a full page source plus headers in one message. The prompt runs in other assistants; it just needs more supervision on those two points.

Can Claude crawl my website?

No. Claude can fetch a URL in some surfaces and it does not crawl a site, and in the browser it may have no fetching at all depending on your settings. Nothing it says about pages you did not paste was measured. This prompt is built for that limit rather than around it, which is why it takes the source from you.

Why does the prompt demand a verbatim quote for every finding?

Because a quote is checkable in ten seconds and a paraphrase is not. It also changes what the model produces: an observation that cannot be evidenced from the paste has nowhere to go except the section labelled as undetermined, so the generic best practice advice that fills most audit output has no route into Part 1.

How much page source can I paste at once?

A single page source is usually fine in one message, including the head, the body and any inlined JSON. Where it gets tight is a page with a large hydration payload, which can be most of the document. If you have to cut something, cut the payload and tell the model you did, so it does not audit the gap.

Should I paste the source or upload the file?

Paste it as text. Some assistants summarise an attached file before reading it, and a summary of an HTML document loses the exact strings the whole prompt depends on. If the interface will not take a paste that long, split at a clear boundary such as the end of the head and say where you split.

A new prompt, most days One working prompt for a real SEO or AI visibility job, what to change in it, and a worked example. No sequences, no offers dressed as newsletters.

Unsubscribe in one click. We never pass your address on.

Run your first audit
in about a minute

Free account, no card. Paste your URL and get a real, scored report of your AI and search visibility.

Measuring rankings in