RSS to LinkedIn with Google Sheets, posts stay consistent
Your LinkedIn page goes quiet, not because you have nothing to say, but because turning “interesting RSS link” into a solid post takes too much fiddling. You copy. You rewrite. You check if you already shared it. Then you do it again next week.
This RSS LinkedIn automation hits marketing managers hardest, but founders and small agency teams feel it too. You will keep your page active with consistent, on-brand posts while Google Sheets quietly tracks what’s already been published.
Below, you’ll see exactly how the workflow runs in n8n, what it automates, and what kind of time it gives back once it’s set up.
The Problem: Staying consistent on LinkedIn without repeating yourself
Posting “regularly” sounds simple until you’re the one doing it. You have to find an article worth sharing, skim it, pull out a credible angle, write copy that doesn’t sound like a robot, add hashtags, and then double-check you didn’t already post the same link two weeks ago. The worst part is the context switching. Five minutes here, ten minutes there, and suddenly it’s 45 minutes gone with nothing to show but another half-finished draft in your notes app.
The friction compounds. Here’s where it breaks down for most teams.
- You rewrite the same kind of “news summary” over and over, and it still comes out inconsistent.
- Duplicates happen because nobody has a reliable log of what has already been posted.
- Good articles get missed since “I’ll post it later” usually turns into never.
- Manual posting adds a hidden tax: approvals, formatting, and last-minute edits on mobile.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: RSS to LinkedIn with Google Sheets, posts stay consistent
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "RSS Read Testing Catalog", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Transform date", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter by date (more than 7 ..", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Sort by date", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Limit news to x", 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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n9@{ icon: "mdi:cog", form: "rounded", label: "RSS Read marktechpost", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "AI Agent1", pos: "b", h: 48 }
n11@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model1", 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/merge.svg' width='40' height='40' /></div><br/>Information"]
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Information2", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Information3", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Code1"]
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/merge.svg' width='40' height='40' /></div><br/>Information1"]
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", 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/linkedin.svg' width='40' height='40' /></div><br/>LinkedIn"]
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Conversión a enlace de Linke..", pos: "b", h: 48 }
n20["<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/>Generar QR"]
n21@{ icon: "mdi:cog", form: "rounded", label: "Escribir archivo", pos: "b", h: 48 }
n22@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Generación de Imagen1"]
n24@{ icon: "mdi:database", form: "rounded", label: "Google Sheets", pos: "b", h: 48 }
n25@{ icon: "mdi:database", form: "rounded", label: "Google Sheets1", pos: "b", h: 48 }
n26@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If exists", pos: "b", h: 48 }
n27["<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"]
n28@{ icon: "mdi:robot", form: "rounded", label: "AI Agent2", pos: "b", h: 48 }
n29@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model2", pos: "b", h: 48 }
n30@{ icon: "mdi:robot", form: "rounded", label: "AI Agent4", pos: "b", h: 48 }
n31@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model4", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Limpieza de contenido de Not.."]
n33@{ icon: "mdi:cog", form: "rounded", label: "RSS LatinxinAI", pos: "b", h: 48 }
n27 --> n28
n15 --> n0
n8 --> n4
n0 --> n12
n18 --> n19
n10 --> n16
n10 --> n17
n28 --> n32
n30 --> n23
n26 --> n27
n20 --> n21
n17 --> n12
n12 --> n25
n16 --> n15
n13 --> n12
n14 --> n16
n6 --> n7
n25 --> n26
n33 --> n8
n4 --> n5
n22 --> n18
n7 --> n13
n7 --> n14
n7 --> n10
n2 --> n3
n2 --> n9
n2 --> n33
n9 --> n8
n23 --> n22
n1 -.-> n0
n3 --> n8
n11 -.-> n10
n29 -.-> n28
n31 -.-> n30
n19 --> n20
n19 --> n24
n5 --> n6
n32 --> n30
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 n0,n10,n28,n30 ai
class n1,n11,n29,n31 aiModel
class n5,n26 decision
class n24,n25 database
class n20,n23 api
class n15,n27,n32 code
classDef customIcon fill:none,stroke:none
class n8,n12,n15,n16,n18,n20,n23,n27,n32 customIcon
The Solution: RSS-to-LinkedIn publishing with Gemini and a Google Sheets log
This workflow runs on a schedule, pulls fresh stories from multiple RSS feeds, and filters them down to the newest, most relevant items. For each candidate article, it uses Gemini (through n8n’s AI Agent setup) to analyze the content, generate a clean LinkedIn-ready summary, and build hashtags that fit the topic. Before anything goes live, it checks a Google Sheet to confirm the link has not been published already. If it’s new, it posts to LinkedIn, generates a trackable LinkedIn link (and even creates a QR image asset), then appends the final link into Google Sheets so future runs won’t repost it. Quiet. Reliable. Honestly the kind of background automation you stop thinking about after week one.
The workflow starts with a weekly schedule trigger and multiple RSS readers. Then it sorts, limits the batch, and runs AI content analysis plus post generation. Finally, it publishes via the LinkedIn API and logs the posted URL in Google Sheets to prevent duplicates.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you share 5 curated news posts per week from 3 RSS sources. Manually, you’ll usually spend about 15 minutes per post between reading, writing, hashtags, and checking old posts, which is roughly 75 minutes a week. With this workflow, you schedule it once, let it process the feed batch, and then you only review what it’s about to publish (maybe 10 minutes total). The Google Sheets log prevents repeats automatically, so you don’t waste time second-guessing.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for the “already posted” log.
- LinkedIn to publish to your profile or company page.
- Gemini API credentials (get them from Google AI Studio / Google Cloud Console).
Skill level: Intermediate. You’ll connect accounts, handle API credentials, and tweak prompts, but you won’t be writing an app.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A weekly schedule kicks things off. n8n runs automatically on the cadence you choose, then pulls new items from your selected RSS feeds (the workflow includes multiple sources out of the box).
The feed is cleaned up and narrowed down. Articles get filtered to recent items, ordered by timestamp, and limited so you’re not flooding LinkedIn or processing a giant backlog.
Gemini turns “article text” into “LinkedIn post.” AI agents analyze the story, generate a tight summary, and build hashtags and final copy. A cleaning step trims noise so posts read like a human wrote them.
Google Sheets prevents duplicates, then LinkedIn publishes. The workflow looks up the link in your spreadsheet, posts only if it’s new, then writes the final LinkedIn link back to Sheets. It also generates a QR image asset if you want to reuse it elsewhere.
You can easily modify the RSS sources to match your niche based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set up the weekly trigger that kicks off the RSS aggregation pipeline.
- Add Weekly Schedule Trigger and set Trigger Interval to weekly with Trigger At Day as
2, 3, 4, 0and Trigger At Hour as15. - Connect Weekly Schedule Trigger to Fetch RSS TestingCatalog, Fetch RSS Marktechpost, and Fetch RSS LatinxAI.
- Note the parallel execution: Weekly Schedule Trigger outputs to both Fetch RSS TestingCatalog and Fetch RSS Marktechpost and Fetch RSS LatinxAI in parallel.
America/Guayaquil).Step 2: Connect RSS Feeds
Aggregate multiple sources, normalize fields, and keep only recent items before analysis.
- In Fetch RSS TestingCatalog, set URL to
https://www.testingcatalog.com/rss/and enable Ignore SSL. - In Fetch RSS Marktechpost, set URL to
https://www.marktechpost.com/feed/. - In Fetch RSS LatinxAI, set URL to
https://medium.com/feed/latinxinai. - In Combine RSS Feeds, set Number Inputs to
3and connect all three feed nodes. - In Map Date Fields, map fields using expressions: title to
{{ $json.title }}, content to{{ $json.contentSnippet }}, link to{{ $json.link }}, timestampDate to{{ new Date($json.isoDate).getTime() }}, and categories to{{ $json.categories }}. - In Filter Recent Items, set the condition to keep items where timestampDate is greater than
{{ Date.now() - 7 * 24 * 60 * 60 * 1000 }}. - In Order by Timestamp, sort by timestampDate in descending order.
- Connect Order by Timestamp to Limit Article Count to cap the number of items processed.
- Note the parallel execution: Limit Article Count outputs to both Map Article Fields and Map Category Data and Content Analysis Agent in parallel.
isoDate, Filter Recent Items may filter everything out. Validate the feed output before proceeding.Step 3: Set Up AI Analysis and Hashtag Generation
Analyze each article, merge metadata, and build a structured prompt for hashtags and later post generation.
- In Content Analysis Agent, keep the analysis prompt as provided to summarize core innovation, goal, problem, benefits, context, significance, and entities.
- Gemini Chat Engine A is connected as the language model for Content Analysis Agent — Credential Required: Connect your
googlePalmApicredentials. - Note the parallel execution: Content Analysis Agent outputs to both Combine Analysis Inputs and Set Analysis Field in parallel.
- In Set Analysis Field, set Analisis to
{{ $json.output }}. - In Map Article Fields, map Enlace to
{{ $json.link }}, Fecha_sinFormato to{{ $json.timestampDate }}, Titulo_original to{{ $json.title }}, and Contenido to{{ $json.content }}. - In Map Category Data, set Categorias to
{{ $json.categories }}. - In Combine Analysis Inputs, set Mode to
combineand Combine By tocombineByPosition. - In Hashtag Prompt Builder, keep the JavaScript prompt generator for LinkedIn hashtags.
- In Language Agent Core, set Text to
{{ $json.prompt }}. - Gemini Chat Engine is connected as the language model for Language Agent Core — Credential Required: Connect your
googlePalmApicredentials. - In Merge Analysis Data, set Mode to
combine, Combine By tocombineByPosition, and Number Inputs to3.
Step 4: Prevent Duplicates and Compose the LinkedIn Post
Check for existing links in Google Sheets, then generate the LinkedIn post copy and clean it for image prompt generation.
- In Lookup Spreadsheet Row, set a filter where Link_raw equals
{{ $json.Enlace }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Lookup Spreadsheet Row. - In Check Link Exists, keep the condition Link_raw exists with
{{ $json.Link_raw }}. - Connect the false output of Check Link Exists to Compose Post Prompt so only new items are published.
- In Compose Post Prompt, keep the JavaScript that builds the post prompt using merged fields from Merge Analysis Data.
- In LinkedIn Copy Agent, set Text to
{{ $json.prompt }}and keep the Spanish system message. - Gemini Chat Engine B is connected as the language model for LinkedIn Copy Agent — Credential Required: Connect your
googlePalmApicredentials. - In Clean News Text, keep the JavaScript to remove line breaks and quotes before image prompt generation.
- In Image Prompt Agent, keep the prompt template and system message for creating a professional LinkedIn image prompt.
- Gemini Chat Engine C is connected as the language model for Image Prompt Agent — Credential Required: Connect your
googlePalmApicredentials.
Step 5: Configure Image Generation and LinkedIn Publishing
Generate the post image, convert it to binary, and publish the final post to LinkedIn.
- In Image Generation Request, set URL to
https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp-image-generation:generateContentand keep the JSON body with{{ $json.output.slice(0, -2) }}. - Credential Required: Connect your
googlePalmApicredentials in Image Generation Request. - In Convert Image Binary, set Operation to
toBinaryand Source Property tocandidates[0].content.parts[0].inlineData.data. - In Post to LinkedIn, set Text to
{{ $('LinkedIn Copy Agent').item.json.output }}, Post As toorganization, Organization to[YOUR_ID], and Share Media Category toIMAGE. - Credential Required: Connect your
linkedInCommunityManagementOAuth2Apicredentials in Post to LinkedIn. - In Build LinkedIn Link, set JSON Output to
{ "link": "https://www.linkedin.com/feed/update/{{ $json.urn }}" }. - Note the parallel execution: Build LinkedIn Link outputs to both Generate QR Request and Append to Spreadsheet in parallel.
[YOUR_ID] in Post to LinkedIn and the Google Sheets URLs with your actual organization and spreadsheet IDs before testing.Step 6: Configure QR and Spreadsheet Logging
Generate a QR code for the LinkedIn post and log publishing details to Google Sheets.
- In Generate QR Request, set URL to
https://api.qrserver.com/v1/create-qr-code/and configure query params data as{{ $json.link }}and size as300x300. - In Write QR File, set File Name to
qr.png. - In Append to Spreadsheet, set Operation to
append, Document ID to your spreadsheet URL, and Sheet Name toHoja 1. - Map columns in Append to Spreadsheet: Title to
{{ $('Merge Analysis Data').item.json.Titulo_original }}, Link_pub to{{ $json.link }}, and Link_raw to{{ $('Merge Analysis Data').item.json.Enlace }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Append to Spreadsheet.
Step 7: Test and Activate Your Workflow
Validate the end-to-end flow, then turn on scheduled publishing.
- Click Execute Workflow to run a manual test from Weekly Schedule Trigger.
- Confirm that Post to LinkedIn publishes a post and that Build LinkedIn Link generates a valid
https://www.linkedin.com/feed/update/URL. - Verify a new row is appended in Append to Spreadsheet with the correct title and links.
- Check that Write QR File creates
qr.pngin your configured environment. - Activate the workflow using the Active toggle to enable weekly publishing.
Common Gotchas
- LinkedIn credentials can expire or need specific permissions. If things break, check your LinkedIn app access and page permissions first (then re-auth inside n8n).
- 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 45 minutes if your accounts and API keys are ready.
No. You’ll mostly connect accounts and paste credentials. You might tweak a prompt or two, but it’s not “developer-only” work.
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 Gemini API usage costs.
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. You can swap RSS feeds by editing the RSS read nodes (for example, the Tech/AI sources in the workflow) and adjust tone by updating the prompt-building code and the Gemini agent instructions. Common tweaks include changing the hashtag rules, forcing a specific post format (hook + 2 bullets + link), and setting a stricter “only post if it matches these topics” filter.
Most of the time it’s permissions or an expired auth session. Reconnect your LinkedIn account in n8n, confirm you have access to the company page you’re trying to post to, and double-check the app scopes you granted. If it fails only on some runs, you may also be hitting LinkedIn rate limits when you process too many items at once.
Plenty for a typical weekly publishing rhythm, and you can cap volume using the workflow’s Limit node.
Usually, yes, because this workflow isn’t a simple two-step “RSS in, post out.” You’re doing filtering, duplicate checks, and multi-stage AI generation, which is where Zapier or Make can get pricey or awkward. n8n also gives you a self-hosted path, so you’re not paying per tiny action when you want to expand to more feeds. The tradeoff is setup effort: n8n gives you more control, but you have to own the workflow. If you’re on the fence, Talk to an automation expert and we’ll tell you bluntly which route fits.
Once this is running, LinkedIn consistency stops being a weekly scramble. The workflow handles the repetitive stuff, and you keep control over the voice and the topics.
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.