Use case

Adding company signals to lead scoring

A lead score knows what a person did, not what the company is or is about to do. Here is how to add company features to it without double counting or leakage.

Updated 5 October 20266 min read

A lead score built on engagement answers one question: how interested is this person? It cannot say whether the company is the right kind, or whether it is in a buying window. This guide shows how to add company-level fit and timing to a score you already run: which tables each feature comes from, how to join it without leakage, and how to set weights and decay so that company signals sharpen the score and do not drown it.

What each part of the score knows

A lead score has three kinds of input, and they age at different speeds.

InputQuestion it answersSourceAges
EngagementIs this person paying attention to you?Your marketing and CRM systemsIn days
FitIs this the right kind of company?Technology, site and size facts about the companySlowly
TimingIs the company doing something that makes a purchase likely now?Dated signals: tools added, roles opened, announcementsIn weeks

Fokals supplies the second and third at company level, and its intent score is built from what a company itself does in public, so every point of timing traces to a dated signal. The first stays in your own marketing and CRM systems. Keep the three inputs as separate fields in your CRM. A single summed number hides which part moved, and it lets strong engagement from a poor-fit company outrank weak engagement from a good one.

Company features and where they come from

Choose the features before the weights. Each one is a dated observation in a dataset you can load: Technology Stack, Website Profile, Employee Headcount, Intent Scores, Hiring Activity and Company Signals. The data dictionary defines every column.

FeatureTable and columnCounts asHow it ages
A complementary or rival tool on the websitecompany_technologies.technologyFitNot at all while it is present
Pricing, demo or contact-sales pagescompany_site_facts.key_pagesFitNot at all
Stated headcountcompany_headcounts.employeesFitYearly, as stated
Intent score and surge for the topic you servecompany_intent_weekly.score, surgeTimingAlready fades by half every 30 days
Hiring momentumcompany_hiring_daily.new_postings, trailing 28 daysTimingThe window is the decay
First enterprise sales posting, first sales posting in a new country, founding sales hirecompany_signals.kind set to sales_upmarket, sales_expansion_country or founding_sales_hireTimingYour own half-life

The intent dataset scores each company weekly, from 0 to 100, for each of 69 topics. Pick the topic or topics your product serves, such as crm, and use only those scores. Summing all 69 blurs the signal, because a company can be in a buying window for something you do not sell. A surge is a score of at least 50 that is at least double the company's own average for the topic over the previous twelve weeks.

Hiring momentum needs care. Divide the last 28 days of new_postings by the company's own average 28 days over the 56 days before, so that a large company is not rewarded for its size. A company's first observation sets a baseline and counts nothing as new, and the comparison needs 56 days of observations, so leave momentum out of the score for companies that do not have them yet.

Joining company data to leads

Match each lead to a company by the domain of its email address or company website. Lower-case it, strip the scheme and www, set aside free-mail domains, and map the rest to company_id by domain matching. The data is pulled and loaded where you work, so the join runs in your own warehouse or CRM. If your accounts sit at group level, roll brands up to their listed parent: a brand carries the identifiers of its parent, so rows can be grouped by ISIN.

Two details decide whether the join is honest. First, Intent Scores hold a row only for a topic that scores at least 5, so a missing row means a score below 5. Treat it as 0. Second, join the week that had closed when the lead was created, never the latest week, so that a model trained on old leads sees only what was known then. Weekly rows are written once after the week closes and never revised, so the value you join is the value that existed that day.

-- leads: lead_id, company_id, created_on (a date)
select
  l.lead_id,
  coalesce(i.score, 0)     as crm_score,
  coalesce(i.surge, false) as crm_surge
from leads l
left join company_intent_weekly i
  on  i.company_id = l.company_id
  and i.topic      = 'crm'
  and i.week_start = date_trunc('week', l.created_on) - interval '7 days';

For a lead you are scoring today, the same join with today's date gives the latest closed week. Signals arrive daily and scores weekly, so a weekly refresh of the timing input is enough.

Weights and decay

Start with rules you can read, so that sales can see why a lead scored what it did. The weights below are illustrative. Set your own.

ComponentRulePoints
FitA complementary tool is on the website15
FitThe site links to pricing and demo pages10
FitStated headcount is in your target band10
TimingIntent score for your topic0.3 per point
TimingThe topic is in surge10
TimingA first enterprise sales posting10, halving every 30 days

Ageing applies wherever a signal carries none of its own. A person's engagement fades by a half-life you choose, for example 14 days. The intent score already fades by half every 30 days, because it is built from the signals of the trailing 90 days, so do not decay it again. A signal you add yourself needs a decay, and the usual form is the weight times 0.5 to the power of its age in days over the half-life.

Take a lead at Acme Robotics, an invented company, in an illustrative example. Its engagement score is 35. Fit is 25: a complementary tool and the two pages. Timing is 38: an intent score of 72 gives 21.6, the surge adds 10, and an enterprise sales posting opened 20 days ago adds 10 times 0.5 to the power of 20 over 30, which is about 6.3. A rule that qualifies a lead at engagement 30 and fit 20 sends this lead to sales, and timing orders the queue. A lead with engagement 95, fit 0 and timing 10 sums to 105, above this lead's 98, and still fails the gate.

When enough leads have outcomes, replace the guessed weights. Fit a logistic regression of becoming an opportunity within 90 days on the three inputs, and check by decile that conversion rises with the score. Train on leads whose company features come from the week that closed before each lead was created, so the model learns from what was known then. Until your own outcomes accumulate, keep the rules and review them monthly.

Traps

  • Double counting. The intent score is already built from tools added or removed, roles opened, funding and announcements, and how the scores are built lists them. For anything the score covers, take the score. Add your own points only for signals that carry no intent topic, such as the sales-organisation signals in the table above.
  • Treating a missing match as poor fit. A lead that matches no company has unknown fit, not poor fit. Free-mail addresses and unmatched domains are the usual cause. Give them a neutral value and a flag.
  • Weighting by guesswork. An intent score is evidence-backed, with the dated signals behind it. Weight it by how well it tracks your own conversions, and recheck the weight each quarter.
  • Hiding the reason. Each weekly score carries its five strongest signals as evidence, with date, kind and source. Put them in the CRM note, so that a representative can open with what the company did. An illustrative note reads: surge on the CRM topic, score 72; a tool was added to the site 12 days ago and a role naming a tool opened 19 days ago.
  • Leaving out the gate. A summed score alone lets one strong input hide a failed one. Set a minimum for engagement and for fit, and use timing to order what passes.

Where company signals fit

Company signals send a lead to sales and order the queue, and the person to call comes from your own systems, where the lead already sits. A company with no match carries a neutral company score until its domain resolves. To rank accounts without leads, see prioritising accounts with intent scores, and for segments instead of a score, building account-based marketing segments from signals.

Frequently asked questions

What is the difference between lead scoring and account scoring?

Lead scoring rates a person, usually from their engagement and the attributes of their company. Account scoring rates the company itself, from fit and timing, whoever has engaged. Company signals feed both: they add fit and timing to a lead score, and they are the whole input of an account score.

What company data should go into a lead score?

Use two groups. Fit features change slowly: a complementary or rival tool on the website, the pricing and demo pages it links to, and stated headcount. Timing features change in weeks: the intent score and surge for the topic you sell, hiring momentum, and sales-organisation events. Keep them as separate fields, not one summed number.

How often should lead scores be refreshed?

Weekly is enough for the company inputs. Intent scores are written once a week, after each week closes, and signals arrive daily, so rescoring hourly adds nothing. Engagement can be rescored as often as your systems record it. Recompute the combined routing rule whenever either input changes.

What key joins company data to a lead?

The join key is the company website's domain, taken from the lead's email address or company field in your own system. Fokals is company-level data, delivered direct by REST API and as bulk files, and you load it where you work, so the match runs in your warehouse or CRM. Leads whose domain cannot be matched, such as free-mail addresses, get a neutral company score.

How do you stop intent data from double counting in a lead score?

Take the intent score for anything it already covers: tools added or removed, roles opened, funding and announcements all feed it. Add your own points only for signals that carry no intent topic, such as a first enterprise sales posting or a founding sales hire. Do not decay the intent score a second time, because it already fades by half every 30 days.

The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.