Google Sheets + Telegram: approve cold emails fast
You finally block time to do outreach, then half of it disappears into copying rows, rewriting “personalized” lines, and double-checking you didn’t email the same lead twice.
Growth marketers feel this when pipeline targets loom. Founders doing sales themselves get dragged into the same chaos. And agencies? They’re stuck proving consistency across clients. This Telegram email approval automation gives you fast drafts, a simple approve/reject loop, and clean tracking without losing human control.
You’ll see exactly how the workflow pulls “Available” leads from Google Sheets, drafts emails with Gemini, routes approvals in Telegram, and only then sends and logs every message.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Telegram: approve cold emails fast
flowchart LR
subgraph sg0["When clicking 'Execute workflow' Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking 'Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Wait3", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items1", pos: "b", h: 48 }
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/telegram.svg' width='40' height='40' /></div><br/>Send a text message9"]
n7["<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 message and wait for re.."]
n8@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n9@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model3", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "AI Agent1", pos: "b", h: 48 }
n11@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory1", pos: "b", h: 48 }
n12@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model1", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Filtered Leads Update", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Sent Leads Append", pos: "b", h: 48 }
n15@{ icon: "mdi:robot", form: "rounded", label: "AI Agent2", pos: "b", h: 48 }
n16@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model2", pos: "b", h: 48 }
n17["<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 message and wait for re.."]
n18@{ icon: "mdi:robot", form: "rounded", label: "AI Agent3", pos: "b", h: 48 }
n19@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model4", pos: "b", h: 48 }
n20@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n21@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model5", pos: "b", h: 48 }
n22@{ icon: "mdi:message-outline", form: "rounded", label: "Send email", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Date & Time", 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/merge.svg' width='40' height='40' /></div><br/>Merge Data and Agent output .."]
n25@{ icon: "mdi:database", form: "rounded", label: "Add Email Draft to Google Sh..", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "Limit Sheets Get Function", pos: "b", h: 48 }
n27@{ icon: "mdi:database", form: "rounded", label: "Get Lead from Google Sheet", pos: "b", h: 48 }
n4 --> n5
n3 --> n22
n3 --> n17
n1 --> n24
n1 --> n7
n18 --> n7
n22 --> n4
n23 --> n27
n11 -.-> n10
n5 --> n6
n5 --> n1
n5 --> n24
n5 --> n10
n14 -.-> n10
n13 -.-> n10
n2 -.-> n1
n8 -.-> n1
n12 -.-> n10
n16 -.-> n15
n9 -.-> n8
n19 -.-> n18
n21 -.-> n20
n26 --> n5
n20 -.-> n18
n27 --> n26
n25 -.-> n15
n24 --> n15
n0 --> n23
n7 --> n3
n17 --> n18
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 n1,n8,n10,n15,n18,n20 ai
class n2,n9,n12,n16,n19,n21 aiModel
class n11 ai
class n3 decision
class n13,n14,n25,n27 database
classDef customIcon fill:none,stroke:none
class n6,n7,n17,n24 customIcon
The Problem: Cold email gets slow (or sloppy) at scale
Cold email is one of those tasks that looks quick until you actually do it daily. You pull a lead list, try to personalize without sounding weird, write a subject line that isn’t spammy, then you still need to send, log, and update statuses so you don’t hit the same person again next week. If you use AI to speed it up, quality control becomes the new bottleneck. And if you skip control, you end up with “personalized” messages that are frankly embarrassing. The time cost is bad. The mental load is worse.
The friction compounds. Here’s where it breaks down.
- Leads sit in a sheet with “Available” status, but turning each row into a send-ready email still takes about 10 minutes of manual work.
- AI drafts help, but without a clean approve/reject loop you either ship mediocre copy or spend forever editing.
- Tracking becomes unreliable because updates land in the wrong tab, or not at all, so you can’t audit what was sent.
- Sending too fast (or inconsistently) can trip spam filters, which means deliverability takes the hit instead of the workflow.
The Solution: AI drafts + Telegram approval + automatic sending and logging
This workflow starts with a simple manual launch in n8n, then grabs the current timestamp so every action is logged cleanly. It pulls leads from your Google Sheet tab called “Filtered Leads” where the status is set to “Available,” and it limits the batch (three leads by default) so you stay in control. For each lead, Google Gemini generates a subject and email body based on the lead data (name, company, job title, LinkedIn, notes, and website context). Then it posts a preview into Telegram with two buttons: approve or reject. Approve sends the email via SMTP, updates statuses, and writes to two tracking tabs plus an archive. Reject asks you for feedback in Telegram, regenerates a new version, and re-sends it for approval.
The workflow begins by fetching a small batch of leads from Google Sheets. Gemini drafts the email, then Telegram becomes the quality gate. Finally, approved emails send through your SMTP account and all three Sheets tabs get updated, so you can always prove what happened.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you run outreach in small daily batches: three leads at a time. Manually, a “quick” personalized email often takes about 10 minutes between researching, drafting, sending, and logging, which is roughly 30 minutes per batch. With this workflow, the batch fetch and drafting happens automatically, then you spend maybe 1-2 minutes per message approving or rejecting in Telegram (about 5 minutes total). The sends and sheet updates happen in the background, with a one-second pause between emails.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store leads and tracking tabs.
- Telegram for fast approve/reject decisions.
- Google Gemini API key (get it from Google AI Studio).
Skill level: Intermediate. You’ll connect accounts, map sheet columns, and test the approval loop end-to-end.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Manual launch, then timestamp logging. You start the run when you’re ready, and the workflow captures the current date and time so your logs are consistent across Sheets tabs.
Lead selection from Google Sheets. It pulls rows from the “Filtered Leads” tab where Status equals “Available,” then limits the pull (three leads by default) and loops through them one by one.
Draft generation and structured parsing. Gemini creates a subject line and body using fields like CompanyName, JobTitle, Website, LinkedIn, and Notes. The output is parsed into a clean structure so it can be archived and sent without formatting surprises.
Telegram approval and branching. Each draft is posted to your Telegram chat with Approve/Reject. Approve sends via SMTP, updates the lead status, and appends rows into “Sent Leads” and “Emails Sent.” Reject asks for your feedback in Telegram, regenerates a revised draft, then requests approval again.
You can easily modify batch size and filtering rules to match your list hygiene and sending volume. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Start the workflow on demand so you can control when lead processing begins.
- Add the Manual Launch Trigger node as your entry point.
- Connect Manual Launch Trigger to Current Time Stamp to follow the defined execution flow.
Step 2: Connect Google Sheets
Pull available leads and prepare the batch processing logic.
- Open Retrieve Lead List and set Document to
[YOUR_ID]and Sheet toFiltered Leads(from the list fields). - In Retrieve Lead List, keep the filter where Status equals
Available. - Configure Limit Lead Fetch with Max Items set to
3. - Ensure the path flows Current Time Stamp → Retrieve Lead List → Limit Lead Fetch → Iterate Lead Batches.
Credential Required: Connect your Google Sheets credentials in Retrieve Lead List, Update Filtered Leads, Append Sent Leads, and Archive Draft to Sheet.
Step 3: Set Up AI Email Drafting and Parsing
Generate structured email drafts using Gemini and parse them into Subject and Body fields.
- In Email Draft Generator, set Prompt to
Generate a personalized cold email based on the lead data provided.and keep Has Output Parser enabled. - Connect Gemini Chat Engine as the language model for Email Draft Generator.
- Attach Parse Email Structure to Email Draft Generator as the output parser, with JSON Schema Example set to
{ "Subject": "Subject Line", "Body": "Body Text" }and Auto Fix enabled. - Connect Gemini Parser Model as the language model for Parse Email Structure.
Credential Required: Connect your Google Gemini credentials in all Gemini nodes (grouped across 6 nodes, including Gemini Chat Engine, Gemini Parser Model, Gemini Update Model, Gemini Archive Model, Gemini Revision Model, and Gemini Revised Parser).
Step 4: Configure Approval Routing and Parallel Outputs
Send drafts to Telegram for approval while archiving the draft data in parallel.
- Set Telegram Approval Prompt to Operation
sendAndWaitand Message to=Subject:{{ $json.output.Subject }}\n\nBody: {{ $json.output.Body }}, and set Chat ID to[YOUR_ID]. - Keep the route from Telegram Approval Prompt into Approval Route Switch to handle approve/reject logic based on
{{ $json.data.approved }}. - Note the parallel flow: Email Draft Generator outputs to both Merge Lead + Draft and Telegram Approval Prompt in parallel.
- In Merge Lead + Draft, pass combined lead and email data forward to Email Archive Agent.
Credential Required: Connect your Telegram credentials in Telegram Approval Prompt, Telegram Revision Query, and Telegram Batch Notice.
sendAndWait and approvals are enabled.Step 5: Configure Email Dispatch and Send Pacing
Send approved emails and pause between sends.
- In Dispatch Email, set To Email to
{{ $('Retrieve Lead List').item.json.Email }}. - Set Subject to
{{ $('Email Draft Generator').item.json.output.Subject }}and Text to{{ $('Email Draft Generator').item.json.output.Body }}\n\n--\nCompany Team. - Set From Email to
[YOUR_EMAIL]and keep Email Format astext. - Configure Pause After Send with Amount set to
1to throttle email sends.
Credential Required: Connect your SMTP/Email credentials in Dispatch Email.
Step 6: Set Up Sheet Updates and Archiving
Record sent emails, update lead status, and archive drafts.
- In Sheet Update Agent, keep the prompt
Update sheets: append to Sent Leads and update status to Sent in Filtered Leads.. - Set Session Memory Buffer with Session Key
{{ $('Retrieve Lead List').item.json['Lead \nID'] }}and Context Window Length100to track per-lead memory. - In Update Filtered Leads, keep Operation as
updateand mapping values like{{ $fromAI('Status', '', 'string') }}and{{ $fromAI('Lead__ID', '', 'string') }}. - In Append Sent Leads, keep Operation as
appendand map fields to AI values like{{ $fromAI('Name', '', 'string') }}and{{ $fromAI('Sent_Date', '', 'string') }}. - Use Email Archive Agent to send combined data to Archive Draft to Sheet with mapped fields
{{ $fromAI('Email_Body', '', 'string') }}and{{ $fromAI('Email_Subject', '', 'string') }}.
AI tool sub-nodes like Update Filtered Leads, Append Sent Leads, and Archive Draft to Sheet inherit credentials from their parent agent nodes. Ensure credentials are added to the parent AI nodes using Google Sheets.
Step 7: Configure Revision Loop (Rejected Approvals)
When an email is rejected, collect feedback and regenerate the draft.
- In Approval Route Switch, keep the second output (Rejected) connected to Telegram Revision Query.
- Set Telegram Revision Query to Operation
sendAndWaitand Response TypefreeTextwith messageHow to change email?. - In Regenerate Email Agent, keep the prompt
Regenerate email based on user feedback.and ensure Has Output Parser is enabled. - Attach Parse Revised Output as the output parser with schema
{ "Subject": "Subject Line", "Body": "Body Text" }, and connect Gemini Revised Parser as its language model. - Confirm that Regenerate Email Agent routes back to Telegram Approval Prompt for another approval cycle.
Step 8: Test and Activate Your Workflow
Validate each branch and then enable the workflow for production.
- Click Execute Workflow and start from Manual Launch Trigger.
- Confirm leads are fetched from Retrieve Lead List and limited by Limit Lead Fetch.
- Verify that Telegram Approval Prompt sends the draft with the subject/body rendered from
{{ $json.output.Subject }}and{{ $json.output.Body }}. - Approve once to ensure Dispatch Email sends to the lead’s email and that Pause After Send runs.
- Reject once to ensure Telegram Revision Query and Regenerate Email Agent loop back correctly.
- When tests pass, toggle the workflow to Active to run it in production.
Common Gotchas
- Google Sheets permissions can be oddly specific. If updates fail, check the n8n Google Sheets credential and confirm it can edit all three tabs (Filtered Leads, Sent Leads, Emails Sent).
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Gemini prompts that are “good enough” on day one often drift off-brand later. Add your voice, offer, and do-not-say rules early or you will be rewriting drafts every day.
Frequently Asked Questions
About an hour if your Sheets and Telegram bot are ready.
No. You’ll mainly connect accounts and map your sheet columns into the AI prompt and email fields.
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 Google Gemini API usage and your email provider 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 change the lead filter in the Google Sheets retrieval node so it pulls Status = “Available,” Priority = “High,” or even a Campaign tag. You can also adjust the batch limit node (it’s set to three leads per execution by default). For tone, update the Gemini prompt inside the Email Draft Generator agent, and keep your must-use offer points in the prompt so every draft stays consistent. Many teams also add extra lead context to the Telegram approval message, like JobTitle and Notes, to make approvals faster.
Usually it’s a bad bot token or the chat ID is wrong. Regenerate the token in BotFather if needed, confirm you’re sending to the correct chat, and check that the bot is actually added to the group (and allowed to post). If approvals work sometimes and then fail, rate limits can also be the culprit when you crank up batch size.
The template processes three leads per execution by default, but you can raise that limit as long as your sending reputation and approval capacity can keep up.
Often, yes, because the approval loop is not just a single “approve” step. You’ve got branching (approve vs. reject), a feedback-driven regeneration path, structured parsing, and multi-sheet logging, and n8n handles that kind of logic cleanly. The other big difference is control over cost and volume: self-hosting removes execution limits, which matters when you run outreach every day. Zapier or Make can still be fine if you only need a basic draft-to-send flow with no revisions. If you’re unsure, pick based on how often you expect rejections and edits, because that’s where simple automations get messy fast. Talk to an automation expert if you want a second opinion.
You get faster outreach without handing the keys to an AI. Set up the approval loop once, keep your tracking clean, and move on to work that actually grows revenue.
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.