GoHighLevel Lead Scoring: Workflow Setup (2026) — HL Growth Partner, Dr Priya Jaganathan

GoHighLevel Lead Scoring: Workflow Setup (2026)

August 14, 2026

GoHighLevel Lead Scoring: Workflow Setup (2026)

By Dr Priya Jaganathan, GoHighLevel Certified Admin · HL Growth Partner, Australia · Updated 14 August 2026 · 8 min read

GoHighLevel lead scoring is something you build yourself, not something you switch on. There is no native score field in the platform — you create a number-type custom field on the contact record, then use the Math Operation action inside Workflows to add or subtract points every time a contact does something meaningful. That is the entire mechanism. Everything else — the point values, the thresholds, the routing — is a decision you make about your own sales process.

The reason most agencies never get around to it is that it looks like plumbing. It is, but it is cheap plumbing with a high return: once the score exists as a real field, you can filter on it in Smart Lists, branch on it with If/Else, push contacts into pipeline stages, and stop your sales rep from ringing people who downloaded a PDF at 11pm and never opened another email. This guide walks through a scoring model I use in Australian sub-accounts, the exact workflow actions, and the mistakes that make scoring useless within a fortnight.

What lead scoring actually is inside GoHighLevel

A lead score is a single number attached to a contact that goes up when they behave like a buyer and down when they go quiet. In GoHighLevel that number lives in a custom field. You go to Settings → Custom Fields, create a field called Lead Score, set the type to Number, and give it a sensible key. Set the default to 0 if your sub-account supports it; if not, your first workflow will need to handle a blank value, which I cover further down.

From there, every scoring event is a workflow. The trigger fires (form submitted, email link clicked, appointment booked), the workflow runs a Math Operation action that reads the current value of Lead Score, adds a number, and writes it back. That is one action. The complexity is never technical — it is deciding what a click is worth compared to a booked call.

Why not just use tags?

Tags are binary. A contact either has downloaded-guide or they do not. That is fine for segmentation, but it cannot express intensity. A contact who has opened eleven emails and clicked four Trigger Links is materially hotter than one who opened once, and tags flatten that difference. Use tags for what happened and the score for how much it mattered. In practice I keep both: tags drive content logic, score drives sales urgency.

Number field vs text field

This trips people up constantly. If you create the field as text, the Math Operation action will either refuse to run or produce nonsense when it tries to add to a string. It must be the Number type. If you have already built on a text field, create a fresh number field, run a one-off workflow across your database to seed the values, and retire the old one rather than trying to convert it in place.

Building your GoHighLevel lead scoring model

Start with the outcome and work backwards. Decide what score means "ring this person today" — I usually set that at 100 — then assign points so that a realistic buying journey reaches that number in three to five meaningful actions, not fifteen trivial ones. If it takes twenty email opens to hit your threshold, your model is measuring patience, not intent.

Here is the baseline model I deploy in most service-business sub-accounts. Adjust the numbers to your sales cycle, but keep the ratios: a booked appointment should be worth roughly ten times an email open.

BehaviourPointsTrigger to useNotes
Form submitted (lead magnet)+10Form SubmittedEntry-level intent, everyone does it
Survey completed+15Survey SubmittedMore effort than a form, score it higher
Email opened+2Email Events → OpenedKeep this low; opens are noisy post-MPP
Email link clicked+8Email Events → ClickedReal signal, not a proxy
Trigger Link clicked+12Trigger Link ClickedUse per-offer links so you know what they wanted
Pricing page visited+20Page Visit (funnel/website)Highest-value passive signal
Replied to SMS+25Customer Replied (SMS)A human typed something back
Appointment booked+40Appointment Status → BookedShould push most leads over the line
Appointment no-show−20Appointment Status → No ShowDeliberate negative
Unsubscribed / DND set−100Contact DND / UnsubscribeEffectively removes them from hot lists
30 days no engagement−15Recurring decay workflowSee decay section below

Setting up the Math Operation action

Inside the workflow, add the action Math Operation. You will be asked for a formula and a field to write the result into. The pattern is: read {{contact.lead_score}}, add your point value, and select Lead Score as the output field. So the formula for a Trigger Link click is {{contact.lead_score}} + 12, output to Lead Score.

If the field is empty on a brand-new contact, the maths can fail. Two fixes: either place a Set Contact Field action before the Math Operation that writes 0 when the field is blank, or wrap the workflow in an If/Else that checks whether Lead Score is empty and routes new contacts down a "seed then score" branch. I prefer the second because it is visible on the canvas. If you are new to branching logic, our guide to workflow If/Else conditions covers the condition types in detail.

One workflow or many?

I build one scoring workflow per behaviour category rather than a single monster. Typically that means four: Score – Forms & Surveys, Score – Email & Links, Score – Appointments, and Score – Negative & Decay. Each one can hold multiple triggers, and the If/Else at the top routes to the right Math Operation. This keeps the canvas readable and means you can pause the email scoring without touching appointment scoring. It also travels better in snapshots. If you are packaging this for multiple clients, store your threshold numbers as custom values in reusable snapshots so each sub-account can tune the hot-lead cutoff without you rebuilding the workflow.

Set Workflow Settings to allow multiple entries and set re-entry to allow. If you leave "Allow Re-entry" off, a contact scores once for their first email click and never again — which defeats the purpose. This is the single most common build error I see when auditing inherited accounts. Full detail on trigger configuration sits in our guide to GoHighLevel workflows, triggers and actions.

Decay and negative scoring

A score that only goes up is a vanity metric. Within three months every contact who has ever existed will look hot, your rep will lose faith in the list, and the whole build gets ignored. Decay is what keeps the number honest.

The recurring decay workflow

Build a separate workflow with a Contact Changed or date-based trigger, or more reliably, add a Wait step loop. The pattern that works in GHL: trigger on any scoring event, Wait 30 days, then check with If/Else whether the contact has had any engagement since. If not, run a Math Operation subtracting 15, then loop back to the Wait. Contacts who re-engage exit the decay branch because the fresh scoring workflow resets their activity date.

A cleaner alternative if your sub-account has the volume: maintain a second number field called Days Since Last Engagement, updated by every scoring workflow, and run a nightly Smart List review. Either approach works; the decay loop needs less maintenance.

Negatives that matter

Score down on no-shows, on unsubscribes, and on SMS opt-outs. In Australia the last one is not just hygiene — ACMA rules under the Spam Act mean an opt-out must be honoured within five working days, and a contact who has opted out should never surface in a hot-lead list your rep is working. Setting DND to −100 makes that structurally impossible rather than relying on someone remembering. The same applies to your A2P 10DLC registration if you are sending into US numbers through Twilio or LeadConnector: a scoring model that keeps messaging opted-out contacts is a compliance problem, not just a tidiness one.

Routing hot leads with Smart Lists and If/Else

The score is worthless until something happens because of it. There are three places to act on it.

Smart Lists

In Contacts, build a Smart List filtered on Lead Score greater than 100, sorted descending, and save it as Hot Leads. Build a second at 50–99 called Warming. These become your rep's working queues. Smart Lists refresh live, so a contact who clicks a Trigger Link at 9am appears in the hot queue by 9:01 without anyone doing anything. Pair this with per-offer Trigger Links setup and tracking so the rep can see not just that the lead is hot but what they were looking at.

Threshold workflows

Create a workflow triggered on Contact Changed → Lead Score. Add an If/Else: if Lead Score is greater than or equal to 100 AND the tag hot-notified is not present, then add the tag, send an internal notification, and create a task for the assigned user. The tag check is essential — without it the rep gets a notification every single time the score ticks up past the threshold, which is every click forever.

For the notification itself, use the Internal Notification action with both email and SMS if your rep works from their phone. Email goes out through Mailgun on the sub-account's sending domain; SMS goes through the LeadConnector or Twilio number. Keep the message short and include the score, the last action, and a direct link to the contact record.

Syncing score to pipeline stages

The tidiest version of this pushes scored contacts into opportunities automatically. At 50, create an opportunity in the Sales pipeline at stage Engaged. At 100, move the opportunity to Sales Qualified. At −20 or a DND flag, move it to Nurture or mark it lost. Use the Create/Update Opportunity action inside the same threshold workflow so the pipeline and the score never disagree. Our walkthrough of pipelines and opportunities setup covers stage naming conventions that make this reporting-friendly.

One caution: do not let scoring move an opportunity backwards once a human has touched it. Add an If/Else that checks the current stage and only advances forward. Nothing erodes rep trust faster than automation dragging a deal they just qualified back into a nurture bucket.

Testing and reporting

Test with a real contact record you control, not a fictional one. Create a test contact with your own mobile and email, then walk the full journey: submit the form, open the email, click the Trigger Link, book the appointment. After each step, open the contact record and check the Lead Score field has moved by exactly the amount you expect. Check the workflow's execution log too — it will show you whether the Math Operation ran and what value it wrote.

Common test failures and what they mean: score stays at 0 (field is text type, or the workflow has re-entry disabled); score jumps by double (two workflows have overlapping triggers); score goes blank (the field was empty and the maths returned null — add your seeding step). The official HighLevel help documentation is worth checking when action behaviour changes between releases, because Math Operation has been revised more than once.

For reporting, the score itself is not the metric — conversion rate by score band is. Export your Smart Lists monthly and check what percentage of contacts who crossed 100 actually booked, and what percentage of bookings came from contacts who never crossed 50. If a third of your closed deals never hit the threshold, your point values are wrong, not your leads. Build a view of this in your dashboards and reporting setup so you are reviewing it without a manual export every month.

Scoring conversations, not just clicks

If you are running Conversation AI to handle inbound SMS or webchat, you can score on conversational intent rather than raw replies. Add a scoring workflow triggered when the AI bot applies a qualification tag — budget confirmed, timeline confirmed, decision-maker confirmed — and weight each at +25. This is the highest-signal scoring available in HighLevel lead scoring builds right now, because it reflects what someone said rather than what they clicked.

Common mistakes to avoid

  • Creating the score field as text instead of number. The Math Operation action cannot do arithmetic on a string. Check the field type before you build anything else.
  • Leaving "Allow Re-entry" switched off. Contacts score once and never again, so the model flatlines and nobody notices for weeks.
  • Overweighting email opens. With Apple Mail Privacy Protection inflating open rates, +5 or +10 per open will make every contact on your list look hot inside a month. Keep opens at +1 or +2, or drop them entirely.
  • Building no decay. Scores that only increase are meaningless after ninety days. Decay is not optional if you want the list to stay useful.
  • Notifying the rep on every score change. Always gate the notification behind a tag check so the alert fires once per contact per threshold crossing.
  • Never revisiting the point values. Set a calendar reminder for ninety days out to compare closed deals against score bands and retune. A model built once and never checked drifts away from reality quickly.

If you want a lead scoring model built and tested inside your GoHighLevel sub-account, book a strategy call with the HL Growth Partner team.

Book Your Strategy Call →

Frequently asked questions

Does GoHighLevel lead scoring work natively, or do I have to build it?

You have to build it. There is no native lead score field or scoring engine in the platform. You create a number-type custom field on the contact record and use the Math Operation action inside Workflows to increment or decrement it based on triggers. It takes about two hours to build a solid model from scratch, and it works reliably once configured.

What point value should I give an email open?

One or two points at most, and many practitioners now score opens at zero. Apple Mail Privacy Protection pre-fetches images, which registers as an open whether or not the recipient read anything. Clicks, Trigger Link activity and SMS replies are far more reliable indicators of intent and should carry the weight instead.

Can I run different scoring models for different offers in one sub-account?

Yes. Create separate number fields — for example Score – Coaching and Score – Done For You — and point each set of scoring workflows at the relevant field. Filter your Smart Lists on the appropriate field. The overhead is a few extra workflows, and it is far cleaner than trying to make one score represent two different buying journeys.

Will the lead score carry across in a snapshot?

The custom field, the workflows and the Smart Lists all travel in a snapshot. The contact data and the actual score values do not — those are per sub-account. Store your threshold numbers as custom values so each new sub-account can be tuned without editing the workflows themselves.

How do I stop the score from breaking on contacts imported from a spreadsheet?

Map the Lead Score column during import if you have historical values, or leave it blank and run a one-off workflow across the imported segment that sets the field to 0. Blank number fields are the usual cause of Math Operation failures, so seed them before your scoring workflows start firing.

Dr PriyaJaganathan

Dr PriyaJaganathan

Dr Priya Jaganathan is a Go High Level Certified Admin, trusted CRM consultant based in Australia, and a keynote speaker at SaaSpreneur Sydney and Level Up 2025 in Dallas.

Back to Blog