Turn a keyword export into topical clusters that map to real pages
A prompt that clusters a keyword export by search intent rather than shared words, names one page per cluster, and flags the pages that would compete.
- Works in
- ChatGPT, Claude, Gemini
- You need
- A keyword export, CSV or pasted list · Your existing URL list, if you have one
- Written for
- chatgpt prompts for seo keyword research
Scored by our own engine
This page, run through the audit we sell. Measured 4 August 2026.

Most keyword clustering prompts produce a tidy table that groups keywords by the words inside them. That is not clustering, it is sorting. The prompt below clusters by what the searcher wants, names the single page that should own each cluster, and refuses to place keywords that do not fit rather than padding a group to look complete. It also tells you which of your planned pages would compete with each other, which is the failure this whole exercise exists to prevent.
Why grouping by words fails
“Cheap running shoes” and “running shoe repair” share two words out of three. One is somebody with a wallet open and one is somebody with a hole in their sole. A clustering pass that puts them on the same page produces a page that serves neither, and the tell is always the same: a page with a good keyword list that ranks for nothing.
Intent is the property that decides whether one page can serve two queries. It is also a property a language model is genuinely good at judging, which is why it is worth asking a model rather than a spreadsheet. The instruction that does the work is rule 1: could a single page satisfy every keyword in this cluster. Everything else in the prompt exists to stop the model quietly answering yes.
The part everyone deletes
The rule telling the model not to estimate volume is the one people cut, and it is the most important line in the prompt. Ask a model to prioritise clusters and it will reach for numbers. It has none, so it produces plausible ones, and they look exactly like real ones. A quarter of content planning is now built on figures no tool ever returned.
Keep the constraint. If you have real volume, paste it and the model will use it. If you do not, the model reasons about intent and business value instead, which is the more useful answer anyway.
You are a technical SEO strategist. I am going to give you a list of keywords
exported from a keyword tool. Group them into topical clusters that map to
pages. Do not group them by surface word similarity.
Rules you must follow:
1. Cluster by search intent and by whether a single page could genuinely
satisfy every keyword in the cluster. Two keywords sharing a word do not
belong together if a searcher typing them wants a different page.
2. For each cluster, name the one page that should target it. If I gave you a
URL list, match the cluster to an existing URL where one fits, and only
write "new" when nothing fits.
3. Give each cluster exactly one primary keyword: the clearest intent match
for that page, not automatically the highest volume one.
4. Label each cluster's intent as one of: informational, commercial
investigation, transactional, navigational.
5. Put any keyword you cannot place into a separate "unplaced" list rather
than forcing it into a cluster. Forced keywords are how thin pages happen.
6. Flag any two clusters that would compete for the same query, and say which
one should own it and what the other should do instead.
Output a markdown table with these columns:
Cluster | Primary keyword | Supporting keywords | Intent | Target page (URL or "new") | Why this is one page
After the table, give me three things:
- The unplaced keywords, with one line each on why they did not fit.
- The cannibalisation risks you found, with your recommendation for each.
- The three clusters you would build first, chosen on intent and business
value rather than on volume, with one sentence of reasoning each.
Constraints:
- Do not invent keywords that are not in my list.
- Do not estimate search volume. Use only figures I supply, and if I supplied
none, leave volume out of your reasoning entirely and say so.
- If the list is too short or too mixed to form meaningful clusters, tell me
that instead of producing clusters of one.
My business: [ONE SENTENCE ON WHAT YOU SELL AND TO WHOM]
My existing pages: [PASTE URL LIST, OR WRITE "none"]
My keyword list: [PASTE THE EXPORT, INCLUDING A VOLUME COLUMN IF YOU HAVE ONE]What to change
Everything in square brackets is yours to replace. Nothing else needs editing.
[ONE SENTENCE ON WHAT YOU SELL AND TO WHOM]- Without this the model clusters generically. "We sell project management software to construction subcontractors" produces completely different clusters from "we sell project management software", because the second one has no buyer in it.
[PASTE URL LIST, OR WRITE "none"]- Your existing indexable URLs, one per line. This is what turns the output from a wish list into a plan, because the model can then tell you which clusters you have already half built. A sitemap export is the fastest way to get it.
[PASTE THE EXPORT, INCLUDING A VOLUME COLUMN IF YOU HAVE ONE]- The keyword list itself. Keep the volume column if you have one and drop everything else. Around 200 to 400 keywords is the sweet spot: fewer and the clusters are obvious, more and the model starts dropping rows silently.
How to run it
- 01Export your keywords and cut the columns
Export from whichever tool you use and keep two columns: keyword and monthly volume. Delete difficulty, CPC and the rest. Extra columns give the model more to reason about and it reasons about them badly, usually by ranking on difficulty when you asked it to cluster on intent.
- 02Get your URL list
Open your sitemap.xml and copy the URLs, or export them from your CMS. Skip pagination, tags and anything noindexed. If you do not have a sitemap, write "none" and take every cluster back as new.
- 03Fill the three variables and run it
Paste the prompt with your three inputs into ChatGPT, Claude or Gemini. Use a model with a long context window if your list runs past 300 keywords, and paste the list as text rather than uploading a file, which some models summarise before reading.
- 04Check the unplaced list before the table
The unplaced keywords are the most useful part of the output and the part everybody skips. A large unplaced list means your export is broader than your business, which is worth knowing before you plan forty pages around it.
- 05Sanity check two clusters by hand
Take two clusters and search the primary keyword. If the pages ranking are a different type from the page the model told you to build, the cluster is wrong regardless of how neat the table looked. Models are good at grouping and weak at reading a live SERP they cannot see.
- 06Build the first cluster and check the page
Write the page for the highest priority cluster, then run it through the AI content readiness check to confirm an assistant can actually lift an answer out of it. A perfectly clustered page that no model can quote is a page that only works on Google.
Questions people ask
What is the best ChatGPT prompt for SEO keyword research?
The one that gives the model constraints rather than a request. Most keyword prompts say "group these keywords into clusters", which produces grouping by shared words. Telling it to cluster by search intent, to name one target page per cluster, to refuse to place keywords that do not fit and to flag cannibalisation is what turns the output into a plan you can build from.
Can ChatGPT do keyword research on its own, without an export?
It can suggest keywords and it cannot tell you how many people search them. Language models have no access to search volume and will produce confident numbers if you ask, which is the single most common way AI keyword research goes wrong. Use a real data source for the list and the model for the thinking.
How many keywords should I paste at once?
Between 200 and 400 works reliably. Past roughly 500 most models start dropping rows without saying so, and the giveaway is a cluster table that covers fewer keywords than you pasted. Split a large export by section of the site rather than sending it all at once.
Does this work in Claude and Gemini too?
Yes. It is written as plain instructions with no model specific syntax. Claude tends to be more willing to leave keywords unplaced, which is the behaviour you want here. Gemini tends to produce more clusters, so watch the cannibalisation section of the output more closely.
Why does the prompt tell the model not to estimate volume?
Because it will otherwise. Asked to prioritise clusters, a model with no data reaches for plausible looking numbers, and a plan built on invented volume is worse than a plan built on none. Removing the estimate forces it to reason about intent, which is the thing it is genuinely good at.
Unsubscribe in one click. We never pass your address on.