GoHighLevel + Slack: smarter lead scoring and routing
Your pipeline shouldn’t feel like a guessing game. But when new GoHighLevel contacts come in, someone still has to check profiles, skim activity, decide if they’re serious, tag them, then figure out who should own the follow-up.
This GoHighLevel Slack automation hits sales managers first, because speed-to-lead becomes a daily fire drill. Agency operators feel it when multiple client funnels run at once. And if you’re the marketing lead handing off MQLs, you already know how messy “ownership” can get.
This workflow scores every new contact with GPT-4, categorizes them (Hot/Warm/Cold), tags and assigns them automatically, then alerts Slack only when it actually matters. You’ll see how the whole thing works, what you need, and where teams usually trip up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: GoHighLevel + Slack: smarter lead scoring and routing
flowchart LR
subgraph sg0["AI Lead Scoring (GPT Flow"]
direction LR
n0["<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/webhook.dark.svg' width='40' height='40' /></div><br/>GHL New Contact Trigger"]
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Workflow Configuration", pos: "b", h: 48 }
n2["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>GHL Get Contact Details"]
n3["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>GHL Fetch Engagement Data"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Clean Contact Data", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare AI Input", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "AI Lead Scoring (GPT-4)", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Parse Score to Numeric"]
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IF Score = 80 (Hot)", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IF Score = 40 (Warm)", pos: "b", h: 48 }
n10["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>GHL Tag Hot Lead"]
n11["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>GHL Tag Warm Lead"]
n12["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>GHL Tag Cold Lead"]
n13["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>GHL Assign Hot to Top Rep"]
n14["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>GHL Assign Warm to Secondary.."]
n15["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>GHL Assign Cold to Nurture T.."]
n16["<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/slack.svg' width='40' height='40' /></div><br/>Slack Notify Hot Lead"]
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/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook Response"]
n10 --> n13
n5 --> n6
n12 --> n15
n11 --> n14
n4 --> n5
n8 --> n10
n8 --> n9
n9 --> n11
n9 --> n12
n16 --> n17
n7 --> n8
n1 --> n2
n6 --> n7
n2 --> n3
n0 --> n1
n13 --> n16
n3 --> n4
n15 --> n17
n14 --> n17
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 n6 ai
class n8,n9 decision
class n0,n2,n3,n10,n11,n12,n13,n14,n15,n17 api
class n7 code
classDef customIcon fill:none,stroke:none
class n0,n2,n3,n7,n10,n11,n12,n13,n14,n15,n16,n17 customIcon
The Problem: Lead qualification slows down follow-up
New leads arrive when they arrive. Sometimes it’s one at a time. Sometimes it’s a burst after an ad starts spending or a form gets shared. The painful part is what happens next: someone has to open the record, look for context, guess intent, and decide what to do with it. And if that person is busy (they are), “quick check” turns into “I’ll get to it later.” Meanwhile, the hot prospect who was ready to talk cools off, and the team wastes energy chasing people who were never a fit.
It adds up fast. Here’s where it breaks down in real life.
- Reps work the inbox in different ways, so two identical leads get totally different treatment.
- Tags get applied late or not at all, which makes reporting and follow-up sequences unreliable.
- Ownership gets fuzzy when more than one person can claim a lead, and the prospect notices.
- Slack notifications become noise if every lead triggers one, so the team stops trusting alerts.
The Solution: AI lead scoring, tagging, and routing (with Slack only for Hot)
This workflow watches for new contacts added to GoHighLevel, then pulls the full contact profile and recent engagement activity so the decision isn’t based on a blank form submission. It packages that context into a clear AI prompt, and GPT-4 returns a score from 1–100, a category (Hot, Warm, or Cold), plus a short explanation your team can actually understand. From there, n8n applies the right tag back in GoHighLevel and assigns the lead to the right person or team. Only Hot leads generate a Slack message, which means Slack stays high-signal instead of becoming another feed everyone mutes. Finally, the workflow returns a clean webhook response so you can confirm it ran successfully.
The workflow starts at an inbound webhook tied to “new contact.” Next, it enriches the lead with profile and engagement details, then has GPT-4 evaluate intent and fit. After that, simple threshold checks route the lead: tag it, assign it, and notify Slack only when it’s truly urgent.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your team gets 20 new contacts a day. Manually, a rep might spend about 5 minutes per lead checking the profile, scanning engagement, tagging, and deciding who owns it, which is roughly 100 minutes daily. With this workflow, the only “human time” is zero: the webhook triggers instantly, GPT scoring runs in the background, and Slack only pings for Hot leads. You’re back to selling instead of sorting, and the follow-up happens while the prospect is still paying attention.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- GoHighLevel to create, tag, and assign contacts
- Slack to notify your team about Hot leads
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, paste API credentials, and adjust a few IDs and thresholds.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new GoHighLevel contact hits the webhook. The workflow begins as soon as a contact is created, so you’re not waiting on a daily batch job or a manual export.
Contact and engagement data get pulled in. n8n uses HTTP requests to retrieve the full profile and recent activity, then normalizes the fields so the AI sees consistent inputs (names, source, notes, engagement signals).
GPT-4 scores and explains the lead. An AI agent evaluates the context and returns a score (1–100), a category, and a short rationale. Then the workflow interprets that output so your thresholds can work reliably.
Tagging, assignment, and Slack routing happen automatically. Hot leads get tagged and assigned to your top rep, plus a Slack alert for fast follow-up. Warm leads go to a secondary rep. Cold leads get tagged and routed to your nurture path, and the workflow returns the result without bothering Slack.
You can easily modify the scoring thresholds to match your pipeline stages based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the inbound webhook that starts the workflow when a new contact is created.
- Add or open Inbound Contact Webhook and set HTTP Method to
POST. - Set Path to
ghl-new-contact. - Set Response Mode to
lastNodeso Return Webhook Result sends the response. - Copy the generated webhook URL and use it in your lead capture form or GoHighLevel webhook configuration.
body.contact_id, since downstream nodes depend on it.Step 2: Connect GoHighLevel and Set Config Variables
Configure the GoHighLevel API variables used across the HTTP request nodes.
- Open Config Variables Setup and replace each placeholder in the assignments:
- Set ghlApiBaseUrl to your base URL, for example
https://rest.gohighlevel.com/v1. - Set ghlApiKey to your GoHighLevel API key.
- Set topRepUserId, secondaryRepUserId, and nurtureTeamUserId to the correct user IDs for assignment.
- Set slackChannel to the channel ID for alerts, e.g.
#sales. - Verify Retrieve Contact Profile uses the URL
={{ $('Config Variables Setup').first().json.ghlApiBaseUrl }}/contacts/{{ $('Inbound Contact Webhook').first().json.body.contact_id }}and sets the Authorization header to={{ 'Bearer ' + $('Config Variables Setup').first().json.ghlApiKey }}. - Verify Pull Engagement Activity uses the URL
={{ $('Config Variables Setup').first().json.ghlApiBaseUrl }}/contacts/{{ $('Inbound Contact Webhook').first().json.body.contact_id }}/activitiesand the same Authorization header expression.
Step 3: Normalize Data and Assemble the AI Input
Map raw contact data into a consistent structure that the AI model can score reliably.
- In Normalize Contact Info, confirm the field mappings use expressions like
={{ $('Retrieve Contact Profile').first().json.name || 'Unknown' }}and={{ $('Pull Engagement Activity').first().json }}to standardize the contact data. - In Assemble AI Payload, set leadData to
={{ { "demographics": { "name": $json.name, "email": $json.email, "phone": $json.phone, "source": $json.source }, "behavior": { "tags": $json.tags, "customFields": $json.customFields, "engagementData": $json.engagementData } } }}. - Confirm the execution flow: Retrieve Contact Profile → Pull Engagement Activity → Normalize Contact Info → Assemble AI Payload.
Step 4: Set Up AI Lead Scoring
Configure the LLM to score the lead based on the assembled payload and parse the result.
- Open AI Lead Evaluation and set Model to
gpt-4o. - Ensure the prompt instructions define scoring and output in JSON format (as provided in the node).
- Set the input content to
={{ JSON.stringify($json.leadData) }}in responses. - Credential Required: Connect your openAiApi credentials to AI Lead Evaluation.
- Keep Interpret Score Output as-is to parse the AI response and normalize score, category, and contact details.
Step 5: Configure Routing, Tagging, Assignments, and Slack Alerts
Route leads by score, apply tags, assign reps, and notify Slack for hot leads.
- In Branch Hot Threshold, verify conditions include
={{ $json.score }}gte80for hot leads. - In Branch Warm Threshold, verify conditions include
={{ $json.score }}gte40for warm leads; the false branch routes to cold. - In Apply Hot Lead Tag, set Method to
PUTand JSON Body to{ "tags": ["Hot Lead"] }with Authorization header={{ 'Bearer ' + $('Config Variables Setup').first().json.ghlApiKey }}. - In Apply Warm Lead Tag and Apply Cold Lead Tag, set the same endpoint pattern
={{ $('Config Variables Setup').first().json.ghlApiBaseUrl }}/contacts/{{ $json.contactId }}and update JSON Body to the matching tag. - In Assign Top Rep, Assign Secondary Rep, and Assign Nurture Team, set JSON Body to
={{ { "userId": $('Config Variables Setup').first().json.topRepUserId } }},={{ { "userId": $('Config Variables Setup').first().json.secondaryRepUserId } }}, and={{ { "userId": $('Config Variables Setup').first().json.nurtureTeamUserId } }}respectively. - Configure Slack Hot Lead Alert to post to Channel
={{ $('Config Variables Setup').first().json.slackChannel }}and keep the provided alert message. - Credential Required: Connect your slackApi credentials to Slack Hot Lead Alert.
- Confirm the action flow: Apply Hot Lead Tag → Assign Top Rep → Slack Hot Lead Alert → Return Webhook Result, while warm and cold branches end at Return Webhook Result.
Step 6: Test and Activate Your Workflow
Run a manual test to validate the scoring and routing logic, then activate the workflow for production.
- Click Execute Workflow and send a sample webhook request with a valid
contact_idto Inbound Contact Webhook. - Confirm a successful run: Return Webhook Result should return JSON like
{"success": true, "message": "Lead scored and tagged successfully"}. - Verify in GoHighLevel that the correct tag was applied and the contact was assigned to the proper user based on the score.
- For hot leads, verify the Slack notification posted with the lead details.
- Toggle the workflow to Active so it runs automatically on new inbound contacts.
Common Gotchas
- GoHighLevel API credentials can expire or lack permissions. If things break, check the API key and base URL in your “Config Variables Setup” node first.
- If you’re processing bursts of contacts, OpenAI requests can get rate-limited or take longer than expected. When the AI output comes back empty, slow the flow down with batching or increase your timeout before downstream tagging runs.
- The default AI prompt is rarely “your” prompt, honestly. Add your definition of Hot/Warm/Cold early (and include a couple real examples), or you’ll keep overriding scores and the team will stop trusting the routing.
Frequently Asked Questions
About 30 minutes if your API keys and Slack access are ready.
No. You will mostly copy credentials, paste IDs, and tweak the score thresholds.
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 OpenAI API usage, which is usually a few cents per lead scoring run.
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, but keep it simple at first. You can change the Hot/Warm/Cold cutoffs in the “Branch Hot Threshold” and “Branch Warm Threshold” IF nodes, then adjust which GoHighLevel tagging HTTP request runs. Common tweaks include adding a “Super Hot” tier, routing by pipeline/source, or sending Warm leads to a nurture owner instead of a rep.
Usually it’s the API key or base URL in your configuration node. Regenerate the GoHighLevel API key if you suspect it’s been rotated, then update every HTTP request that uses it. Also check the assigned user IDs: invalid IDs can make the “assign” call fail even if tagging works. If it fails only during busy periods, you may be hitting rate limits and need batching.
A lot, as long as your n8n plan and API limits match your volume. On n8n Cloud, your monthly execution cap depends on your plan, and each lead usually consumes multiple executions because of enrichment, AI scoring, and tagging. If you self-host, there’s no platform execution limit, but your server resources and GoHighLevel/OpenAI rate limits still apply. In practice, most small teams run hundreds to thousands of leads a month without changing much.
Often, yes, especially once you add enrichment plus AI plus multi-branch routing. n8n handles complex logic cleanly, and you don’t pay extra just because you used a few IF branches and HTTP requests. Self-hosting is a big deal if your lead volume spikes. Zapier or Make can still be fine for a lightweight “tag then notify” setup, but this workflow benefits from flexibility. If you want help deciding, Talk to an automation expert.
Once this is live, every new lead gets the same fast, consistent treatment. The workflow handles the sorting and routing so your team can focus on conversations that turn into 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.