Definitive guide
HubSpot Lead Scoring Template: Drop-In Properties + Workflow
The 8 custom properties and 4 workflows below are the data model we reach for to run lead scoring across the B2B SaaS engagements we have audited. Copy the data model, paste the point values, and route leads on threshold. Setup is roughly 90 minutes if you have admin access. This template runs the standard Fit plus Intent model that works in any CRM, and it is the HubSpot build of the framework in the lead scoring guide.
Step 1: Create the 8 custom properties
Go to Settings, Properties, Create Property. Object: Contact. Group: "Lead Scoring" (create it if it does not exist).
| Property | Internal name | Type | Range | Notes |
|---|---|---|---|---|
| Fit Score | fit_score | Number | 0 to 50 | Sum of firmographic point values |
| Intent Score | intent_score | Number | 0 to 50 | Sum of behavioral point values, decays |
| Total Lead Score | total_lead_score | Calculation | 0 to 100 | Calculated: fit_score plus intent_score |
| Lead Tier | lead_tier | Single-line text | Hot / Warm / Cold / Disqualified | Set by the tier-assignment workflow |
| Last Score Update | last_score_update | Date | Timestamp | Updated on every recalculation |
| Score Decay Pause | score_decay_pause | Single checkbox | true / false | Manual override to freeze decay |
| Routing Owner | routing_owner | HubSpot user | User reference | Set by the tier-assignment workflow |
| Last High-Intent Action | last_high_intent_action | Single-line text | Action name | Audit trail for why they crossed threshold |
Total Lead Score is a Calculation property type. Formula: fit_score + intent_score. HubSpot recalculates it whenever either input changes, so no workflow is needed for the math itself.
Step 2: Workflow #1, Fit Score on firmographic change
Enrollment trigger: a Contact property value changes, any of industry, numberofemployees, annualrevenue, or a tech_stack field.
Action sequence: for each firmographic attribute, set or copy a point value into fit_score. The allocations below are illustrative example B2B SaaS values, a starting point you should tune to your own won-deal patterns, not measured outcomes:
- Industry matches ICP (SaaS, fintech, health-tech): plus 12 points
- Employee count 50 to 500: plus 10 points (200 to 2,000: plus 12)
- Annual revenue $5M to $50M: plus 10 points
- Has a core tool in stack (for example HubSpot, Salesforce, Outreach): plus 8 points
- Geo: US, Canada, UK, Australia: plus 5 points; EMEA non-UK: plus 3
Cap fit_score at 50. The cap is critical. Without it, an over-firmographic match (perfect industry plus perfect size plus perfect stack) can drown out intent signals.
Step 3: Workflow #2, Intent Score on behavior
Enrollment trigger: any of form submission, page view (Marketing Hub Pro or higher tracking), email engagement event, or list membership change.
Branch logic by event type (again, these are illustrative example point values, not measured lift):
- Demo request form submit: plus 15 points, set
last_high_intent_actionto "demo_request" - Pricing page viewed 3 or more times: plus 12 points, set action to "pricing_revisit"
- Case study downloaded: plus 10 points, set action to "case_study_dl"
- ROI calculator completed: plus 10 points, set action to "calculator_complete"
- Webinar attended: plus 8 points
- 5 or more email opens (one campaign): plus 6 points
- Blog post viewed: plus 2 points
- Email unsubscribe: set
intent_scoreto 0 and setlead_tierto "Disqualified"
Cap intent_score at 50. Increment, do not overwrite. Use the "Increase property value" action so concurrent events stack instead of racing.
Step 4: Workflow #3, daily recalc plus decay
Enrollment trigger: daily at midnight UTC. Filter: score_decay_pause is false AND last_high_intent_action was 7 or more days ago.
Action: multiply intent_score by 0.9. After 60 days of no high-intent action, branch: set intent_score to 0 and re-evaluate lead_tier. Update last_score_update to now() on every run. The 0.9-every-7-days figure is an illustrative default you should tune to your own sales cycle. The decay rule keeps stale "warm" leads from clogging the AE queue forever.
Decay is the most-skipped workflow and, in our experience, the most expensive omission. Why intent expires covers the math in detail.
Step 5: Workflow #4, tier assignment plus routing
Enrollment trigger: total_lead_score property value changes.
Branch logic:
- Score 80 plus:
lead_tier= "Hot", assignrouting_ownerto the next AE in round-robin, send a Slack alert with full context, set lifecycle stage to SQL - Score 60 to 79:
lead_tier= "Warm", assign to the next BDR, enroll in a 24-hour qualification cadence - Score 40 to 59:
lead_tier= "Cold", marketing nurture only, re-evaluate monthly - Score under 40:
lead_tier= "Disqualified", suppress from outreach
The Slack alert payload should include: contact name and email, company, score breakdown (Fit / Intent / Total), the triggering action (last_high_intent_action), and a one-click link to the contact record. Without context, AEs ignore the alert. What happens after this handoff is covered in BDR queue routing from lead scores.
Routing is the gate, sequencing is the action. A lead that crosses 80 and then waits hours for a manual reply gives back a large share of its conversion potential, and that decay with delay is directional, not a guaranteed figure. Trigger outreach automatically the moment the tier-assignment workflow flips a lead to Hot, with no human handoff between the threshold cross and first touch. A signal-based sequencing tool such as Amplemarket can fire the first message on that flip. The Lead Scoring agent wires this full model, decay and routing included, with you inside your own Claude.
Common mistakes
- Letting Fit Score uncap. An over-firmographic match (perfect industry plus perfect size plus perfect stack) drowns out intent. Cap fit at 50, period.
- Using "Set property value" instead of "Increase property value". Concurrent behavior events race and overwrite each other. The Increase action accumulates.
- Skipping decay. A six-month-old "warm" lead with a score of 65 that never re-engages is dead but stays in the AE queue forever. Decay is what keeps the queue honest.
- Not logging which action crossed the threshold. Without
last_high_intent_action, AEs get a Slack alert that says "this lead is Hot" with no idea what just happened. They ignore it. Always log the trigger. - Tying compensation to score before calibration. Do not pay AEs on tier movements until you have seen a couple of months of conversion data and confirmed your thresholds predict revenue. Bad thresholds plus comp tied to them equals AEs gaming the system.
Beyond Fit plus Intent
This template runs the standard Fit plus Intent model that works in any CRM. Once it is stable, one next evolution is a pain-first approach that weights pain signals more heavily than firmographics. That handles the case where two prospects with identical firmographics and engagement still convert at different rates. When you want the same model in a different CRM, see the Salesforce lead-scoring template.
Frequently asked questions
Which HubSpot tier do I need for this template?
How long does the full setup take?
Can I run this alongside HubSpot's predictive lead scoring?
What happens to lead scores when contacts unsubscribe or go dormant?
How do I know if my point allocations are right?
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.