Google Sheets to WordPress, SEO drafts ready to edit
Your SEO pipeline breaks in the boring places. Keywords sit “prioritized” in a sheet for days, competitor research lives in 12 tabs, and drafts never make it into WordPress because someone got pulled into meetings.
Content managers feel it first. A solo business owner trying to publish weekly feels it too. Same with a small marketing team that wants Sheets WordPress drafts without turning every post into a mini project. This workflow turns one click into a ready-to-edit WordPress draft and updates your sheet so you always know what’s in progress.
You’ll see how the automation pulls SERP data, creates a content brief, drafts the post, publishes it as a WordPress draft, and marks the status back in Google Sheets.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to WordPress, SEO drafts ready to edit
flowchart LR
subgraph sg0["Content Analysis Str Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "split into different SERP re..", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "Claude Haiku 3.5 Model", pos: "b", h: 48 }
n5@{ icon: "mdi:brain", form: "rounded", label: "Claude Sonnet 3.7", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Content Analysis Structure", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "Content Brief Structure", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "AI Article Analysis", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "AI Content Brief Generator", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "AI Content Draft", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Search in Google Search API1"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Raw Web Page"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Extract Text from Web Page"]
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/wordpress.svg' width='40' height='40' /></div><br/>Send Draft to WordPress"]
n15@{ icon: "mdi:database", form: "rounded", label: "Update Progress Info", pos: "b", h: 48 }
n16@{ icon: "mdi:database", form: "rounded", label: "Update Excel Sheet", pos: "b", h: 48 }
n0 --> n1
n3 --> n9
n1 --> n15
n1 --> n11
n10 --> n14
n12 --> n13
n5 -.-> n10
n8 --> n3
n4 -.-> n8
n4 -.-> n9
n7 -.-> n9
n14 --> n16
n9 --> n10
n6 -.-> n8
n13 --> n8
n11 --> n2
n2 --> n12
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n6,n7,n8,n9,n10 ai
class n4,n5 aiModel
class n15,n16 database
class n0,n11,n12 api
class n13 code
classDef customIcon fill:none,stroke:none
class n0,n11,n12,n13,n14 customIcon
The Problem: SEO drafting gets stuck between “idea” and “draft”
Most teams don’t fail at SEO because they lack ideas. They fail because the path from keyword to WordPress draft is messy, manual, and easy to postpone. You prioritize keywords in Google Sheets, then you “just need” to check the top results, skim competitor structure, find gaps, write a brief, then draft, then upload. That sounds linear. In real life, it’s interruptions, context switching, and re-checking the same SERPs three different times because things changed or you forgot what you saw.
The friction compounds. A few minutes here, a few tabs there, and suddenly publishing consistently feels weirdly hard.
- Manual SERP review pulls you into 10 tabs per keyword, and you still miss patterns like content type shifts or “hidden” subtopics.
- Briefs end up inconsistent, which means drafts get rewritten and deadlines slip.
- Copying drafts into WordPress is repetitive work, and small formatting mistakes are annoyingly common.
- Status tracking turns into guesswork when the sheet isn’t updated the moment work starts and finishes.
The Solution: One-click keyword → SERP → brief → WordPress draft
This n8n workflow gives you a simple habit: keep your keyword list in Google Sheets, mark rows as “prioritized,” then click “Prepare Content.” That click triggers n8n through a webhook, and the workflow takes over. It pulls the top Google results for the keyword, grabs page content for those listings, and uses AI to analyze what competitors are doing (tone, structure, content type, and what they missed). From that analysis it generates a content brief you can actually work from, then drafts the article based on the brief. Finally, it publishes the result into WordPress as a draft (not live), and updates your Google Sheet so the keyword row shows that processing started and completed.
The flow starts in Google Sheets, then Google Search results get collected and split into individual listings. Those pages are fetched and parsed into readable text, then AI produces structured analysis and a brief. The draft gets created and sent straight to WordPress, while the sheet is updated so you can manage content like a pipeline instead of a pile.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you prioritize 5 keywords each week. Manually, a “quick” pass often looks like 10 SERP clicks at maybe 5 minutes each (about 50 minutes), plus 30 minutes to turn notes into a brief, plus about 2 hours for a first draft, plus another 10 minutes to create a WordPress draft. That’s roughly 3 hours per keyword, or about 15 hours a week. With this workflow, you click “Prepare Content,” wait about 10–20 minutes per keyword for SERP pull, brief, and draft creation, then open a ready-to-edit WordPress draft. You still edit (you should), but you stop doing the repetitive setup work.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store keywords and statuses
- WordPress to receive the draft posts
- Google Custom Search API key (get it from Google Cloud Console)
- Claude AI API key (get it from Anthropic Console)
Skill level: Intermediate. You’ll connect accounts, add API keys, and test a webhook from the sheet.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A Google Sheets click triggers the workflow. Your sheet sends prioritized keyword rows to n8n through an incoming webhook, then n8n immediately marks those rows as “processing started.”
Search results and competitor pages get collected. n8n calls Google Search, splits the top 10 results into individual items, pulls each webpage’s HTML, and parses it into plain text your AI model can actually analyze.
AI turns competitor noise into a usable plan. Claude generates structured analysis (what’s ranking, the angles they take, what’s missing), then it produces a content brief and a draft blog article based on that brief.
Your draft lands in WordPress, and the sheet updates. The workflow publishes a draft post in WordPress and marks the keyword row as “processing complete,” which means your queue stays trustworthy.
You can easily modify the content brief format to match your template or client SOP based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the entry point that receives keyword rows and starts the pipeline.
- Add the Incoming Webhook Trigger node and set HTTP Method to
POST. - Set Path to
208f9a1a-60ce-40d8-ac20-1909f0ac4257so external systems can call the workflow. - Connect Incoming Webhook Trigger to Distribute Rows to split incoming rows into individual items.
Tip: Test the webhook with a sample payload that includes body.rows to match the downstream split logic.
Step 2: Connect Google Sheets
Update processing status in your keyword tracking sheet at the start and end of the run.
- Open Mark Processing Started and set Operation to
update. - Set Document to
[YOUR_ID]and Sheet Name togid=0. - Map Column 1 to
Started processingand row_number to{{ $json.rowNumber }}. - Open Mark Processing Complete and set Operation to
update, Document to[YOUR_ID], and Sheet Name togid=0. - Map Column 1 to
processing finishedand row_number to{{ $json.row_number }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in both Mark Processing Started and Mark Processing Complete.
⚠️ Common Pitfall: The matching column is row_number; ensure your incoming data includes rowNumber and later row_number so updates match the correct row.
Step 3: Configure SERP Retrieval and Parsing
Fetch top-ranking URLs for each keyword and convert HTML into clean text for analysis.
- In Distribute Rows, set Field to Split Out to
body.rows. - Configure Google Search Request with URL
https://www.googleapis.com/customsearch/v1and enable Send Query. - Set query parameters: q to
{{ $json.keywordString }}, and provide values for key and cx. - Set Split SERP Listings to split Field to Split Out as
items. - Configure Retrieve Webpage HTML with URL
={{ $json.link }}. - In Parse Webpage Text, keep Mode as
runOnceForEachItemand use the provided JavaScript to extract text.
Execution Flow: Distribute Rows outputs to both Mark Processing Started and Google Search Request in parallel.
Tip: If Google Custom Search errors, verify your key and cx parameters are populated in Google Search Request.
Step 4: Set Up AI Analysis and Content Briefing
Use Claude to analyze competitor content, aggregate insights, and generate a content brief.
- Configure Analyze Article Content with Text set to
=This is the text:\n {{ $json.text }}and keep Prompt Type asdefine. - Attach Analysis Schema Parser as the output parser for Analyze Article Content; keep the JSON schema example as provided.
- Configure Combine Analysis Output to aggregate the output field from all analyses.
- Set Generate Content Brief Text to
=The target Keyword is: AI Agent vs AI Chatbot\n\nhere are the summaries: \n{{ JSON.stringify($json.output) }}\n. - Attach Brief Schema Parser as the output parser for Generate Content Brief and keep the JSON schema example as provided.
- Credential Required: Connect your anthropicApi credentials in Claude Haiku Runtime (used by both Analyze Article Content and Generate Content Brief).
⚠️ Common Pitfall: Analysis Schema Parser and Brief Schema Parser do not take credentials directly—add credentials to Claude Haiku Runtime, the parent model node.
Step 5: Draft the Article with AI
Generate a full HTML draft using the content brief and SERP summaries.
- In Draft Blog Article, set Text to
=This is the keyword: \n'AI Agents vs AI Chatbots'\n\nThe content brief is here:\n{{ JSON.stringify($json.output) }}\n\nThese are the summaries:\n{{ JSON.stringify($('Combine Analysis Output').item.json.output) }}. - Ensure Draft Blog Article is connected to Claude Sonnet Runtime as its language model.
- Credential Required: Connect your anthropicApi credentials in Claude Sonnet Runtime.
Tip: The prompt requests HTML output only. Confirm the generated content is valid HTML before publishing.
Step 6: Configure Output to WordPress
Publish the drafted HTML as a WordPress draft and update the processing status.
- In Publish Draft to WordPress, set Title to
Testtest. - Set Content (additional field) to
={{ $json.text }}to publish the generated HTML. - Credential Required: Connect your wordpressApi credentials in Publish Draft to WordPress.
- Confirm the flow: Draft Blog Article → Publish Draft to WordPress → Mark Processing Complete.
⚠️ Common Pitfall: If the post appears empty, verify that Draft Blog Article outputs HTML in $json.text.
Step 7: Test and Activate Your Workflow
Validate the end-to-end pipeline and then enable it for production use.
- Click Execute Workflow and send a POST request to the Incoming Webhook Trigger URL with a
body.rowsarray. - Watch for successful branching: Distribute Rows should run to Mark Processing Started and Google Search Request in parallel.
- Confirm that Publish Draft to WordPress creates a draft post and Mark Processing Complete updates the spreadsheet status.
- When satisfied, switch the workflow Active toggle to on for production runs.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Google Sheets credential screen and the shared sheet access first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30–60 minutes once your accounts and API keys are ready.
No. You’ll mostly paste API keys, connect WordPress, and test the webhook from Google Sheets.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Claude API usage and Google Custom Search API costs.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s one of the best tweaks to make. Update the “Generate Content Brief” node prompt to match your outline template (sections, headings, FAQs, internal link targets), then keep the “Draft Blog Article” node aligned so it writes from that structure. Many teams also adjust the analysis to focus on intent (commercial vs informational), add a “brand voice” paragraph, and enforce word count or reading level.
Usually it’s incorrect WordPress credentials or missing permissions for the user you connected in n8n. Also check if your site blocks XML-RPC or REST requests via a security plugin, which can silently break draft publishing. If it fails only sometimes, rate limiting or hosting firewalls can be the culprit, especially when you’re drafting multiple keywords in a batch.
Most small teams run batches of 5–20 keywords at a time without issues, then scale up once they’re confident.
It depends on how “hands off” you want the SERP analysis and drafting to be. Zapier and Make can move data around quickly, but this workflow leans on multi-step AI chains, structured parsing, and looping through multiple SERP URLs, which is where n8n feels more natural. You can also self-host n8n, which keeps costs predictable when you run lots of keywords. If you’re only pushing a finished Google Doc into WordPress, Zapier might be simpler. If you want the full keyword → SERP → brief → draft pipeline, n8n is a better fit. Talk to an automation expert if you want help picking the cleanest route.
Set it up once, then let your sheet become a real content queue instead of a parking lot. The workflow handles the repetitive parts so you can spend your time editing, improving, and publishing.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.