The complete playbook for building an AI-powered content engine that actually ranks β from zero to 4.6M impressions in 3 months.
This is the methodology, the toolkit, and the hard-won lessons from building a content engine on ValueAddVC.com using AI agents, GSC feedback loops, and automated quality gates. 14 diagnostic scripts, 9 battle-tested configs (safety guards, agent orchestration, quality gates, anti-AI detection), structured data schemas, and CI automation β everything you need to replicate the system.
Not theory. Not prompts. The actual operating system behind a site that went from 604K to 4.62M monthly impressions.
Built by Trace Cohen at ValueAddVC.com.
The Content Engineβ AI agent orchestration (multi-model pipelines: Opus/Fable for planning, Sonnet for writing, Haiku for grunt work), 5-format content rotation, voice training, anti-AI fingerprint detectionThe GSC Feedback Loopβ Weekly automated reports, title rewrite candidates, cannibalization detection, query gap mining, striking distance optimizationThe Quality Systemβ 9 publish gates, template phrase blocklists, source verification, fact-checking, structured data validation** The Safety Layer**β Repo locks, rebase guards, build cost control ([nobuild] tags, deploy-tick), self-healing heartbeats, content writer isolation from gitThe Growth Loopβ Keyword anticipation (publish before demand spikes), living page refreshes, internal link graph optimization, news sitemap + WebSub for instant crawling
flowchart LR
GSC[Google Search Console API] --> Report[Weekly Report]
Report --> Triage{Triage}
Triage --> Rewrite[Title Rewrites]
Triage --> Merge[Merge Cannibals]
Triage --> Refresh[Refresh Stale Pages]
Triage --> Kill[Kill Dead Weight]
Content[Content Pipeline] --> Gates[Quality Gates]
Gates --> |Pass| Publish[Publish]
Gates --> |Fail| Fix[Fix & Retry]
Publish --> GSC
Rewrite --> GSC
Merge --> GSC
Refresh --> GSC
style GSC fill:#0d7377,color:#fff
style Gates fill:#0d7377,color:#fff
style Publish fill:#15803d,color:#fff
style Kill fill:#b91c1c,color:#fff
The feedback loop: GSC data feeds diagnostic scripts β scripts surface what needs fixing β AI agents make the fixes through quality gates β improved rankings produce better GSC data β repeat. Every week the system gets smarter.
| Script | What It Does |
|---|---|
gsc-rewrite-candidates.mjs |
|
| Finds title rewrite opportunities from GSC data β pages ranking position 4β20 with high impressions but low CTR | |
template-detector.mjs |
|
| Scans your content for AI template fingerprints β the repeated phrases that signal scaled-content-abuse to Google | |
cannibalization-detector.mjs |
|
| Finds pages on your site competing for the same queries, splitting authority and ranking worse than one consolidated page would | |
weekly-report.mjs |
|
| Generates a weekly SEO performance report with trending queries, dropping pages, CTR triage candidates, and query monopolies | |
orphan-finder.mjs |
|
| Finds pages with zero inbound internal links β invisible to Google's link-graph crawler | |
content-audit.mjs |
|
| Scores every page into KILL / MERGE / UPDATE / PROMOTE / KEEP buckets based on GSC data + content quality | |
redirect-checker.mjs |
|
| Finds URLs in your sitemap that return 301/302/308 instead of 200 β these break GSC validation and waste crawl budget | |
refresh-tracker.mjs |
|
| Identifies high-traffic pages that haven't been updated recently β candidates for the "refresh drip" strategy | |
query-gap-miner.mjs |
|
| The retroactive keyword discovery engine β finds queries with real demand where you have no dedicated page. Google is telling you what to write. | |
striking-distance.mjs |
|
| Finds pages ranking position 5-20 with real impressions β the cheapest wins in SEO. Estimates click gain if improved. | |
rewrite-measurer.mjs |
|
| Before/after tracking for title rewrites. Take a baseline, make changes, measure impact 2-4 weeks later. | |
websub-ping.mjs |
|
| Notifies Google's hub that your feeds changed β triggers immediate crawl instead of waiting hours. Run after every publish. | |
indexing-submitter.mjs |
|
| Submits URLs to Google's Indexing API for near-instant crawling. 200 URLs/day quota. | |
broken-link-checker.mjs |
|
| Scans all content for outbound links and checks for 404s, timeouts, and redirect chains. Exits non-zero for CI. |
| File | Purpose |
|---|---|
format-rotation.json |
|
| The 5-format content system: Deep Explainer, News Analysis, Ranked List, Question-Led, Contrarian Take β with per-format word counts, chart requirements, and selection weights | |
quality-gates.json |
|
| Publish gate rules: cannibalization check, source URL verification, template phrase detection, shared closer detection, typecheck | |
anti-ai-rules.json |
|
| The complete blocklist of AI template phrases + style rules for making AI content sound human | |
refresh-rules.json |
|
| Rules for the refresh drip strategy β staleness thresholds by content type, refresh triggers, and a refresh checklist | |
keyword-anticipation.json |
|
| Event calendar methodology β publish content before IPOs, earnings, funding rounds, regulations so you're ranked when demand spikes | |
health-checks.json |
|
| Live-site health checks: leaked template variables, broken OG images, injected ad links, thin content, dead pages | |
content-pipeline-guards.json |
|
| Safety guards: repo locks, rebase guards, cannibalization checks, build cost control, self-healing heartbeats | |
agent-orchestration.json |
|
| Multi-model AI pipeline rules: Opus/Fable for planning, Sonnet for writing, Haiku for mechanical tasks. Max 3 concurrent agents. |
| File | Schema Type |
|---|---|
article-with-author.json |
|
| Article + Person author entity (the E-E-A-T foundation) | |
faq-page.json |
|
| FAQPage for blog posts β drives FAQ rich results | |
item-list.json |
|
| ItemList for ranking/comparison pages β the format sponsors want | |
news-article.json |
|
| NewsArticle + news sitemap template for real-time content |
sitemap.ts
β Next.js dynamic sitemap with honest lastmod datesnews-sitemap.ts
β 48-hour rolling news sitemap for Google News/Discoverinternal-link-component.tsx
β React component for related posts + a build-time internal link insertervercel-ignore.sh
β Build skip logic for Vercel: [nobuild] tags, content-only detection, deploy-tick pattern (saves $$$)
Every script has a sample output file so you can see what to expect before running anything:
weekly-report.json
β Full weekly report with trending queries, dropping pages, CTR triagerewrite-candidates.json
β Title rewrite opportunities with per-query diagnosiscontent-audit.json
β KILL/MERGE/UPDATE/PROMOTE/KEEP bucket assignmentscannibal-clusters.json
β Cannibalization clusters with wasted impression estimatestemplate-scan.json
β AI fingerprint scan with per-file phrase locationsorphan-pages.json
β Orphan, low-link, and dead-end page reports
β Step-by-step Google Search Console API setup (local auth + service account for CI)setup-gsc.md
weekly-seo-report.yml
β GitHub Action that runs the weekly report every Sunday, commits results, and optionally creates a GitHub issue with the summary
git clone https://github.com/TraceCohenTech/ai-seo-playbook.git
cd ai-seo-playbook
npm install
gcloud auth application-default login \
--scopes=https://www.googleapis.com/auth/webmasters.readonly
npm run rewrite-candidates -- --site sc-domain:yoursite.com
npm run template-scan -- --dir ./your-content-directory
npm run find-cannibals -- --site sc-domain:yoursite.com
npm run content-audit -- --site sc-domain:yoursite.com --dir ./your-content-directory
npm run find-orphans -- --dir ./your-content-directory
npm run weekly-report -- --site sc-domain:yoursite.com
npm run query-gaps -- --site sc-domain:yoursite.com --dir ./your-content-directory
npm run striking-distance -- --site sc-domain:yoursite.com
npm run refresh-tracker -- --site sc-domain:yoursite.com --dir ./your-content-directory
npm run check-redirects -- --site sc-domain:yoursite.com --sitemap https://yoursite.com/sitemap.xml
npm run websub-ping -- --feeds https://yoursite.com/sitemap.xml,https://yoursite.com/feed.xml
New to the GSC API?See[for a step-by-step setup guide.]docs/setup-gsc.md
These tools are one half of the system. The methodology β why these specific metrics matter, how to interpret the results, and how to build the feedback loop that makes your content engine self-improving β is in the full guide:
The AI SEO Playbook: How I Used AI to Build a Content Engine That Hit 4.6M Impressions in 3 Months
The guide covers:
- Building the content engine (architecture, voice training, format rotation)
- The GSC reckoning (the AI-overview discovery, title rewrites, cannibalization)
- The iteration loop (keyword anticipation, living pages, technical SEO bugs)
- The system (quality gates, weekly reviews, cost control)
These tools were built and refined on ValueAddVC.com over 3 months:
| Metric | Week 1 (May '26) | Now (Aug '26) |
|---|---|---|
| 3-Month Impressions | β | 4.62M |
| 3-Month Clicks | β | 17.3K |
| Daily Clicks (peak) | ~50 | 854 |
| Average Position | 12+ | 7.5 |
| CTR | 0.93% | 0.4% |
| Posts Audited | 480 | 960+ |
| Title Rewrites | 0 | 92 |
| Cannibalization Clusters Fixed | 0 | 21 |
| Template Phrases Purged | 500+ | 0 |
| Orphan Pages Linked | 0 | 191 |
*CTR is 0.4% because impressions grew ~8x β largely from AI-overview citations (GEO traffic) that don't produce clicks by nature. Human-intent CTR improved: ranked lists hit 6.8%, question-led posts hit 3.2%. The growth curve is near-vertical: Aug 13 alone hit 127K impressions and 854 clicks.
-
Create a Google Cloud service account with Search Console API access
-
Add the service account JSON as a GitHub secret named
GSC_CREDENTIALS -
Set the repository variable
GSC_SITE
to your GSC property (e.g.,sc-domain:yoursite.com
) - Set
CONTENT_DIR
to your content directory path (e.g.,./src/app/blog
) - Optionally set
CREATE_ISSUES
totrue
for weekly GitHub issue summaries - The workflow runs every Sunday at 9:30 AM ET automatically
The scripts are standalone Node.js β run them anywhere you can install googleapis
and authenticate with Google Cloud.
ai-seo-playbook/
βββ scripts/ # 14 diagnostic & tracking scripts
β βββ weekly-report.mjs # Weekly GSC performance report
β βββ gsc-rewrite-candidates.mjs # Find title rewrite opportunities
β βββ rewrite-measurer.mjs # Before/after rewrite tracking
β βββ query-gap-miner.mjs # Retroactive keyword discovery
β βββ striking-distance.mjs # Position 5-20 opportunities
β βββ template-detector.mjs # Scan for AI template phrases
β βββ cannibalization-detector.mjs # Find competing pages
β βββ content-audit.mjs # KILL/MERGE/UPDATE/PROMOTE scoring
β βββ orphan-finder.mjs # Find unlinked pages
β βββ refresh-tracker.mjs # Stale page detection
β βββ redirect-checker.mjs # Sitemap redirect problems
β βββ broken-link-checker.mjs # 404s and dead outbound links
β βββ websub-ping.mjs # Notify Google of feed changes
β βββ indexing-submitter.mjs # Google Indexing API submissions
βββ config/ # Quality gates, format system, anti-AI rules
βββ schemas/ # JSON-LD structured data examples
βββ examples/ # Next.js sitemaps + React components
βββ samples/ # Example output from every script
βββ docs/ # Setup guides
βββ .github/workflows/ # Weekly automated report CI
Found a template phrase pattern that should be in the blocklist? A better heuristic for the content audit scorer? See CONTRIBUTING.md for how to submit changes.
There's even a dedicated issue template for submitting new template phrases β the blocklist is never complete.
This toolkit was built and battle-tested on ValueAddVC.com β a venture capital content platform that went from 604K monthly impressions to 4.62M in 3 months using these exact scripts and methodology.
| May 2026 | August 2026 | |
|---|---|---|
| Daily clicks | ||
| ~50 | 854 (peak) | |
| Position | ||
| 12+ | 7.5 | |
| Template phrases | ||
| 500+ | 0 | |
| Orphan pages | ||
| 191 | 0 |
The full methodology is in the companion guide: The AI SEO Playbook
MIT
Built by Trace Cohen Β· ValueAddVC.com Β· t@nyvp.com