Google Sheets to WordPress, scheduled posts done
Your content calendar looks fine in a spreadsheet. Then publishing day hits, and someone is copying titles, pasting drafts, hunting for images, and trying to remember the SEO fields before the post goes live.
This Sheets WordPress automation hits marketing managers first, but agency leads and small business owners feel it too. The outcome is simple: your planned rows in Google Sheets become scheduled WordPress posts with featured images and SEO metadata, without the “did we forget something?” scramble.
Below you’ll see exactly how the workflow runs in n8n, what it produces, and where you can tweak it to match your brand voice and publishing rules.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to WordPress, scheduled posts done
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger1", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "XML", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Code in JavaScript"]
n6["<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 to Wordpress2"]
n7["<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/>Code in JavaScript1"]
n8@{ icon: "mdi:database", form: "rounded", label: "Get post information from Sp..", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Compare date of spreadsheet ..", pos: "b", h: 48 }
n10["<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 information from sitemap"]
n11@{ icon: "mdi:robot", form: "rounded", label: "Generate all the necessary i..", pos: "b", h: 48 }
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 image"]
n13@{ icon: "mdi:cog", form: "rounded", label: "Edit Feature 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 feature image"]
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/html.dark.svg' width='40' height='40' /></div><br/>Design the post"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Added post excerpt"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Added meta title, meta descr.."]
n18["<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/>Post feature image meta info.."]
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/>Added feature image meta inf.."]
n20@{ icon: "mdi:message-outline", form: "rounded", label: "Send a Email to admin", pos: "b", h: 48 }
n4 --> n3
n0 --> n11
n12 --> n7
n3 --> n0
n1 --> n10
n15 --> n16
n2 --> n8
n16 --> n18
n5 --> n6
n13 --> n14
n6 --> n12
n7 --> n13
n14 --> n19
n10 --> n4
n18 --> n17
n19 --> n15
n8 --> n9
n9 --> n1
n11 --> n5
n17 --> n20
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 n2 trigger
class n11 ai
class n9 decision
class n8 database
class n10,n12,n14,n16,n17,n18,n19 api
class n5,n7 code
classDef customIcon fill:none,stroke:none
class n5,n6,n7,n10,n12,n14,n15,n16,n17,n18,n19 customIcon
The Problem: Scheduled posts still become manual work
Most teams don’t struggle with ideas. They struggle with follow-through. A spreadsheet row turns into a dozen tiny tasks: check the publish date, write the draft, format it, create a featured image, upload it, set the excerpt, add internal links, fill in the meta title and description, and finally schedule it. Miss one step and you either ship a half-finished post or you delay publishing again. That “just one more thing” feeling is the real cost, because it steals focus from strategy, distribution, and client work.
The friction compounds. And it usually shows up at the worst time.
- Publishing a single post can quietly take about an hour when you include writing, formatting, SEO fields, and media uploads.
- Manual scheduling fails in predictable ways, like using the wrong date or posting immediately instead of queueing it.
- SEO metadata often becomes an afterthought, so posts go out with weak titles, missing descriptions, or inconsistent slugs.
- Featured images become a bottleneck because “quick” turns into font hunting, resizing, and re-uploading.
The Solution: Google Sheets to WordPress scheduling with SEO and images
This n8n workflow turns your Google Sheet into a publishing queue for WordPress. It starts on a schedule, pulls the rows that represent planned posts, and checks each one against today’s date so you only publish what’s actually due. When a row is ready, the workflow maps your inputs (title, keywords, word count, style, service areas, CTAs, internal and external links) into an AI “blueprint” that generates a full SEO-friendly article: intro, chapters, conclusion, and FAQs. Then it creates a featured image by downloading a base image, wrapping your title text, and overlaying it with your chosen fonts. Finally, it publishes to WordPress, attaches the featured media, writes Yoast SEO fields (meta title, meta description, slug), and emails you or your team with the live link.
The workflow starts with a scheduled trigger in n8n, then reads your spreadsheet and validates publish dates. From there it pulls your site’s sitemap to build a list of URLs for internal linking, generates the article structure with AI, and publishes everything to WordPress with media and SEO fields filled in.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your team publishes 5 posts a week. Manually, a “scheduled” post still takes about 60 minutes when you count formatting, Yoast fields, uploading a featured image, and double-checking the date, so that’s roughly 5 hours weekly. With this workflow, the human time becomes “update the Google Sheet row,” which is maybe 5 minutes per post, plus some waiting while AI generates content and WordPress updates in the background. You save about 4 hours a week, and the queue doesn’t get dropped when someone’s busy.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for your content queue and inputs.
- WordPress to publish drafts and schedule posts.
- OpenAI API key (get it from your OpenAI dashboard).
Skill level: Intermediate. You’ll connect accounts, add credentials, and may adjust a couple of prompts and HTTP requests.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled trigger checks your calendar. n8n runs on a timer (daily, hourly, whatever you choose) and fetches rows from Google Sheets that represent planned posts.
Date validation prevents accidental publishing. An “if” check compares the row’s scheduled date with today so the workflow only continues when a post is actually due. No surprises.
Content and links are assembled automatically. The workflow pulls your sitemap XML, parses URLs, and compiles a list that can be used for internal linking. Then the OpenAI node generates a post blueprint, and a code step assembles HTML so the article lands in WordPress cleanly formatted.
WordPress gets the draft, media, and SEO fields. The workflow publishes to WordPress, generates a featured image (text wrapping, overlay, upload), attaches it to the post, and writes Yoast meta fields and the excerpt via HTTP requests. A Gmail node sends an email notification once it’s done.
You can easily modify the prompts and the sitemap-based internal link logic to match your site structure. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
Set the workflow to run daily using the built-in scheduler.
- Open Scheduled Automation Trigger.
- In Rule, keep the interval with triggerAtHour set to
4so the workflow runs at 4 AM. - Save the node to confirm the schedule.
Step 2: Connect Google Sheets
Pull blog publishing inputs from your spreadsheet.
- Open Retrieve Sheet Rows.
- Select the spreadsheet in Document and set Sheet Name to
Sheet1. - Credential Required: Connect your Google Sheets credentials.
⚠️ Common Pitfall: If the sheet name or document ID is incorrect, Validate Publish Date will receive empty data and stop the workflow.
Step 3: Set Up Date Validation and Input Mapping
Only rows scheduled for today are processed and mapped into consistent fields.
- Open Validate Publish Date and confirm the condition compares the publish date using
{{ $json['Date to be published']?.trim() }}and{{ new Date($('Scheduled Automation Trigger').item.json.timestamp).toISOString().split('T')[0] }}. - Open Map Input Fields and verify all mapped fields use expressions like
{{ $json['Primary keyword'] }},{{ $json['Word Count'] }}, and{{ $json.Website }}. - Ensure confirmation email after a blog post is created is set to
{{ $('Retrieve Sheet Rows').item.json['Blog Confirmation Mail'] }}.
Step 4: Configure Sitemap Parsing and URL Aggregation
Collect existing blog URLs from your WordPress sitemap for internal linking suggestions.
- Open Fetch Sitemap XML and set URL to
{{ $json.Website }}/post-sitemap.xml. - In Parse XML Data, set Data Property Name to
=data. - In Expand URL Items, set Field to Split Out to
urlset.url. - In Compile URL List, aggregate Field to Aggregate as
=locand rename output toBlog URL List.
⚠️ Common Pitfall: If your sitemap URL differs from /post-sitemap.xml, update Fetch Sitemap XML accordingly or URL aggregation will fail.
Step 5: Set Up AI Content Generation and HTML Assembly
Generate the blog blueprint with AI and build the HTML body.
- Open Generate Post Blueprint and confirm Model is set to
gpt-4o-miniwith JSON Output enabled. - Credential Required: Connect your OpenAI credentials.
- Open Assemble Article HTML and confirm the JS Code returns the
articleproperty from the AI output.
⚠️ Common Pitfall: If Generate Post Blueprint doesn’t return valid JSON, Assemble Article HTML will produce empty output.
Step 6: Configure WordPress Publishing and Media Pipeline
Publish the draft post, generate the featured image, and attach SEO metadata.
- Open Publish Draft to WP and set Title to
{{ $('Generate Post Blueprint').item.json.message.content.title }}and Content to{{ $json.article }}. - In Publish Draft to WP, verify Additional Fields include slug set to
{{ $('Map Input Fields').first().json.Website }}/{{ $('Generate Post Blueprint').first().json.message.content.Slug }}, status set todraft, and author/category IDs from Map Input Fields. - Open Download Base Image and confirm the base image URL is
https://res.cloudinary.com/dbpf3j934/image/upload/v1763646097/The-GCC-Blinds-Window-Treatments-3-1_iauheu.png. - Open Wrap Title Text to ensure the title is wrapped into
wrappedTitlefor the image overlay. - In Overlay Feature Title, set Text to
{{ $json.wrappedTitle }}, Font Size to120, and Font Color to#FD5444. - Open Upload Featured Image and confirm the URL is
{{ $('Map Input Fields').first().json.Website }}/wp-json/wp/v2/mediawith authentication set to wordpressApi. - Open Update Media Metadata and verify title, slug, alt text, caption, and description expressions are pulled from Generate Post Blueprint.
- Open Render HTML Template and confirm the HTML includes
{{ $('Generate Post Blueprint').all()[0].json.message.content.title }}and{{ $('Assemble Article HTML').item.json.article }}. - Open Append Post Excerpt, Attach Featured Media, and Write SEO Meta Fields, then verify each uses the WordPress API URL with
{{ $('Map Input Fields').first().json.Website }}. - Credential Required: Connect your WordPress API credentials in Upload Featured Image, Update Media Metadata, Append Post Excerpt, Attach Featured Media, and Write SEO Meta Fields.
⚠️ Common Pitfall: WordPress API endpoints must be accessible and authenticated; otherwise featured media and SEO fields will fail silently.
Step 7: Configure Notification Email
Send a confirmation email once the draft and SEO metadata are created.
- Open Dispatch Admin Email and set Send To to
{{ $('Map Input Fields').item.json['confirmation email after a blog post is created'] }}. - Ensure Subject is
Your Blog Post Has Been Successfully Createdand the Message uses the title and timestamp expressions. - Credential Required: Connect your Gmail credentials.
Step 8: Test and Activate Your Workflow
Validate the workflow end-to-end and enable it for production runs.
- Click Execute Workflow to run the flow manually with test data in your Google Sheet.
- Confirm Publish Draft to WP creates a draft post and Dispatch Admin Email sends the confirmation message.
- Verify the featured image and SEO metadata are visible in WordPress after Write SEO Meta Fields completes.
- Turn on the workflow using the Active toggle to run it on schedule.
Common Gotchas
- Google Sheets credentials can expire or lack access to the right spreadsheet. If things break, check the n8n credential connection and the Sheet sharing 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
About an hour if your Google, WordPress, and email accounts are ready.
No. You’ll mostly connect accounts and edit prompts. The only “code-like” part is optional tweaking of the HTML template if you want custom formatting.
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 are usually a few cents per post depending on length.
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 a common tweak. In the WordPress publishing step, change the post status to “draft” (or “pending”) instead of scheduling. You can also adjust the “Validate Publish Date” check to run only when a row is marked “Ready,” which keeps your calendar flexible. Many teams also customize the “Generate Post Blueprint” prompt to enforce brand voice, include specific headings, or require a certain number of FAQs.
Usually it’s an application password issue or missing permissions for the user you connected. Regenerate the WordPress application password, then update the credential in n8n and retry the publish step. If you’re writing Yoast fields through HTTP requests, also confirm the endpoint is correct and your site allows REST API access (some security plugins block it). Rate limiting can show up too when you publish a lot at once, so splitting posts into batches helps.
On a typical n8n Cloud plan, it can handle a normal small-business queue (dozens to hundreds of posts a month) as long as you’re within your execution limit. If you self-host, there’s no execution cap, so capacity mainly depends on your server and how long AI generation takes. Practically, most teams run this daily and process whatever is scheduled for that day, which keeps it stable. If you want to backfill hundreds of posts, use the Split in Batches node and slow it down a bit.
Often, yes, because this isn’t a simple “send data from A to B” workflow. You’re mixing sitemap parsing, AI generation, HTML assembly, image creation, multiple WordPress API calls, and conditional scheduling logic. n8n handles branching and custom logic cleanly, and self-hosting can make high-volume runs affordable. Zapier or Make can still work if you simplify the scope (for example, no image generation and no Yoast fields), but you’ll hit limits faster. If you want help choosing, Talk to an automation expert and map the version you actually need.
Once this is running, your spreadsheet becomes the source of truth and WordPress becomes the output. Honestly, that’s the kind of boring reliability content teams need.
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.