Score HubSpot leads based on firmographic and technographic fit using Make

medium complexityCost: $10-29/mo

Prerequisites

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)

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)))}}
Code module alternative

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_score to {{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: totalScore greater than 70

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
Variable scope

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.

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.

Need help implementing this?

We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.