Google Sheets to WordPress, posts publish themselves
Your content process probably isn’t “writing.” It’s chasing docs, rebuilding outlines, hunting for internal links, resizing images, and then triple-checking WordPress before you hit Publish. And somehow, the simple idea you had on Monday still isn’t live on Friday.
This Google Sheets WordPress automation hits hardest for content marketers trying to publish consistently. But agency owners managing multiple client blogs feel the drag too, and so do busy founders who just want the site to look alive without living inside WordPress.
This workflow turns one spreadsheet row into a full, SEO-optimized WordPress post, complete with a featured image, chapter images, internal links, and a Google Drive backup. Below, you’ll see exactly what it does, what you need, and what usually trips people up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to WordPress, posts publish themselves
flowchart LR
subgraph sg0["Google Sheets Flow"]
direction LR
n0@{ icon: "mdi:robot", form: "rounded", label: "Generate featured image", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser2", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Create post title and struct..", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Write chapter text", 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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Settings", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split out chapters", pos: "b", h: 48 }
n8["<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 post sitemap"]
n9@{ icon: "mdi:cog", form: "rounded", label: "Get XML file", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split out links", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get title chapter and content", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "Generate chapter image", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Resize Image", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Upload chapter images"]
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/merge.svg' width='40' height='40' /></div><br/>Merge chapters title and text"]
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/markdown.dark.svg' width='40' height='40' /></div><br/>Markdown to HTML"]
n17["<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 on Wordpress"]
n18@{ icon: "mdi:cog", form: "rounded", label: "Resize featured image", pos: "b", h: 48 }
n19["<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 featured image"]
n20["<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 for post"]
n21["<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 image meta data"]
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n23["<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 featured image meta d.."]
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items1", pos: "b", h: 48 }
n25@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
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 excerpt"]
n27@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Chat Model", pos: "b", h: 48 }
n28@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n29@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n30@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Chat Model1", pos: "b", h: 48 }
n31@{ icon: "mdi:play-circle", form: "rounded", label: "Google Sheets Trigger", pos: "b", h: 48 }
n32@{ icon: "mdi:cog", form: "rounded", label: "Limit1", pos: "b", h: 48 }
n33@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check inputs", pos: "b", h: 48 }
n34["<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/merge.svg' width='40' height='40' /></div><br/>Add featured image"]
n35@{ icon: "mdi:cog", form: "rounded", label: "Save texts to Doc", pos: "b", h: 48 }
n36@{ icon: "mdi:cog", form: "rounded", label: "Create Doc", pos: "b", h: 48 }
n37@{ icon: "mdi:cog", form: "rounded", label: "Upload featured image to Drive", pos: "b", h: 48 }
n38@{ icon: "mdi:cog", form: "rounded", label: "Upload chapter images to Drive", pos: "b", h: 48 }
n39@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get output", pos: "b", h: 48 }
n40@{ icon: "mdi:cog", form: "rounded", label: "Create Drive folder", pos: "b", h: 48 }
n41["<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/merge.svg' width='40' height='40' /></div><br/>Merge2"]
n42["<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/merge.svg' width='40' height='40' /></div><br/>Merge1"]
n44@{ icon: "mdi:cog", form: "rounded", label: "Get the latest topic", pos: "b", h: 48 }
n46@{ icon: "mdi:swap-vertical", form: "rounded", label: "FInal article in HTML", pos: "b", h: 48 }
n47@{ icon: "mdi:swap-vertical", form: "rounded", label: "Final article in Markdown", pos: "b", h: 48 }
n48["<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/>Combine into article"]
n49@{ icon: "mdi:cog", form: "rounded", label: "Aggregate internal links", pos: "b", h: 48 }
n28 --> n3
n4 --> n24
n29 --> n12
n32 --> n49
n42 --> n22
n41 --> n34
n5 --> n33
n36 --> n35
n39 --> n7
n39 --> n0
n26 --> n25
n33 --> n2
n33 --> n8
n9 --> n10
n13 --> n14
n22 --> n15
n22 --> n29
n10 --> n32
n8 --> n9
n24 --> n11
n24 --> n28
n16 --> n46
n17 --> n34
n35 --> n17
n34 --> n19
n7 --> n4
n7 --> n22
n3 --> n24
n40 --> n39
n48 --> n47
n44 --> n5
n46 --> n36
n31 --> n44
n27 -.-> n2
n18 --> n41
n14 --> n21
n19 --> n23
n12 --> n38
n12 --> n13
n30 -.-> n3
n21 --> n42
n0 --> n37
n0 --> n18
n49 --> n4
n6 -.-> n3
n47 --> n16
n1 -.-> n2
n20 --> n26
n11 --> n15
n15 --> n48
n38 --> n42
n37 --> n41
n2 --> n40
n23 --> n20
end
subgraph sg1["Schedule Flow"]
direction LR
n43@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
end
subgraph sg2["When clicking ‘Test workflow’ Flow"]
direction LR
n45@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
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 n31,n43,n45 trigger
class n0,n1,n2,n3,n6,n12 ai
class n27,n30 aiModel
class n33 decision
class n8,n14,n19,n20,n21,n23,n26 api
class n48 code
class n28 disabled
class n29 disabled
class n43 disabled
class n45 disabled
classDef customIcon fill:none,stroke:none
class n4,n8,n14,n15,n16,n17,n19,n20,n21,n23,n26,n34,n41,n42,n48 customIcon
The Problem: Publishing blog posts is still a pile of tiny tasks
Most teams don’t struggle because they “can’t write.” They struggle because publishing is a hundred micro-decisions scattered across tools. You draft in one place, source images somewhere else, grab internal links by manually searching your site, then paste everything into WordPress and pray the formatting holds. Now add “do it every week” and it becomes exhausting. Miss one detail and you get broken images, weak on-page SEO, or a post that looks fine on desktop but weird on mobile. The time cost is bad. The mental load is worse.
The friction compounds. Here’s where it breaks down in real life.
- You spend about 2 hours per post just moving content between tools and reformatting it.
- Internal linking turns into a scavenger hunt, so posts go out with “good enough” links or none at all.
- Images become a bottleneck because sourcing, resizing, uploading, and setting metadata is a separate mini project.
- If anything goes wrong after publishing, you may not have a clean backup of the final text and assets in one place.
The Solution: A spreadsheet row becomes a complete WordPress post
This workflow starts with something your team will actually use: a Google Sheet. Add a new row with your topic and a few parameters (like audience, style, target length, seed keyword), and the workflow takes over. It generates a title and outline, writes each chapter, and then builds visuals to match: a featured “hero” image plus a unique image for every chapter. While content is being created, it also pulls your site’s sitemap, extracts internal URLs, limits them (20 by default), and strategically inserts those links throughout the article. Finally, it publishes to WordPress and saves everything to Google Drive in a folder named after the post title, so your assets and final copy are never lost.
The workflow begins when Google Sheets detects a new row. From there, the AI model (via OpenRouter) creates the structure and content, while HTTP requests handle WordPress media uploads and post updates. At the end, you get a formatted WordPress post with images, internal links, an excerpt, and a tidy Drive backup.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 3 posts a week. Manually, a typical post might take about 30 minutes to format in WordPress, another 30 minutes to find and place internal links, and about 45 minutes to generate, resize, and upload images. That’s roughly 2 hours per post, or about 6 hours a week. With this workflow, you add a row to Google Sheets (maybe 5 minutes), then wait for generation and uploads to finish. You get most of that 6-hour block back, without cutting corners.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to add topics and trigger runs.
- WordPress to publish posts and upload media.
- Google Drive to store final copy and images.
- OpenRouter API key (get it from your OpenRouter dashboard).
Skill level: Intermediate. You will connect accounts, paste API keys, and map a few sheet columns to the workflow’s input fields.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new row is added in Google Sheets. The Google Sheets trigger detects the change, then the workflow pulls the latest topic and your content settings (audience, style, length, seed keyword).
Your site’s internal links are gathered automatically. The workflow fetches your sitemap via HTTP Request, parses the XML, splits the URLs into a usable list, and caps the count (20 by default) so the post doesn’t turn into a link farm.
AI writes the post in a controlled structure. It generates a title and outline, separates chapters, then composes each chapter’s content. Wait nodes are used so the AI and media steps don’t slam into rate limits.
Images, publishing, and backups happen at the end. A hero image and chapter images are generated, resized, uploaded to WordPress, and attached to the post (including featured image and metadata). The final text is saved in Google Docs, and the whole package is backed up to Google Drive in a folder named after the post title.
You can easily modify the link limit and the content parameters (like number of chapters or tone) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Google Sheets Trigger
This workflow starts when a spreadsheet changes, so you must configure the trigger that watches your sheet.
- Add and open Sheet Change Trigger, then select the spreadsheet and worksheet you want to monitor.
- Credential Required: Connect your Google Sheets OAuth2 credentials.
- Leave Utility: Scheduled Trigger and Utility: Manual Test Trigger disabled unless you want alternate triggers for testing or scheduled runs.
Step 2: Connect the input preparation and validation path
The initial chain filters the newest topic, maps inputs, and gates execution before branching into AI generation and sitemap retrieval.
- Confirm Sheet Change Trigger connects to Retrieve Latest Topic and then to Configure Inputs.
- Open Configure Inputs and map any input fields needed downstream (topic, keyword, or category fields).
- Set conditions in Validate Input Data to ensure required fields exist before continuing.
- Validate Input Data outputs to both Generate Title Outline and Fetch Post Sitemap in parallel.
Step 3: Build the internal link stream from your sitemap
This branch fetches your site’s sitemap, parses it, and limits links used for internal linking.
- Configure Fetch Post Sitemap to request your sitemap URL.
- Send the response to Parse XML File and then to Separate Links to split URLs into items.
- Use Limit Links to cap the number of internal URLs, then aggregate them in Aggregate Internal URLs.
- Ensure Aggregate Internal URLs outputs to Combine Streams to merge with chapter data.
Step 4: Set up AI title and outline generation
This stage generates the blog title/outline and creates the storage folder structure used later.
- Open Generate Title Outline and configure the prompt and inputs you want the model to use.
- Attach Structured Parser A as the output parser for Generate Title Outline (credentials should be added to the parent AI node, not the parser).
- Credential Required: Connect your OpenRouter API credentials in OpenRouter Dialogue Model, which is linked as the language model for Generate Title Outline.
- Confirm Generate Title Outline routes to Create Drive Directory, then to Assemble Output.
- Assemble Output outputs to both Separate Chapters and Generate Hero Image in parallel.
Step 5: Generate chapter text and assemble the article
Chapters are created, iterated, merged with internal links, and assembled into Markdown and HTML.
- Check that Separate Chapters splits the outline into items, then sends output to both Combine Streams and Iterate Chapter Images in parallel.
- From Combine Streams, confirm the flow goes to Iterate Chapters and then to Map Title Chapter Content.
- Configure Compose Chapter Content with the chapter-writing prompt and ensure Structured Parser B is attached as its output parser (credentials belong on the parent AI node).
- Credential Required: Connect your OpenRouter API credentials in OpenRouter Dialogue Model B, which is linked as the language model for Compose Chapter Content.
- Verify the merge and assembly path: Map Title Chapter Content → Merge Titles and Text → Assemble Article → Finalize Markdown → Convert Markdown to HTML → Finalize HTML.
- Confirm Finalize HTML routes to Create Document and then to Save Texts to Document.
Step 6: Generate, resize, and upload chapter images
This branch creates chapter images and prepares them for upload and metadata updates.
- Ensure Iterate Chapter Images feeds into Delay Image Step and then to Generate Chapter Image.
- Credential Required: Connect your OpenAI API credentials in Generate Chapter Image.
- Generate Chapter Image outputs to both Upload Chapters to Drive and Resize Chapter Image in parallel.
- Send Resize Chapter Image to Upload Chapter Images, then to Update Image Metadata and Combine Chapter Media.
- Check that Upload Chapters to Drive also feeds into Combine Chapter Media, and that Combine Chapter Media loops back to Iterate Chapter Images to continue the batch.
Step 7: Generate the hero image and featured image workflow
This path produces the hero image, uploads it, and merges it with the publishing pipeline.
- Credential Required: Connect your OpenAI API credentials in Generate Hero Image.
- Generate Hero Image outputs to both Upload Hero to Drive and Resize Hero Image in parallel.
- Verify Resize Hero Image and Upload Hero to Drive merge in Combine Hero Data, which feeds Attach Featured Image.
Step 8: Configure publishing, featured image attachment, and outputs
The final path publishes the post to WordPress, attaches the featured image, and updates metadata.
- Confirm Save Texts to Document routes to Publish to WordPress, then to Attach Featured Image.
- Set WordPress fields in Edit Post Fields and ensure Apply Excerpt runs before it.
- Verify the featured image path: Attach Featured Image → Upload Featured Image → Update Featured Metadata → Set Featured Image → Apply Excerpt → Edit Post Fields.
- Credential Required: Connect your WordPress credentials in Publish to WordPress.
- Credential Required: Connect your Google Docs OAuth2 credentials in Create Document and Save Texts to Document.
- Credential Required: Connect your Google Drive OAuth2 credentials in Create Drive Directory, Upload Hero to Drive, and Upload Chapters to Drive.
Step 9: Test and Activate Your Workflow
Run a manual test to validate the end-to-end flow, then activate it for live processing.
- Use Utility: Manual Test Trigger (enable temporarily) or trigger a spreadsheet change to run the workflow.
- Confirm outputs: a Google Doc is created, a WordPress post is published, and images appear in your media library.
- If any AI steps fail, re-check credentials for Generate Title Outline, Compose Chapter Content, Generate Hero Image, and Generate Chapter Image.
- Activate the workflow to process new rows automatically from Sheet Change Trigger.
Common Gotchas
- WordPress credentials can expire or need specific permissions. If things break, check your WordPress Application Password settings and user role permissions 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
Plan on about an hour the first time.
No. You’ll mostly connect accounts and map the right columns from your sheet to the workflow inputs.
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 OpenRouter (AI text) and image generation costs, which vary by model and how many chapters you generate.
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, but you’ll want to change the publishing behavior near the “Publish to WordPress” step so it creates a draft (or skips publishing entirely). Common tweaks include changing the default post status, adjusting the internal link limit from 20 to something smaller, and tightening the prompts in “Generate Title Outline” and “Compose Chapter Content” so the output matches your brand voice. If you also want a stricter editorial process, you can route the final HTML to a review step and only publish once approved.
Usually it’s an expired Application Password or a user role that can’t upload media. Regenerate the WordPress Application Password, update it in n8n, then confirm the user can create posts and upload files. If it fails only on bigger runs, check for server-side rate limiting or security plugins blocking REST API requests. Honestly, caching and security plugins cause a lot of “random” failures here.
If you self-host, there’s no execution limit (it mostly depends on your server and API limits). On n8n Cloud, it depends on your plan’s monthly executions, and this workflow can use multiple executions per post because it generates chapters, images, and uploads media in batches.
For this workflow, n8n is usually the better fit because it handles branching logic, loops (like chapter-by-chapter creation), and wait steps without turning into a pricey pile of tasks. It also gives you self-hosting, which matters once you start publishing at volume. Zapier or Make can be simpler for a basic “row → draft” flow, but they get awkward when you add images, internal linking from a sitemap, and metadata updates. If you’re unsure, Talk to an automation expert and describe your publishing cadence and review needs.
You set the direction in a spreadsheet, and the workflow handles the assembly line. That’s hours back every week, plus a publishing rhythm you can actually stick to.
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.