How to Build an AI Website Chatbot with CRM Lead Capture Using n8n

AI Website Chatbot n8n workflow template thumbnail

Every visitor who leaves your website without talking to someone is a missed opportunity. Maybe they had a question about your services but didn’t feel like filling out a contact form. Maybe they were ready to buy but got distracted. A live chat widget helps, but you can’t sit at your desk 24/7 waiting for messages. What if an AI chatbot could greet visitors, answer their questions about your business, and quietly collect their name and email — all while you sleep? That’s exactly what you’ll build in this guide using n8n and OpenAI.

Prefer to skip the setup? Grab the ready-made template → and be up and running in under 10 minutes.

What You’ll Build

  1. A visitor lands on your website and sees a chat widget in the corner of the screen.
  2. They type a question — the AI chatbot responds naturally, explains your services, and asks what they need help with.
  3. Once the visitor shares their email and describes their project, the chatbot automatically saves the lead to a Google Sheet acting as your lightweight CRM.
  4. The visitor gets a friendly confirmation message, and you wake up to a spreadsheet full of qualified leads ready for follow-up.

How It Works — The Big Picture

This template uses two connected workflows inside n8n. The main workflow runs the chatbot itself — receiving messages, thinking through responses with GPT-4o mini, and maintaining conversation context. When the visitor shares their contact info, the chatbot calls a sub-workflow tool that extracts the email and description, formats it into clean JSON, and appends a new row to your Google Sheet.

┌──────────────────────────────────────────────────────────────────────────────┐
│  MAIN WORKFLOW — Website Chatbot                                            │
│                                                                              │
│  [Chat Trigger] → [Website Chatbot Agent] ←── [OpenAI GPT-4o mini]         │
│                           ↑                                                  │
│                    [Conversation Memory]                                     │
│                           ↓ (tool call when lead info collected)             │
│                    [Save Lead to CRM]                                        │
└──────────────────────────────────────────────────────────────────────────────┘
                            │
                            ▼
┌──────────────────────────────────────────────────────────────────────────────┐
│  SUB-WORKFLOW — CRM Lead Processing                                         │
│                                                                              │
│  [Receive Lead Data] → [Extract Lead Info] → [Append to Sheet] → [Confirm] │
│                              ↑                                               │
│                     [GPT-4o mini + Output Parser]                            │
└──────────────────────────────────────────────────────────────────────────────┘
                            │
                            ▼
                   ┌─────────────────┐
                   │  Google Sheets   │
                   │  (Leads CRM)     │
                   └─────────────────┘
  

What You’ll Need

  • A self-hosted or cloud n8n instance (version 1.0 or later)
  • An OpenAI API key with access to GPT-4o mini (or any other chat model)
  • A Google account with Google Sheets access (free tier works fine)
  • A website where you can embed the n8n chat widget (any site that supports JavaScript snippets)

Estimated build time: 30–45 minutes from scratch, or under 10 minutes with the template.

Part 1 — The Main Chatbot Workflow

This workflow handles every incoming message from your website visitors. It powers the AI conversation, remembers what the visitor said earlier in the chat, and calls the CRM sub-workflow when it detects lead information.

1 Chat Trigger (n8n Chat Trigger)

The Chat Trigger node is n8n’s built-in way to receive messages from a chat widget you embed on your website. When a visitor types something and hits send, this node fires and passes the message into the workflow.

  1. Add a Chat Trigger node to your canvas (search for “When chat message received”).
  2. Leave the default options as-is — no extra configuration needed.
  3. After saving and activating the workflow, n8n gives you a webhook URL and a small JavaScript snippet you can paste into your site’s HTML to display the chat widget.
{
  "action": "sendMessage",
  "body": {
    "message": "Hi, I'm interested in automating my invoice process."
  },
  "sessionId": "visitor-session-abc123"
}
💡

Tip: The n8n chat widget works on any website — WordPress, Shopify, static HTML, React apps. Just paste the embed snippet before the closing </body> tag.

2 Website Chatbot Agent (AI Agent)

This is the brain of the operation. The AI Agent node receives the visitor’s message, processes it through the OpenAI model, checks conversation history, and generates a helpful response. It’s configured with a system message that tells the AI who it is, what services your company offers, and what information to collect.

  1. Add an AI Agent node and connect it to the Chat Trigger.
  2. In the System Message field under Options, paste your company description and instructions. Here’s the template version (customize for your business):
You are the first point of contact for visitors on our website.
Your company helps businesses automate their internal processes
using n8n, an open-source workflow automation platform.

Keep answers brief and helpful.

Our services include:
- Designing and implementing automations using n8n
- Replacing manual work with fully automated workflows
- Training teams to manage and scale automations in-house

Your primary goals are:
1. Briefly explain what we do in a helpful, conversational tone.
2. Ask the visitor what processes they want to automate.
3. Collect their name and email address for follow-up.

After you have the email and what the user needs, send all the
info together to the CRM tool.
💡

Tip: The last line is critical — it tells the AI agent when to trigger the CRM tool. Without it, the agent won’t know to save the lead. Adjust the wording, but keep the instruction to call the tool once email and description are collected.

3 OpenAI Chat Model (Language Model)

This node provides the actual language model that powers the agent’s responses. It connects to the Agent node via the ai_languageModel connector — not the regular data flow.

  1. Add an OpenAI Chat Model node.
  2. Select gpt-4o-mini as the model (fast, cheap, and accurate enough for customer conversations).
  3. Connect your OpenAI API credential.
  4. Drag a connection from this node’s output to the Agent node’s AI Language Model input (the connector on the bottom-left of the Agent node).
📌

You can swap gpt-4o-mini for gpt-4o if you want more nuanced responses, but it costs roughly 10x more per token. For a lead-capture chatbot, gpt-4o-mini is the sweet spot.

4 Conversation Memory (Buffer Window Memory)

Without memory, the chatbot forgets everything after each message. The Buffer Window Memory node stores the last several exchanges so the AI can reference what the visitor said earlier in the conversation — like when they mentioned their name two messages ago.

  1. Add a Window Buffer Memory node.
  2. Leave defaults as-is (it stores the last 5 message pairs by default).
  3. Connect it to the Agent node’s AI Memory input.

Part 2 — The CRM Sub-Workflow (Lead Processing)

When the chatbot collects enough information (email + project description), the Agent calls the CRM tool. This tool is actually a full sub-workflow embedded inside a Tool Workflow node. It takes the raw conversation data, extracts the structured lead info, and saves it to Google Sheets.

5 Save Lead to CRM (Tool Workflow)

The Tool Workflow node lets you give the AI agent access to a multi-step process as if it were a single tool. When the agent decides it’s time to save the lead, it calls this tool and passes the conversation data in.

  1. Add a Tool Workflow node and connect it to the Agent node’s AI Tool input.
  2. Set the source to Parameter (this embeds the sub-workflow JSON directly inside the node, so you don’t need a separate workflow file).
  3. In the Description field, write: CRM tool to store lead information — call this once you have the visitor's email address and a description of what they need
  4. Paste the sub-workflow JSON into the Workflow JSON field. The template includes this pre-configured.
💡

Tip: The tool description matters more than you’d think. The AI agent reads this description to decide when to call the tool. A vague description like “save data” may cause the agent to trigger it at the wrong time.

6 Extract Lead Info (AI Agent with Output Parser)

Inside the sub-workflow, this agent node takes the raw conversation input (which could be messy — “Sure, my email is sarah.thompson@gmail.com and I need help with onboarding automation”) and extracts it into a clean JSON object with exactly two fields: email and description.

  1. The node receives input from the Receive Lead Data trigger.
  2. It uses GPT-4o mini with a strict system prompt that says: “You are a formatting assistant. Your only job is to extract and convert the input into clean, valid JSON.”
  3. A Structured Output Parser is connected to enforce the JSON schema, making sure the output always has the right shape.

After this node runs, the data looks like this:

{
  "output": {
    "email": "sarah.thompson@gmail.com",
    "description": "Wants help automating client onboarding and sending welcome emails."
  }
}

7 Append Lead to Sheet (Google Sheets)

This node takes the structured lead data and appends it as a new row in your Google Sheet. Each lead gets its own row with the email and project description.

  1. Connect your Google Sheets OAuth2 credential.
  2. Select your spreadsheet (or create a new one called “Leads CRM”).
  3. Choose Sheet1 as the sheet name.
  4. Map the columns: set email to ={{ $json.output.email }} and description to ={{ $json.output.description }}.

8 Send Confirmation (Code Node)

A simple Code node that returns a thank-you message back to the chatbot. This text gets sent back through the tool chain to the agent, which uses it to confirm the lead was saved.

return [
  {
    json: {
      text: "Thanks for the info, we will be in touch soon"
    }
  }
];

The Data Structure

Your Google Sheet acts as a lightweight CRM. It only needs two columns to start, but you can add more later (timestamp, source page, lead score).

Column Type Example Description
email Text sarah.thompson@gmail.com The visitor’s email address, collected during the chat conversation
description Text Wants help automating client onboarding and sending welcome emails A summary of what the visitor needs, extracted by the AI from the conversation

Here’s what a few rows might look like after a week of running the chatbot:

email description
sarah.thompson@gmail.com Wants help automating client onboarding and sending welcome emails
james.carter@outlook.com Looking to sync Shopify orders with their warehouse spreadsheet automatically
emily.rodriguez@acmecorp.com Needs a workflow to route support tickets from email to Slack channels
📌

Column names must match exactly — email and description, all lowercase. The Google Sheets node maps data by column header, so a mismatch like “Email” or “Description” will cause empty cells.

Full System Flow

  Visitor types message in chat widget
                │
                ▼
  ┌─────────────────────────────┐
  │  Chat Trigger               │ ← Receives message via webhook
  └─────────────┬───────────────┘
                │
                ▼
  ┌─────────────────────────────┐     ┌──────────────────────┐
  │  Website Chatbot Agent      │ ←── │ OpenAI GPT-4o mini   │
  │  (System prompt defines     │     └──────────────────────┘
  │   company info + goals)     │     ┌──────────────────────┐
  │                             │ ←── │ Conversation Memory   │
  └─────────────┬───────────────┘     └──────────────────────┘
                │
          Has email + description?
          ┌─────┴─────┐
          No          Yes
          │           │
          ▼           ▼
     Reply with    ┌──────────────────────┐
     follow-up     │ Save Lead to CRM     │ (Tool Workflow call)
     question      └───────────┬───────────┘
                              │
                              ▼
                   ┌──────────────────────┐
                   │ Extract Lead Info     │ ← GPT-4o mini + Output Parser
                   └──────────┬───────────┘
                              │
                              ▼
                   ┌──────────────────────┐
                   │ Append Lead to Sheet  │ → Google Sheets
                   └──────────┬───────────┘
                              │
                              ▼
                   ┌──────────────────────┐
                   │ Send Confirmation     │ → "Thanks, we'll be in touch"
                   └──────────────────────┘
  

Testing Your Workflow

  1. Save and activate the workflow in n8n.
  2. Open the chat widget (you can test it directly in n8n by clicking “Chat” in the top-right corner of the editor, or embed the snippet on a test page).
  3. Send a greeting like: “Hi, I run a small e-commerce store and I’m interested in automating my order fulfillment process.”
  4. Wait for the chatbot to respond and ask for your email. Provide a test email: “Sure, it’s test.user@example.com”
  5. Check your Google Sheet — you should see a new row with the email and a description of the request.
  6. Verify the chatbot sent back a confirmation message like “Thanks for the info, we will be in touch soon.”
Problem Likely Cause Fix
Chatbot responds but never saves the lead The tool description is too vague, or the system prompt doesn’t tell the agent to call the CRM tool Make sure the system message ends with “After you have the email and what the user needs, send all the info together to the CRM tool.”
Google Sheet stays empty Column headers don’t match or OAuth credential expired Check that your sheet has email and description as column headers (lowercase). Re-authorize Google Sheets in n8n if needed.
Chat widget doesn’t appear on site Embed snippet is missing or blocked by CSP Paste the n8n chat embed code before </body>. Check your browser console for Content Security Policy errors.
Agent gives generic or off-topic answers System message doesn’t describe your specific business Rewrite the system message to include your actual services, company name, and the tone you want.
“Could not parse output” error in sub-workflow The Structured Output Parser schema doesn’t match GPT’s output format Ensure the parser’s example JSON has exactly email and description fields. Check the Extract Lead Info node’s execution log for the raw output.

Frequently Asked Questions

Can I use a different AI model instead of GPT-4o mini?

Yes. You can swap in any model that n8n supports — GPT-4o, Claude, Gemini, or even a local model via Ollama. Just replace the OpenAI Chat Model nodes with the appropriate model node. Keep in mind that the system prompts may need slight adjustments for non-OpenAI models.

How do I add the chat widget to my WordPress site?

After activating the workflow, n8n provides an embed snippet (a small block of HTML and JavaScript). In WordPress, go to Appearance → Theme Editor → footer.php and paste the snippet just before the closing </body> tag. Alternatively, use a plugin like “Insert Headers and Footers” to add it without editing theme files.

Will the chatbot work on multiple pages at once?

Yes — the chat widget runs on every page where the embed snippet is loaded. Each visitor gets their own session ID, so conversations stay separate even when dozens of people are chatting at the same time. The Buffer Window Memory keeps each session’s context isolated.

Can I collect more fields like phone number or company name?

Absolutely. Update the system message to ask for those fields, then update the Structured Output Parser schema in the sub-workflow to include the new fields. Finally, add matching columns to your Google Sheet. The AI will extract whatever you tell it to look for.

How much does it cost to run this per month?

The main cost is OpenAI API usage. GPT-4o mini is priced at about $0.15 per million input tokens and $0.60 per million output tokens. A typical chat conversation of 10 messages costs roughly $0.002–$0.005. Even with 500 conversations per month, you’d spend under $3 on AI. n8n self-hosted is free; n8n Cloud starts at $24/month.

What happens if OpenAI’s API goes down while someone is chatting?

The chatbot will fail to respond to that specific message. n8n will log the error in the execution history. The visitor’s message isn’t lost — they can try again once the API recovers. For production use, consider adding an error branch in the Agent node that sends a fallback message like “Sorry, I’m having trouble right now. Please email us at support@yourcompany.com.”

🚀 Get the AI Website Chatbot Template

Skip the 45-minute build. Get the complete workflow JSON, a setup guide with step-by-step screenshots, and a credentials guide that walks you through every API key — ready to import and go live in under 10 minutes.

Get the Template →

Instant download · Works on n8n Cloud and self-hosted

What’s Next?

  • Add email notifications: Connect a Gmail or SendGrid node to email yourself whenever a new lead is captured, so you can follow up faster.
  • Qualify leads with AI scoring: Add a second AI step that rates each lead (hot, warm, cold) based on their description and writes the score to a third column in your sheet.
  • Connect to a real CRM: Replace the Google Sheets node with HubSpot, Salesforce, or Pipedrive to send leads directly into your sales pipeline.
  • Add a knowledge base: Attach a RAG (Retrieval-Augmented Generation) tool so the chatbot can answer detailed questions about your products or services using your own documentation.
n8n
OpenAI
Google Sheets
chatbot
lead capture
CRM
automation
AI agent

How to Auto-Generate LinkedIn Posts from Your Blog with n8n and AI

You publish a blog post every week. It’s great content—researched, written, polished. But then you face a familiar problem: how do you turn that article into a compelling LinkedIn post? Do you manually rewrite it? Copy-paste? Start from scratch? You end up spending 20 minutes crafting something that captures the essence of your article, and you repeat this every single week.

What if that rewriting happened automatically?

This guide walks you through building a workflow that pulls your latest blog posts from Ghost CMS, feeds them to an AI agent powered by GPT-4o-mini, and saves LinkedIn-ready promotional posts to a Google Sheet—all on a schedule, no manual work required. Get the complete template below.

What You’ll Build

By the end of this tutorial, you’ll have a fully automated workflow that:

  1. Fetches your latest blog posts from Ghost CMS every Monday morning at 9am
  2. Cleans up the HTML content to extract just the text, removing all markup and formatting noise
  3. Sends each post to an AI agent (GPT-4o-mini) with a custom prompt to generate a professional LinkedIn promotional post
  4. Appends everything to a Google Sheet where you can review, refine, or directly copy the AI-generated post to LinkedIn
  5. Repeats automatically every week, giving you a constantly growing library of pre-written LinkedIn content

How It Works — The Big Picture

Here’s the workflow architecture at a glance:

┌─────────────────────┐
│ Schedule Trigger    │ (Every Monday 9am)
└──────────┬──────────┘
           │
           v
┌─────────────────────┐
│ Extract Blog Posts  │ (Ghost CMS - getAll, limit 3)
└──────────┬──────────┘
           │
           v
┌─────────────────────┐
│ Map Post Fields     │ (Set node - extract id, title, etc.)
└──────────┬──────────┘
           │
           v
┌─────────────────────┐
│ Process Each Post   │ (SplitInBatches - batch size 1)
└──────────┬──────────┘
           │
           v
┌─────────────────────┐
│ Strip HTML Tags     │ (Code node - JS to remove markup)
└──────────┬──────────┘
           │
           v
┌─────────────────────┐
│ Combine Post Data   │ (Merge node - SQL combine)
└──────────┬──────────┘
           │
           v
┌─────────────────────┐
│ Generate LinkedIn   │ (AI Agent - GPT-4o-mini)
│ Post                │
└──────────┬──────────┘
           │
           v
┌─────────────────────┐
│ Merge AI Output     │ (Merge node - combine with original)
└──────────┬──────────┘
           │
           v
┌─────────────────────┐
│ Save to Sheets      │ (Google Sheets - append rows)
└─────────────────────┘

Each blog post flows through this pipeline independently. The workflow extracts relevant data, cleans it, feeds it to AI, and stores the result in a structured spreadsheet for your review.

What You’ll Need

Before you start building, make sure you have:

  • n8n account (free tier works fine, or self-hosted)
  • Ghost CMS with at least 3 published blog posts
  • Ghost Admin API key (generate in Settings → Integrations)
  • OpenAI API key with access to GPT-4o or GPT-4o-mini
  • Google Sheets API credentials (or just use n8n’s built-in Google Sheets connector)
  • A Google Sheet ready to receive the data
  • Time commitment About 45 minutes to build and test the entire workflow

Building the Workflow

Let’s build this step by step. I’ll walk you through each node, what it does, and how to configure it.

1 Schedule Trigger: Weekly Automation

Start with a Schedule node to run your workflow every Monday morning at 9am Eastern Time.

Configuration:

  • Choose Recurring as the trigger type
  • Set Trigger Type to Weekly
  • Select Monday (or your preferred day)
  • Set the time to 09:00:00 (9am)
  • Set timezone to America/New_York

This node outputs a single object with a timestamp. It doesn’t pass data forward—it just kicks off the workflow on schedule.

📌

Pro tip: If you want to test the workflow immediately without waiting for Monday, you can manually trigger it by clicking the “Execute Workflow” button in n8n’s editor. No need to change the schedule.

2 Extract Blog Posts: Pull from Ghost CMS

Next, add a Ghost node configured to fetch your latest blog posts.

Configuration:

  • Create a new Ghost connection using your Admin API key
  • Set the resource to Posts
  • Set the operation to Get All
  • Under “Options,” set Limit to 3 (fetch the 3 most recent posts)
  • Enable Include HTML so we capture the full content

Expected output (sample):

[
  {
    "id": "post_5a2k8x9m",
    "title": "5 Ways to Automate Your Marketing Funnel in 2026",
    "featured_image": "https://ghost.easyworkflows.net/content/images/2026/04/marketing-funnel.jpg",
    "excerpt": "Automation is no longer a luxury...",
    "html": "<h2>Automation is...</h2><p>...",
    "slug": "5-ways-automate-marketing-funnel-2026",
    "published_at": "2026-04-08T08:00:00Z"
  },
  ...
]

3 Map Post Fields: Extract What We Need

Now use a Set node to pluck out just the fields we care about. This keeps our data clean and reduces noise downstream.

Configuration:

  • Add a Set node after the Ghost node
  • In the “Set” section, map these fields from the Ghost posts:
    • idid
    • titletitle
    • featured_imagefeatured_image
    • excerptexcerpt
    • contenthtml
    • link ← construct using slug: https://yourblog.ghost.io/{{$node["Ghost"].data.slug}}/

At this point, each post has a clean data structure with just what we need.

4 Process Each Post: Use SplitInBatches

Since we fetched multiple posts, we need to process them one at a time. A SplitInBatches node lets us handle each post independently before merging results back together.

Configuration:

  • Add a SplitInBatches node
  • Set Batch Size to 1
  • Set Options → Timeout to 120 seconds (gives AI time to respond)

This node splits the array of posts into single-item batches. Each batch loops through the remaining nodes.

5 Strip HTML Tags: Clean the Content

The Ghost CMS gives us HTML-rich content, but we want plain text for the AI. A Code node will strip all HTML tags and clean up whitespace.

Configuration:

  • Add a Code node (JavaScript)
  • Paste this function:
const htmlContent = $node["Map Post Fields"].data.content;

// Strip HTML tags
let cleanText = htmlContent.replace(/<[^>]+>/g, '');

// Decode HTML entities
cleanText = cleanText
  .replace(/&/g, '&')
  .replace(/</g, '<')
  .replace(/>/g, '>')
  .replace(/"/g, '"')
  .replace(/'/g, "'");

// Remove extra whitespace
cleanText = cleanText
  .replace(/\s+/g, ' ')
  .trim();

return { clean_content: cleanText };

Output example:

{
  "clean_content": "5 Ways to Automate Your Marketing Funnel in 2026 Automation is no longer a luxury. It's a necessity..."
}

6 Combine Post Data: Merge Original + Cleaned

We now have two pieces of data floating around: the original post fields and the cleaned content. A Merge node combines them back into a single, complete object.

Configuration:

  • Add a Merge node
  • Merge mode: Combine
  • Input 1: Output from “Map Post Fields” (original fields)
  • Input 2: Output from “Strip HTML Tags” (cleaned content)

Result:

{
  "id": "post_5a2k8x9m",
  "title": "5 Ways to Automate Your Marketing Funnel in 2026",
  "featured_image": "https://...",
  "excerpt": "Automation is no longer a luxury...",
  "content": "<h2>...</h2>...",
  "link": "https://yourblog.ghost.io/...",
  "clean_content": "5 Ways to Automate... [full plain text]"
}

7 Generate LinkedIn Post: AI Agent with GPT-4o-mini

Now the magic happens. We send the cleaned blog content to an AI Agent node powered by OpenAI, which generates a professional LinkedIn promotional post.

Configuration:

  • Add an AI Agent node
  • Model: gpt-4o-mini
  • Credentials: Connect your OpenAI API key
  • System Prompt: Copy and customize this:
    You are a LinkedIn content specialist. Your job is to transform blog articles into engaging, professional LinkedIn posts.
    
    Guidelines:
    - Keep it between 3-5 sentences
    - Use 1-2 relevant emojis (but not too many)
    - Include a call-to-action at the end (e.g., "Read the full article below" or "What's your experience?")
    - Maintain a professional but friendly tone
    - Focus on the key insight or takeaway from the blog post
    - Do NOT include hashtags
    
    Format your response as plain text only.
  • User Message: Set this to:
    Blog Title: {{$node["Combine Post Data"].data.title}}
    
    Blog Content:
    {{$node["Combine Post Data"].data.clean_content}}
    
    Generate a LinkedIn promotional post for this blog article.

Expected output:

"In 2026, your marketing stack is only as strong as your automation. We just published a deep dive into 5 game-changing automation strategies that cut manual work, reduce errors, and scale your growth.

Whether you're managing leads, nurturing prospects, or coordinating campaigns, automation does the heavy lifting. Curious how? Check out the full breakdown below. 📈

What automation tool has made the biggest impact for you?"
💡

Not getting the tone you want? Tweak the system prompt. Ask the AI to be more casual, more technical, more sales-focused, whatever fits your brand. The beauty of AI agents is they adapt to your instructions.

8 Merge AI Output: Combine Generated Post with Metadata

The AI agent returned a LinkedIn post, but we also want to keep the original blog metadata (title, link, featured image) so we can reference them in the Google Sheet.

Configuration:

  • Add another Merge node
  • Merge mode: Combine
  • Input 1: Output from “Combine Post Data” (all original + cleaned fields)
  • Input 2: Output from “Generate LinkedIn Post” (the AI-generated text)
  • In Input 2, set the field name to linkedin_post so the AI output is clearly labeled

Final merged object:

{
  "id": "post_5a2k8x9m",
  "title": "5 Ways to Automate Your Marketing Funnel in 2026",
  "featured_image": "https://...",
  "excerpt": "Automation is no longer a luxury...",
  "content": "<...>",
  "clean_content": "5 Ways to Automate... [plain text]",
  "link": "https://yourblog.ghost.io/...",
  "linkedin_post": "In 2026, your marketing stack is only as strong..."
}

9 Save to Google Sheets: Append the Results

Finally, append each row to your Google Sheet so you have a growing library of LinkedIn posts ready to go.

Configuration:

  • Add a Google Sheets node
  • Credentials: Authenticate with your Google account
  • Spreadsheet: Select or paste the ID of your sheet
  • Sheet: Choose the sheet tab (e.g., “Posts”)
  • Resource: Append
  • Columns to append: Map these fields:
    • id
    • title
    • featured_image
    • excerpt
    • link
    • clean_content
    • linkedin_post

Each week, new rows are added to the bottom of your sheet with the original blog data and the AI-generated post.

The Data Structure

Here’s exactly how your Google Sheet should be organized. Create these column headers in row 1:

id title featured_image excerpt link clean_content linkedin_post
post_5a2k8x9m 5 Ways to Automate Your Marketing Funnel in 2026 https://ghost.easyworkflows.net/content/images/2026/04/marketing-funnel.jpg Automation is no longer a luxury. It’s a necessity… https://blog.easyworkflows.net/marketing-automation-2026/ 5 Ways to Automate Your Marketing Funnel in 2026 Automation is no longer a luxury… In 2026, your marketing stack is only as strong as your automation. We just published a deep dive into 5 game-changing automation strategies…
post_3j9m2x5k Why n8n is Better Than Zapier for Complex Workflows https://ghost.easyworkflows.net/content/images/2026/04/n8n-vs-zapier.jpg When it comes to no-code automation, flexibility matters… https://blog.easyworkflows.net/n8n-vs-zapier-comparison/ Why n8n is Better Than Zapier for Complex Workflows When it comes to no-code automation, flexibility matters… Ever hit a wall with Zapier because it can’t do exactly what you need? n8n is different. We compared side-by-side, and the results might surprise you. Read our full breakdown…

The featured_image column is great for visual reference. The link column lets you click straight to the blog post. And linkedin_post is what you’ll actually copy into LinkedIn when you’re ready to post.

Full System Flow

Here’s a more detailed view of the entire workflow end-to-end:

WORKFLOW: Auto-Generate LinkedIn Posts from Blog Content

┌──────────────────────────────────────────────────────┐
│ 1. SCHEDULE TRIGGER                                  │
│    Runs: Every Monday at 9:00 AM (America/New_York) │
└────────────────┬─────────────────────────────────────┘
                 │
                 v
┌──────────────────────────────────────────────────────┐
│ 2. GHOST CMS NODE                                    │
│    Fetches: Latest 3 published blog posts            │
│    Fields: id, title, excerpt, html, featured_image │
│    Output: Array of 3 post objects                   │
└────────────────┬─────────────────────────────────────┘
                 │
                 v
┌──────────────────────────────────────────────────────┐
│ 3. SET NODE (Map Fields)                             │
│    Extracts: id, title, featured_image, excerpt,    │
│             content (html), link (slug-based)        │
│    Output: Cleaned post object                       │
└────────────────┬─────────────────────────────────────┘
                 │
                 v
┌──────────────────────────────────────────────────────┐
│ 4. SPLIT IN BATCHES NODE                             │
│    Batch Size: 1                                     │
│    Processes: Each post individually in loop         │
│    Output: Single post object (batch)                │
└────────────────┬─────────────────────────────────────┘
                 │
                 v
┌──────────────────────────────────────────────────────┐
│ 5. CODE NODE (Strip HTML)                            │
│    Removes: All HTML tags                            │
│    Cleans: Whitespace, HTML entities                │
│    Output: { clean_content: "plain text..." }        │
└────────────────┬─────────────────────────────────────┘
                 │
                 v
┌──────────────────────────────────────────────────────┐
│ 6. MERGE NODE (Combine)                              │
│    Input 1: Original post fields                     │
│    Input 2: clean_content from Code node             │
│    Output: Single object with all fields             │
└────────────────┬─────────────────────────────────────┘
                 │
                 v
┌──────────────────────────────────────────────────────┐
│ 7. AI AGENT NODE (OpenAI GPT-4o-mini)                │
│    System Prompt: LinkedIn content specialist        │
│    Input: Blog title + clean_content                 │
│    Generates: Professional LinkedIn post (3-5 sent.) │
│    Output: { text: "In 2026, your marketing..." }    │
└────────────────┬─────────────────────────────────────┘
                 │
                 v
┌──────────────────────────────────────────────────────┐
│ 8. MERGE NODE (Combine with Metadata)                │
│    Input 1: All original fields + clean_content      │
│    Input 2: AI-generated linkedin_post               │
│    Output: Complete object ready for Sheets          │
└────────────────┬─────────────────────────────────────┘
                 │
                 v
┌──────────────────────────────────────────────────────┐
│ 9. GOOGLE SHEETS NODE (Append)                       │
│    Spreadsheet: "LinkedIn Auto-Posts"                │
│    Sheet Tab: "Posts"                                │
│    Appends: 1 row per blog post                      │
│    Columns: id, title, featured_image, excerpt,      │
│            link, clean_content, linkedin_post        │
└──────────────────────────────────────────────────────┘

RESULT: Every blog post → 1 professional LinkedIn post
        Stored in Google Sheet for review & scheduling

Testing Your Workflow

Before you set it to run on schedule, test it end-to-end. Here’s the checklist:

  1. Execute the workflow manually from the n8n editor (click the play button)
  2. Check the Ghost node output — do you see your 3 recent posts?
  3. Check the Set node output — are all the fields (title, link, content) correct?
  4. Check the Code node output — is the HTML stripped? Is clean_content plain text?
  5. Check the AI Agent output — is the generated LinkedIn post sensible? Does it match your tone?
  6. Check Google Sheets — did the row appear? Are all columns populated?
  7. Copy the LinkedIn post to LinkedIn — does it read well? Would you actually post it?

Troubleshooting table:

Problem Likely Cause Solution
Ghost node returns no posts Admin API key invalid or no published posts Verify API key in Ghost integration; ensure you have 3+ published posts
AI Agent times out Content too long or OpenAI API slow Reduce blog excerpt length; increase timeout in SplitInBatches to 180s
Google Sheets append fails Missing column headers or wrong Sheet ID Manually create header row in Sheet; verify Spreadsheet ID matches
AI-generated post is bland System prompt too generic Customize system prompt with your brand voice, target audience, examples
Duplicate rows in Sheet Workflow executed multiple times Check n8n execution logs; disable “activate” if not ready to run on schedule

Frequently Asked Questions

Can I use WordPress or RSS instead of Ghost CMS?

Absolutely. Replace the Ghost node with a WordPress node (if available in n8n) or use an RSS node to pull your latest posts. The rest of the workflow stays the same. You’ll just need to adjust the field mappings to match WordPress’s output format (e.g., post_content instead of html).

Can I use a different AI model instead of GPT-4o-mini?

Yes. You can swap in Claude 3.5 Sonnet, Gemini, or any other LLM supported by n8n. The workflow structure stays identical—just update the AI Agent node credentials and model selection. Different models may produce slightly different tones, so test and see which you prefer.

How do I customize the LinkedIn post style to match my brand voice?

Edit the System Prompt in the AI Agent node (Step 7). Add specific instructions about your brand voice, target audience, desired length, tone, and format. For example: “Use more technical language,” “Add industry jargon,” “Make it humorous,” “Include a specific CTA.” The AI will adapt accordingly.

Can I auto-post directly to LinkedIn instead of saving to a sheet first?

Not yet—LinkedIn’s API is limited, and n8n doesn’t have a direct “post to LinkedIn feed” node. However, you can use LinkedIn’s RSS feed directly or integrate with a tool like Buffer or Later that connects to n8n. For now, using Google Sheets as a review layer is the safest approach; it gives you a chance to tweak the AI output before publishing.

How many blog posts can I process at once?

The workflow processes posts one at a time (batch size 1) to avoid rate-limiting and stay within API cost bounds. If you want to fetch more than 3 posts, increase the Limit in the Ghost node. Keep in mind: each post calls the OpenAI API, so processing 10 posts will cost more than processing 3. Start with 3 and scale as needed.

💡

Want to take this further? Try setting up a second workflow that watches your Google Sheet and automatically schedules posts to LinkedIn via Buffer on specific days. Or build a variation that emails the LinkedIn post to your team for approval before it hits the sheet. Check out our templates library for more advanced workflows.

Get the Complete Workflow Template

Don’t want to build it from scratch? We’ve packaged the entire workflow—all 9 nodes pre-configured and ready to import—so you can get up and running in minutes, not hours.

Download the Template

Includes step-by-step setup guide and troubleshooting tips.

What’s Next?

You now have a powerful foundation. Here are four natural extensions to consider:

  1. Multi-platform distribution — Fork the workflow to generate Twitter posts, email newsletters, or Slack announcements from the same blog content.
  2. A/B testing variants — Call the AI agent twice with different system prompts and store both versions in the sheet. See which one gets more engagement on LinkedIn, then refine your prompt based on the winner.
  3. Sentiment and keyword extraction — Add a node to analyze the blog post sentiment and extract key topics, storing them in the sheet for SEO and content tracking.
  4. Scheduled LinkedIn publishing — Integrate with Buffer or another scheduling tool to automatically queue the posts for posting at optimal times, bypassing the manual copy-paste step entirely.

The beauty of n8n is that each workflow is a building block. Start here, learn what works for your brand, and expand from there.


Questions? Run into issues? The n8n community forum is incredibly active, and our templates team is always available. Happy automating!

n8n
Ghost CMS
LinkedIn
OpenAI
Google Sheets
automation
content marketing