Lead scoring on clean sales data.
A lead score is a number that ranks which leads are worth a call today. It is only as trustworthy as the records underneath it.
Lead scoring learns from past deals to rank the open pipeline, so attention flows to the leads most likely to convert. We walk it the way the field is built: what it is, why clean records are the precondition, how matching and scoring work, what honest scoring unlocks, and where it is heading. The papers behind each idea are linked, so you can read the source yourself.
The three ideas to carry: record linkage, gradient-boosted trees, and predicting cause rather than correlation.
- NorthwindDemo completed · budget confirmed
- OaklinePilot requested · timeline open
- AcmeEarly conversation · budget unknown
Relative priority, not a probability of winning.
A learned ranking, not a verdict.
A model reads the history of past deals, learns what separated wins from losses, and applies that to the open pipeline.
A lead score answers one question: of all the people and companies in the pipeline, which ones are worth a call today. The output is a probability or a rank, a sort order for a rep's day, not a yes or no. Point a model at past deals, let it learn what a winning deal looked like, and have it rank the open ones so a morning goes to the few that matter instead of the hundred that do not.
The catch shows up before the model does. The score is a function of the records, and the records are messy. The same account sits in the system twice, once as "Acme Inc" and once as "Acme, Incorporated," so its activity is split across two rows and neither looks busy. So lead scoring is really two joined problems. First, deciding which rows describe the same account and folding them into one trustworthy record: a field called record linkage or entity resolution. Then, learning a ranking from those clean records.
- Resolve the records
Connect activity to the correct account.
- Choose a prediction target
For example, conversion within the next 90 days.
- Build available features
Use information known at the prediction time.
- Rank and evaluate
Measure whether higher-ranked leads reach the target more often.
The number looks confident and points the wrong way.
A score built on messy records learns from noise. The failures are quiet, because the output still looks tidy.
A duplicate splits a history.
When one account lives in two rows, its activity is divided. Each copy looks quieter than the truth, so a model that rewards engagement scores both copies low. Deduping is a correctness step on the inputs, not tidiness.
Blank fields are not zeros.
A missing title or company size is unknown, not "none." Treating absence as a value teaches the model the wrong lesson. Handling missingness honestly is part of the job, not an afterthought.
Stale is worse than missing.
A deal that closed but still reads "open," a last-touch date from a quarter ago: these are confident-looking lies. They corrupt the labels the model learns from, which is harder to catch than a visible gap.
Matching is a judgment call.
Are "J. Smith at Acme" and "John Smith, Acme Corp" the same person? Record linkage formalizes this as a decision under uncertainty, weighing field-by-field evidence, with a deliberate middle zone for pairs a human should review.
Prediction is not causation.
A plain conversion model rewards leads that would convert with no help, which wastes outreach on the already-sold. What a campaign wants is the incremental effect of acting. Naming this gap early keeps the score honest.
A score is perishable.
A model trained on last year's pipeline decays as the market, the product, and the team change. And the history is observational: reps already worked the leads they liked, so it records who got attention, not a clean experiment.
Clean first, then rank.
Turn many rows into one record, build features a model can read, score with trees, and separate correlation from cause.
- 01Link
Resolve account identities.
- 02Featurize
Use information available now.
- 03Score
Predict a defined outcome.
- 04Target
Separate prediction from uplift.
- 05Evaluate
Check ranking and calibration.
Five jobs in a row, each doing one thing, with cleaning ahead of scoring.
1Clean first: turn many rows into one record
Decide that two rows are the same account.
Compare candidate pairs field by field, name, domain, address, phone, score the agreement, and decide: same, not same, or send to review. Blocking narrows the comparison to plausible pairs so the work stays tractable. The decision-theoretic core is Fellegi and Sunter (1969), which casts matching as a likelihood-ratio test with controlled error rates and a deliberate middle zone for a human.
This is the "many messy rows become one clean record" beat. Worth stating plainly, though: a merged record is not automatically a correct one. The honest design keeps the uncertain pairs visible rather than guessing.
CRM record
Meeting record
4 emails · 3 meetings for one account
2Build features the model can read
From clean records to signals.
From the cleaned records, derive signals: firmographics like size and industry, engagement like emails opened and meetings held, recency such as days since last touch, and pipeline stage. Encode missingness explicitly rather than faking a value, so an unknown title stays unknown.
The result is tabular, mixed-type, gappy data: numbers, categories, and blanks side by side. That shape is exactly what the next method was built to read, which is why it became the workhorse for this kind of ranking.
| Feature | Value |
|---|---|
| Company size | 200 employees |
| Meetings in period | 3 |
| Days since last touch | 6 |
| Contact role | Missing; missingness flagged |
3Score with gradient-boosted trees
Many small trees, each correcting the last.
The workhorse for tabular ranking builds many small decision trees in sequence, each one correcting the errors of the trees before it, and adds their votes into a single score. The idea is Friedman (2001), which frames function fitting as stagewise descent.
Two engineered systems made it fast and standard on real datasets: XGBoost (Chen and Guestrin, 2016) and LightGBM (Ke et al., 2017). Their honest fit for this work: they handle missing values and mixed feature types directly, which is why they suit CRM-style data.
Initial score
+ tree 1 contribution
+ tree 2 contribution
+ tree 3 contribution
= ensemble scoreThe final score can then be calibrated or used for ranking.
4From "who will buy" to "who will buy because we acted"
Separate correlation from cause.
Plain conversion scoring has a known blind spot: it rewards people who were going to buy anyway. The history is also observational, because reps already worked the leads they liked. Rosenbaum and Rubin (1983) give the tool for that bias: the propensity score, the probability a record would have been treated, used to compare like with like.
Gutierrez and Gérardy (2017) build on it with uplift modeling, which estimates the incremental lift of outreach and sorts the three standard approaches: two-model, class transformation, and modeling uplift directly. A high predicted-conversion score is not proof that outreach caused the outcome, and saying so out loud keeps the page honest.
| Lead type | Without outreach | With outreach |
|---|---|---|
| Already likely to buy | High | High |
| Responsive to outreach | Lower | Higher |
| Unresponsive | Low | Low |
Which lead is more likely to convert because of the action?
5Check the ranking, not just the accuracy
Does the top of the list really convert.
A lead score is judged by whether the top of the list really is the most likely to convert. Gains-style evaluation asks a plain question: does working the top decile beat working at random. And because pipelines move forward in time, the honest test validates on held-out time periods, training on the past and checking on a later stretch rather than a random split.
This is also where matching shows its shape. The middle zone of uncertain pairs is a feature, not a bug: it keeps low-confidence cases visible for a human instead of letting a guess flow downstream into the score.
Lift = 25% / 10% = 2.5×Evaluate on a later, held-out period and compare with the appropriate baseline.
Clean records under a score change the order of a sales day.
Stated at the field level: these are the benefits honest scoring tends to unlock for a sales team, not a description of any one product.
When the records are trustworthy and the model reads real history, a rep works a list that reflects the pipeline as it actually is. The harder cases in the section above, the duplicate account and the stale deal, are exactly the ones that decide whether a score points at the right call or the wrong one.
A defensible order of operations.
A rep works the top of a list built from real history, not a list distorted by duplicates and stale rows.
One account, one view.
Merging duplicates and matching contacts to companies means a score reflects the full relationship, not a fragment of it.
Spend where it changes the outcome.
Uplift framing points outreach at the leads an action actually moves, rather than the ones already certain or already lost.
A record clean enough to trust downstream.
The same cleaning that helps the score helps everything that reads the CRM: reporting, routing, and forecasting.
The direction the field is heading.
We describe the direction, not a roadmap of our own.
Cleaning and scoring as one loop.
The field increasingly treats record quality and modeling as a single pipeline rather than two separate projects handed off to each other.
What changes the outcome, not just what predicts it.
Uplift and policy-style methods keep maturing as teams ask which action moves a deal, rather than which signal happens to correlate with one.
Honesty about uncertainty.
Growing attention to whether a score's probability means what it says, and to flagging low-confidence cases for a human rather than guessing.
A deployed score is perishable.
Routine checks that a model still ranks well on recent data become standard practice, since a score trained on last year decays as the team and market change.
The records and the model, both kept honest.
A score is only as good as the records under it. The durable work is keeping both trustworthy, which is where the page started.
The papers behind this page.
- Fellegi and Sunter (1969). A Theory for Record Linkage. Journal of the American Statistical Association, 64(328).
- Friedman (2001). Greedy Function Approximation: A Gradient Boosting Machine. Annals of Statistics, 29(5).
- Chen and Guestrin (2016). XGBoost: A Scalable Tree Boosting System. KDD 2016. arXiv:1603.02754.
- Ke et al. (2017). LightGBM: A Highly Efficient Gradient Boosting Decision Tree. NeurIPS 2017.
- Rosenbaum and Rubin (1983). The Central Role of the Propensity Score in Observational Studies for Causal Effects. Biometrika, 70(1).
- Gutierrez and Gérardy (2017). Causal Inference and Uplift Modelling: A Review of the Literature. PMLR v67.
Keep reading.
Sibling explainers in the Research section.
Talk. Done.
A score is only as good as the records under it. Keep both honest, and a sales day sorts itself. See it on a real call.
No app required. Just your phone number.