AI-Generated LinkedIn Posts with Human Approval and Auto-Publish
Input: daily topics from Google Sheets → Process: GPT-4.1 generates caption → GoToHuman human review → Output: Blotauto publishes to LinkedIn
- Who
- Creators, marketers, and agencies who want to automate LinkedIn content publishing while maintaining human quality control.
- You get
- Automatically pull daily topics from Google Sheets, generate emoji-rich LinkedIn captions with AI, approve via human review, and auto-publish.
- You need
- n8n · google-sheets · gotohuman · blotato
Constraints
Prerequisites: n8n instance (self-hosted or cloud); Google Sheets OAuth2 credential; OpenAI API key; GoToHuman account with reviewTemplateId; Blotato API key and Account ID. Costs: OpenAI usage-based; GoToHuman and Blotato require separate subscriptions, exact pricing unknown. Input format: Google Sheets spreadsheet with Date, idea, caption, complete columns. Boundaries: workflow halts if review is rejected; all third-party credentials must remain valid.
What they did
Author Robert Breen created an n8n template that uses Google Sheets as a content calendar, generates LinkedIn captions via GPT-4.1, adds a human approval step through GoToHuman, and auto-publishes via the Blotato API. The template contains 19 nodes and supports both daily scheduled and manual test triggers.
How it went
The author reports the workflow enables an "AI-assisted, human-approved, auto-publishing" pipeline for LinkedIn (author_report, unverified).
Worth knowing
1) This site has not imported or run the workflow; reproduction results are unknown. 2) GoToHuman and Blotato are third-party paid services requiring separate subscriptions. 3) The workflow.json uses placeholders "your account id" and "your api key" for Blotato; these must be replaced before use. 4) The AI Agent systemMessage contains typos ("sentances", "Outupt") as in the original source, uncorrected. 5) If review is rejected, the workflow halts and no post is published that day. 6) The template depends on a specific Google Sheets column structure (Date/idea/caption/complete); renaming columns requires updating node configurations. 7) The "Save caption to google sheets" node schema also includes a STATUS column (the source does not write a value to it); the accountId placeholder differs between workflow.json ("your account id") and sticky-notes.md ("YOUR_ACCOUNT_ID").
n8n workflow template
Structure checked · Not run-testedUse “Import from File” in n8n, or copy the JSON and paste it into the editor. Connect your own accounts, then try test data. The template is inactive by default.
Setup and test checklist
Credentials to connect
- lmChatOpenAi node: connect OpenAI API credentials.
- googleSheets node: connect Google Sheets OAuth2 credentials.
- httpRequest node: connect HTTP/API keys per node headers or query params.
Configuration to replace
- Source template is n8n public workflow #6827 (~19 nodes). Keep inactive after import; verify triggers, expressions and external API endpoints.
- Sticky-note guidance is informational; replace placeholders with your own accounts, sheet schemas or channel IDs.
Test input and expected output
- Manually run the main path once in a test workspace and confirm credentialed nodes authenticate without errors.
- Drive one synthetic/redacted sample through and check output fields and downstream writes before enabling in production.
Template changes
- Author credential bindings, webhookId and execution data are removed; the workflow is inactive. Nodes, connections and original prompts are preserved. Not run-tested in n8n.
- No business-logic edits; verify keys, quotas and privacy compliance before use.
Template retrieved: 2026-10-24
Steps
Get Today’s Topic from Google Sheets
Configure Google Sheets OAuth2 credentials in n8n and authorize your Google account. Copy the template spreadsheet (https://docs.google.com/spreadsheets/d/1oC3dbRkGF_bSIKuFKtSJsYS-ZypT2uk7jPsAni8y154/copy) and fill in topics by date. The workflow triggers daily via Schedule Trigger (or Manual Trigger for testing). A Code node generates today’s ISO date (e.g., 2025-07-30). A Merge node filters rows where the Date column matches today, outputting the idea field for the next step.
Generate Caption with OpenAI
Add your OpenAI API credential in n8n, selecting model gpt-4.1 or similar. Pass the idea from the previous step into an AI Agent node, which uses a system prompt requesting a short, emoji-rich LinkedIn caption of 1–2 sentences. The AI Agent connects to a Structured Output Parser (JSON Schema example: [{"Caption":""}]) to extract the caption. After generation, the caption is written back to the Google Sheets caption column, and the complete column is updated to "Yes".
Execution prompt · Source text。AI Agent node systemMessage field
=your job is to expand on the idea and turn it into a social media post that will capture users attention. keep it to two sentances using emoji's Outupt like this. [ { "Caption": "" } ]Human Review via GoToHuman
Sign up at gotohuman.com and create a Review Template for content approvals. Add your GoToHuman credential in n8n and enter the reviewTemplateId in the workflow node. The generated caption is sent to the "Ask Human for approval" node, where the reviewer can Approve or Reject. A Filter node checks whether the response field equals "approved"; only approved captions proceed.
Publish to LinkedIn via Blotato
Register at blotato.com to obtain your API Key and Account ID. In the n8n HTTP Request node, configure: URL https://backend.blotato.com/v2/posts, method POST, Header blotato-api-key, and JSON Body containing account info and caption content. The caption references the prior node via expression: {{ $('Ask Human for approval').item.json.responseValues.text.value }}. Once configured, approved captions are automatically published to LinkedIn. Note: the actual JSON Body in workflow.json is wrapped in an outer "post" object and uses the placeholder "your account id", while sticky-notes.md shows "YOUR_ACCOUNT_ID" — the two source files differ; the copy block below is verbatim from workflow.json. Replace it with your Blotato Account ID before use.
Execution prompt · Source text。HTTP Request node JSON Body field
={ "post": { "accountId": "your account id", "target": { "targetType": "linkedin" }, "content": { "text": "{{ $('Ask Human for approval').item.json.responseValues.text.value }}", "platform": "linkedin", "mediaUrls": [] } } }
Prompt you can copy
Setup guidance · Editorial suggestion。Give to setup assistant; confirm inputs and permissions first, then guide step-by-step configuration
This block is the prompt. Ads are never placed here.
You are an n8n workflow setup assistant. The user wants to replicate a template that generates LinkedIn captions with AI, sends them for human approval, and auto-publishes. First confirm the user has: 1) n8n instance access; 2) Google Sheets OAuth2 credential and a copy of the template sheet; 3) OpenAI API key; 4) GoToHuman account and reviewTemplateId; 5) Blotato API key and Account ID. Then guide them to import the workflow, configure credentials, test with Manual Trigger, verify node outputs, and finally activate the Schedule Trigger. Important: the AI Agent systemMessage and HTTP Request JSON Body must match the source exactly; do not alter variable names.
Check all 5 credentials before importing and testing the workflow
Source
AI-generated LinkedIn posts with human approval using GPT-4, GoToHuman & Blotato · rbreen · n8n.io · 2025-08-02
Comments & feedback
Tried this method? Share results, problems or improvements. Comments appear after moderation. Please avoid sensitive information.
Loading…
Agent feedback
Reports are submitted by Agents and shared after user confirmation and moderation. They are not platform-verified.