Google Sheets to WordPress, posts published and promoted
Your content calendar looks organized in Google Sheets. Then publishing day hits, and it turns into a messy checklist: copy the draft, clean the formatting, find an image, upload it, set categories, write a meta description, then crank out social captions you’ll probably rewrite anyway.
This Sheets WordPress automation hits content marketers hardest, but agency owners and small business teams feel it too. The payoff is simple: consistent posts go live on WordPress with a featured image and ready-to-use captions for Instagram, Facebook, and X (Twitter), without you babysitting every step.
Below you’ll see exactly how the workflow runs, what you need to connect, and where the real time savings come from once it’s in place.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to WordPress, posts published and promoted
flowchart LR
subgraph sg0["When clicking ‘Test workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n5@{ icon: "mdi:brain", form: "rounded", label: "OpenAI 4.1 mini4", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Write prompt to create image", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "OpenAI", 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/>Upload Image to Wordpress2"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Set Image on Wordpress Post2"]
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/wordpress.svg' width='40' height='40' /></div><br/>Wordpress"]
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Cleanup Links", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Cleanup HTML ", pos: "b", h: 48 }
n13@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Google Sheets", pos: "b", h: 48 }
n15@{ icon: "mdi:wrench", form: "rounded", label: "get brand brief", pos: "b", h: 48 }
n16@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n17@{ icon: "mdi:robot", form: "rounded", label: "Idea creator", pos: "b", h: 48 }
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/>Perplexity Research1"]
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/>WordPress excerpt add"]
n20@{ icon: "mdi:robot", form: "rounded", label: "Excerpt creator", pos: "b", h: 48 }
n21@{ icon: "mdi:database", form: "rounded", label: "Update list of blog post", pos: "b", h: 48 }
n22@{ icon: "mdi:database", form: "rounded", label: "Update base post", 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/markdown.dark.svg' width='40' height='40' /></div><br/>Markdown"]
n24@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n25@{ icon: "mdi:robot", form: "rounded", label: "Content writer", pos: "b", h: 48 }
n26@{ icon: "mdi:brain", form: "rounded", label: "OpenAI 4.1 mini", pos: "b", h: 48 }
n27@{ icon: "mdi:brain", form: "rounded", label: "OpenAI 4.1 mini2", pos: "b", h: 48 }
n28@{ icon: "mdi:brain", form: "rounded", label: "OpenAI 4.1 mini3", 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/code.svg' width='40' height='40' /></div><br/>Category rewrite"]
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/>Upload Image to Wordpress"]
n31["<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 Image on Wordpress Post"]
n32["<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 from Pexcel"]
n33["<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/>Download Image"]
n34@{ icon: "mdi:robot", form: "rounded", label: "Write prompt to search image", pos: "b", h: 48 }
n35@{ icon: "mdi:brain", form: "rounded", label: "OpenAI 4.1 mini1", pos: "b", h: 48 }
n36@{ icon: "mdi:robot", form: "rounded", label: "Social Media Content", pos: "b", h: 48 }
n37@{ icon: "mdi:brain", form: "rounded", label: "gpt-4.1 mini", pos: "b", h: 48 }
n38@{ icon: "mdi:robot", form: "rounded", label: "Social Media Content Creator", pos: "b", h: 48 }
n39["<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/facebook.svg' width='40' height='40' /></div><br/>Upload media to Instagram"]
n40["<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/facebook.svg' width='40' height='40' /></div><br/>Publish Post on IG"]
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/facebook.svg' width='40' height='40' /></div><br/>Facebook Post1"]
n42@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n43["<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/>Merge3"]
n44["<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/>Merge4"]
n45@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields2", pos: "b", h: 48 }
n46["<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/x.dark.svg' width='40' height='40' /></div><br/>X"]
n47["<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"]
n48@{ icon: "mdi:message-outline", form: "rounded", label: "Gmail", pos: "b", h: 48 }
n49@{ icon: "mdi:database", form: "rounded", label: "Add too Data Bank", pos: "b", h: 48 }
n50@{ icon: "mdi:cog", form: "rounded", label: "Aggregate1", pos: "b", h: 48 }
n51@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields3", pos: "b", h: 48 }
n52@{ icon: "mdi:robot", form: "rounded", label: "OpenAI1", pos: "b", h: 48 }
n53@{ icon: "mdi:robot", form: "rounded", label: "OpenAI2", pos: "b", h: 48 }
n54["<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 image Cloudinary1"]
n55["<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 image Cloudinary"]
n46 --> n47
n47 --> n50
n43 --> n39
n44 --> n41
n7 --> n8
n7 --> n34
n52 --> n55
n53 --> n54
n23 --> n21
n10 --> n6
n50 --> n49
n42 --> n43
n45 --> n44
n51 --> n38
n17 --> n29
n37 -.-> n38
n12 --> n10
n11 --> n25
n14 -.-> n17
n13 -.-> n17
n25 --> n12
n33 --> n30
n41 --> n47
n20 --> n19
n26 -.-> n25
n15 -.-> n17
n29 --> n18
n35 -.-> n34
n27 -.-> n20
n28 -.-> n17
n5 -.-> n6
n24 --> n17
n22 --> n51
n49 --> n48
n40 --> n47
n18 --> n11
n36 -.-> n38
n32 --> n33
n55 --> n43
n19 --> n23
n54 --> n44
n21 --> n22
n16 -.-> n17
n30 --> n31
n39 --> n40
n8 --> n9
n31 --> n20
n9 --> n20
n38 --> n45
n38 --> n42
n38 --> n46
n38 --> n52
n38 --> n53
n6 --> n7
n34 --> n32
n0 --> n17
end
subgraph sg1["When Executed by Another Workflow Flow"]
direction LR
n1@{ icon: "mdi:play-circle", form: "rounded", label: "When Executed by Another Wor..", pos: "b", h: 48 }
n2["<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/notion.dark.svg' width='40' height='40' /></div><br/>Notion"]
n3@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n2 --> n3
n3 --> n4
n1 --> n2
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 n0,n24,n1 trigger
class n6,n7,n16,n17,n20,n25,n34,n36,n38,n52,n53 ai
class n5,n26,n27,n28,n35,n37 aiModel
class n15 ai
class n13 ai
class n14,n21,n22,n49,n2 database
class n8,n9,n18,n19,n30,n31,n32,n33,n39,n40,n41,n54,n55 api
class n29 code
classDef customIcon fill:none,stroke:none
class n8,n9,n10,n18,n19,n23,n29,n30,n31,n32,n33,n39,n40,n41,n43,n44,n46,n47,n54,n55,n2 customIcon
The Problem: Publishing Consistently Takes Too Many Micro-Steps
Publishing “one blog post” is rarely one task. It’s a chain of tiny decisions and repetitive clicks that drain focus fast: formatting gets weird when you paste into WordPress, images don’t match the headline, categories drift over time, and social posts end up sounding generic because you’re rushing. Then there’s tracking. Somebody has to log what went live, where it was promoted, and what link was used. If you miss even one step, you notice later (usually when traffic is flat and you can’t tell why).
The friction compounds. Here’s where it usually breaks down.
- Copying from a doc or sheet into WordPress often creates formatting cleanup that steals about 20 minutes per post.
- Featured images become a bottleneck because you’re switching tools, downloading files, re-uploading, and redoing alt text.
- Social captions get pushed to “later,” which turns into missed promotion on Instagram, Facebook, and X.
- Tracking what shipped (and what didn’t) turns into a stale spreadsheet nobody trusts.
The Solution: Google Sheets → WordPress Publishing, Plus Social Promotion
This workflow turns your Google Sheets content calendar into the source of truth, then handles the heavy lifting inside n8n. On a schedule (or when you manually run it to test), it checks your planned topics so you don’t accidentally generate duplicates. It pulls in your brand brief, generates a blog idea, runs live research through Perplexity, and drafts a full article in your preferred structure. Next, it sanitizes and normalizes the HTML so your WordPress post formatting stays consistent. It also generates a featured image using OpenAI, with a fallback to Pexels if needed, then uploads and assigns it in WordPress. Finally, it creates platform-specific social posts and publishes them to Instagram and Facebook (via the Meta Graph API) and to X, then logs everything back to Google Sheets and can email you a report in Gmail.
The workflow starts with your schedule trigger and a Sheets-driven “what should we publish next?” check. From there, AI writes, research supports the claims, images are created or sourced, and WordPress gets a clean, publish-ready post. Social promotion happens in the same run, so the post doesn’t just exist. It gets pushed.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 3 posts per week and promote each one on Instagram, Facebook, and X. Manually, you might spend about 45 minutes writing and formatting in WordPress, another 20 minutes finding and uploading an image, and about 10 minutes per social platform for captions and posting. That’s roughly 2 hours per post, or about 6 hours a week. With this workflow, the “work” becomes: update your Google Sheet, let the run complete, then spend about 20 minutes reviewing the draft and hitting publish (or letting it publish automatically if you trust your prompts). You get most of that week back.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for the content calendar and logging.
- WordPress to publish posts, images, categories, and excerpts.
- OpenAI API key (get it from the OpenAI API dashboard).
Skill level: Intermediate. You’ll connect a few services, paste API keys, and edit prompts so the writing matches your brand.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Your calendar kicks it off. The workflow can run on a schedule, or you can trigger it manually for testing. It starts by checking your Google Sheets plan so the next post is actually “next,” not a repeat of last week’s topic.
Research and drafting happen in one pass. It retrieves your brand brief, generates an idea, then uses Perplexity research via HTTP request to ground the article in current information. After that, the draft writer produces the post content and a structured excerpt you can use in WordPress and social sharing.
Formatting and cleanup are handled before WordPress sees it. The workflow normalizes links and sanitizes HTML so you don’t get random font sizes, broken lists, or spacing chaos after publishing. Categories can also be rewritten and standardized, which helps your site stay organized as volume grows.
Publishing and promotion are tied together. The post goes to WordPress with the featured image assigned (generated by OpenAI or pulled from Pexels as a fallback), then the social content agent creates captions and pushes them to Instagram and Facebook through Meta’s Graph API and to X through the Twitter integration. Results are merged, aggregated, and logged back into Google Sheets, and you can get a Gmail notice with the publication details.
You can easily modify the review step to publish as a draft instead of going live based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Trigger Nodes
This workflow can run on demand or on a schedule, and can also be invoked by another workflow.
- Open Manual Test Trigger and use it for ad-hoc testing and development runs.
- Open Scheduled Run Trigger and define your production cadence in the schedule settings.
- Open Workflow Execution Trigger if you plan to call this workflow from a parent workflow.
Step 2: Connect Notion and Prepare Source Records
This branch pulls content records from Notion and shapes them for downstream processing.
- Open Notion Workspace Fetch and select the database or page source you want to ingest.
- Credential Required: Connect your Notion credentials.
- In Aggregate Records, verify the aggregation strategy you want for batching records.
- In Map Fields, map the Notion properties you need for the article pipeline.
Step 3: Set Up Idea Generation and AI Tooling
The core ideation and brand alignment happens in the AI agent with memory, tools, and structured outputs.
- Open Idea Generator and review the agent prompt and tool bindings.
- Ensure Mini Chat Model C is connected as the language model for Idea Generator and add OpenAI credentials there.
- Confirm Buffer Memory, Sheets Tool Access, Retrieve Brand Brief, and Structured Output Parser A are attached to Idea Generator.
- Credential Required: Connect your OpenAI credentials on Mini Chat Model C.
- Credential Required: Connect your Google Sheets credentials on Sheets Tool Access.
Step 4: Research, Draft, and Sanitize the Article
This segment conducts research, normalizes references, drafts the article, and cleans HTML for publishing.
- Review Rewrite Categories to ensure category normalization logic fits your taxonomy.
- Open Perplexity Research A and configure the HTTP request to your research endpoint.
- Use Normalize Links to standardize URLs before drafting.
- Open Article Draft Writer and confirm the prompt; ensure Mini Chat Model is connected as the language model.
- In Sanitize HTML, add any cleaning rules needed for your WordPress editor.
Step 5: Publish to WordPress and Build Featured Media
After the draft is sanitized, the workflow publishes it to WordPress, generates images, and sets featured media and excerpt content.
- Open Publish to WordPress and configure the post type, status, and target site.
- Credential Required: Connect your WordPress credentials.
- Review the image generation path: Compose Image Prompt → OpenAI Image Call → Upload Image to WP Alt → Assign WP Featured Img Alt.
- Review the Pexels path: Compose Search Prompt → Fetch Image from Pexels → Download Image File → Upload Image to WP → Assign WP Featured Image.
- Confirm excerpt flow: Excerpt Composer → Add WP Excerpt → Markdown Formatter.
Step 6: Generate Social Content and Run Parallel Branches
Social copy and images are generated by the social agent, then routed in parallel to multiple channels.
- Open Update Blog Index → Update Core Post → Map Social Fields C and confirm field mapping for social prompts.
- Open Social Content Agent and ensure GPT Mini Language Model is connected as the language model, with Social Output Parser attached.
- Credential Required: Connect your OpenAI credentials on GPT Mini Language Model.
- Note the parallel execution: Social Content Agent outputs to both Map Social Fields B and Map Social Fields A and Post to X and OpenAI Social Image A and OpenAI Social Image B in parallel.
- Configure channel delivery: Map Social Fields A → Combine Streams A → Upload to Instagram → Publish Instagram Post.
- Configure channel delivery: Map Social Fields B → Combine Streams B → Publish Facebook Post.
- Credential Required: Connect your Twitter (X) credentials on Post to X.
- Credential Required: Connect your Facebook Graph API credentials on Upload to Instagram, Publish Instagram Post, and Publish Facebook Post.
Step 7: Aggregate Social Results, Log to Sheets, and Notify
After social posts are published, results are aggregated, stored, and a notification is sent.
- Confirm Combine Social Results merges results from Publish Instagram Post, Publish Facebook Post, and Post to X.
- Open Aggregate Social Data and ensure the aggregation output structure matches your sheet schema.
- Open Append to Data Bank, Update Blog Index, and Update Core Post and connect your target Google Sheets.
- Credential Required: Connect your Google Sheets credentials for all Sheets nodes (multiple nodes handle blog index updates and logging).
- Open Send Gmail Notice and configure the email recipients and template.
- Credential Required: Connect your Gmail credentials.
Step 8: Test and Activate Your Workflow
Verify that the full publishing and social workflow runs end-to-end before scheduling it.
- Click Execute Workflow starting from Manual Test Trigger and confirm the run reaches Send Gmail Notice.
- Check WordPress for a newly created post with featured image and excerpt added via Assign WP Featured Image and Add WP Excerpt.
- Confirm social outputs were posted from Publish Instagram Post, Publish Facebook Post, and Post to X.
- Verify Sheets updates in Update Blog Index, Update Core Post, and Append to Data Bank.
- Once validated, activate the workflow and rely on Scheduled Run Trigger for production execution.
Common Gotchas
- WordPress credentials can expire or need specific permissions. If things break, check your WordPress Application Passwords (or user role capabilities) 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 60–90 minutes if your accounts and permissions are ready.
No. You’ll mostly connect accounts and edit prompts in plain English.
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 usage and any Perplexity costs depending on your setup.
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. Change the WordPress publishing action so it creates a draft rather than publishing immediately, then keep the rest of the flow the same (image upload, excerpt, and logging still work). You can also adjust the “Social Content Agent” branch to only generate captions and store them in Google Sheets instead of posting them.
Most of the time it’s an application password issue or a user role problem. Regenerate your WordPress Application Password, update it inside n8n, and confirm the WordPress user can actually publish posts and upload media. If image upload fails but posting works, check media permissions and the site URL used in the HTTP Request nodes. Also watch for security plugins that block REST API requests, because they can break publishing without an obvious error.
If you self-host n8n, there’s no fixed execution limit (it mainly depends on your server). On n8n Cloud, your monthly execution cap depends on your plan, and this workflow may use multiple executions per post because it runs research, writing, image steps, and social publishing.
Often, yes, if you want the “all-in-one” run that includes research, long-form writing, HTML cleanup, image handling, and multi-platform posting. n8n is simply more comfortable when the workflow has lots of branching and data shaping, and self-hosting can keep costs predictable at higher volume. Zapier or Make can still be fine for lightweight publishing like “new row in Sheets → create WordPress draft.” But once you add AI, fallbacks (like Pexels), and logging, those tools can get brittle and expensive. If you’re on the fence, Talk to an automation expert and we’ll map the simplest option for your setup.
Once this is running, publishing stops being a weekly scramble. The workflow handles the repetitive stuff, and you get your time back for planning, offers, and growth.
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.