This workflow corresponds to n8n.io template #10151 — we link there as the canonical source.
This workflow follows the Google Calendar → Google Sheets 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": "S65jfvMZZfPk7EKf",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Automate High-Value Lead Alerts from GoHighLevel to Slack ,Sheets and Calender",
"tags": [],
"nodes": [
{
"id": "6539d6c2-4beb-42db-af71-48fa1853d0aa",
"name": "Workflow Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2608,
-320
],
"parameters": {
"color": 4,
"width": 390,
"height": 464,
"content": "## \ud83c\udfaf High-Value Lead Scoring & Alert System\n\nThis workflow automatically:\n- Fetches contacts from HighLevel CRM daily at 8 AM\n- Calculates lead scores from custom fields\n- Alerts sales team via Slack for leads scoring >80\n- Logs high-priority leads to Google Sheets\n- Creates follow-up calendar events automatically\n\n**Setup Required:**\n1. Connect HighLevel OAuth2 credentials\n2. Connect Slack API credentials\n3. Connect Google Sheets OAuth2\n4. Connect Google Calendar OAuth2\n5. Update Slack channel ID with your channel\n6. Update Google Sheet ID with your tracking sheet\n7. Map custom field IDs to match your CRM setup"
},
"typeVersion": 1
},
{
"id": "c922fb0a-b1fd-468f-90e5-4aa414efc93c",
"name": "Schedule Setup Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2176,
-304
],
"parameters": {
"width": 280,
"height": 220,
"content": "## \u23f0 Daily Trigger\n\nRuns every day at 8:00 AM to check for new high-value leads.\n\n**Customization:**\nAdjust the trigger time in node settings to match your team's schedule."
},
"typeVersion": 1
},
{
"id": "5180b1c3-1f23-4101-918e-cf970e5a19ac",
"name": "HighLevel Setup Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1872,
-368
],
"parameters": {
"width": 300,
"height": 280,
"content": "## \ud83d\udce5 Fetch All Contacts\n\n**Before Using:**\n1. Connect your HighLevel OAuth2 credentials\n2. Ensure API access is enabled in your HighLevel account\n3. Test with a small batch first\n\n**Note:** This retrieves ALL contacts. Consider adding filters if you have a large database."
},
"typeVersion": 1
},
{
"id": "ff5451e2-b740-4c16-a7b9-879083678689",
"name": "Filter Logic Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1712,
80
],
"parameters": {
"width": 280,
"height": 220,
"content": "## \ud83d\udd0d Filter Contacts with Custom Fields\n\nOnly processes contacts that have custom fields populated.\n\nThis prevents errors when trying to extract lead scores from incomplete data."
},
"typeVersion": 1
},
{
"id": "51cf93d7-a03e-4eed-b4c2-0cf0821d8536",
"name": "Code Configuration Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1472,
-384
],
"parameters": {
"width": 300,
"height": 300,
"content": "## \u2699\ufe0f Transform Contact Data\n\n**Custom Field IDs to Update:**\n- Lead Score Field: `sEic9OWa5yndTAitjgoe`\n- Assigned Rep Field: `YHJqNOSAvMbI08mnabNb`\n\n**Action Required:**\nReplace these IDs with YOUR actual custom field IDs from HighLevel.\n\nFind them in: HighLevel \u2192 Settings \u2192 Custom Fields \u2192 Copy Field ID"
},
"typeVersion": 1
},
{
"id": "6f3ad72f-c5d5-476d-90dc-3ffc5181dca1",
"name": "Score Threshold Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1328,
96
],
"parameters": {
"width": 280,
"height": 220,
"content": "## \ud83c\udfaf Lead Score Filter\n\nOnly leads with score **>80** proceed to alerting.\n\n**Customization:**\nAdjust the threshold (currently 80) to match your lead qualification criteria."
},
"typeVersion": 1
},
{
"id": "ead078ba-ec45-4702-bf08-d14d2fed451d",
"name": "Slack Configuration Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1056,
-512
],
"parameters": {
"width": 300,
"height": 332,
"content": "## \ud83d\udea8 Slack Alert Setup\n\n**Required Configuration:**\n1. Create a Slack App with chat:write permissions\n2. Install app to your workspace\n3. Get your channel ID:\n - Right-click channel \u2192 View channel details \u2192 Copy ID\n4. Replace `YOUR_SLACK_CHANNEL_ID` in node settings\n\n**Security:** Never commit channel IDs to public repositories."
},
"typeVersion": 1
},
{
"id": "81620101-5cd3-477e-aa1f-265fee1765ac",
"name": "Google Sheets Setup Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-800,
144
],
"parameters": {
"width": 340,
"height": 380,
"content": "## \ud83d\udcca Google Sheets Logging\n\n**Setup Steps:**\n1. Create a Google Sheet with these columns:\n contact_id, contact_name, first_name, last_name, email, phone, company_name, lead_score, assigned_rep, assigned_rep_slack_id, location_id, source, tags, country, date_added, date_updated, is_high_priority\n\n2. Share sheet with your service account email\n3. Copy the Sheet ID from URL\n4. Replace `YOUR_GOOGLE_SHEET_ID` in node settings\n\n**Security:** Use environment variables for Sheet IDs in production."
},
"typeVersion": 1
},
{
"id": "708a9b3f-9dc4-4e79-9457-7e4524d4c22e",
"name": "Calendar Setup Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-544,
-368
],
"parameters": {
"width": 320,
"height": 348,
"content": "## \ud83d\udcc5 Auto-Schedule Follow-up\n\nCreates a calendar event 1 hour from now for immediate follow-up.\n\n**Configuration:**\n1. Connect Google Calendar OAuth2\n2. Replace `YOUR_CALENDAR_EMAIL` with your team calendar\n3. Adjust timing: Currently set to 1-1.5 hours from trigger\n\n**Tip:** Use a shared team calendar for better visibility."
},
"typeVersion": 1
},
{
"id": "c29fd9ed-1582-488b-b4a6-0f02de537e46",
"name": "Daily 8AM Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-2064,
-64
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "3a243805-b158-479c-afd4-431d5989fa24",
"name": "Fetch HighLevel Contacts",
"type": "n8n-nodes-base.highLevel",
"position": [
-1840,
-64
],
"parameters": {
"filters": {},
"options": {},
"operation": "getAll",
"requestOptions": {}
},
"typeVersion": 2
},
{
"id": "03ed8e64-6a5f-48ac-a025-e379ab7d6b56",
"name": "Filter Valid Contacts",
"type": "n8n-nodes-base.if",
"position": [
-1616,
-64
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a49be490-38c5-4620-b29f-8150655f32ba",
"operator": {
"type": "array",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.customFields }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "f006b6bf-4b73-45c6-802d-4cfa0e8e8584",
"name": "Transform Contact Data",
"type": "n8n-nodes-base.code",
"position": [
-1392,
-64
],
"parameters": {
"jsCode": "// Process all items from the input\nconst items = $input.all();\n\n// Map through all items and extract/transform data\nreturn items.map(item => {\n const customFields = item.json.customFields || [];\n \n // \u26a0\ufe0f IMPORTANT: Replace these field IDs with YOUR HighLevel custom field IDs\n // Find the lead score field (Replace 'sEic9OWa5yndTAitjgoe' with your field ID)\n const leadScoreField = customFields.find(field => field.id === 'YOUR_LEAD_SCORE_FIELD_ID');\n const leadScore = leadScoreField ? parseFloat(leadScoreField.value) : 0;\n \n // Extract assigned rep (Replace 'YHJqNOSAvMbI08mnabNb' with your field ID)\n const assignedRepField = customFields.find(field => field.id === 'YOUR_ASSIGNED_REP_FIELD_ID');\n const assignedRep = assignedRepField ? assignedRepField.value : 'Unassigned';\n \n return {\n json: {\n contact_id: item.json.id,\n contact_name: item.json.contactName,\n first_name: item.json.firstName,\n last_name: item.json.lastName,\n email: item.json.email || 'No email provided',\n phone: item.json.phone || 'No phone provided',\n company_name: item.json.companyName || 'N/A',\n lead_score: leadScore,\n assigned_rep: assignedRep,\n assigned_rep_slack_id: assignedRep, // TODO: Map to actual Slack member IDs\n location_id: item.json.locationId,\n source: item.json.source || 'Unknown',\n tags: Array.isArray(item.json.tags) ? item.json.tags.join(', ') : '',\n country: item.json.country,\n date_added: item.json.dateAdded,\n date_updated: item.json.dateUpdated,\n is_high_priority: leadScore > 80 // Boolean flag for workflow filtering\n }\n };\n});"
},
"typeVersion": 2
},
{
"id": "2bad2795-7f45-4170-8c9d-829193c25828",
"name": "Check If High-Value Lead",
"type": "n8n-nodes-base.if",
"position": [
-1168,
-64
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{ $json.lead_score }}",
"value2": 80,
"operation": "larger"
}
]
}
},
"typeVersion": 1
},
{
"id": "1f2a561f-228b-4793-9823-413f0fd7cea3",
"name": "Send Slack Alert to Sales Team",
"type": "n8n-nodes-base.slack",
"position": [
-944,
-160
],
"parameters": {
"text": "=\ud83d\udea8 **High-Value Lead Alert**\n\n\ud83d\udc64 **Contact:** {{ $json.contact_name }}\n\ud83d\udcca **Lead Score:** {{ $json.lead_score }}\n\u23f0 **Action Required:** Follow-up within 1 hour\n\n**Contact Details:**\n\ud83d\udce7 Email: {{ $json.email }}\n\ud83d\udcde Phone: {{ $json.phone }}\n\ud83c\udfe2 Company: {{ $json.company_name }}\n\ud83d\udc68\u200d\ud83d\udcbc Assigned Rep: {{ $json.assigned_rep }}\n\ud83d\udccd Location: {{ $json.country }}\n\ud83c\udff7\ufe0f Tags: {{ $json.tags }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "YOUR_SLACK_CHANNEL_ID"
},
"otherOptions": {}
},
"typeVersion": 2.1
},
{
"id": "263b6c15-a8fb-44ee-b883-97964cde7176",
"name": "Log to Google Sheets Tracker",
"type": "n8n-nodes-base.googleSheets",
"position": [
-944,
48
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "contact_id",
"type": "string",
"display": true,
"required": false,
"displayName": "contact_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "contact_name",
"type": "string",
"display": true,
"required": false,
"displayName": "contact_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "first_name",
"type": "string",
"display": true,
"required": false,
"displayName": "first_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "last_name",
"type": "string",
"display": true,
"required": false,
"displayName": "last_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "phone",
"type": "string",
"display": true,
"required": false,
"displayName": "phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company_name",
"type": "string",
"display": true,
"required": false,
"displayName": "company_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "lead_score",
"type": "string",
"display": true,
"required": false,
"displayName": "lead_score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "assigned_rep",
"type": "string",
"display": true,
"required": false,
"displayName": "assigned_rep",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "assigned_rep_slack_id",
"type": "string",
"display": true,
"required": false,
"displayName": "assigned_rep_slack_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "location_id",
"type": "string",
"display": true,
"required": false,
"displayName": "location_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "source",
"type": "string",
"display": true,
"required": false,
"displayName": "source",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "tags",
"type": "string",
"display": true,
"required": false,
"displayName": "tags",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "country",
"type": "string",
"display": true,
"required": false,
"displayName": "country",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "date_added",
"type": "string",
"display": true,
"required": false,
"displayName": "date_added",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "date_updated",
"type": "string",
"display": true,
"required": false,
"displayName": "date_updated",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "is_high_priority",
"type": "string",
"display": true,
"required": false,
"displayName": "is_high_priority",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "High Priority Leads"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4
},
{
"id": "bd644f55-c61e-4e4d-8a9a-438749d094a7",
"name": "Create Follow-up Calendar Event",
"type": "n8n-nodes-base.googleCalendar",
"position": [
-720,
-160
],
"parameters": {
"end": "={{ $now.plus(1.5, 'hours').toISO() }}",
"start": "={{ $now.plus(1, 'hours').toISO() }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "YOUR_CALENDAR_EMAIL"
},
"additionalFields": {
"description": "=**High-Priority Lead Follow-up**\n\nContact: {{ $json.contact_name }}\nEmail: {{ $json.email }}\nPhone: {{ $json.phone }}\nCompany: {{ $json.company_name }}\nLead Score: {{ $json.lead_score }}\nAssigned Rep: {{ $json.assigned_rep }}\n\nAction: Reach out within 1 hour to maintain engagement.",
"sendUpdates": "all"
}
},
"typeVersion": 1.3
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "be04a62e-8c04-4ee9-9bf1-ef74ae725aa5",
"connections": {
"Daily 8AM Trigger": {
"main": [
[
{
"node": "Fetch HighLevel Contacts",
"type": "main",
"index": 0
}
]
]
},
"Filter Valid Contacts": {
"main": [
[
{
"node": "Transform Contact Data",
"type": "main",
"index": 0
}
]
]
},
"Transform Contact Data": {
"main": [
[
{
"node": "Check If High-Value Lead",
"type": "main",
"index": 0
}
]
]
},
"Check If High-Value Lead": {
"main": [
[
{
"node": "Send Slack Alert to Sales Team",
"type": "main",
"index": 0
},
{
"node": "Log to Google Sheets Tracker",
"type": "main",
"index": 0
}
]
]
},
"Fetch HighLevel Contacts": {
"main": [
[
{
"node": "Filter Valid Contacts",
"type": "main",
"index": 0
}
]
]
},
"Send Slack Alert to Sales Team": {
"main": [
[
{
"node": "Create Follow-up Calendar Event",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Streamline sales prioritization by automatically identifying, scoring, and routing high-value leads from GoHighLevel CRM to your sales team. This workflow scores contacts daily, flags top prospects, alerts sales reps in Slack, logs data to Google Sheets, and schedules instant…
Source: https://n8n.io/workflows/10151/ — 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.
This workflow automates sales contact follow-ups and engagement tracking by integrating HighLevel CRM, Gmail, Slack, and Google Sheets. It fetches all contacts from HighLevel, filters inactive contact
Watch target companies for C-level and VP hiring signals, then send AI-personalized outreach emails when leadership roles are posted.
Boost your meeting conversion rates with this Automated Meeting Booking Sequence! This workflow automatically follows up with unbooked leads after 24 hours, sends personalized emails with calendar lin
Monitor customers for competitor tech adoption via PredictLeads and alert CSMs to prevent churn.
This workflow is designed for marketing teams, data analysts, and business owners who need to consistently track key performance indicators (KPIs). It saves hours of manual data collection and reporti