This workflow corresponds to n8n.io template #14578 — we link there as the canonical source.
This workflow follows the Chainllm → Gmail recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "SAR8bH9kVKARWSj4",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Leads Follow-Up - Auto Draft Generator Published",
"tags": [],
"nodes": [
{
"id": "47fff186-eb26-4526-96f7-9c726fd303d3",
"name": "Read Leads Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
912,
608
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/YOUR_SHEET_ID",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultUrl": "https://docs.google.com/spreadsheets/YOUR_SHEET_ID",
"cachedResultName": "Leads FollowUp"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "e0671f98-f565-4152-ab57-4b12fb445a6c",
"name": "Basic LLM Chain",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
2896,
224
],
"parameters": {
"text": "=You are a sales assistant. Read the following meeting transcript and write a personalized follow-up email based ONLY on the details below. Do not invent or assume any information not provided.\n\nLead details:\n- Name: {{ $json.lead_name }}\n- Company: {{ $json.lead_company }}\n- Sales Rep: {{ $json.lead_sales_rep }}\n\nMeeting Transcript:\n{{ $json.transcript_text }}\n\nRules:\n- Read the transcript carefully\n- Extract the main topic discussed\n- Extract the pain point mentioned\n- Extract any agreed next steps\n- Write a follow-up email of max 6 sentences\n- Reference specific details from the transcript\n- Do NOT use placeholders like [brackets]\n- Return ONLY the email body, no subject line",
"batching": {},
"promptType": "define"
},
"typeVersion": 1.9
},
{
"id": "ed70593b-c282-4435-8b55-60bdf84329a4",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
2960,
432
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "c47d58e7-c124-454c-814f-704a0f4abbb2",
"name": "Gmail - Create Draft",
"type": "n8n-nodes-base.gmail",
"position": [
3200,
224
],
"parameters": {
"message": "={{ $json.text }}",
"options": {
"sendTo": "={{ $('Read Leads Sheet').item.json.Email }}"
},
"subject": "=Following up - {{ $('Transcript Data From Files').item.json.lead_company }}",
"resource": "draft"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "f4a33e12-b6a7-4b98-b1d6-15a4a3e2cf04",
"name": "HTTP - Download File from Google Drive",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
1808,
320
],
"parameters": {
"url": "={{ 'https://drive.google.com/uc?export=download&id=' + $json['Meeting Transcript'].split('/d/')[1].split('/')[0] }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.2
},
{
"id": "dbd12111-2d7b-4054-8fb2-b102e1c72e6f",
"name": "Daily 9AM Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
688,
608
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * 1-5"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "29ad290e-7839-418e-9bd2-9356dbc70ee5",
"name": "Filter - Active Leads Only",
"type": "n8n-nodes-base.if",
"position": [
1136,
608
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "7ade6b43-3e44-4e65-bb78-8279301a438c",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json['Current status'] }}",
"rightValue": "New"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "939b3f2d-12b2-4823-b00d-6fcd5507c812",
"name": "Filter - 5+ Days No Contact",
"type": "n8n-nodes-base.filter",
"position": [
1360,
592
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "condition1",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $json['Last Contact'] && !isNaN(new Date($json['Last Contact'])) ? Math.floor((new Date() - new Date($json['Last Contact'])) / (1000 * 60 * 60 * 24)) : -1 }}",
"rightValue": 5
}
]
}
},
"typeVersion": 2
},
{
"id": "88377bcc-0ea1-4cab-abcc-35c5cfd98bc0",
"name": "Check - Transcript Exists?",
"type": "n8n-nodes-base.if",
"position": [
1568,
592
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "has-transcript",
"operator": {
"type": "string",
"operation": "notEmpty"
},
"leftValue": "={{ $json['Meeting Transcript'] }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "5a603849-fdc7-4850-8300-80eeff988c50",
"name": "Alert - Missing Transcript",
"type": "n8n-nodes-base.slack",
"position": [
1920,
880
],
"parameters": {
"text": "=\u26a0\ufe0f *Missing Transcript!*\n\n*Lead:* {{ $json['Name'] }}\n*Company:* {{ $json['Company'] }}\n*Sales Rep:* {{ $json['Sales Rep'] }}\n*Last Contact:* {{ $json['Last Contact Date'] }}\n\nPlease upload the meeting transcript to Google Drive and update the sheet!",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultName": "followups-reminders"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "4e9578bd-5e68-4e62-9e3f-5702ca54fa60",
"name": "Alert - Download Failed",
"type": "n8n-nodes-base.slack",
"position": [
2192,
880
],
"parameters": {
"text": "=\u274c *Download Error!*\n\n*Lead:* {{ $('Check - Transcript Exists?').item.json['Name'] }}\n*Company:* {{ $('Check - Transcript Exists?').item.json['Company'] }}\n*Sales Rep:* {{ $('Check - Transcript Exists?').item.json['Sales Rep'] }}\n\nFailed to download transcript from Google Drive.\nPlease check the link and permissions!",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultName": "followups-reminders"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "7f36f193-a4a9-4781-9bb5-0d62f031602a",
"name": "Alert - Unsupported File Type",
"type": "n8n-nodes-base.slack",
"position": [
2464,
880
],
"parameters": {
"text": "=\u26a0\ufe0f *Unsupported File Type!* \u26a0\ufe0f\n\n*Lead:* {{ $('Check - Transcript Exists?').item.json['Name'] }}\n*Company:* {{ $('Check - Transcript Exists?').item.json['Company'] }}\n*Sales Rep:* {{ $('Check - Transcript Exists?').item.json['Sales Rep'] }}\n*File:* {{ $binary.data.fileName }}\n*Type:* {{ $binary.data.fileExtension }}\n\n\nFile format *{{ $binary.data.fileExtension }}* is not supported. Please upload the transcript as PDF, TXT, or MP3 only!\n\n",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultName": "failing-followups"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "2a936d7a-6c29-447f-9415-64ca95569ebf",
"name": "Notify - Draft Ready",
"type": "n8n-nodes-base.slack",
"position": [
3696,
224
],
"parameters": {
"text": "=\u2705 *Follow-Up Draft Ready!*\n\n*Lead:*{{ $('Transcript Data From Files').item.json.lead_name }}\n*Company:* {{ $('Transcript Data From Files').item.json.lead_company }}\n*Sales Rep:* {{ $('Transcript Data From Files').item.json.lead_sales_rep }}\n*Last Contact:* {{ $('Transcript Data From Files').item.json.lead_last_contact }}\n\n\u2709\ufe0f Gmail draft is ready \u2014 please review and send!",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultName": "followups-reminders"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "df5df853-a0fb-46e7-999a-8788352fc539",
"name": "Extract Text: txt",
"type": "n8n-nodes-base.extractFromFile",
"position": [
2416,
160
],
"parameters": {
"options": {},
"operation": "text",
"binaryPropertyName": "=data"
},
"typeVersion": 1
},
{
"id": "3b2d3d23-0fb6-4be0-ad5f-a8b2f00e923c",
"name": "Extract Text: Pdf",
"type": "n8n-nodes-base.extractFromFile",
"position": [
2416,
304
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "e948726f-ff38-4b9e-be13-9a6e2d983a31",
"name": "Update FollowUp Status with Dates",
"type": "n8n-nodes-base.googleSheets",
"position": [
3488,
224
],
"parameters": {
"columns": {
"value": {
"row_number": "={{ $('Transcript Data From Files').item.json.lead_row }}",
"Current status": "Draft Created",
"FollowUp Draft Creation date": "=Draft Created @ {{ new Date().toLocaleString('en-GB') }}"
},
"schema": [
{
"id": "Current status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Current status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Contact",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Last Contact",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Meeting Transcript",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Meeting Transcript",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sales Rep",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Sales Rep",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "FollowUp Draft Creation date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "FollowUp Draft Creation date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "c6d08836-7312-4735-b77d-75b118f83046",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
3408,
0
],
"parameters": {
"color": 7,
"width": 512,
"height": 528,
"content": "## 4. Deduplication\nAfter draft is created, status updates to **Draft Created** so this lead won't trigger again tomorrow.\n\n\n"
},
"typeVersion": 1
},
{
"id": "db720a8e-8bd6-44e6-8ef6-8cd343d49f1e",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1808,
672
],
"parameters": {
"color": 7,
"width": 884,
"height": 400,
"content": "## Error Handling\nNotify teams on slack for\n- **Missing transcript**\n- **Download failed**\n- **Unsupported file type**"
},
"typeVersion": 1
},
{
"id": "13ec7869-9af8-4371-8df7-27e4bdacbaaf",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
640,
400
],
"parameters": {
"color": 7,
"width": 1104,
"height": 400,
"content": "## 1. Read & Filter Leads\n\nRuns every weekday at 9AM. Reads all leads from Google Sheet and filter rows by:\n- **Status** = New \u2013\u2013 **Skips:** Draft Created, Sent, Closed\n- **No contact** for 5+ days\n- **Transcript link** exists\n"
},
"typeVersion": 1
},
{
"id": "bfa097d5-5ec9-4266-b823-c041df77c4b4",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"width": 624,
"height": 960,
"content": "## LEADS FOLLOW-UP WORKFLOW\n\nThis workflow automatically identifies leads that require follow-up and generates personalized emails using AI, saved as drafts for human review. The team is notified on Slack when a draft is ready.\n\n- Runs every weekday morning\n- Finds leads with no contact for 5+ days\n- Downloads their meeting transcript\n- Generates a personalized email with AI\n- Saves it as a Gmail Draft\n\n**Who is it for?**\nSales teams who need to follow up regularly with specific leads.\n\n---\n\n### Setup Steps\n- [ ] Replace YOUR_SHEET_ID with your Google Sheet ID \n- [ ] Update the Google Sheet column names in the filter nodes to match your sheet\n- [ ] Set up Google Gemini credentials for AI processing nodes\n- [ ] Set up Slack credentials and update channel IDs in all alert nodes\n- [ ] Connect your Gmail account to the Gmail nodes\n\n### Customization\n- You can extend supported file types to include voice notes (MP3) via Gemini transcription\n- This workflow can be adapted for any follow-up use case: feedback collection, deadline reminders, onboarding check-ins, etc.\n\n---\n\n## Required Google Sheet Columns\n\n| Column | Description |\n|---|---|\n| Current status | Lead status: New, Draft Created, Sent, Closed |\n| Last Contact | Date of last contact with the lead |\n| Name | Lead's full name |\n| Company | Lead's company name |\n| Email | Lead's email address |\n| Meeting Transcript | Google Drive link to the meeting doc |\n| Sales Rep | Name of the sales rep handling this lead |\n| FollowUp Draft Creation date | Auto-filled by workflow when draft is created |"
},
"typeVersion": 1
},
{
"id": "36dc61d2-3db2-45fd-80c6-438df8066e8a",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1760,
-16
],
"parameters": {
"color": 7,
"width": 1044,
"height": 544,
"content": "## 2. Download, Route & Extract Meetings Docs\nDownloads the meeting transcript from Google Drive and routes it by file type.\n\n**Supported formats:**\n- TXT \n- PDF \n\n**If unsupported format \u2192** Slack alert sent to team"
},
"typeVersion": 1
},
{
"id": "e7da4805-ffb2-460d-8666-a817842f14be",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
2848,
0
],
"parameters": {
"color": 7,
"width": 512,
"height": 592,
"content": "## 3. AI Email Generation\n\nUses Google Gemini to write a personalized follow-up email based on the transcript.\nSaves the output as a **Gmail Draft** \u2014 not sent automatically."
},
"typeVersion": 1
},
{
"id": "79865dc7-69fb-4aa8-ae64-b41e2980b81d",
"name": "Transcript Data From Files",
"type": "n8n-nodes-base.code",
"position": [
2640,
224
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "let transcriptText = '';\n\nif ($json.text) {\n transcriptText = $json.text;\n} else if ($json.data && typeof $json.data === 'string') {\n transcriptText = $json.data;\n} else if ($binary?.data?.data) {\n const buffer = Buffer.from($binary.data.data, 'base64');\n transcriptText = buffer.toString('utf-8').replace(/\\0/g, '').trim();\n}\n\nconst lead = $('Check - Supported File Type').item.json;\n\nreturn {\n lead_row: lead['row_number'],\n transcript_text: transcriptText,\n lead_name: lead['Name'],\n lead_email: lead['Email'],\n lead_company: lead['Company'],\n lead_sales_rep: lead['Sales Rep'],\n lead_last_contact: lead['Last Contact'], \n};"
},
"typeVersion": 2
},
{
"id": "459558c9-84af-480e-a34a-9cafe07f6982",
"name": "Check - Supported File Type",
"type": "n8n-nodes-base.if",
"position": [
2000,
304
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "a992bcb5-8506-4e2c-a6c9-df8d7a1566cf",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $binary.data.fileExtension }}",
"rightValue": "txt"
},
{
"id": "ac99ac4f-9092-45fe-b242-874fccc2f4f8",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $binary.data.fileExtension }}",
"rightValue": "pdf"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "a4dbac67-de7e-46b6-b37f-791a412c4966",
"name": "Route - Is TXT?",
"type": "n8n-nodes-base.if",
"position": [
2208,
224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2470c363-afe3-4733-baf3-f134fbce6fa3",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $binary.data.fileExtension }}",
"rightValue": "txt"
}
]
}
},
"typeVersion": 2.3
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "7c8acf75-b5be-41f2-ba6d-9edca1adb638",
"connections": {
"Basic LLM Chain": {
"main": [
[
{
"node": "Gmail - Create Draft",
"type": "main",
"index": 0
}
]
]
},
"Route - Is TXT?": {
"main": [
[
{
"node": "Extract Text: txt",
"type": "main",
"index": 0
}
],
[
{
"node": "Extract Text: Pdf",
"type": "main",
"index": 0
}
]
]
},
"Read Leads Sheet": {
"main": [
[
{
"node": "Filter - Active Leads Only",
"type": "main",
"index": 0
}
]
]
},
"Daily 9AM Trigger": {
"main": [
[
{
"node": "Read Leads Sheet",
"type": "main",
"index": 0
}
]
]
},
"Extract Text: Pdf": {
"main": [
[
{
"node": "Transcript Data From Files",
"type": "main",
"index": 0
}
]
]
},
"Extract Text: txt": {
"main": [
[
{
"node": "Transcript Data From Files",
"type": "main",
"index": 0
}
]
]
},
"Gmail - Create Draft": {
"main": [
[
{
"node": "Update FollowUp Status with Dates",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "Basic LLM Chain",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Check - Transcript Exists?": {
"main": [
[
{
"node": "HTTP - Download File from Google Drive",
"type": "main",
"index": 0
}
],
[
{
"node": "Alert - Missing Transcript",
"type": "main",
"index": 0
}
]
]
},
"Filter - Active Leads Only": {
"main": [
[
{
"node": "Filter - 5+ Days No Contact",
"type": "main",
"index": 0
}
]
]
},
"Transcript Data From Files": {
"main": [
[
{
"node": "Basic LLM Chain",
"type": "main",
"index": 0
}
]
]
},
"Check - Supported File Type": {
"main": [
[
{
"node": "Route - Is TXT?",
"type": "main",
"index": 0
}
],
[
{
"node": "Alert - Unsupported File Type",
"type": "main",
"index": 0
}
]
]
},
"Filter - 5+ Days No Contact": {
"main": [
[
{
"node": "Check - Transcript Exists?",
"type": "main",
"index": 0
}
]
]
},
"Update FollowUp Status with Dates": {
"main": [
[
{
"node": "Notify - Draft Ready",
"type": "main",
"index": 0
}
]
]
},
"HTTP - Download File from Google Drive": {
"main": [
[
{
"node": "Check - Supported File Type",
"type": "main",
"index": 0
}
],
[
{
"node": "Alert - Download Failed",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2googlePalmApigoogleSheetsOAuth2ApislackOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automatically identifies overdue sales leads and generates personalized follow-up emails using AI. Runs every weekday Reads leads from Google Sheets Filters leads with no contact for 5+ days Downloads last meeting transcript from Google Drive Uses Google Gemini to write a…
Source: https://n8n.io/workflows/14578/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Categories Content Creation AI Automation Publishing Social Media
SMB finance teams, SaaS companies, and accounting professionals who need to automate transaction reconciliation between Stripe payments and their accounting ledgers. Perfect for businesses processing
DevOps engineers, site reliability teams, and business owners who need to know the moment their website goes down — and want AI-powered diagnostics instead of just a ping alert.
This workflow is the AI analysis and alerting engine for a complete social media monitoring system. It's designed to work with data scraped from X (formerly Twitter) using a tool like the Apify Tweet
Automate your lead intake, scoring, and outreach pipeline. This workflow collects leads from forms, enriches and scores them using Relevance AI, routes them by quality, and triggers the right follow-u