Google Sheets to WordPress, drafts ready to review
You finally get a clean list of keywords. Then the real work starts: research, outlining, writing, formatting, finding a decent image, creating tags, and pushing it into WordPress without breaking the layout. By the time the draft exists, you’re already tired of it.
SEO managers feel this when the content calendar slips. Agency owners feel it when writers deliver drafts that still need two rounds of cleanup. And founders doing “just one post a week” end up stuck in busywork. This Sheets WordPress drafts automation turns a row of inputs into a WordPress draft that’s actually review-ready.
Below, you’ll see what the workflow does, what it replaces, and what you need to run it reliably in n8n.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Sheets to WordPress, drafts ready to review
flowchart LR
subgraph sg0["On form submission Flow"]
direction LR
n0@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n1["<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/>Set Featured Image"]
n2@{ icon: "mdi:robot", form: "rounded", label: "Generate Featured Image", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Resize Image", pos: "b", h: 48 }
n4["<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/>Upload Image To WP"]
n5["<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/>Update Meta Data1"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check ready for publish", pos: "b", h: 48 }
n7@{ icon: "mdi:location-exit", form: "rounded", label: "Not Ready", pos: "b", h: 48 }
n8@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n9["<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/form.svg' width='40' height='40' /></div><br/>On form submission"]
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "GetOnilneInfo", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "configuration", pos: "b", h: 48 }
n13@{ icon: "mdi:web", form: "rounded", label: "Internal Links", pos: "b", h: 48 }
n14@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Chat Model", pos: "b", h: 48 }
n15["<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/>Post Blog To WP-without image"]
n16["<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/>Post Blog To WP- with image"]
n17@{ icon: "mdi:wrench", form: "rounded", label: "OutlinePlanner", pos: "b", h: 48 }
n18@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n19@{ icon: "mdi:wrench", form: "rounded", label: "SectionWriter", pos: "b", h: 48 }
n20@{ icon: "mdi:wrench", form: "rounded", label: "createSections", pos: "b", h: 48 }
n21@{ icon: "mdi:wrench", form: "rounded", label: "Editor", pos: "b", h: 48 }
n22@{ icon: "mdi:wrench", form: "rounded", label: "Image Prompt", pos: "b", h: 48 }
n23@{ icon: "mdi:wrench", form: "rounded", label: "metaInfo", pos: "b", h: 48 }
n24@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser2", pos: "b", h: 48 }
n25["<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/>Set excerpt"]
n26["<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/>Set excerpt3"]
n27@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser3", pos: "b", h: 48 }
n28@{ icon: "mdi:web", form: "rounded", label: "getCategories", pos: "b", h: 48 }
n29["<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/>set-tags"]
n30["<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-tags"]
n31@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n32@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n33@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check-Existence", pos: "b", h: 48 }
n34@{ icon: "mdi:swap-vertical", form: "rounded", label: "getID", pos: "b", h: 48 }
n35@{ icon: "mdi:swap-vertical", form: "rounded", label: "getID1", pos: "b", h: 48 }
n36@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser4", pos: "b", h: 48 }
n37@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model8", pos: "b", h: 48 }
n38@{ icon: "mdi:cog", form: "rounded", label: "Tags", pos: "b", h: 48 }
n39@{ icon: "mdi:robot", form: "rounded", label: "Tags Agent", pos: "b", h: 48 }
n40@{ icon: "mdi:robot", form: "rounded", label: "Orchestration Agent", pos: "b", h: 48 }
n41@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n42@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n43@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n44@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model3", pos: "b", h: 48 }
n45@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model4", pos: "b", h: 48 }
n46@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model5", pos: "b", h: 48 }
n47@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model6", pos: "b", h: 48 }
n10 --> n2
n10 --> n15
n38 --> n10
n34 --> n32
n21 -.-> n40
n35 --> n32
n30 --> n33
n23 -.-> n40
n29 --> n35
n31 --> n32
n39 --> n31
n22 -.-> n40
n3 --> n4
n11 --> n40
n19 -.-> n40
n12 --> n11
n28 -.-> n23
n13 -.-> n21
n17 -.-> n40
n20 -.-> n40
n33 --> n34
n33 --> n29
n32 --> n38
n32 --> n30
n41 --> n42
n8 -.-> n40
n5 --> n16
n9 --> n12
n18 -.-> n17
n43 -.-> n20
n44 -.-> n19
n45 -.-> n21
n46 -.-> n22
n47 -.-> n23
n37 -.-> n39
n1 --> n25
n4 --> n5
n42 --> n12
n14 -.-> n11
n6 --> n39
n6 --> n7
n2 --> n3
n40 --> n6
n0 -.-> n40
n24 -.-> n22
n27 -.-> n23
n36 -.-> n39
n16 --> n1
n15 --> n26
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 n9,n41 trigger
class n0,n2,n11,n24,n27,n36,n39,n40 ai
class n8,n14,n18,n37,n43,n44,n45,n46,n47 aiModel
class n17,n19,n20,n21,n22,n23 ai
class n6,n10,n33 decision
class n42 database
class n1,n4,n5,n13,n25,n26,n28,n29,n30 api
classDef customIcon fill:none,stroke:none
class n1,n4,n5,n9,n15,n16,n25,n26,n29,n30 customIcon
The Challenge: Turning Keywords Into Drafts Without Chaos
“Write a post from this keyword” sounds simple until you do it at scale. Each draft requires research that’s current, an outline that won’t ramble, sections that don’t repeat themselves, and HTML that won’t look broken inside WordPress. Then come the extras you can’t skip: a usable title, a clean slug, an excerpt, tags that match your site’s taxonomy, and a category that isn’t guessed wrong. Manually, you end up hopping between Google Sheets, browser tabs, AI tools, image tools, and WordPress. It’s not hard work. It’s draining work, and it steals time from strategy.
It adds up fast. Here’s where it breaks down in real life.
- A single “quick draft” turns into about 2 hours of small tasks spread across too many tools.
- Formatting gets messy, which means someone has to fix headings, lists, links, and spacing inside the WordPress editor.
- Tags and categories drift over time, so your archive pages become a jumble and internal linking gets harder.
- Batch production fails because nobody wants to manually copy-paste 10 drafts, one-by-one, and then mark rows as “done.”
The Fix: Google Sheets → GPT Research/Writing → WordPress Drafts
This workflow starts with structured inputs (either a form submission or rows in Google Sheets) and turns them into WordPress drafts designed for review, not rework. It pulls in real-time information through a research agent, then an orchestration agent hands the task to specialized “sub-agents” that plan the outline, define sections, write each section, and polish everything into valid editorial HTML. Next, it generates the publishing metadata: title, slug, excerpt, tags, and a sensible category selection. If you toggle featured images on, it also creates an image prompt, generates the image, scales it, uploads it to WordPress media, and assigns it to the post. Finally, it publishes the post as a draft and updates the Google Sheets row so your pipeline stays accurate.
The workflow kicks off from Google Sheets on a schedule (batch mode) or from a manual form (one-off mode). AI handles the research, writing, editing, and metadata in a consistent order so the output is predictable. WordPress receives a draft post (with or without a featured image), ready for a human to review and hit publish.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you publish 5 SEO drafts per week from a Google Sheet. Manually, you might spend about 20 minutes researching, 60 minutes drafting, and another 20 minutes formatting + filling WordPress fields per post, so around 8 hours weekly. With this workflow, adding five rows and letting the batch run is maybe 15 minutes of your time, then you review drafts when they’re ready. Even if you still spend an hour total editing across the week, you’ve freed up most of a workday.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store keywords and status flags.
- WordPress to create draft posts via REST API.
- OpenAI API key (get it from your OpenAI account dashboard).
Skill level: Intermediate. You’ll connect accounts, paste credentials, and map a few fields, but you won’t be writing code.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A keyword request arrives. The workflow starts either when someone submits the form (great for one-off requests) or when a scheduled trigger reads new rows from Google Sheets for batch runs.
Configuration gets set once, then reused. It normalizes your inputs like target word count, number of sections, writing style, site URL, and any website context you provide so the writing stays aligned with your brand.
Research and writing happen in a controlled order. A web research agent pulls current information, then the orchestration agent routes the task through outline planning, section generation, section writing, editorial cleanup into HTML, and metadata creation (title, slug, excerpt, category).
WordPress gets a clean draft and optional image. Tags are fetched or created, applied to the post, and the draft is published through the WordPress API. If featured images are enabled, the workflow generates an image, scales it, uploads it as media, and assigns it before setting the excerpt.
You can easily modify the prompt and metadata rules to match your editorial standards based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the workflow to start from user submissions or scheduled sheet inputs that feed the same configuration step.
- Open Form Submission Trigger and confirm it is the manual entry point for content requests.
- Open Scheduled Trigger to confirm it runs on your desired cadence for batch publishing.
- Verify that both Form Submission Trigger and Scheduled Trigger connect into Setup Configuration.
Step 2: Connect Google Sheets for Scheduled Inputs
The scheduled path pulls draft items from a spreadsheet before entering the shared configuration stage.
- Open Retrieve Sheet Rows and configure it to read the rows that represent publish-ready items.
- Credential Required: Connect your Google Sheets credentials in Retrieve Sheet Rows.
- Confirm Retrieve Sheet Rows outputs to Setup Configuration so scheduled items follow the same processing route.
Step 3: Set Up the Core Orchestration and AI Planning
This step builds the content plan and structures the data used by later publishing steps.
- Open Setup Configuration and define the fields you want to standardize for all inputs.
- Open Fetch Online Info and verify it uses OpenRouter Chat Engine as its language model.
- Open Orchestration Agent and confirm it uses OpenAI Chat Engine and Structured Result Parser A for consistent output format.
- Credential Required: Connect your OpenRouter credentials in OpenRouter Chat Engine.
- Credential Required: Connect your OpenAI credentials in OpenAI Chat Engine.
Step 4: Configure Content Validation and Tagging Flow
This block ensures content is ready and assigns taxonomy based on AI tagging and tag verification logic.
- Open Validate Publish Readiness and confirm its true path goes to Tagging Agent while the false path goes to Halt Not Ready.
- Open Tagging Agent and confirm it uses OpenAI Chat Engine Tags with Structured Result Parser D to standardize tags.
- Check the batch processing sequence: Split Items → Iterate Batches → Fetch Tags → Verify Existence.
- Validate that Verify Existence branches to Extract ID (existing tags) and Apply Tags (new tags), and both return through Extract ID B or Extract ID to Iterate Batches.
- Credential Required: Connect your OpenAI credentials in OpenAI Chat Engine Tags.
Step 5: Build the Featured Image Path
When the post includes a featured image, the workflow generates, scales, uploads, and assigns it before publishing.
- Open Branch Condition and confirm the true path goes to Create Featured Image and the false path goes to Publish WP Post No Image.
- Open Create Featured Image and connect your image-generation model settings.
- Verify the image pipeline sequence: Create Featured Image → Scale Image → Upload Image to WordPress → Modify Meta Details.
- Credential Required: Connect your OpenAI credentials in Create Featured Image.
Step 6: Configure WordPress Publishing Actions
This step handles publishing posts both with and without images, plus excerpt and featured image assignment.
- Open Publish WP Post With Image and Publish WP Post No Image to confirm post type and status settings.
- Confirm the image path continues: Publish WP Post With Image → Assign Featured Image → Set Post Excerpt.
- Confirm the no-image path continues: Publish WP Post No Image → Set Post Excerpt B.
- Credential Required: Connect your WordPress credentials in Publish WP Post With Image and Publish WP Post No Image.
Step 7: Add Error Handling
Error handling prevents publishing when validation fails.
- Open Validate Publish Readiness and confirm the false branch routes to Halt Not Ready.
- Open Halt Not Ready and add a clear error message so the reason for stopping is visible in execution logs.
Step 8: Test and Activate Your Workflow
Run an end-to-end test to verify AI output, tagging, and WordPress publishing before going live.
- Manually execute Form Submission Trigger with a sample submission to test the full content path.
- Verify successful executions show outputs through Orchestration Agent, Tagging Agent, and reach either Publish WP Post With Image or Publish WP Post No Image.
- Confirm the WordPress post contains the expected excerpt from Set Post Excerpt or Set Post Excerpt B.
- Enable the workflow and confirm Scheduled Trigger is active for production runs.
Watch Out For
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n credentials page and the Google Cloud OAuth consent settings 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.
- WordPress REST API access often fails because the application password is missing permissions, blocked by security plugins, or pointed at the wrong site URL. Confirm your /wp-json/wp/v2 endpoints respond and that the author user can create posts and media.
Common Questions
Usually in about an hour if your WordPress and Google credentials are ready.
Yes. No coding required. You will mostly be connecting accounts and pasting API keys into n8n.
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 OpenAI API costs, which vary based on how long your posts are and how much research you run.
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.
Start by editing the Setup Configuration node so it reflects your site rules (tone, target audience, and any “must include” details). If you want different metadata logic, swap the Meta Info Builder prompt to match your slug style, excerpt length, and category rules. To change research sources, adjust the Fetch Online Info agent to use your preferred provider (for example, OpenRouter instead of OpenAI-only). And if you don’t want images at all, keep the featured image toggle off so the Branch Condition routes straight to “Publish WP Post No Image.”
Usually it’s an invalid application password or a blocked REST API. Regenerate the WordPress application password, update it in n8n, and confirm your site’s /wp-json/wp/v2/posts endpoint is reachable. Security plugins and basic auth rules can also interfere, especially with media uploads. If posts work but images fail, check permissions for /wp-json/wp/v2/media specifically.
It scales well, but the practical limit is AI processing time and your WordPress server’s API tolerance.
Often, yes, if you want multi-step logic and consistent long-form output. This workflow uses several AI stages (research, outline, section writing, editing, metadata, and tags), plus branching for optional images, which is the kind of flow that gets awkward and expensive in tools that price by task. n8n also gives you a self-hosting path when volume ramps up, which keeps your per-draft automation cost stable. Zapier or Make can still be fine for “create a post from a short template,” but this is closer to a production content pipeline. If you want a quick sanity check before you commit, Talk to an automation expert.
Once this is running, Google Sheets becomes your content queue and WordPress becomes your draft inbox. The workflow handles the repetitive parts so your team can spend time on review, positioning, and actually shipping.
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.