Lead scoring by email domain

Lead scoring by email domain: why the domain is a strong signal, an example scoring model, routing to sales, CRM enrichment, pitfalls and measuring it.

  • #sales
  • #lead-scoring
  • #b2b
A lead card for jane@acme.io scores 85 out of 100 from business +20, Microsoft 365 +10 and federated sign-in +5, and is routed to sales. @ jane@acme.io → sales business +20 Microsoft 365 +10 federated sign-in +5 score 85 /100

Lead scoring by email domain means adding or subtracting points based on what a lead’s email domain reveals: a company’s own domain or a free provider, a disposable or relay inbox, a school or government agency, and whether the company runs Google Workspace or Microsoft 365. Every inbound lead has an email address, so the signal is there the moment a form is submitted, before any enrichment or call. Use it to sort the queue automatically, as one input next to firmographics and behavior, not as the whole score.

Why the email domain is a strong signal

  • It’s always there. Every form submission includes an address. No extra fields, no wait for an enrichment vendor.
  • It separates companies from individuals. A custom domain ties the lead to an organization you can look up. A shared provider such as gmail.com tells you nothing about the employer. Business email vs personal email covers the difference in detail.
  • It flags low-intent leads early. A disposable inbox usually means someone who wants the download, not the follow-up. A relay address reaches a real person who chose to hide their inbox. An invalid domain can’t receive your reply at all.
  • It hints at the stack. DNS shows whether the company runs Google Workspace or Microsoft 365, and Microsoft’s public sign-in discovery shows whether login is federated to an identity provider such as Okta. That matters if your product integrates with either suite.
  • It’s cheap to check. One lookup against lists and DNS, and results for a domain can be cached and reused for every lead from that company.

What the domain can’t tell you: company size, the person’s role, budget or buying intent. A two-person startup on Microsoft 365 looks a lot like a large enterprise on Microsoft 365. Treat domain signals as a fast first sort, not a verdict on the deal.

The signals and what they mean

These are the signals a classification API such as isBusinessEmail returns for one address, and how to read them for sales:

Signal Field Reads as
Company domain category: "business" A real organization, even a small one
Free or shared provider category: "personal" An individual, or a buyer using a personal address
Disposable inbox category: "disposable" Throwaway address; no useful follow-up
Privacy relay category: "relay" A real person avoiding follow-up
School or university category: "education" Student, researcher or staff: often a different motion
Public sector category: "government" Separate buying process and rules
Can’t receive mail category: "invalid" Typo or fake; nobody to follow up with
Too little evidence category: "unknown" Very new, parked or forwarding-only domain
Shared inbox is_role_account: true Real company (info@, sales@), unknown person
Google Workspace or Microsoft 365 workspace.google_workspace.detected, workspace.microsoft_365.detected Stack and integration fit
Federated sign-in workspace.microsoft_365.auth: "federated", identity_provider Usually a more structured IT setup
Brand-new domain is_new_domain: true Registered less than 30 days ago: a new company, or something less legitimate
Likely typo did_you_mean jane@gmial.com: fix it before you score it

is_new_domain is only known when you request deep enrichment (deep=true, which counts as 5 checks) or when the domain has already been enriched, so save it for leads where it matters. Field details are in Response fields and Categories and policies. How suite detection works, and its limits, is covered in which email provider a company uses and Workspace detection.

An example scoring model

The model below is an illustrative example, not a benchmark or a recommendation for your funnel. It’s simple on purpose: start every lead at 50, add or subtract points per signal, and keep the result between 0 and 100.

Signal Points (example)
Company domain (business) +20
Google Workspace or Microsoft 365 detected +10
Federated Microsoft sign-in +5
Education or government 0, and route to its own track
Role account (info@, sales@) −10
Too little evidence (unknown) −10
Brand-new domain −15
Free or shared provider (personal) −20
Privacy relay (relay) −25
Disposable, invalid or blocked Score 0, no sales follow-up
Bar chart of example weights around a starting score of 50: business +20, Google Workspace or Microsoft 365 +10, federated sign-in +5, role account −10, new domain −15, personal −20, relay −25, while disposable or invalid sets the score to 0 Example weights start at 50 business +20 Workspace or M365 +10 federated sign-in +5 role account −10 new domain −15 personal −20 relay −25 disposable · invalid reject 0
Example weights: a starting point to tune, not a standard

In code, check each lead with policy: "lenient". Under that policy only disposable, invalid and blocked addresses get recommendation: "block", so a personal address scores low instead of being zeroed out:

// Example weights only: tune them against your own closed-won data.
const CATEGORY_POINTS = { business: 20, personal: -20, relay: -25, unknown: -10 };

export function leadScore(v) {
  // Checked with policy "lenient", so "block" means disposable, invalid or blocked.
  if (v.recommendation === 'block') return 0;
  let score = 50 + (CATEGORY_POINTS[v.category] ?? 0);
  const ws = v.workspace ?? {};
  if (ws.google_workspace?.detected || ws.microsoft_365?.detected) score += 10;
  if (ws.microsoft_365?.auth === 'federated') score += 5;
  if (v.is_role_account) score -= 10;
  if (v.is_new_domain) score -= 15;
  return Math.max(0, Math.min(100, score));
}

With these weights, a few typical leads score like this:

Lead Score
jane@acme.io, company on Microsoft 365 with federated sign-in 85
Company domain, no suite detected 70
info@ on a company domain that runs Google Workspace 70
Company domain registered last week 55
Custom domain with too little evidence (unknown) 40
jane@gmail.com 30
Relay address 25
Disposable inbox 0

The B2B lead qualification use case has a shorter variant that uses the default b2b policy, which also zeroes personal addresses. Pick the version that matches how you sell.

Routing leads by score

A score is only useful when it changes who does what. A simple set of bands, again as an example:

Score or category Route
70 and up Assign an owner right away and notify the team
40 to 69 Quick human review, then sales or nurture
1 to 39 Nurture sequence with a meeting link, or self-serve resources
0 No sales follow-up; keep out of sequences
education or government Their own track, whatever the score
Flow from a new lead through a domain check to a score, which routes 70 and up to an owner right away, 40 to 69 to human review, 1 to 39 to nurture, 0 to no follow-up, and education or government to their own track New lead jane@acme.io Check domain /v1/check score 0–100 70+ Assign owner now 40–69 Human review 1–39 Nurture 0 No follow-up edu/gov Own track
Score first, then route

Once a lead clears the bar, the workspace fields decide who takes it. Send Microsoft 365 companies to the rep who knows your Graph, SharePoint and Teams story, Google Workspace companies to the Drive and Gmail demo, and federated tenants to someone ready for SSO and SCIM questions. Sales routing by workspace has the full table. When workspace.pending is true, detection is still running in the background: route by category now and check again a few minutes later.

Enriching your CRM: a HubSpot example

The pattern is the same in any CRM: store the verdict on the contact, compute the score, branch on it. In HubSpot:

  1. Create contact properties for email_category, uses_google_workspace, uses_microsoft_365, microsoft_tenant_id and a number property such as email_domain_score.
  2. Call the API when a form is submitted. Use a workflow custom code action if your HubSpot plan includes it, or an automation tool such as Zapier, Make or n8n. Keep the API key in the tool’s secret store, never in the form.
  3. Write the score back and use it in your assignment rules: an owner for high scores, a review task for the middle band, a nurture list for the rest.
  4. Back-fill existing contacts with the batch endpoint, up to 100 items per request. De-duplicate to domains first: a domain check costs one check however many contacts share it.

The HubSpot forms integration has the custom code, and CRM hygiene walks through the back-fill. For a quick look at an exported list before you build anything, the bulk email checker takes a CSV.

When you only have a company, or the lead typed a company website next to a personal address, check the domain instead of an address:

{ "domain": "acme.io", "policy": "lenient" }

Send that body to POST /v1/check. It returns the same category and workspace detection, and the person’s address never leaves your system. Address-level fields such as is_role_account don’t apply to domain checks.

Pitfalls to avoid

  • Founders and freelancers on Gmail. Plenty of real buyers run a business from a personal address, especially early on. Score them low, not zero, and let other answers lift them. If the form asks for a company website, check that domain and score the company.
  • Agencies, consultants and resellers. A business domain doesn’t always belong to the end customer. An agency evaluating tools for a client scores like a buyer. A “company” field that doesn’t match the email domain is worth a human look.
  • Contractors on a client’s domain. The domain is right, but the person isn’t an employee and may not influence the purchase. Nothing in DNS will tell you.
  • Role accounts. info@ and sales@ belong to real companies with no named person behind them. A small penalty is enough; a rep can find the right contact.
  • Treating suite detection as size. Google Workspace and Microsoft 365 run everywhere from two-person shops to global enterprises. A Microsoft 365 tenant also doesn’t mean this person has a license or admin rights.
  • Scoring typos. jane@gmial.com is a lead you can’t reach. Show did_you_mean on the form so the lead fixes it before submitting.
  • Letting the domain dominate. A lead with a personal address who requested a demo and visited your pricing page several times deserves attention. Cap how much the domain alone can move the total score.
  • Forgetting it’s a hint. DNS can be stale or unusual. Treat detection as a strong hint for routing, and let reps confirm on the first call.

Measuring whether it works

  1. Record from day one. Store category, the workspace flags and the score on every lead, including the ones you don’t send to sales.
  2. Wait for outcomes. A few weeks of leads is enough to compare meeting rates; closed-won data takes longer.
  3. Compare rates, not counts. Look at conversion by score band and by category.
  4. Hunt for misses. Pull the deals you won from leads that scored under 40. If many came from personal addresses, soften that penalty.
  5. Keep a holdout. Route a small random sample without the score, so you can see what the model would have filtered out.
Metric What it tells you
Lead to meeting rate by score band Whether high scores really get more meetings
Meeting to opportunity rate by category Whether personal or unknown leads are worth sales time
Won deals that scored low Which signals are over-penalized
Time to first touch for high-score leads Whether routing actually speeds up follow-up
Share of leads scored 0 How much noise the filter removes

Re-run the comparison after big changes to your product, pricing or forms. The right weights move with your audience.

Putting it together

  1. Check every inbound lead’s email, or the company domain, when the form is submitted, using policy: "lenient" for scoring.
  2. Start with the example weights above, and write them down where sales and marketing can both see them.
  3. Route by score band first, then by Google Workspace or Microsoft 365.
  4. Store the category, workspace flags and score in your CRM.
  5. Review conversion by band after a few weeks and adjust.

To build the check itself, checking for a business email in code has working code in JavaScript, Python and PHP, and you can get a free API key when you’re ready. If you also want to stop disposable or personal addresses at sign-up, how to require a work email at sign-up covers the policies and the copy. New to the topic? Start with what a business email is.

Frequently asked questions

What is lead scoring by email domain?

It means adding or subtracting lead score points based on the lead's email domain: whether it is a company's own domain or a free provider, whether it is disposable or a relay, and which email suite the company runs. It is usually one part of a larger lead score.

Should leads with a Gmail address get a score of zero?

Usually not. Founders, freelancers and evaluators who want to keep sales emails out of their work inbox often use personal addresses. Score them lower, route them to nurture, and let other form answers or behavior move them up.

Does Google Workspace or Microsoft 365 mean a company is large?

No. Both suites are used by very small teams as well as large enterprises. Detection tells you which suite the company runs, which helps with routing and integration fit, but it is not a company size signal.

How many points should a business email be worth?

There is no universal number. Start with a simple example model, store the score on every lead, and after a few weeks adjust the weights based on which leads became opportunities and customers.

Can I score a lead by company website instead of email?

Yes. If a lead uses a personal address but enters a company website, check that domain instead. A domain check returns the same category and workspace detection without sending the person's address.

How do I add email domain scoring to HubSpot?

Create contact properties for the email category, the workspace flags and the score. Call a classification API when a form is submitted, from a workflow custom code action or an automation tool, then branch your routing on those properties.