This workflow corresponds to n8n.io template #9345 — we link there as the canonical source.
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": "EHOx9tJ71PVTuz5c",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Priority Follow-Up Queue Builder",
"tags": [],
"nodes": [
{
"id": "f6fbaebc-f91b-4f31-810b-945d282a29b2",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"position": [
944,
704
],
"parameters": {},
"typeVersion": 1
},
{
"id": "6dab30f9-0b1c-463f-909c-0b9239dbf1cd",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
496,
624
],
"parameters": {
"width": 380,
"height": 280,
"content": "## \ud83d\ude80 Workflow Start\n\nThis workflow automatically identifies and queues your highest-priority leads for follow-up.\n\n**What it does:**\n- Reads lead data from Google Sheets\n- Calculates priority scores based on engagement and recency\n- Selects top leads for follow-up\n- Creates tasks in ClickUp\n- Updates the sheet with queue status"
},
"typeVersion": 1
},
{
"id": "24b80916-7fbf-415c-89fe-ec198bf10623",
"name": "Read Leads from Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1168,
704
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1hYKQSySynmFlOwF1MJZko7kiY9wJE26M-l5bgeoEw98/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1hYKQSySynmFlOwF1MJZko7kiY9wJE26M-l5bgeoEw98",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1hYKQSySynmFlOwF1MJZko7kiY9wJE26M-l5bgeoEw98/edit?usp=drivesdk",
"cachedResultName": "Priority followup"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "68039cea-d1b3-4395-88e9-ea530e8d2eec",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1056,
352
],
"parameters": {
"width": 300,
"height": 332,
"content": "## \ud83d\udcca Step 1: Read Lead Data\n\nFetches all leads from Google Sheet 'Sheet1'.\n\n**Expected columns:**\n- Lead Name\n- Last_Contact_Date\n- Engagement_Score\n- Timezone\n- Email\n- Status"
},
"typeVersion": 1
},
{
"id": "a11cadaa-c5e6-4f36-8c09-be885e0484b0",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
864
],
"parameters": {
"width": 300,
"height": 304,
"content": "## \u23f0 Step 2: Calculate Recency\n\nCalculates days since last contact for each lead.\n\n**Logic:**\n- Takes Last_Contact_Date\n- Compares with today\n- Adds Days_Since_Last_Contact field\n\n*Longer gaps = higher urgency*"
},
"typeVersion": 1
},
{
"id": "58f3405e-6db0-4dee-8efc-704f460299d8",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1536,
320
],
"parameters": {
"width": 300,
"height": 340,
"content": "## \ud83c\udfaf Step 3: Calculate Priority\n\nCreates a Priority_Score for each lead.\n\n**Formula:**\n- 70% Engagement Score\n- 30% Recency Score\n\n**Example:**\nEngagement: 80/100\nDays since contact: 5\nRecency: 95/100\nPriority = (80\u00d70.7)+(95\u00d70.3) = 84.5"
},
"typeVersion": 1
},
{
"id": "3501da06-dcb6-403a-96d1-8b8524958f7e",
"name": "Sort by Priority Score",
"type": "n8n-nodes-base.sort",
"position": [
1840,
704
],
"parameters": {
"options": {},
"sortFieldsUi": {
"sortField": [
{
"order": "descending",
"fieldName": "Priority_Score"
}
]
}
},
"typeVersion": 1
},
{
"id": "367e537c-63b2-47bb-86b3-96102cc54081",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1776,
880
],
"parameters": {
"width": 280,
"height": 164,
"content": "## \ud83d\udcc8 Step 4: Sort Leads\n\nSorts all leads by Priority_Score in descending order.\n\nHighest priority leads appear first."
},
"typeVersion": 1
},
{
"id": "b7f1fd67-804a-4f67-9817-e6be404a2aff",
"name": "Select Top 10 Leads",
"type": "n8n-nodes-base.limit",
"position": [
2064,
704
],
"parameters": {
"maxItems": 10
},
"typeVersion": 1
},
{
"id": "024f813e-41c8-42fb-a6c4-3a61b3d4232b",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2000,
400
],
"parameters": {
"width": 280,
"height": 264,
"content": "## \ud83d\udd1d Step 5: Filter Top Leads\n\nSelects only the top 10 highest-priority leads.\n\n**Adjustable:**\nChange maxItems to get more/fewer leads.\n\nCurrent setting: Top 10"
},
"typeVersion": 1
},
{
"id": "a2905675-38e1-4ebb-892b-e428af5245f9",
"name": "Suggest Optimal Send Time",
"type": "n8n-nodes-base.function",
"position": [
2288,
704
],
"parameters": {
"functionCode": "// Suggest optimal send time based on lead's timezone\nreturn items.map(item => {\n const tz = (item.json.Timezone || '').toUpperCase();\n let suggestedTime = '9:00 AM';\n \n // Timezone-specific recommendations\n if (tz.includes('IST')) suggestedTime = '10:00 AM IST';\n else if (tz.includes('PST')) suggestedTime = '9:00 AM PST';\n else if (tz.includes('EST')) suggestedTime = '9:30 AM EST';\n else if (tz.includes('GMT')) suggestedTime = '9:00 AM GMT';\n \n item.json.Suggested_Send_Time = suggestedTime;\n \n return item;\n});"
},
"typeVersion": 1
},
{
"id": "a46f0103-bcdc-4d4b-957e-a2d0d1b8d532",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2224,
880
],
"parameters": {
"width": 300,
"height": 320,
"content": "## \ud83d\udd50 Step 6: Time Optimization\n\nSuggests best time to contact each lead based on their timezone.\n\n**Time zones supported:**\n- IST: 10:00 AM\n- PST: 9:00 AM\n- EST: 9:30 AM\n- GMT: 9:00 AM\n\n*Maximizes response rates*"
},
"typeVersion": 1
},
{
"id": "2545f230-e090-413c-aec2-b02c1b82fc62",
"name": "Create ClickUp Task",
"type": "n8n-nodes-base.clickUp",
"position": [
2512,
704
],
"parameters": {
"list": "901611225384",
"name": "={{ $json.Lead_Name }} - Priority Follow-up",
"team": "90161261705",
"space": "90165174252",
"folderless": true,
"additionalFields": {}
},
"credentials": {
"clickUpApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "15b9e908-0b83-4256-b1e5-50fda3da8c51",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
2464,
336
],
"parameters": {
"width": 300,
"height": 320,
"content": "## \u2705 Step 7: Create Tasks\n\nCreates a ClickUp task for each priority lead.\n\n**Task includes:**\n- Lead name\n- Priority score\n- Last contact date\n- Suggested send time\n- Engagement data\n\n*Ready for action!*"
},
"typeVersion": 1
},
{
"id": "437dec32-0caf-4493-ab5e-e530b8ec7803",
"name": "Update Sheet - Mark as Queued",
"type": "n8n-nodes-base.googleSheets",
"position": [
2736,
704
],
"parameters": {
"options": {},
"dataMode": "autoMapInputData",
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 704813266,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1hYKQSySynmFlOwF1MJZko7kiY9wJE26M-l5bgeoEw98/edit#gid=704813266",
"cachedResultName": "Sheet2"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1hYKQSySynmFlOwF1MJZko7kiY9wJE26M-l5bgeoEw98",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1hYKQSySynmFlOwF1MJZko7kiY9wJE26M-l5bgeoEw98/edit?usp=drivesdk",
"cachedResultName": "Priority followup"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "4c1dfd1b-b7c2-474b-b9be-0d0b3d40c7cc",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
2688,
912
],
"parameters": {
"width": 300,
"height": 268,
"content": "## \ud83d\udcdd Step 8: Update Records\n\nWrites results back to Sheet2 with:\n- Priority scores\n- Days since contact\n- Suggested send times\n- Queue status\n\n*Keeps your data synchronized*"
},
"typeVersion": 1
},
{
"id": "3bba318c-52ef-49ff-95ff-ed546bb0fcf9",
"name": "Calculate Days Since Contact1",
"type": "n8n-nodes-base.function",
"position": [
1392,
704
],
"parameters": {
"functionCode": "// Calculate how many days have passed since last contact\nconst today = new Date();\n\nreturn items.map(item => {\n const lastContact = new Date(item.json.Last_Contact_Date);\n const diffDays = Math.floor((today - lastContact) / (1000 * 60 * 60 * 24));\n \n item.json.Days_Since_Last_Contact = diffDays;\n \n return item;\n});"
},
"typeVersion": 1
},
{
"id": "5875baa9-f729-4f6c-872a-9f621b9470dc",
"name": "Calculate Priority Score1",
"type": "n8n-nodes-base.function",
"position": [
1616,
704
],
"parameters": {
"functionCode": "// Calculate priority score combining engagement and recency\nreturn items.map(item => {\n const engagement = parseFloat(item.json.Engagement_Score) || 0;\n const days = parseFloat(item.json.Days_Since_Last_Contact) || 0;\n \n // Recency score: 100 points minus days (0-100 scale)\n const recencyScore = Math.max(0, 100 - days);\n \n // Priority Score: 70% engagement + 30% recency\n item.json.Priority_Score = Math.round((engagement * 0.7) + (recencyScore * 0.3));\n \n return item;\n});"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "4bc03222-7267-4d72-be6d-6be0c3e3b6c7",
"connections": {
"Manual Trigger": {
"main": [
[
{
"node": "Read Leads from Sheet",
"type": "main",
"index": 0
}
]
]
},
"Create ClickUp Task": {
"main": [
[
{
"node": "Update Sheet - Mark as Queued",
"type": "main",
"index": 0
}
]
]
},
"Select Top 10 Leads": {
"main": [
[
{
"node": "Suggest Optimal Send Time",
"type": "main",
"index": 0
}
]
]
},
"Read Leads from Sheet": {
"main": [
[
{
"node": "Calculate Days Since Contact1",
"type": "main",
"index": 0
}
]
]
},
"Sort by Priority Score": {
"main": [
[
{
"node": "Select Top 10 Leads",
"type": "main",
"index": 0
}
]
]
},
"Calculate Priority Score1": {
"main": [
[
{
"node": "Sort by Priority Score",
"type": "main",
"index": 0
}
]
]
},
"Suggest Optimal Send Time": {
"main": [
[
{
"node": "Create ClickUp Task",
"type": "main",
"index": 0
}
]
]
},
"Calculate Days Since Contact1": {
"main": [
[
{
"node": "Calculate Priority Score1",
"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.
clickUpApigoogleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Stop losing warm leads in the noise. This automation analyzes your lead engagement data, calculates priority scores based on activity and last contact date, and automatically queues your top 10 leads for follow-up in ClickUp — complete with suggested send times based on…
Source: https://n8n.io/workflows/9345/ — 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.
SEO agencies doing competitor analysis for clients Content teams planning content strategies Marketing teams tracking competitive performance SEO professionals measuring AI search visibility
This template automates the enrichment of business leads from a Google Sheet by: Triggering when a row is activated Searching for company information with Serper.dev Generating and validating potentia
The automation starts by retreiving the unused queries from a sheet, executes queries in the web using Serper API and extracts linkedin profiles of decision makers.
This workflow helps you automatically collect verified business leads from Google Search using SerpAPI — no coding required. It extracts company names, websites, emails, and phone numbers directly fro
This workflow automates comprehensive SEO reporting by: Extracting keyword rankings and page performance from Google Search Console. Gathering organic reach metrics from Google Analytics. Analyzing in