The headline A/B loop
Title tags are the single biggest click-through lever in organic search, and most blogs write one at publish time and never touch it again — leaving 10–40% of click-through on the table on every post. True A/B testing is hard in search because you can’t show different titles to different users on the same results page. But you can test sequentially: ship variant A for two weeks, swap to variant B, compare. Over a year that’s three or four iterations per post and measurably better titles archive-wide. The reason nobody does it is bookkeeping — tracking variants, swapping them, measuring the shift. With a folder of markdown, frontmatter, and a weekly cron, that bookkeeping is trivial.
What you need
- Specter synced to your blog
- An AI assistant you already use
- Search Console access (manual export is fine; the API is better)
The recipe
This one is a loop, in two phases:
- Setup — generate candidates (once). Pull with Specter, then run the variant prompt to give every post a
title_candidateslist and atitle_historyblock in frontmatter. Dry-run and push. - Rotate (weekly). Export Search Console → Pages → last 14 days, run the rotation prompt to record the current title’s performance and swap in the next candidate, then dry-run and push.
- Schedule it. Run the weekly step via cron or GitHub Actions. After about three months every post has three or four titles measured — lock each to its winner (highest CTR with enough impressions).
The prompt
The one-time variant generator:
For every post, read the current title and body and generate 4 alternative
titles in distinct patterns (question, numbered/specific, comparison, outcome
promise). Each must be 45–65 characters, include the primary keyword, make a
specific promise, and avoid "ultimate / best / guide / everything you need to
know". Write them to a `title_candidates` frontmatter list (impressions 0,
clicks 0), and seed `title_history` with the current title and today's date.
Don't change the live `title`. Frontmatter only.
The weekly rotator:
Using the last-14-days Search Console CSV: for each post, record impressions and
clicks against the open `title_history` entry. If the post had < 200 impressions
in the window, roll the current title over another week (too little signal).
Otherwise swap in the next `title_candidates` entry as the live title and open a
new history entry. When candidates run out, lock the post to the highest-CTR
title with >= 500 impressions. Log rotations, skips, and locks.
Cost and time
| Phase | Tokens | Cost | Cadence |
|---|---|---|---|
| Setup (200 posts × 4 variants) | ~600k | $1.20 | Once |
| Weekly rotation | ~80k | $0.15 | Weekly |
| Annual total | ~4M | ~$9 | — |
Pitfalls
- Don’t rotate too fast. Fourteen days is a floor; seven is too noisy and ignores weekly seasonality.
- Watch for position drift. If a post’s average position shifts mid-test, the CTR comparison is invalid. Add a position guard that skips posts whose position moved by more than two.
- Brand pages. Don’t run this on your homepage, about, or pricing pages — lock those titles.
Where to go next
Run the meta description sweep on the same cadence — title and description share the snippet, so rotating both compounds the click-through gain.