Google sends this newsletter 15 to 20 percent of its new subscribers. It also sends 40 to 50 percent of its new subscription revenue. That gap, from my August 2026 numbers, is why an independent publication still has a reason to chase blue links while every conversation in the industry has moved on to GEO and AI Overviews.
I'd already built an agent for half the problem. It takes a finished Substack draft, checks Tavily for what's currently ranking, then hands back a search angle, metadata, slug suggestions, internal links and image alt text. I still run it on every post.
It answers the wrong question first.
It can tell me how to fix a draft. It can't tell me whether that draft was worth writing. Fixing the order took three things: my own Search Console history, a $10 research tool with an MCP connection, and the willingness to drop the easiest keywords on my list.
The polish agent couldn't talk me out of a bad topic
Say I wanted to write about Claude Skills. My review agent could read the finished piece, check what was already ranking, and suggest a search phrase that seemed to fit. What it couldn't do was tell me how many people typed that phrase, how hard it would be to rank for, or what my own Search Console and Google Analytics data had been pointing at all along.
So the same thing kept happening. I'd spend a full writing session on a post, bring it to the agent for polish, and find out afterwards that the phrase I'd picked barely got searched, or that a stronger opportunity had been sitting one click deep in my own account data the whole time.
I needed the evidence before the draft existed, not after it.
$199 a month to use a tenth of a tool
Tools for this already exist, and they're serious ones. Ahrefs has a $29 Starter plan, but MCP access only begins at the $129-per-month Lite tier. Semrush's SEO plan runs $139 a month, and its MCP-enabled plan costs $199 as of August 2026.
Both platforms carry far more capability than a one-person newsletter needs for one research job. I couldn't justify that bill to use a fraction of the feature set.
What I wanted was narrow: current keyword and competitor evidence, a read-only line into Search Console and Analytics, and direct MCP access so my agent could pull the data itself instead of sending me into another dashboard. That last part is the whole point. My AI Maker agent already knows my publication goals, reader profile, content archive, conversion analysis and SEO rules. I wanted it holding all of that next to what people actually search for and which pages already win those searches.
OpenSEO cost $10 a month on its hosted plan when I tested it. Its MCP connection lets Claude Code, ChatGPT, Codex and other compatible agents call its research tools directly. It reads Search Console and Analytics on a read-only basis, then combines that first-party data with keyword estimates, live search results and competitor research.
Search Console is the cheapest research you already own
For AI Maker, the first place I looked was Google Search Console. It showed the queries already pulling my posts into Google, the pages tied to those queries, and where I had room to move. I filtered for recent non-branded queries sitting around positions 5 to 20.
Those positions don't guarantee an easy win. But Google already associates my site with the subject, which makes them better starting points than a broad topic an agent invents on its own.
I also read the words people stacked around each subject. A setup, a guide, a review, a comparison, or a way to connect two tools? Those modifiers tell you what the searcher is actually trying to get done.
Then I checked the queries against my archive. My data/content-index.csv holds 186 indexed URLs, so the agent could see whether a page already served the search, whether an older page could be sharpened, or whether several posts were competing for the same intent. Publishing goals and directional conversion data went on top of that. Four inputs, then: Search Console queries and their connected pages, my existing archive, my reader and publishing goals, and Google Analytics or Substack outcomes when they changed the priority.
No search history yet? Start with hypotheses
For a newer site the process still works, just from a different starting point. Ask the agent to read the homepage, the About page, product or service pages, and the strongest existing content. It should work out who the site helps, what those people are trying to do, what the site can credibly help with, and which audiences or topics would be a poor fit.
From there it generates five to ten specific query hypotheses. Hypotheses is the operative word: at that stage nobody knows whether the phrases get searched, or what kind of page Google rewards for them.
Where the estimates come in
For each candidate query I checked estimated search volume, trend, keyword difficulty, likely intent, and the pages currently ranking. A query survived only when three things held: enough demand to bother investigating, intent that matched my audience or offer, and a page type I could credibly create or improve.
Those volume and difficulty numbers are estimates. I used them to compare opportunities against each other, never as ground truth. Search Console stayed the direct evidence of what had already happened on my site. From the Claude Code cluster alone, that filter cut a wide field down to five to ten approved queries, enough to define the search area and point OpenSEO at the right competitors.
How competitor gaps turned into five decisions
With approved queries in hand, OpenSEO surfaced the domains that kept ranking across them. I picked the competitors that matched my audience, inspected their ranking pages, and ran a second keyword pass on whatever gaps looked useful. The last check happened inside my own archive: for every opportunity, the agent had to decide whether I needed a new page, already had the right one, needed broader coverage on an existing page, or should leave the topic alone.
Five labels came out of that. TEST means keep investigating before deciding. WRITE means create a distinct new page. UPDATE means retarget an existing page that should own the query. EXPAND means keep a page's current target and add the missing coverage. IGNORE means leaving the opportunity outside the plan entirely.
One competitor kept showing up: Ruben Hassid's Substack. As of August 24, 2026, OpenSEO estimated his site at 30,394 organic traffic and 970 ranking keywords, against 19,418 traffic and 682 keywords for AI Maker. We overlap heavily on keywords targeting "Claude skills." Ruben uses exact-match slugs, publishes one page per named topic, and builds around specific problems like Claude usage limits. None of the pages in his top 100 ranking keywords covered Claude Code hooks, subagents, MCP, plugins or CLAUDE.md. That gap list is where the decisions got interesting.
Update: the page that already converted, aimed at the wrong phrase
OpenSEO put "claude code hooks" at 3,600 monthly searches with a keyword difficulty of 16. I already had a paid post on Claude Code hooks. It had pulled 906 search clicks, ranked around position 8.5, and brought in nine attributed paid subscribers, roughly 9.93 subscribers per 1,000 search clicks. One of the strongest conversion rates in the whole research set.
Ruben had no hooks page among his top 100 rankings. But the right asset already existed on my side, so a second broad Claude Code post would have added overlap without solving the targeting problem. The call was UPDATE: sharpen the existing page around "claude code hooks" and protect the conversion it already had.
Write: the keyword that looked too easy
"Claude memory" looked almost too good on paper. An estimated 2,900 monthly searches, a keyword difficulty of 2, and no memory page in the ranking set I reviewed for Ruben. My archive told a more complicated story: I already had a guide on Claude Projects memory ranking around position 6 with 3,218 search clicks. A new page with a broad angle could cannibalize it.
So the agent flagged a possible WRITE, medium cannibalization risk, one decision still unresolved. The existing guide keeps Claude Projects memory. Any new page would have to focus specifically on Claude Code memory through CLAUDE.md and continuity across sessions.
I haven't approved that page yet.
I need to confirm the two posts can genuinely answer different searches before I write a word of it. That's the part of the exercise I keep coming back to: the research found the opportunity and then handed me back the exact judgment call I still had to make myself.
Expand: a competitor proving the market exists
My existing post on Claude Code usage limits already ranked around position 6.8. Right intent, narrow query coverage. Ruben's equivalent page ranked for a broader family of 21 keywords with an estimated traffic value of 2,742 across them, and sat around position 6 for "claude usage limits" itself, wedged between two Anthropic pages.
That was enough evidence that an independent Substack page can compete here, and I had no other page fighting for the same territory. The call was EXPAND: keep the existing page, add the missing usage-limit questions, skip the duplicate.
Ignore: the keywords that looked best on paper
This was the most useful decision in the plan, precisely because the numbers looked so attractive. OpenSEO put "claude code vs cursor" at 6,600 monthly searches with a keyword difficulty of 5. "Perplexity vs claude" showed 2,900 searches at a difficulty of 0. On volume and difficulty alone, both read as free wins.
My own conversion data said otherwise. Across six comparable AI Maker pages, tool-comparison posts had produced 17,428 search clicks and six attributed paid subscribers, about 0.34 subscribers per 1,000 clicks, based on the August 18, 2026 archive analysis. Build and method posts in the same analysis averaged around 8.2 per 1,000, roughly 24 times better.
The call was IGNORE, for search-driven revenue specifically. I may still write a comparison when timeliness, authority or social reach justifies it. It just doesn't earn a slot on the SEO monetization calendar.
Run through the archive, those four decisions gave me the plan I wanted: which page to work on first, which new posts still needed evidence before I'd commit, and which tempting keywords didn't belong on the list at all.
One research sprint, rebuilt as an agent
After that first run, I wanted the same process on demand instead of reassembled from scratch every time. So I turned it into an SEO research agent with one job: run competitive keyword research and generate a content plan so I can expand my keyword territory deliberately.
It delegates to three subagents. The first finds and validates the starting query territory. The second selects relevant competitors, inspects the pages that matter, and proposes gaps. The third validates those gaps, groups the surviving queries, determines page ownership and surfaces cannibalization risk, which is exactly the kind of call the Claude memory case required.
Four pieces make it work:
- A local project foundation that records your site, audience, offers, goals, writing rules, OpenSEO connection, content inventory and any business outcomes worth tracking.
- The OpenSEO data connection, giving the agent Search Console plus current keyword, search-result and competitor evidence through MCP, with Google Analytics addable when it changes how you prioritize.
- One delegated research skill that kicks off a full opportunity study from a single request while the three subagents handle their stages.
- A four-artifact record (queries, competitor findings, opportunity map, final decisions) kept in one dated run folder so the reasoning stays auditable.
Before you start you need a coding agent that can read local files and run a project-level skill, an OpenSEO account, Search Console for an established site or enough site and offer detail to run the low-data path, and optionally Google Analytics or Substack data if you want prioritization to go past raw traffic.
OpenSEO's research tools run on credits, so start with small batches and check the results after each stage before scaling up. My latest full run cost less than a dollar.
What sticks with me is the IGNORE. A keyword with 6,600 searches and a difficulty score of 5 cost me nothing to walk away from, because my own archive already knew that category converts at a fortieth of my best posts. Search volume tells you what people type. The archive tells you what pays.
Google still sends 40 to 50 percent of the revenue. It just doesn't get to pick the calendar.