An entire Head of SEO function in one folder: 15 specialist skills across research, optimisation, growth and measurement. Every file is here in full โ open a dropdown, copy it, save it.
How one founder went from 250 to 750 clicks a day on this method โ
Free ยท No credit card required
A prompt is a request. A skill is a job description that outlives your mood.
Paste a great prompt today and you get a great answer today. Paste it again next month, reworded slightly because you remembered it differently, and the answer has a different shape โ so you can't compare the two, so neither one taught you anything.
A skill file takes the wording out of the equation. Same inputs, same steps, same output format, every run. Which is why each of the 15 files below carries seven things a prompt never does:
That last box is the part people leave out, and it's the part that does the most work. If the keyword skill calls a query "low CTR" at one number and the reporting skill calls it low at another, the folder contradicts itself and you stop trusting it. One shared file, twelve numbers, no drift.
The folder is designed for messy inputs. That's the whole point of it.
Then every skill below has something real to read.
seo. Save each skill below as its own .md file inside it, named after the name: line in its frontmatter._thresholds.md. Do this even if you only ever use three skills โ it's what stops two skills disagreeing.Fifteen skills that reason about your site are worth nothing if the model can't see your site. Every skill below reads Search Console data. Without it you get a well-structured essay about SEO in general โ confident, beautifully formatted, and about nobody's website.
You can paste CSV exports by hand, and the skills are written to accept that. The way I do it is the ChatSEO plugin: one read-only Google OAuth connection, then Claude can query Search Console and GA4 as tools. No export, no pasting, and it can re-pull next month without you.
Test it before you save a single file. Ask: "Which of my pages lost the most clicks last month?" Real URLs back means you're connected. Advice about how to find those pages means you aren't โ and all 15 skills will produce fiction in a nice table. Connect ChatSEO free โ
Every skill reads this file. Open a scale to see the numbers it uses.
SEO advice falls apart on undefined words. "Low CTR", "thin content", "a good link", "a big drop" โ every one of those is a judgement call, and a model left to make it will make a different one each time. So the folder makes the calls once, here, and every skill defers to this file.
Used by: GSC analysis, on-page, dead pages, reporting.
| Band | Avg position | Read as |
|---|---|---|
| Winning | 1.0 โ 3.0 | Defend. Only touch if CTR is below this site's own band average. |
| Striking distance | 3.1 โ 10.0 | Cheapest clicks on the site. Work here first. |
| Page two | 10.1 โ 20.0 | Real intent, wrong page. Usually an intent or internal-link problem. |
| Noise | 20.1+ | Ignore unless impressions exceed the floor in scale 2. |
CTR is always judged against this site's own average for that band, never a published industry table. Brand queries are excluded from the average first โ they inflate it enough to hide everything else.
Used by: every skill that ranks anything.
Below a floor, the correct output is "below the floor, not ranked" โ not a smaller-font recommendation.
Used by: keyword clustering, search intent, topical map, content brief.
| Class | Signal in the SERP | Page that wins it |
|---|---|---|
| Informational | Guides, forums, videos, People Also Ask | Explainer or tutorial |
| Comparison | Listicles, "best", "vs", review sites | Comparison or alternatives page |
| Transactional | Product pages, pricing, ads above the fold | Product, pricing or signup page |
| Navigational | One brand owns the top 3 | Nothing. Don't target it. |
Cluster rule: 3 or more queries sharing one intent class and one realistic destination URL = one cluster, named after its highest-impression query. Fewer than 3 = merge into a neighbour or drop. One cluster maps to exactly one URL โ that constraint is what prevents cannibalisation later.
Used by: content refresh, traffic drop diagnosis, internal linking.
Decayed = clicks down 30% or more over the last 90 days versus the 90 before, while impressions are flat or down less than 10%. Impressions holding is what separates decay (you lost the click) from a demand drop (nobody searched).
Cannibalisation = two or more URLs from your site ranking in the top 20 for the same query inside one 28-day window, with neither above position 5. Two URLs where one sits at 2 and the other at 14 is not cannibalisation โ it's a strong page and a weak one.
Seasonal = the same shape appeared in the same weeks last year. Always check this before diagnosing anything as a drop.
Used by: backlink audit, link building.
| Tier | What it is | Action |
|---|---|---|
| A | Editorial link, topically relevant site, page gets real search traffic | Study it. Get more like it. |
| B | Relevant site, but a directory, profile or resource list | Keep. Don't chase more. |
| C | Irrelevant topic, or a page with no traffic of its own | Ignore. Not worth a disavow. |
| D | Paid network, scraper, spun content, obvious footprint | Document. Disavow only with a manual action. |
Tier is assigned from what you can actually see. A link whose tier can't be determined is written as tier unknown โ never rounded up to B.
Used by: every skill, on every claim about cause.
| Label | Means | Allowed to |
|---|---|---|
| Confirmed | Visible in the data provided, with the figure quoted | Drive the recommendation |
| Probable | Consistent with the data, but the data can't prove it | Be named, with the test that would confirm it |
| Unverifiable | Would need data that wasn't provided | Be listed as what to pull next. Nothing else. |
Every skill is forbidden from producing a number that isn't in its inputs. The instruction is literal โ write "cannot compute from this data" and move on โ and it's the difference between an audit you can act on and an essay that sounds like one.
--- name: seo-thresholds description: Shared SEO definitions and thresholds. Every skill in this folder reads this file before deciding whether a number matters. Never override these locally. --- POSITION BANDS winning 1.0-3.0 | striking distance 3.1-10.0 | page two 10.1-20.0 | noise 20.1+ CTR is judged against THIS site's own average for that band, brand queries excluded. Never use a published industry CTR table. OPPORTUNITY FLOORS page enters a priority list: 1,000+ impressions / 28 days query named individually: 100+ impressions / 28 days CTR treated as signal: 30+ clicks a trend may be called a trend: 3+ months of history Below a floor, output "below the floor, not ranked". Do not rank it quietly. INTENT CLASSES informational | comparison | transactional | navigational Navigational queries owned by one brand in the top 3 are never targeted. CLUSTER RULE 3+ queries, one intent class, one realistic destination URL = one cluster. Name the cluster after its highest-impression query. Fewer than 3 queries: merge into a neighbour or drop it. One cluster maps to EXACTLY ONE URL. DECAY clicks down 30%+ over 90 days vs the prior 90, AND impressions flat or down <10%. If impressions fell too, it is a demand change, not decay. Say so. CANNIBALISATION 2+ of my URLs in the top 20 for one query in one 28-day window, neither above position 5. One strong page plus one weak page is not cannibalisation. SEASONALITY Before diagnosing any drop, check the same weeks last year. Same shape = seasonal. LINK TIERS A editorial, relevant, page has its own search traffic B relevant but directory / profile / resource list C irrelevant topic, or page with no traffic D paid network, scraper, spun, obvious footprint Undeterminable tier is written "tier unknown". Never round up. CONFIDENCE SCALE โ applies to every claim about cause confirmed visible in the data provided; quote the figure probable consistent with the data; name the test that would confirm it unverifiable needs data not provided; list it as what to pull next FORECASTING Requires 6+ months of history. Output a range, never a single number. State the assumption the range depends on. UNIVERSAL RULES Never state a number that is not in the inputs. Write "cannot compute from this data" and move on. Never estimate, and never carry an estimated number into a later step. Every skill ends on ONE action. Not a ranked list of actions. One.
Four groups, in the order you'd actually run them. Every file is complete โ open the dropdown and copy it.
What to go after, and what to leave alone.
The rule: one cluster, one URL. Anything that can't own a URL gets merged or dropped.
Most keyword lists fail because they're sorted by volume. This one is sorted by whether a single page could plausibly rank for the whole group โ which is the only property that turns a list into a content plan.
--- name: keyword-clustering description: Turn a raw query list into clusters that each map to one URL. Use before any content planning. --- Read _thresholds.md first. Apply the cluster rule and the intent classes from it. INPUTS โ ask for what is missing, do not proceed without it: - a query list with impressions (GSC export or connected Search Console), or a keyword list - the site's existing URLs, if you have them PROCESS 1. Drop every query under the individual-query floor. 2. Drop navigational queries owned by another brand in the top 3. 3. Assign each remaining query an intent class. 4. Group queries that share an intent class AND could be satisfied by one page. 5. Name each cluster after its highest-impression query. 6. Map each cluster to ONE URL: an existing one if it fits, otherwise "new page". 7. Merge or drop any cluster left with fewer than 3 queries. OUTPUT โ one table, ranked by total cluster impressions, capped at 15 rows: cluster | intent | total impressions | query count | destination URL | new or existing RULES - A query appears in exactly one cluster. If it fits two, the cluster with more impressions takes it, and you say which one lost it. - Never invent search volume. If impressions are missing, write "not in data". - No difficulty score. You cannot see one, and inventing one is worse than omitting it. End with ONE line: the cluster to build first, and whether it is new or existing.
The rule: read the SERP that exists, not the intent you'd prefer the query had.
Nearly every "we wrote the content and it didn't rank" story is this: a guide aimed at a query where Google is only showing product pages. The format is the fight, and you can see who won it before you write anything.
--- name: search-intent description: Read a live SERP and name the page format that can rank. Use before writing or rewriting any page. --- Read _thresholds.md first. Use its intent classes. INPUTS โ ask for what is missing: - the query, and the country and language it should be read in - the SERP itself: a screenshot, a paste of the top 10, or a live fetch If you cannot see the SERP, say so and stop. Do not describe what the SERP "probably" looks like โ that is the one failure mode of this skill. PROCESS 1. List the top 10 results: URL, page type, and whether it is a brand's own page. 2. Count the page types. The majority type is the format Google is rewarding. 3. Note SERP features present: ads, People Also Ask, video, images, local pack, shopping, AI overview. 4. Assign the intent class from _thresholds.md. 5. Judge whether a page of the winning format is realistic for this site. OUTPUT - intent class, one word - winning format, one line, with the count that justifies it (e.g. "7 of 10 are listicles") - SERP features present, comma separated - what would have to be true for us to rank, 2 bullets maximum - verdict: TARGET or SKIP, with the reason in one sentence RULES - Only describe results you can actually see. Never reconstruct a SERP from memory โ rankings change and yours are months stale. - If the top 3 are one brand's own properties, the verdict is SKIP. End with ONE line: TARGET or SKIP, and the format to build if TARGET.
The rule: only report gaps you could realistically close. A gap you can't close is trivia.
Gap analyses usually produce a list of everything a bigger competitor ranks for, which is demoralising and useless. The filter here is winnability, and it cuts the list by about 90%.
--- name: competitor-gap description: Find the topics a competitor covers that you could realistically take. Use quarterly. --- Read _thresholds.md first. INPUTS โ ask for what is missing: - my site and my current queries (connected Search Console, or an export) - 1-3 competitor domains, and their pages if you can fetch or be given them Never work from a competitor's traffic estimate. You do not have their Search Console. PROCESS 1. Build the topic list they cover and I do not. 2. Remove anything where I already have a page in the winning or striking band. 3. Remove anything that needs an asset I do not have: proprietary data, a physical location, a product I do not sell, a team I do not have. 4. For what remains, check whether I already rank ANYWHERE for a related query. Sites with an existing foothold on a topic close gaps far faster than sites without. 5. Rank the survivors by foothold first, impressions second. OUTPUT โ one table, capped at 10 rows: topic | their page | do I rank for anything related | my best related position | why it is closable RULES - Every "closable" claim cites something visible: my own position, my own impressions, or a page of theirs you actually read. - Confidence label on every row, per the confidence scale. - No estimate of their traffic, their authority score, or their budget. Ever. - Do not list gaps you removed in steps 2-3. The value here is the removal. End with ONE line: the single topic to take first, and the foothold that makes it winnable.
The rule: every page has a parent and a job. No orphans, no duplicates.
This is the skill that stops you writing the same page three times over two years. It runs on the output of skill 1, and it's the artefact you keep โ the internal-linking skill later reads it as its input.
--- name: topical-map description: Turn clusters into a hub-and-spoke map where every page has a parent and one job. Use after keyword-clustering. --- Read _thresholds.md first. INPUTS โ ask for what is missing: - the cluster table from keyword-clustering - the site's existing URLs and what each one currently targets PROCESS 1. Name 3-6 hubs. A hub is a topic the site wants to be known for, not a keyword. 2. Assign every cluster to exactly one hub. A cluster that fits no hub either proves a missing hub or does not belong on this site โ say which. 3. Under each hub, order spokes: existing pages first, then new ones by impressions. 4. Flag every existing URL that targets the same cluster as another existing URL. That is a cannibalisation candidate โ apply the definition in _thresholds.md. 5. Flag every existing URL that maps to no cluster. That is an orphan. OUTPUT For each hub: HUB NAME โ the hub URL, existing or "to build" spokes: URL or "new" | cluster | status: live, refresh, build, or merge Then two short lists: CANNIBALISATION โ pairs of URLs on one cluster, with the recommended survivor ORPHANS โ URLs mapping to no cluster, with keep or retire RULES - Maximum 6 hubs. If you want a seventh, one of the six is really two topics โ say which, and still give me six. - Never assign one cluster to two hubs. - Do not estimate how long anything takes. You do not know who is writing it. End with ONE line: the hub to build out first, and its first spoke.
Fix what you already have before you write anything new.
The rule: name the one issue costing the most traffic. Everything else waits.
Technical audits are where 47-item checklists come from, and a 47-item checklist gets read once and never worked. The banned-output section of this file is longer than its process section, and that's deliberate.
--- name: technical-audit description: Find the single technical issue costing the most organic traffic. Use quarterly, or after a migration. --- Read _thresholds.md first. INPUTS โ ask for what is missing: - a crawl export (any tool), or the Search Console page indexing report, or both - optionally: Core Web Vitals, the robots.txt, the XML sitemap PROCESS โ in this order, because each stage gates the one below it 1. INDEXABLE โ are the pages I want indexed actually indexed? Count them. 2. REACHABLE โ are they linked from anywhere? Count orphans. 3. CORRECT โ canonicals, redirects, status codes. Count wrong ones. 4. FAST โ Core Web Vitals, only if stages 1-3 are clean. Stop at the first stage that is broken. A speed problem does not matter on a page that is not indexed. For the broken stage, quantify it: how many URLs, and how many impressions or clicks sit behind them. If you cannot tie it to traffic, say "traffic impact not computable from this data" โ do not assert that it is severe. OUTPUT - one line per stage: the count, and pass or fail - THE ISSUE: the earliest failing stage, in one sentence - the affected URLs, capped at 10, with the figure that makes it the issue - the fix, as one instruction a developer could act on today BANNED - a severity-ranked list of findings - a second issue mentioned "while you're in there" - a summary of the stages that passed - the words "quick win", "low-hanging fruit", or "best practice" - any recommendation that is not tied to a number you pulled End with ONE sentence: the issue, and the single fix.
The rule: rewrite what's underperforming its own position band. Leave the rest alone.
Not a generic optimisation pass โ it only fires on pages ranking well and being clicked badly, judged against that band's average on your own site. Those pages are the cheapest traffic you will ever buy, because the ranking is already paid for.
--- name: on-page description: Rewrite the title, meta and H1 of a page that ranks well but is clicked badly. Use monthly on the worst offender. --- Read _thresholds.md first. Use its position bands and CTR rule. INPUTS โ ask for what is missing: - the URL, and its current title, meta description and H1 - that URL's Search Console queries: impressions, clicks, CTR, average position - the page's actual content, fetched or pasted PROCESS 1. Compute this site's average CTR for the band this page sits in, brand queries excluded. 2. Compare the page's CTR to that average. If it is at or above, STOP and say "this page is performing at band average โ do not touch it". That is a valid output. 3. Find the highest-impression query the page ranks for that the title does not answer. 4. Check the page body actually delivers that query. If it does not, the fix is content, not a title โ say so and stop. 5. Write ONE title (max 60 characters), ONE meta description (max 155), ONE H1. OUTPUT current CTR vs band average, with both numbers the query the title is missing TITLE: ... (character count) META: ... (character count) H1: ... one line on what changed and why RULES - One version of each. Do not give me three options to choose between. - Never write a benefit the page does not contain. Quote the line that supports it. - Never state a CTR you did not compute from the data given. - No emoji, no brackets stuffed with keywords, no year unless the page updates yearly. End with ONE action: ship these three fields, or fix the content first.
The rule: link from pages that already have authority to pages that need it. Nothing else.
The most underused lever in SEO, and the easiest to do badly. This one names source page, target page, anchor text and the paragraph to put it in โ because "improve your internal linking" is not an instruction anyone can follow.
--- name: internal-links description: Produce a specific list of internal links to add, with source, target, anchor and placement. Use monthly. --- Read _thresholds.md first. INPUTS โ ask for what is missing: - the topical map, or the list of URLs and what each targets - Search Console clicks per page, last 28 days - the content of the candidate source pages, so anchors can be placed truthfully PROCESS 1. Rank pages by clicks. The top decile are the authority pages. 2. Identify targets: pages in the page-two band, and pages that are new or orphaned. 3. For each target, find up to 3 authority pages whose content genuinely relates. Relevance is judged on the source page's actual text, not on its title. 4. For each pair, write the anchor text and quote the sentence it belongs in or beside. 5. Reject any pair where you cannot quote a real sentence. That link would be a bolt-on and reads like one. OUTPUT โ one table, capped at 15 rows: source URL | target URL | anchor text | the existing sentence it attaches to RULES - Never invent the sentence. If you were not given the source page's content, ask for it. - Anchor text describes the target, is 2-5 words, and is not "click here" or the bare URL. - Do not repeat the same anchor to the same target more than twice across the site. - No link graph diagram, no authority score, no PageRank estimate. You cannot see them. End with ONE line: the single link that should be added first, and why that one.
The rule: separate decay from a demand drop before recommending anything.
Half of what gets called "content decay" is just fewer people searching, and rewriting a page can't fix that. The impressions test in scale 4 is what tells the two apart, and it takes one line of the data you already have.
--- name: content-refresh description: Find pages that lost clicks while demand held, and say exactly what to change. Use monthly. --- Read _thresholds.md first. Use its decay definition literally. INPUTS โ ask for what is missing: - Search Console: clicks, impressions and average position per page, for the last 90 days AND the 90 days before that - optionally the same window last year, for the seasonality check PROCESS 1. Compute the change in clicks and in impressions for every page. 2. Apply the decay definition. Pages failing the impressions half are NOT decayed โ put them in a separate short list labelled "demand change, not decay". 3. For the decayed pages, check the position change. Position down means you lost ranking; position flat with clicks down means you lost the click, which is a title, snippet or SERP-feature problem. 4. Check seasonality before finalising anything. 5. Pick the one page with the largest absolute click loss that is genuinely decayed. OUTPUT DECAYED โ table capped at 8: page | clicks before/after | impressions before/after | position before/after | lost ranking or lost the click DEMAND CHANGE โ page list only, one line, no recommendations THE ONE TO FIX โ the page, the diagnosis in one sentence, the change to make RULES - Never recommend "refresh and republish". Name the specific change: the section that is now wrong, the query the page stopped answering, or the snippet that stopped earning. - If the position data is missing, say "cannot distinguish ranking loss from CTR loss without position data" and ask for it. Do not guess which one it is. - Percentages are shown with both raw numbers. A 40% drop from 5 clicks is not news. End with ONE action: the page, and the single change to make to it.
New surface: pages, links, maps, and AI answers.
The rule: the brief is built from the SERP that exists, and it names what to leave out.
A brief that only says what to include produces a page that says everything and ranks for nothing. The exclusions section is the one writers actually thank you for.
--- name: content-brief description: Build a brief a writer can execute without asking questions. Use after search-intent has returned TARGET. --- Read _thresholds.md first. INPUTS โ ask for what is missing: - the cluster: its queries and their impressions - the search-intent verdict for the head query, including the winning format - what this site can credibly claim: product, data, experience If the intent verdict is missing, run search-intent first. Do not brief blind. PROCESS 1. State the format the SERP is rewarding, from the intent verdict. 2. Take the sections from what the ranking pages actually cover, not from a template. 3. Add the section only this site could write โ the product, the data, the experience. If there isn't one, say so plainly. That is a real finding about the page's odds. 4. Name what to LEAVE OUT: subtopics belonging to a different cluster, and background the reader of this query already has. 5. Set the length from the ranking pages, as a range, not a target word count. OUTPUT URL: the destination, from the topical map FORMAT: one line, with the SERP evidence TITLE: one working title, max 60 characters SECTIONS: H2s in order, each with one line on what it must answer MUST CITE: the specific data, screenshot or example the page needs LEAVE OUT: 3-5 bullets LENGTH: a range, with what the ranking pages run at RULES - No keyword density, no LSI list, no "include the keyword 5 times". None of that is real. - Never invent a statistic for the writer to cite. Name the source they must go get. - One title. Not three. End with ONE line: what the writer opens first.
The rule: tier every link A to D, then only chase more of what tier A already worked.
Link building goes wrong when it starts from a list of prospects instead of from the links you already earned. The A-tier links you have are a description of who links to sites like yours โ that's the prospect list.
--- name: backlink-audit description: Tier existing backlinks, then derive the next link target from the tier A pattern. Use quarterly. --- Read _thresholds.md first. Use its link tiers exactly. INPUTS โ ask for what is missing: - a backlink export from any tool: source URL, target URL, anchor text - optionally, whether there is a manual action in Search Console PROCESS 1. Tier every link A to D. Where you cannot see enough to judge, write "tier unknown". 2. Count each tier. Report the counts before any analysis. 3. Look only at tier A. What do those sites have in common: topic, format, why they linked? 4. Find which of my pages earned them. That page type is my linkable asset. 5. Name one prospect type โ not one specific site โ that matches the tier A pattern. OUTPUT tier counts: A / B / C / D / unknown TIER A โ table: source | my page they linked | why they linked, in 5 words THE PATTERN โ one sentence MY LINKABLE ASSET โ the page or page type, with the count of A-tier links it earned NEXT TARGET โ the prospect type, and the page I would pitch RULES - Never recommend disavowing without a manual action. Say so explicitly if D-tier links exist: "D-tier links present; no action unless a manual action appears." - No domain authority, no spam score, no trust flow. Those are vendor metrics you cannot see, and quoting one you were not given is inventing a number. - Do not write outreach copy here. That is a different job. End with ONE line: the single prospect type to approach, and the asset to pitch.
The rule: the profile and the site have to say the same thing. Check that before anything else.
Local rankings turn on consistency far more than on content, and the fastest wins are almost always a category, a service area or a name that disagrees between the profile and the site.
--- name: local-seo description: Reconcile a Google Business Profile against the website and name the one fix. Use monthly. --- Read _thresholds.md first. INPUTS โ ask for what is missing: - the Google Business Profile: name, primary category, secondary categories, service areas, hours, description - the website's contact or location page - optionally: Business Profile insights, and the top 3 local competitors' categories If you cannot see the profile, ask for a screenshot. Do not describe a generic profile. PROCESS 1. Compare, field by field: business name, address, phone, hours, services. Any disagreement between profile and site is the finding. Stop hunting after that. 2. Check the primary category against what the business actually sells. The primary category does more for local ranking than every other field combined. 3. Compare categories against the local competitors, if given. 4. Check the site has a page for each real service area. Not a doorway page per town โ a real page per area you genuinely serve. 5. Check reviews only for whether recent ones are answered. Never estimate review counts. OUTPUT MISMATCHES โ table: field | on the profile | on the site CATEGORY โ current primary, and whether it matches what is sold, with the reason SERVICE AREAS โ areas claimed with no page, and pages with no area THE ONE FIX โ the single change with the largest expected effect, and why RULES - Never invent a category name. Only use categories you were shown or that appear in Google's list; if unsure, describe it and ask. - No "post weekly to your profile" advice unless the insights data shows posts are already earning views. End with ONE action: the single field to correct today.
The rule: cited, mentioned or absent. Three states, no vibes.
GEO gets talked about in the abstract constantly. This skill makes it concrete: run your real questions, record which of three states you're in, and fix the specific thing that makes a page quotable rather than merely correct.
--- name: ai-answers description: Audit whether AI assistants cite you for your core questions, and fix what makes a page citable. Use monthly. --- Read _thresholds.md first. Use the confidence scale on every claim. INPUTS โ ask for what is missing: - 5-10 questions a buyer would actually ask, in their words - the AI answers themselves, pasted in, with which assistant produced each - my pages that should have been the source I cannot see what an assistant returned unless you paste it. If answers are missing, give me the question list to run and stop there โ that is a complete, useful output. PROCESS 1. For each question, record one of three states: CITED โ my page is linked or named as a source MENTIONED โ my brand appears with no link ABSENT โ neither 2. For CITED, note which page and which sentence was used. That sentence is the pattern. 3. For ABSENT, note who was cited instead and what shape their content took: a direct definition, a table, a step list, a number with a date. 4. Compare my page to the cited source on ONE axis: is the answer extractable as a standalone passage, or is it distributed across the page? 5. Name the single page change that would make the passage extractable. OUTPUT - table: question | state | who was cited | my page that should have won - counts: cited / mentioned / absent - THE PATTERN โ what the cited sources have in common, one sentence - THE FIX โ one page, one change, with the passage rewritten as it should appear RULES - Never claim a page "will be cited". State the change and the confidence label. - Never report a state for a question whose answer you were not given. - No made-up share-of-voice percentage. Report the counts you actually recorded. End with ONE action: the page to rewrite, and the passage to put at the top of it.
The part that tells you whether any of the above worked.
The rule: strip brand queries first. Everything else is a lie until you do.
On my own site, 88% of clicks came from three brand queries. Every chart that included them said the site was healthy. Stripping brand is the first move in this file for exactly that reason.
--- name: gsc-analysis description: Read the full Search Console funnel and name the single constraint holding the site back. Run first, then quarterly. --- Read _thresholds.md first. Use its bands and floors. INPUTS โ ask for what is missing: - Search Console, connected or exported: queries and pages, last 90 days, and the 90 days before for comparison - my brand terms, so they can be excluded. If I have not given them, ask. Do not guess which queries are branded. PROCESS โ the order gates itself; each stage decides whether the next one matters 1. BRAND SPLIT โ clicks from brand vs non-brand. Report both, then work non-brand only. 2. IMPRESSIONS โ total and direction vs the prior 90 days. 3. POSITION โ how many queries sit in each band from _thresholds.md. 4. CTR โ actual CTR per band, against this site's own average for that band. 5. PAGES โ pages above the impressions floor with CTR under the band average. One line per stage: the number, the direction, healthy or not. Then name THE ONE binding constraint: the EARLIEST broken stage, with two sentences on why that stage and not the next, quoting the numbers you pulled. A CTR problem is not worth solving on pages Google is barely showing. BANNED - a list of findings, a severity ranking, a second constraint "for later" - a recap of the stages that were fine - the word "additionally" If a figure is not in the data, write "cannot compute from this data" and move on. Never estimate, and never carry an estimate into a later stage. End with ONE sentence: the constraint, and the single next action.
The rule: every cause gets a confidence label. "Probably the update" is not a diagnosis.
The reason drops stay unsolved is that the first plausible story gets accepted. Forcing confirmed / probable / unverifiable onto every candidate is what keeps the real cause in play long enough to be found.
--- name: traffic-drop description: Diagnose an organic traffic drop with a confidence label on every candidate cause. Use when traffic falls. --- Read _thresholds.md first. The confidence scale is mandatory here. INPUTS โ ask for what is missing: - the date the drop started, or the data to find it - Search Console for 60 days before and everything since: clicks, impressions, position, by page and by query - what changed on the site and when: deploys, redesigns, migrations, deletions - the same window last year, for seasonality If there is no change log, say so โ it is the single most common reason a drop stays unexplained, and I would rather you tell me than fill the gap with a guess. PROCESS 1. Locate the drop precisely: which day, and is it a cliff or a slope? A cliff points at something we did. A slope points at competition or decay. 2. Isolate it: is the drop site-wide, or one section, or one page, or one query? Never diagnose site-wide without checking whether it is one page. 3. Split clicks from impressions. Impressions holding while clicks fell means we lost the click, not the ranking โ a different cause entirely. 4. Check seasonality against last year before considering anything else. 5. Test candidates IN THIS ORDER, and label each confirmed / probable / unverifiable: our own change ยท indexing or coverage change ยท position loss on specific queries ยท SERP layout change ยท demand change ยท algorithm update Algorithm update is LAST because it is unfalsifiable and ends the investigation. OUTPUT - the drop: date, size in clicks, cliff or slope - the scope: site-wide, section, page or query, with the numbers - candidate table: cause | confidence | the evidence | how to confirm it - THE DIAGNOSIS โ the highest-confidence cause, in one sentence RULES - No cause is stated without its label. A probable cause is never written as the cause. - Never blame an algorithm update you cannot date and correlate. - If everything is unverifiable, say that, and list what data to pull. That is a correct answer, and a better one than a confident wrong story. End with ONE action: the fix if confirmed, or the exact data to pull if not.
The rule: report what changed and what you did about it. Forecast as a range or not at all.
The last skill closes the loop the first fourteen open: what you shipped, what moved, what didn't, and what's next โ short enough that someone actually reads it.
--- name: seo-reporting description: Write the monthly SEO report: what changed, what we did, what is next. Use monthly. --- Read _thresholds.md first. Use its forecasting rule. INPUTS โ ask for what is missing: - Search Console for the month and the month before: clicks, impressions, position, split brand and non-brand - what we actually shipped this month, with dates - optionally GA4 conversions from organic PROCESS 1. Report non-brand clicks first, with brand shown separately underneath. 2. For each thing we shipped, check whether the pages it touched moved. Attribute only where the timing and the page line up. Otherwise write "no measurable change yet" โ with the date it shipped, so next month can revisit it. 3. Name what moved that we did NOT cause. Being honest about luck is what makes the attributed wins believable. 4. Forecast only with 6+ months of history, and only as a range with its assumption. Otherwise write "not enough history to forecast" and give the trend direction. OUTPUT โ the whole report fits on one page THE NUMBER โ non-brand clicks, this month vs last, with the raw figures WE SHIPPED โ bullet per item: what, when, did it move MOVED WITHOUT US โ 1-3 lines DIDN'T WORK โ anything shipped 60+ days ago with no movement. Do not skip this section. NEXT โ one action, carried from whichever skill named it RULES - Every percentage is shown with the raw numbers behind it. - Never attribute a rise to work whose dates do not line up. Say "timing does not support attribution". - No projection of revenue from clicks unless given a conversion rate and a value. - No chart descriptions. Numbers, sentences. End with ONE line: the single thing next month is about.
Worth saying plainly, because you'll hit it in week two.
Fifteen files make Claude reason like an SEO operator. They don't make it employed as one. Four things are structurally outside what a folder of text can do:
That gap is exactly what I've been building ChatSEO to close: it holds the Search Console connection so nothing gets pasted, it remembers what it told you in March, and it can push the fix to your site and check a month later whether it worked. The folder above is genuinely the same thinking โ this is the version that doesn't need you to remember to run it.
This is the Search Console graph from a ChatSEO user running this exact loop โ find the binding constraint, fix the pages already ranking, recheck the following month. No new content, no link building.
Everything on this page runs on a Search Console export and 15 text files โ and you can try it here for free if you'd rather not be the one remembering to run them.
One SEO employee that reads your Search Console, names the single thing holding the site back, writes the fix, ships it โ and tells you a month later whether it worked.
Try ChatSEO free โNo credit card required