Between two checkpoints four weeks apart, Google clicks to this site went from 38 a day to 116 a day. I did not buy an SEO suite or hire anyone. Search runs from Claude Code, through a handful of small scripts and one routine that I repeat every four weeks. This post is the exact setup, the honest caveats on the numbers, and the mistakes that cost me time.
Treat SEO as operations, not tips. Connect Search Console and GA4 to Claude Code, generate the sitemap so it cannot ship a broken URL, ping IndexNow after every upload, sweep the index for pages Google dropped, and compare equal windows every four weeks against rules you wrote down in advance. Publishing useful pages is still the engine; the system makes sure none of that work leaks.
The Numbers, Honestly
| Metric | 18 Aug to 12 Sep | 15 Sep to 10 Oct |
|---|---|---|
| Google clicks per day | 38 | 116 |
| Google impressions per day | 5,892 | 9,261 |
| Click-through rate | 0.65% | 1.25% |
| URLs indexed | 519 of 532 | 682 of 695 (98.1%) |
Both windows are 26 days, from Google Search Console. Now the caveat, because this is the part most growth posts leave out: about 39% of the clicks in the second window came from just two posts, both about fast-moving topics. Spikes like that fade. The rest of the site still earned roughly 1,850 clicks, close to double the previous total, and that is the baseline I actually track.
The second caveat: more traffic did not bring more client enquiries. Most visitors come to read research, not to buy. That is the next thing the checkpoints measure. Clicks are an input, not the goal.
1. Connect the Data to Claude Code
Search Console and GA4 both have free APIs. I created a Google Cloud project, enabled the Search Console API, the URL Inspection part of it, and the GA4 Data API, then authorized them with OAuth for my own account. Claude Code calls small Python scripts that read those APIs and save the raw results to dated JSON files beside the site.
One trap cost me a week of confusing reports: while a Google Cloud OAuth app is in Testing mode, its refresh tokens expire after seven days. The scripts did not crash, they just started returning empty indexing data. Moving the app to production fixed it. If a sweep ever says "0 indexed", check the token before you panic about the site.
2. A Sitemap That Refuses Mistakes
This site publishes most days, so the sitemap is generated by a PHP script, never edited by hand. Two checks make it trustworthy:
- Preflight: before writing the file, the generator checks that every post listed in the index actually exists. If one is missing, it stops with an error instead of publishing a URL that would 404.
- Live verify: after an upload, the same script requests every URL in the sitemap on the live site and fails unless all of them return 200. Today that is 712 out of 712.
It also warns about titles longer than 70 characters, which Bing truncates. These are small things, but a sitemap full of redirects and dead links teaches search engines to trust it less.
3. IndexNow After Every Upload
IndexNow lets you tell Bing, Copilot, Yandex, Seznam, and Naver that a URL changed. They usually come to look within minutes. You host a key file at the root of your site, and the submitter sends a list of URLs. Mine checks that the key file is live before sending anything, so a forgotten upload fails loudly instead of silently wasting the ping.
Two rules: run it after the upload, never before, or the engines crawl the old version. And remember Google does not take part, which brings me to the most expensive lesson.
4. Sweep the Index, Then Ask Google Properly
A parallel script runs the URL Inspection API across every sitemap URL and records its coverage state, last crawl date, and the canonical Google chose. The output is a list, not a feeling: these 8 pages were crawled but not indexed, these 3 were discovered but not crawled yet.
For the pages that matter, I use Request Indexing in the Search Console web interface and add internal links from related pages. Every page I flagged this way in September was indexed by the next checkpoint.
What I do not use is Google's Indexing API for normal pages. It is meant for job postings and livestreams. For a blog post it returned a success code and then quietly discarded the request. Nothing in the response told me so.
5. The Checkpoint Is the Whole Trick
Every four weeks I pull the same numbers the same way and write them into a dated document: equal-length windows, clicks, impressions, CTR, indexing, and the sessions and events from GA4. Each experiment has its decision rule written before the data comes in. For example: "if the new films get barely any plays in ten days, no second batch". This month they did not, so there is no second batch, and I did not have to argue with myself about it.
This is what Claude Code is genuinely good at here. It runs the pulls, joins the data, and drafts the comparison. I make the calls, and the rules stop a good week from talking me into the wrong one.
What Did Not Work
- Overhauling a declining page. I spent a session rebuilding a flagship post whose impressions were falling. When I finally plotted it weekly, the decline had started three weeks before my changes. The topic had simply cooled. I retired the page.
- Chasing AI citations as traffic. Bing reported thousands of Copilot citations for this site over three months. GA4 counted one session from copilot.com in 28 days. Citations are worth having, but they are not visits.
- Reading CTR during a spike. I planned a per-post check on rewritten meta descriptions. Then site-wide CTR doubled on a topic spike, which would have made any result meaningless, so the read waits for a quieter window.
Start With This Prompt
Paste this into Claude Code from your own website's folder. It sets up the baseline and your first checkpoint without touching the live site.
Set up your first SEO checkpoint
Baseline, index check, and decision rules, with no live changes.
The full system, with the stack and dated results, is on the SEO Engine case study. If you would rather set it up on your own site with me, it is a module in my 1:1 training.