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)

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_score property

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.

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.