LinkedIn + OpenAI drafts with GoToHuman approval
Your blog is publishing. Your LinkedIn is quiet. Not because you don’t have ideas, but because turning a post into a good LinkedIn draft takes time, context-switching, and a little too much willpower.
Marketing managers feel it when the content calendar gets crowded. Founders feel it when posting slips for “just a week.” And consultants who live on referrals know consistency matters. This LinkedIn draft automation turns new blog articles into ready-to-review posts, without risking off-brand AI noise.
This workflow pulls fresh articles, summarizes them with OpenAI, drafts LinkedIn copy, then routes everything through GoToHuman so a real person approves (or regenerates) before anything goes live. You’ll see how it works, what you need, and where teams usually trip up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: LinkedIn + OpenAI drafts with GoToHuman approval
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", 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/html.dark.svg' width='40' height='40' /></div><br/>Fetch feed item HTML"]
n3["<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/>Fetch n8n blog feed"]
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/html.dark.svg' width='40' height='40' /></div><br/>Extract Title,Link+Tag"]
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/>Fetch Article HTML"]
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/html.dark.svg' width='40' height='40' /></div><br/>Extract publishing datetime"]
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Post from last 24hrs?", pos: "b", h: 48 }
n8@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Summarize Article", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Draft LinkedIn Post", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Article link", 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/linkedin.svg' width='40' height='40' /></div><br/>Create a post"]
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Initial Prompt", pos: "b", h: 48 }
n14@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Retry", 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/>Fetch Article (LLM-friendly)"]
n19@{ icon: "mdi:cog", form: "rounded", label: "Human approval", pos: "b", h: 48 }
n17 --> n10
n16 --> n12
n16 --> n15
n16 --> n17
n1 --> n4
n11 --> n5
n12 --> n15
n19 --> n16
n15 --> n13
n0 --> n3
n8 -.-> n9
n9 --> n15
n5 --> n6
n14 -.-> n10
n13 --> n10
n10 --> n19
n3 --> n2
n2 --> n1
n7 --> n18
n4 --> n11
n6 --> n7
n18 --> n9
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 trigger
class n9,n10 ai
class n8,n14 aiModel
class n7,n16 decision
class n3,n5,n18 api
classDef customIcon fill:none,stroke:none
class n2,n3,n4,n5,n6,n12,n18 customIcon
The Problem: Turning blogs into LinkedIn posts is tedious
Repurposing a blog post sounds easy until you actually do it. You have to read (or re-read) the article, pull out the point, translate it into a LinkedIn-friendly angle, and write something that doesn’t sound like a newsletter intro. Then you second-guess the tone. Then someone asks, “Did we already post this?” And if you’re trying to stay brand safe, you’re either avoiding AI entirely or you’re generating drafts and rewriting most of them anyway. After a few cycles, the whole thing quietly falls apart.
The friction compounds. Here’s where it breaks down in real life.
- Each post requires a full context rebuild, so “quick repurposing” still eats about 30–45 minutes.
- Manual checks get skipped when you’re busy, which is when tone mistakes sneak through.
- If multiple articles publish close together, you end up batch-writing drafts late at night and quality drops.
- Without a repeatable approval step, you either don’t post, or you post something you wouldn’t want screenshotted.
The Solution: Auto-draft posts, then require human approval
This n8n workflow runs on a schedule and checks a blog (the template uses https://blog.n8n.io). It pulls the latest feed HTML, extracts article titles and links, and fetches each article page. Next, it checks the publish timestamp and keeps only posts published in roughly the last day, so you’re not drafting old news. For each recent article, OpenAI generates a summary, then drafts a LinkedIn update based on that summary and your prompt setup. Finally, every draft goes to GoToHuman, where a reviewer can approve, edit, or request a regeneration (and even tweak the prompt). Only approved content gets published automatically to LinkedIn.
The workflow starts with a daily scheduled trigger, then uses HTTP requests and HTML parsing to detect what’s new. OpenAI handles the summarizing and draft writing. GoToHuman acts as the gatekeeper, and LinkedIn publishing happens only after an explicit approval decision.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your blog publishes 3 posts a week. Manually, a decent LinkedIn repurpose often takes about 40 minutes per post once you include reading, drafting, polishing, and a quick internal review, so that’s roughly 2 hours weekly. With this workflow, the daily run finds new posts automatically, generates drafts, and drops them into GoToHuman for review. You might spend 5 minutes approving or lightly editing each one, which turns that weekly effort into about 15–20 minutes, plus the background processing time you don’t have to sit through.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- GoToHuman for human-in-the-loop review and approval.
- OpenAI to summarize articles and draft LinkedIn posts.
- LinkedIn to publish approved posts automatically.
Skill level: Intermediate. You’ll connect credentials, adjust prompts, and may tweak HTML extraction if your blog structure differs.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily schedule kicks things off. The workflow runs once per day, so you’re not relying on someone to remember “LinkedIn time.” Simple, steady.
The workflow finds new articles and filters out old ones. It retrieves the blog feed, parses the titles and links, then fetches each article’s HTML to grab the publish timestamp. If the post wasn’t published in the last 24 hours, it gets ignored.
OpenAI turns the article into a LinkedIn-ready angle. First it creates a summary from clean article text, then it drafts a LinkedIn update using your prompt (and any examples you include). There’s also a retry loop so regeneration isn’t a manual redo from scratch.
GoToHuman decides what happens next. A reviewer can approve and publish, edit the draft, or request a regeneration (even with an adjusted prompt). Approved items route to the LinkedIn node and publish automatically.
You can easily modify the blog source URL to monitor a different site based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Run Trigger
Set the workflow to run on a daily schedule so it can check the blog for new posts automatically.
- Add and open Scheduled Run Trigger.
- Set the schedule rule to run daily at
7using the triggerAtHour setting. - Ensure Scheduled Run Trigger connects to Retrieve Blog Feed.
Step 2: Connect the Blog Feed Parsing Pipeline
Fetch the blog homepage HTML, extract post blocks, and parse titles and links for each post.
- In Retrieve Blog Feed, set URL to
https://blog.n8n.io/. - In Extract Feed HTML, set Operation to
extractHtmlContentand extract posts using CSS selectorarticle.itemwith Return Array enabled. - In Distribute Posts, set Field to Split Out to
postsand Destination Field Name topost. - In Parse Title Link Tags, set Data Property Name to
postand extract link, title, and tags using selectors.item-title aand.item-tags a.
Step 3: Build Article URLs and Filter Recent Posts
Compose each article URL, fetch article metadata, and ensure only recent posts move forward.
- In Compose Article URL, add an assignment for articleUrl with value
=https://blog.n8n.io{{ $json.link }}and keep Include Other Fields enabled. - In Retrieve Article HTML, set URL to
={{ $json.articleUrl }}. - In Get Publish Timestamp, extract published from selector
meta[property="article:published_time"]with Return Value set to attributecontent. - In Recent Publish Check, set the boolean condition to
={{ (new Date($('Scheduled Run Trigger').item.json.timestamp) - new Date($json.published)) / (1000 * 60 * 60) <= 480 }}to allow only posts from the last 480 hours. - In Fetch Clean Article Text, set URL to
=https://r.jina.ai/{{ $('Compose Article URL').item.json.articleUrl }}.
Step 4: Set Up AI Summarization and Drafting
Use OpenAI to summarize each article and draft a LinkedIn post based on the extracted content.
- Open OpenAI Chat Engine and select the model
gpt-4o-mini. - In Generate Article Summary, set Text to
={{ $json.data }}and define the prompt message that asks for a markdown summary. - Credential Required: Connect your OpenAI API credentials in OpenAI Chat Engine. This node provides the language model for Generate Article Summary.
- In Initialize Draft Prompt, set prompt to
You will be passed a scraped article from a company blog. I'm an influencer for their product and will write a LinkedIn post for every news that is coming out. Please write an engaging post based on the article. - Open OpenAI Chat Engine B and select the model
gpt-4o-mini. - In Draft LinkedIn Update, set Text to
={{ $('Fetch Clean Article Text').item.json.data }}and set the prompt message to={{ $json.prompt }}. - Credential Required: Connect your OpenAI API credentials in OpenAI Chat Engine B. This node provides the language model for Draft LinkedIn Update.
- Use Iterate Items Batch to control batching between Generate Article Summary and Initialize Draft Prompt for each item.
Step 5: Configure Human Review and Publishing
Send the draft for human approval, route the outcome, and publish approved posts to LinkedIn.
- In Human Review Gate, map the review fields to include link, summary, postDraft, and timestamp using the existing expressions like
={{ $('Generate Article Summary').item.json.text }}and={{ new Date($('Get Publish Timestamp').item.json.published).toDateTime().toRelative() }}. - Keep updateForReviewId set to
={{ $('Prepare Retry Prompt').isExecuted ? $('Prepare Retry Prompt').item.json.reviewToUpdate : null }}to support review retries. - In Route Review Outcome, keep the switch rules matching
approved,rejected, andtype=chatfor retry handling. - In Prepare Retry Prompt, set prompt to
={{ $json.messages[0].content }}and reviewToUpdate to={{ $json.reviewId }}. - In Publish LinkedIn Post, set Text to
={{ $json.responseValues.postDraft.value }}, Title to={{ $('Parse Title Link Tags').item.json.title }}, and Original URL to={{ $('Compose Article URL').item.json.articleUrl }}, with shareMediaCategory set toARTICLE. - Ensure Publish LinkedIn Post connects back to Iterate Items Batch to continue processing remaining posts.
- Credential Required: Connect your GoToHuman credentials in Human Review Gate.
- Credential Required: Connect your LinkedIn credentials in Publish LinkedIn Post.
Step 6: Test and Activate Your Workflow
Run a manual test to confirm the feed parsing, AI outputs, review gate, and LinkedIn publishing all work correctly.
- Click Execute Workflow and verify Retrieve Blog Feed returns HTML and Extract Feed HTML returns an array of
posts. - Confirm Compose Article URL generates valid URLs and Get Publish Timestamp returns a
publishedvalue. - Check that Generate Article Summary produces a markdown summary and Draft LinkedIn Update produces a post draft.
- Approve a draft in Human Review Gate and confirm Publish LinkedIn Post publishes successfully to LinkedIn.
- When everything works as expected, toggle Active to enable scheduled runs.
Common Gotchas
- GoToHuman credentials can expire or need specific permissions. If things break, check the GoToHuman node credentials and the selected review template ID in GoToHuman 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 if your accounts and permissions are ready.
No. You’ll connect accounts, paste a few IDs/URLs, and adjust the prompts. The only “technical” part is tweaking HTML parsing if your blog layout is unusual.
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 drafted post.
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 you should. Swap the monitored blog URL in the feed/article HTTP request nodes, then adjust the HTML parsing nodes if the site structure differs. Most teams also update the “Initialize Draft Prompt” and “Draft LinkedIn Update” prompts with brand rules and a few example posts, so the drafts sound like you. If your approvals need different outcomes (like “send to email” instead of publish), you can tweak the routing in the “Route Review Outcome” switch.
Usually it’s an invalid credential or the review template isn’t selected correctly. Double-check that you installed the GoToHuman node before importing, then confirm the template (“Blog scraper agent” or the provided template ID) is available in your GoToHuman account. If it still fails, regenerate the GoToHuman API key, update it in n8n, and rerun with one article to keep debugging simple.
Plenty for a typical company blog. On n8n Cloud, the practical limit is your monthly executions and how many articles you process per run; if you self-host, it mainly depends on your server and OpenAI rate limits. If your feed can publish dozens of posts per day, you’ll want to keep the split-in-batches settings conservative and watch execution timeouts.
Often, yes. This workflow mixes scraping, timestamp filtering, batching, retries, and a human approval loop, which is the kind of “glue logic” n8n tends to handle more comfortably. Zapier/Make can do parts of it, but multi-step content workflows can get expensive and brittle once you add branching and regeneration paths. Also, self-hosting matters when you want control and higher volume. If you’re unsure, pick the tool your team will actually maintain, then improve from there. Talk to an automation expert and you’ll get a straight recommendation.
Once this is running, new posts stop being “one more thing” to promote. You get drafts daily, approvals stay clean, and LinkedIn finally keeps up with your 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.