AutomationFlowsMarketing & Ads › Automate Lead Ranking & Task Creation with Google Sheets + Clickup

Automate Lead Ranking & Task Creation with Google Sheets + Clickup

ByRahul Joshi @rahul08 on n8n.io

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…

Event trigger★★★★☆ complexity18 nodesGoogle SheetsClickUp
Marketing & Ads Trigger: Event Nodes: 18 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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.

Pro

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 →

More Marketing & Ads workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Marketing & Ads

SEO agencies doing competitor analysis for clients Content teams planning content strategies Marketing teams tracking competitive performance SEO professionals measuring AI search visibility

@Seranking/N8N Nodes Seranking, Google Sheets
Marketing & Ads

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

HTTP Request, Google Sheets Trigger, Google Sheets
Marketing & Ads

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.

Google Sheets, HTTP Request, Stop And Error
Marketing & Ads

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

HTTP Request, Google Sheets
Marketing & Ads

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

HTTP Request, Google Sheets, Google Analytics +1