Score HubSpot leads based on firmographic and technographic fit using Make
Prerequisites
- Make account (Core plan or higher recommended for volume)
- HubSpot connection configured in Make via OAuth
- A custom HubSpot contact property for the fit score (e.g.,
icp_fit_score, number type, 0-100)
Why Make?
Make is a good option for teams who prefer a visual builder and want scoring logic expressed as scenario modules rather than code. The Router module lets you define scoring criteria as parallel branches, making the logic easy to visualize. Core plan starts at $10/mo — the most affordable paid option.
How it works
- Watch Contacts module detects new or updated contacts in HubSpot
- Router sends the contact through parallel scoring branches (company size, industry, seniority, source)
- Math/Set Variable modules calculate points for each criterion
- Update Contact writes the total score to the
icp_fit_scoreproperty
Step 1: Add a Watch Contacts trigger
Create a new scenario. Add a HubSpot CRM -> Watch Contacts module:
- Connection: Your HubSpot OAuth connection
- Watch: New contacts (or Updated contacts if re-scoring)
- Limit: 10 (per poll cycle)
- Properties: Select
jobtitle,company,numberofemployees,industry,hs_analytics_source
Step 2: Add a Router for scoring criteria
Add a Router module after the trigger. Each route handles one scoring dimension and sets a variable. Alternatively, use a single code module -- Make supports both approaches.
For the cleaner approach, add a Tools -> Set Multiple Variables module and use Make's built-in functions:
sizeScore:
{{if(and(1.numberofemployees >= 200; 1.numberofemployees <= 2000); 30;
if(and(1.numberofemployees >= 50; 1.numberofemployees < 200); 20;
if(and(1.numberofemployees >= 2000; 1.numberofemployees <= 10000); 15;
if(1.numberofemployees > 0; 5; 0))))}}industryScore:
{{if(contains("saas;technology;software;computer software"; lower(1.industry)); 25;
if(contains("financial services;consulting;marketing"; lower(1.industry)); 15;
if(length(1.industry) > 0; 5; 0)))}}If nested if() formulas feel unwieldy, use a JavaScript Code module (available on Core plan and above) with the same scoring logic as the n8n or Zapier approaches. It's more readable for complex scoring.
Step 3: Calculate the title seniority score
Add another Set Variable module for the seniority component:
seniorityScore:
{{if(contains(lower(1.jobtitle); "chief"); 30;
if(or(contains(lower(1.jobtitle); "vp"); contains(lower(1.jobtitle); "vice president"); contains(lower(1.jobtitle); "head of")); 25;
if(contains(lower(1.jobtitle); "director"); 20;
if(or(contains(lower(1.jobtitle); "manager"); contains(lower(1.jobtitle); "lead")); 10; 0))))}}Step 4: Aggregate the total score
Add an Aggregator or another Set Variable module:
totalScore:{{min(sizeScore + industryScore + seniorityScore; 100)}}
Step 5: Update the contact in HubSpot
Add a HubSpot CRM -> Update a Contact module:
- Contact ID:
{{1.id}}(from the Watch Contacts trigger) - Properties to update: Set
icp_fit_scoreto{{totalScore}}
Step 6: Add a filter for high-score alerts (optional)
Click the line between the Update module and a new Slack -> Create a Message module to add a Filter:
- Condition:
totalScoregreater than70
Configure the Slack module:
- Channel:
#high-fit-leads - Text:
🎯 *High-Fit Lead*
*{{1.firstname}} {{1.lastname}}* — {{1.jobtitle}} at {{1.company}} ({{1.numberofemployees}} employees)
Score: *{{totalScore}}/100*Step 7: Schedule and activate
- Set the scenario schedule to every 15 minutes (or Immediately if using webhooks)
- Toggle the scenario to Active
Make variables set in one module are available downstream but not in parallel branches. If using a Router, calculate the score before the Router or use a Code module that outputs everything in one step.
Troubleshooting
Common questions
Can I use the Router module for multi-dimensional scoring?
Yes — the Router sends the contact through parallel branches for each scoring dimension (size, industry, seniority, source). Each branch sets a variable with that dimension's score. A final aggregator adds them up. This makes the logic very visual and easy to adjust.
How does Make compare to n8n for this use case?
Make's visual builder is slightly more intuitive for non-developers. n8n's Code node gives more flexibility for complex scoring logic. Make's free plan (1,000 credits/mo) handles ~250 contacts; n8n self-hosted is unlimited and free.
Cost
- Free plan: 1,000 credits/month. Each scored contact uses ~3-4 credits (trigger + set variables + update). Handles ~250 contacts/month on free.
- Core plan: $10.59/mo for 10,000 credits. Handles ~2,500 contacts/month.
Looking to scale your AI operations?
We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.