Skip to main content

Definitive guide

Salesforce Lead Scoring Template: Custom Fields + Flow Builder

TR
Tom Regan·9 min read·Updated
Quick Answer
A working Salesforce lead-scoring system is commonly built from eight custom fields (Fit_Score__c, Intent_Score__c, Total_Lead_Score__c, Lead_Tier__c, Last_Score_Update__c, Score_Decay_Pause__c, OwnerId, Last_High_Intent_Action__c) and four Flow Builder flows (Fit calculation, Intent calculation, daily recalc plus decay, tier assignment). Total Lead Score is a formula field, not a Number, so Salesforce sums it natively instead of a flow writing it back. The point values and tier cutoffs below are an illustrative starting model, not measured outcomes. The fastest path is the Lead Scoring agent, built with you inside Claude.

The eight custom fields and four Flow Builder flows below are the field-and-flow pattern we commonly stand up across the B2B SaaS engagements we have worked on. It is the same data model as the HubSpot version of this template, ported to Salesforce-native automation. The full framework behind the model lives in the lead scoring pillar guide. The point values and tier cutoffs here are an illustrative starting model, not benchmarked outcomes, so tune them against your own closed-won data.

Step 1: Create the 8 custom fields

Setup, Object Manager, Lead, Fields and Relationships, New. Apply the same fields to Contact (with conversion mapping) so post-conversion records keep their score history. Field names and types are the checkable substance here; only the downstream point math is illustrative.

LabelAPI nameTypeNotes
Fit ScoreFit_Score__cNumber(3, 0)0 to 50, sum of firmographic point values
Intent ScoreIntent_Score__cNumber(3, 0)0 to 50, sum of behavioral point values, decays
Total Lead ScoreTotal_Lead_Score__cFormula (Number)Fit_Score__c + Intent_Score__c
Lead TierLead_Tier__cPicklistHot / Warm / Cold / Disqualified
Last Score UpdateLast_Score_Update__cDateTimeUpdated on every Flow run
Score Decay PauseScore_Decay_Pause__cCheckboxManual override to freeze decay
Routing OwnerOwnerId (standard)Lookup (User)Assigned via Assignment Rule on tier
Last High-Intent ActionLast_High_Intent_Action__cText(80)Audit trail for tier change

Step 2: Flow #1, Fit Score on firmographic change

Flow type

Record-Triggered Flow on Lead. Trigger: Updated. Entry condition: ISCHANGED(Industry) OR ISCHANGED(NumberOfEmployees) OR ISCHANGED(AnnualRevenue) OR ISCHANGED(Tech_Stack__c).

Action sequence (illustrative point allocations)

Treat the point values below as an example allocation to calibrate, not a measured formula:

  • Industry in {SaaS, FinTech, HealthTech}, add 12 points.
  • NumberOfEmployees 50 to 500, add 10; 200 to 2000, add 12.
  • AnnualRevenue $5M to $50M, add 10.
  • Tech_Stack__c contains a core tool (HubSpot, Salesforce, Outreach, Attention), add 8.
  • Country in {US, CA, UK, AU}, add 5; EMEA non-UK, add 3.

Sum points into Fit_Score__c. Cap at 50. Use a Decision element with a Min function or an explicit IF(sum > 50, 50, sum).

Step 3: Flow #2, Intent Score on behavior

Flow type

Record-Triggered Flow on Task (or your Behavior_Event__c custom object if marketing automation pushes there). Trigger: Created. Entry condition: WhatId or WhoId matches a Lead.

Decision branches (illustrative point allocations)

  • Subject contains "Demo Request", add 15 and set Last_High_Intent_Action__c to "demo_request".
  • Subject contains "Pricing Page" AND Description count 3 or more, add 12 and set "pricing_revisit".
  • Subject contains "Case Study Download", add 10.
  • Subject contains "ROI Calculator", add 10.
  • Subject contains "Webinar Attended", add 8.
  • Type is "Email Open" AND count in last 7 days 5 or more, add 6.
  • Subject contains "Unsubscribe", set Intent_Score__c to 0 and Lead_Tier__c to "Disqualified".

Use the Update Records element with Intent_Score__c = Intent_Score__c + N rather than overwriting, so concurrent events stack.

Step 4: Flow #3, Daily recalc plus decay

Flow type

Scheduled Flow. Frequency: Daily. Time: 02:00 UTC. Object: Lead.

Filter

Score_Decay_Pause__c = false AND Last_High_Intent_Action_Date__c < TODAY() - 7.

Action (illustrative decay model)

Intent_Score__c = ROUND(Intent_Score__c × 0.9, 0). After 60 days of no high-intent action, set Intent_Score__c to 0 and re-fire tier assignment. The 0.9 multiplier and the 60-day cliff are an example decay curve, not a measured constant; pick the half-life that matches your sales cycle. Update Last_Score_Update__c to NOW().

Why intent expires covers the math behind an illustrative 0.9 multiplier and the 60-day cliff.

Step 5: Flow #4, Tier assignment plus Assignment Rule

Flow type

Record-Triggered Flow on Lead. Trigger: ISCHANGED(Total_Lead_Score__c).

Branches (illustrative tier cutoffs)

  • 80 or higher: Lead_Tier__c is "Hot", Status is "SQL", trigger Assignment Rule "Hot Lead Round-Robin to AE", post Slack alert.
  • 60 to 79: Lead_Tier__c is "Warm", Status is "Working", assign to BDR queue, enroll in a 24h cadence.
  • 40 to 59: Lead_Tier__c is "Cold", Status is "Open", marketing nurture.
  • Under 40: Lead_Tier__c is "Disqualified", Status is "Closed - Not Converted", suppress outreach.

Salesforce Assignment Rules have to fire from the Flow's Reassign Lead Owner action; they do not auto-fire on field updates by default. Once tiers are set, BDR queue routing from lead scores covers how to turn the Warm tier into an actual worked queue.

The Slack alert payload should include the lead name and email, company, score breakdown, the triggering action (Last_High_Intent_Action__c), and a deep link to the Lead record. Without context, AEs ignore the alert.

Common mistakes

  • Forgetting Lead-to-Contact field mapping. When MQLs convert, scores reset unless you map Fit_Score__c, Intent_Score__c, and Lead_Tier__c in the Lead Conversion field mapping.
  • Decay in workflow rules instead of Scheduled Flow. Workflow rules fire on save, not on a schedule. Decay needs Scheduled Flow.
  • Routing via Assignment Rules without the explicit Reassign Lead Owner action. Assignment Rules do not fire automatically on field changes from Flow; you have to call them.
  • Letting Einstein and the rule-based score race. Pick one for routing. Einstein in a separate field for sanity-checking, the rule-based score in Total_Lead_Score__c for action.

Frequently asked questions

Do I need Salesforce Sales Cloud Enterprise for this template?

Professional Edition works for the fields and basic assignment rules, but Flow Builder for the recalculation logic requires Enterprise or higher. If you are on Professional, you can build the same logic with Process Builder (deprecated but still functional) or with workflow rules, clunkier but it ships.

Can I run this on Lead and Contact objects, or just one?

Build it on Lead, then mirror the fields onto Contact for post-conversion scoring. Most teams forget the Contact mirror and lose all score history when MQLs convert to Contacts on opportunity creation. The conversion mapping has to copy fit_score__c, intent_score__c, and lead_tier__c forward.

How does this interact with Einstein Lead Scoring?

Einstein gives you a 0-100 score from a black-box ML model trained on your historical data. The custom-field model in this template is rule-based and explainable. Most teams keep both: Einstein in a separate field for sanity checks in dashboards, the rule-based score in Total_Lead_Score__c for routing. If you let Einstein drive routing, you cannot tell AEs why a lead scored high, because Einstein's reason codes are vague.

What is the right way to handle decay in Salesforce?

A Scheduled Flow that runs nightly, queries leads where Last_High_Intent_Action__c is 7 or more days old and Score_Decay_Pause__c is false, and applies a decay multiplier to Intent_Score__c. Do not try to do decay in workflow rules, because they fire on record save, not on a schedule. Scheduled Flow is the cleanest Salesforce-native option.

How do I keep this in sync with marketing automation?

Pardot, Marketo, and HubSpot all push behavior events into Salesforce as Tasks or custom objects. Wire your Intent Score Flow to fire on Task creation where Subject contains 'Form Fill', 'Page View', or 'Email Engagement'. The point allocations stay the same; only the trigger changes from native Salesforce events to MA-pushed Task events.

Run this play in your own stack

Read the guide, then install the engine.

The Artemis AI GTM Engineer prices this leak in dollars before it recommends anything, then builds the fix with you inside your own Claude. See how an agent installs and buys, or start with the free audit that prices all seven leaks.

Your go-to-market needs real systems.

Install the free AI GTM Engineer and get a full GTM audit in one session.

Free, no account Agents from $349 Run by Claude