Google Sheets + Telegram for consistent LinkedIn posts
You start the week with good intentions. Then your LinkedIn posting turns into a messy mix of half-finished drafts, “I’ll post tomorrow,” and another idea lost in a notes app somewhere. It’s exhausting, honestly.
Content managers feel it when the calendar goes quiet. Founders notice it when leads slow down. And consultants know the pain of showing up inconsistently. This LinkedIn post automation takes trending AI tweet ideas, turns them into clean drafts, and gives you a simple Telegram approve-or-skip loop.
Below you’ll see how the workflow runs, what it produces, and what “consistent posting” looks like when you aren’t doing the repetitive parts yourself.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Telegram for consistent LinkedIn posts
flowchart LR
subgraph sg0["Daily Sheet Flow"]
direction LR
n8@{ icon: "mdi:play-circle", form: "rounded", label: "Daily Sheet Trigger", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Retrieve Sheet Rows", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "AI Content Agent", pos: "b", h: 48 }
n13@{ icon: "mdi:brain", form: "rounded", label: "Language Model Route", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Cap Records", pos: "b", h: 48 }
n15@{ icon: "mdi:robot", form: "rounded", label: "Structured Result Parser", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Post Set", pos: "b", h: 48 }
n17@{ icon: "mdi:cog", form: "rounded", label: "Pause Before Update", pos: "b", h: 48 }
n18@{ icon: "mdi:database", form: "rounded", label: "Write Sheet Update", pos: "b", h: 48 }
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/telegram.svg' width='40' height='40' /></div><br/>Send Telegram Alert"]
n20@{ icon: "mdi:cog", form: "rounded", label: "Combine Records", pos: "b", h: 48 }
n13 -.-> n12
n14 --> n12
n17 --> n18
n12 --> n16
n8 --> n9
n20 --> n19
n16 --> n20
n16 --> n17
n9 --> n14
n18 --> n16
n15 -.-> n12
end
subgraph sg1["Sheet Update Flow"]
direction LR
n21@{ icon: "mdi:play-circle", form: "rounded", label: "Sheet Update Trigger", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Approved Items", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Limit to Twenty", pos: "b", h: 48 }
n24["<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/>Derive Post Schedule"]
n25@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Approved Posts", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "Hold Until Post Time", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Retrieve Image File"]
n28["<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/>Publish LinkedIn Post"]
n29@{ icon: "mdi:database", form: "rounded", label: "Mark As Posting", pos: "b", h: 48 }
n30@{ icon: "mdi:database", form: "rounded", label: "Mark As Posted", pos: "b", h: 48 }
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/telegram.svg' width='40' height='40' /></div><br/>Notify User"]
n23 --> n24
n30 --> n25
n29 --> n27
n21 --> n22
n28 --> n30
n27 --> n28
n22 --> n23
n24 --> n25
n26 --> n29
n25 --> n31
n25 --> n26
end
subgraph sg2["Morning Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Morning Schedule Trigger", pos: "b", h: 48 }
n1["<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 AI Tweets"]
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/code.svg' width='40' height='40' /></div><br/>Normalize Tweet Text"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Tweet Batches", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Lookup Existing Tweet", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Skip Existing Entry", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Store New Tweet", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Processing Complete", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Condition", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Delay Before Save", pos: "b", h: 48 }
n11 --> n6
n10 --> n11
n10 --> n5
n3 --> n7
n3 --> n4
n0 --> n1
n2 --> n3
n1 --> n2
n6 --> n3
n4 --> n10
n5 --> n3
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 n8,n21,n0 trigger
class n12,n15 ai
class n13 aiModel
class n22,n10 decision
class n9,n18,n29,n30,n4,n6 database
class n27,n1 api
class n24,n2 code
classDef customIcon fill:none,stroke:none
class n19,n24,n27,n28,n31,n1,n2 customIcon
The Problem: Consistent LinkedIn Posting Breaks Down Fast
Coming up with ideas is not the hard part. The hard part is turning a decent idea into a finished draft, putting it somewhere you can find again, and then actually publishing it at the right time. Most teams try to manage this with browser bookmarks, a Google Doc, and good vibes. Then duplicates creep in (“did we already cover this?”), drafts get lost in Slack threads, and the week disappears. By Friday, you’ve spent about 2 hours collecting inspiration and still have nothing posted.
The friction compounds. A small delay at each step quietly kills consistency.
- You rewrite the same idea three times because there is no single draft source of truth.
- Duplicate ideas slip through, which means you waste time polishing posts you won’t use.
- Approvals happen in random places, so publishing becomes a last-minute scramble.
- Your “content system” has no tracking, so you can’t tell what’s ready, approved, scheduled, or already posted.
The Solution: Trend-to-Draft-to-Post, With Approval in Telegram
This workflow automates daily LinkedIn post creation using trending AI tweets as the raw material. It starts on a morning schedule, pulls in fresh tweets via an HTTP request, cleans up the text, and checks Google Sheets to make sure you haven’t already stored the same idea. New ideas get written into a tracking sheet, then an AI agent converts selected rows into LinkedIn-ready drafts using your OpenAI/OpenRouter model setup. From there, you get a Telegram message that’s actually useful: it surfaces drafts and gives you an approval signal the automation can act on. Once approved, the workflow schedules each post, waits until the right time, publishes to LinkedIn, and marks the sheet so you always know what happened.
In practice, the workflow has two loops. One loop collects and deduplicates tweet ideas into Google Sheets. The second loop drafts, alerts you in Telegram, schedules approved items, and pushes them to LinkedIn (then updates the sheet so nothing is a mystery later).
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want to publish 5 LinkedIn posts per week. Manually, you might spend about 30 minutes per post collecting an idea, drafting, getting a quick approval, and posting, which is roughly 2.5 hours weekly. With this workflow, idea collection happens automatically, drafts land in Google Sheets, and approvals happen in Telegram in a minute or two each. Even if you spend 20 minutes reviewing and tweaking the week’s drafts, you still end up with about 2 hours back.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store ideas, drafts, and statuses.
- Telegram to approve drafts and get alerts.
- RapidAPI key (get it from your RapidAPI dashboard).
- OpenAI or OpenRouter API key (get it from your provider’s API keys page).
- LinkedIn account access to publish posts through the LinkedIn node.
Skill level: Intermediate. You will connect accounts, paste API keys, and adjust a few content fields in the sheet.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Daily idea capture kicks it off. A morning schedule trigger runs and calls an HTTP endpoint to fetch trending AI tweets. The workflow cleans the text so you don’t store junk formatting.
Deduping happens before anything gets saved. Each tweet is checked against Google Sheets, and if it already exists the workflow skips it. New ideas get stored, which keeps your sheet clean over time.
Draft generation turns rows into LinkedIn posts. A separate daily sheet run pulls rows, caps how many it processes, then sends them to an AI content agent (via OpenRouter/OpenAI) and parses the results into structured fields you can review.
Approval and publishing are controlled through Telegram. Once drafts are written back to Google Sheets, Telegram alerts you. When items are approved, the workflow derives a posting schedule, waits until each post time, publishes on LinkedIn (optionally fetching an image file), and updates the sheet to “posting” then “posted.”
You can easily modify the approval rules to require a specific tag or column value based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Triggers
Set up the time-based triggers that kick off tweet ingestion and daily sheet processing.
- Add and configure Morning Schedule Trigger with your desired time for fetching AI tweets.
- Add and configure Daily Sheet Trigger to control when the system processes the sheet for AI content generation.
- Add and configure Sheet Update Trigger so approved rows in your sheet can initiate posting.
Step 2: Connect Google Sheets
All sheet reads and writes rely on Google Sheets nodes. Connect credentials once and reuse across all six Google Sheets nodes.
- Open Lookup Existing Tweet and connect Google Sheets access. Credential Required: Connect your Google Sheets credentials.
- Connect Google Sheets credentials on Store New Tweet, Retrieve Sheet Rows, Write Sheet Update, Mark As Posting, and Mark As Posted.
- Open Sheet Update Trigger and connect Google Sheets credentials. Credential Required: Connect your Google Sheets credentials.
⚠️ Common Pitfall: If any Google Sheets node is left without credentials, the workflow will fail when it hits that node.
Step 3: Set Up AI Content Generation
This workflow uses an agent plus a language model route to generate content and a structured parser to format results.
- Open AI Content Agent and configure prompts or tools as needed for your content style.
- Open Language Model Route and connect OpenRouter. Credential Required: Connect your OpenRouter credentials.
- Confirm Structured Result Parser is attached as the output parser for AI Content Agent. Add credentials to AI Content Agent (not the parser node).
Step 4: Configure Tweet Ingestion and De-duplication
This path fetches tweets, normalizes them, checks for duplicates, and stores new entries.
- Configure Fetch AI Tweets to pull data from your chosen source (API endpoint, headers, and parameters).
- Use Normalize Tweet Text to standardize content formatting before batching.
- In Iterate Tweet Batches, set batch sizes appropriate for your sheet quota.
- Lookup Existing Tweet checks the sheet, then Route by Condition sends results to Delay Before Save or Skip Existing Entry.
- Delay Before Save outputs to Store New Tweet, then Iterate Tweet Batches continues until complete and ends at Processing Complete.
Step 5: Configure Approval Flow and Posting Schedule
This path filters approved items, schedules posts, and prepares them for publishing.
- Sheet Update Trigger starts the approval path and sends data to Filter Approved Items.
- Use Limit to Twenty to cap the number of posts being scheduled in each run.
- Derive Post Schedule should calculate future timestamps for each item, then send to Iterate Approved Posts.
- Iterate Approved Posts outputs to Hold Until Post Time and Notify User; Hold Until Post Time then outputs to Mark As Posting.
Step 6: Configure Publishing and Alerts
These steps handle LinkedIn publishing and user notifications.
- Configure Retrieve Image File to pull images before posting (if required by your content).
- Open Publish LinkedIn Post and connect LinkedIn access. Credential Required: Connect your LinkedIn credentials.
- After posting, Publish LinkedIn Post sends to Mark As Posted to update the sheet status.
- Connect Telegram credentials for Send Telegram Alert and Notify User. Credential Required: Connect your Telegram credentials.
Step 7: Test and Activate Your Workflow
Run a full test to verify ingestion, approval, scheduling, and posting.
- Manually execute Morning Schedule Trigger and confirm that Fetch AI Tweets → Normalize Tweet Text → Iterate Tweet Batches runs without errors.
- Verify the sheet checks: Lookup Existing Tweet routes to Store New Tweet only for new content.
- Manually execute Sheet Update Trigger and confirm approved items pass through Filter Approved Items → Derive Post Schedule → Hold Until Post Time.
- Check for successful posting: Publish LinkedIn Post updates the sheet via Mark As Posted and sends notifications via Notify User.
- Toggle the workflow to Active to enable scheduled production runs.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials panel and confirm the sheet is shared with the connected Google account 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-45 minutes if your accounts and API keys are ready.
No. You will mostly connect tools and paste credentials. Light edits to prompts or sheet columns are optional.
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/OpenRouter usage (often a few dollars a month at small volumes) plus any RapidAPI charges for the tweet source.
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. Most people tweak the AI Content Agent prompt to match their voice, then adjust the Derive Post Schedule code so posts publish on the days and times you prefer. You can also change the approval logic by editing the Filter Approved Items step to look for your own status value in Google Sheets (like “Approved,” “Revise,” or “Hold”).
Usually it’s expired or changed Google permissions. Reconnect the Google Sheets credential in n8n, then confirm the sheet is accessible to that same Google account. If the workflow can read but not write, the file-sharing settings are often the culprit. Also check for renamed tabs or changed column headers, because the workflow may be writing to fields that no longer exist.
Plenty for a small team. On n8n Cloud, your practical limit is your plan’s monthly executions plus your API rate limits. If you self-host, there’s no hard execution cap, but your server size and API quotas still matter. This workflow also caps and limits records (for example, it limits approved items to 20), which keeps it stable unless you intentionally raise those limits.
Often, yes, because this workflow relies on branching logic, waiting until scheduled times, and structured AI output parsing, and those can get awkward or expensive in Zapier/Make. n8n also gives you the self-host option, which is a big deal if you run lots of executions. The tradeoff is that you’re closer to the plumbing, so you’ll spend a bit more time setting it up the first time. If you want someone to sanity-check your version, Talk to an automation expert.
Consistent posting stops being a heroic effort when your pipeline is automatic and visible. The workflow handles the repetitive stuff, and you get to focus on the parts that actually sound like you.
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.