AI Content Pipeline: Keyword to Published, Costed
The six stages, the tool at each one, what a single article costs in tokens at list prices, and the hours that do not disappear no matter what you automate.
Table of contents
The chain is six stages, and the tools split cleanly by stage: keyword research (the Search Console API, free; Ahrefs from 29 dollars a month), brief (a model reading SERP and competitor extracts), draft (Claude, GPT, or a self-hosted Llama), edit (a human, with a model doing a first fact-check pass), publish (the WordPress REST API, or whatever your CMS exposes), and report (the Search Console API again). At published API rates the model spend is cents per article. The subscriptions and the human hours are the actual bill. Here is every line of it.
The six stages and what runs each one
| Stage | What it has to produce | Tool options | What I run |
|---|---|---|---|
| Keyword research | A query with real impressions and headroom | Search Console API, Ahrefs, Semrush, Keyword Planner | Search Console API + a 40-line Python script |
| Brief | Target query, angle, H2 skeleton, sources to cite | Model over a SERP scrape; Ahrefs content gap | Claude with web search, output pinned to a template |
| Draft | 1,200-1,900 words against the brief | Claude, GPT, Gemini, Llama via Groq | Claude Sonnet for the first pass |
| Edit | Every claim sourced, every number labelled, voice fixed | Human. A model can flag, not clear | Me, with a model doing a claims-only pass first |
| Publish | A row in the CMS, plus schema, sitemap, internal links | WordPress REST API, Contentful, Sanity, a Supabase insert | Supabase insert behind an approval queue |
| Report | Impressions and position for that URL, 28 days later | Search Console API, Looker Studio | Search Console API, same script as stage one |
The stages that automate well are the ones with a checkable output: expanding a seed keyword, drafting from a fixed brief, generating schema. The stage that does not automate is choosing what to write. Every time I let a model pick topics it produced competent posts about queries nobody searched. That decision needs the search data and a view of the business, and being wrong there is the expensive kind of wrong. More on the shape of the whole thing in what a content system actually is.
The publish step is the least interesting one
I do not run WordPress. This site is Next.js on Vercel with Supabase behind it, so publishing is a database insert. If you are on WordPress the equivalent is a POST to /wp-json/wp/v2/posts with an application password and "status": "draft".
Keep it on draft. An automated pipeline with publish rights has no natural stopping point, and the failure mode is not one bad post — it is forty bad posts found a week later, each one indexed. I wrote up the pattern I use instead in why my agents get an approval queue, not write access.
What one article costs in tokens
Worked example, stated as assumptions: one 1,500-word article, roughly 1.33 tokens per word, one pass per stage, no revisions. Prices are the published Claude API rates as of September 2026 — Sonnet 5 at 2 dollars in and 10 dollars out per million tokens, Opus 5 at 5 and 25 (Claude pricing).
| Stage | Input tokens | Output tokens | Sonnet 5 | Opus 5 |
|---|---|---|---|---|
| Keyword expansion and clustering | 8,000 | 2,000 | $0.036 | $0.090 |
| Brief from SERP extracts | 12,000 | 3,000 | $0.054 | $0.135 |
| Draft | 6,000 | 4,000 | $0.052 | $0.130 |
| Model fact-check pass | 12,000 | 4,000 | $0.064 | $0.160 |
| Title, meta, schema, internal links | 6,000 | 1,000 | $0.022 | $0.055 |
| Per article | 44,000 | 14,000 | $0.228 | $0.570 |
Twenty-three cents on Sonnet. Fifty-seven on Opus. That is the number people quote when they tell you AI content is free, and within the assumptions above it is correct.
The revision multiplier is where it stops being cents
The table assumes one pass. In practice the draft and fact-check rows run three times before I keep anything, which triples the two most expensive lines. On Opus that takes the article from $0.57 to about $1.15. Still cheap. Still not the bill.
If you want the draft row cheaper, the lever is model choice per stage, not per pipeline — expansion and metadata are fine on a small model, editing is not. I went through that tradeoff for a different workload in picking between Groq, DeepSeek and Llama.
What the stack costs per month
List prices, checked September 2026, linked so you can check them yourself.
| Line item | Price | Note |
|---|---|---|
| Google Search Console and its API | $0 | Both the keyword source and the reporting source |
| Ahrefs Starter / Lite | $29 / $129 per month (pricing) | Starter is enough to see competitor headroom |
| Semrush, entry SEO plan | $117.33 per month billed annually (pricing) | An alternative to Ahrefs, not an addition |
| Model API | usage-based, see the table above | Roughly $1 per finished article at three revisions on Opus |
| WordPress host, or Vercel Hobby plus the Supabase free tier | varies / $0 | My stack is the second one |
| Orchestration (cron plus a few hundred lines) | $0 | Vercel Cron on the free tier runs mine |
A working pipeline at ten articles a month, on Ahrefs Starter with Opus and three revisions, lands around $40. The tooling is not what makes content expensive.
The hours that do not disappear
This is the part the pipeline diagrams leave out.
| Stage | What the model genuinely does | What stays on you |
|---|---|---|
| Keyword research | Expands seeds, clusters, spots four posts targeting one query | Deciding which query deserves a page at all |
| Brief | Pulls the SERP, drafts an outline | Knowing which claim you can actually defend |
| Draft | The whole thing, competently | Nothing, honestly. This stage really is solved |
| Edit | Flags unsourced numbers, tightens sentences | Verifying every source. A model cannot clear its own citation |
| Publish | Formats, generates schema, suggests internal links | Checking the links resolve, and pressing the button |
| Report | Pulls the numbers | Deciding what they mean and killing what failed |
Fact-checking is the hour that never goes away, and it scales with output instead of shrinking. Worked example, again as an assumption: value your time at 50 dollars an hour and allow two hours per article for topic choice, source verification and the final read. That is $100 of labour against roughly $1 of tokens — a hundred to one. Any plan that treats token spend as the cost of the pipeline is off by two orders of magnitude.
The reporting stage, with a script you can run
Stage one and stage six are the same query against the same API, which is the only elegant thing about this pipeline. Export the Pages report from Search Console as CSV and run this. It ranks pages by how much a rewrite could plausibly win: impressions already earned, times the headroom above the page, times how badly the snippet converts. Pages in the top three score zero, because there is little left to win. Pages past position 20 score zero too, because those need a different page, not a better one.
#!/usr/bin/env python3
"""Rank Search Console pages by rescue priority.
Usage: python rescue_priority.py [gsc-pages-export.csv]
With no file argument it runs the built-in sample and self-checks.
Expects the column names Search Console uses in its Pages export:
"Top pages", "Clicks", "Impressions", "CTR", "Position".
"""
import csv
import sys
HEALTHY_CTR = 5.0 # assumption: 5% is a decent CTR for a page in positions 4-20
def num(value):
"""GSC exports CTR as 0.48% and impressions with thousands separators."""
return float(str(value).replace("%", "").replace(",", "").strip() or 0)
def score(impressions, position, ctr_pct):
"""Impressions earned x headroom above the page x how badly it converts."""
if position <= 3 or position > 20:
return 0.0
headroom = (position - 3) / position
waste = max(0.0, 1 - ctr_pct / HEALTHY_CTR)
return impressions * headroom * waste
def rank(rows):
scored = [
(score(num(r["Impressions"]), num(r["Position"]), num(r["CTR"])), r["Top pages"])
for r in rows
]
return sorted(scored, key=lambda t: -t[0])
SAMPLE = [
{"Top pages": "/blog/ai-content-pipeline-keyword-to-published",
"Clicks": "0", "Impressions": "310", "CTR": "0.00%", "Position": "5.8"},
{"Top pages": "/blog/what-is-a-content-system",
"Clicks": "6", "Impressions": "74", "CTR": "8.11%", "Position": "9.2"},
{"Top pages": "/blog/some-generic-industry-post",
"Clicks": "0", "Impressions": "1200", "CTR": "0.00%", "Position": "62.4"},
{"Top pages": "/blog/already-winning",
"Clicks": "40", "Impressions": "900", "CTR": "4.44%", "Position": "2.8"},
]
def main(argv):
if len(argv) > 1:
with open(argv[1], newline="", encoding="utf-8-sig") as fh:
rows = list(csv.DictReader(fh))
else:
rows = SAMPLE
assert rank(rows)[0][1].endswith("ai-content-pipeline-keyword-to-published")
assert score(900, 2.8, 4.44) == 0.0 # already ranking: leave it alone
assert score(1200, 62.4, 0.0) == 0.0 # position 62: a rewrite will not save it
print("self-check passed\n")
for value, page in rank(rows):
if value > 0:
print(f"{value:9.1f} {page}")
if __name__ == "__main__":
main(sys.argv)
Run it with no arguments and it prints self-check passed and one surviving row. The two zero-scored rows are the useful part: a page at position 2.8 and a page at position 62 both get filtered, for opposite reasons. Which metrics I watch and which I ignore is in the five SEO metrics that matter.
What I got wrong
I ran this pipeline for a quarter and shipped a lot of posts. My own Search Console numbers for the 85 days to 3 September 2026: 22 clicks from 4,553 impressions, a 0.48% CTR, across about 390 indexed URLs. Russia produced 1,320 impressions and zero clicks. The United States produced 970 impressions at an average position of 38.8 and also zero clicks. Nepal produced 8 clicks from 74 impressions — a 10.8% CTR at position 9.2.
The split by topic is sharper than the split by country. Posts about building things — Claude Code, Supabase, Vercel — sit at positions 2.8 to 15.5. Posts titled some variant of "[industry] content marketing" sit at 46 to 81. Same author, same domain, same quarter, same pipeline. The pipeline was not the variable. Topic choice was, and that is the one stage I had automated.
The other thing that changed under me is where the click goes. Pew Research Center tracked 68,879 Google searches from about 900 US adults in March 2025 and found that when an AI summary appeared, users clicked a search result on 8% of visits, against 15% when no summary appeared; only 1% clicked a source inside the summary (Pew Research Center, July 2025). Those summaries showed on about 18% of searches then. By July 2026, Similarweb put AI Overviews on roughly 43% of queries and Semrush on roughly 48% (Search Engine Roundtable, July 2026).
So the report stage has to change too. Ranking is no longer the same thing as being read. Semrush analysed 230,000 prompts and over 100 million citations across ChatGPT, Google AI Mode and Perplexity between July and October 2025 and found Reddit the leading cited source across platforms — with ChatGPT alone swinging from citing Reddit in close to 60% of responses in early August to about 10% by mid-September (Semrush, 2025). A pipeline optimising for a blue link is optimising for a shrinking surface, and one tuned to a single engine is tuned to a number that moved 50 points in six weeks. Structure — direct answers, real tables, named sources — is what gets lifted into an answer, which is why writing for skimmers stopped being a style preference.
FAQ
What tools automate an AI content pipeline from keyword research to WordPress publishing and reporting?
Search Console API or Ahrefs for research, a model with web search for the brief, Claude or GPT for the draft, a human for the edit, the WordPress REST API (/wp-json/wp/v2/posts) for publishing, and the Search Console API again for reporting. Orchestrate with cron and a few hundred lines. No single product does all six well.
How much does it cost to generate one article with AI?
At published Claude API rates in September 2026, a 1,500-word article costs about $0.23 on Sonnet 5 or $0.57 on Opus 5 for a single pass, and roughly $1 with three revision rounds. The per-stage token assumptions behind those figures are in the table above.
Can you fully automate publishing to WordPress?
Technically yes — the REST API accepts a POST with an application password. I do not, and I would advise against it. Publish to draft and approve by hand. One unreviewed batch going live and getting indexed costs far more than the minutes you save.
Is AI-generated content still worth publishing in 2026?
Only where you can source it. The posts on this domain that rank are the ones with a build log, a table, or arithmetic in them; the generic ones sit at positions 46 to 81. Volume was never the constraint. Defensible specificity was.
Want a content pipeline that reports on results rather than output? I will map your six stages, cost them at real rates, and tell you which ones to leave manual. See my services or get in touch.
Get the AI Automation Playbook
The real architecture behind a 6-agent AI content team — what it saves, what it gets wrong, and the propose-then-approve pattern that makes it safe to trust.
Browse all free guides →Run this on your own numbers
Content ROI & Payback Calculator — free, no signup, runs in your browser.
Want to implement this with guidance?
Santosh helps founders turn insights like this into real systems.
External Resources