Back to blog
Lead scoring
Kurt Warner
· Sep 18, 2026· 6 min read

Why Bad Leads Keep Coming Back Into Your Outbound Lists

You removed the bad leads last month. So why are they back in this month's campaign?

You removed the bad leads last month. So why are they back in this month's campaign?

Usually, the team saved the decision but lost the reason.

One person deleted the row from a CSV. Another marked the contact as unqualified in a prospecting tool. A rep remembered that the company was a poor fit. Then somebody exported a fresh list, changed tools, or asked a new team member to build the next campaign.

The same records came back because nothing durable told the next person to keep them out.

"Not a fit" is not enough

A label such as "unqualified" may stop a lead today. It does not tell you why the lead was rejected or whether the reason still applies.

Was the company outside your service area? Was it too small for your offer? Was the contact in the wrong role? Did the person leave the company? Or was the data too old to trust?

Those are different problems. They need different next steps.

A company outside your service area may be a permanent exclusion. A contact who changed jobs should be replaced with the right person. A record with conflicting employee counts may only need review.

If all three receive the same vague label, the next operator has to research them again. Many teams will not. They will load the list and hope the scoring or outreach tool sorts it out later.

The exclusion reason has to travel with the row

Outbound lists rarely stay in one place.

A list may start as an Apollo export, move into a spreadsheet, pass through an enrichment tool, enter HubSpot or Salesforce, and finish in a sequencer. Each handoff creates a chance to lose the original decision.

This is why suppression cannot live only inside one person's spreadsheet or one platform's private score.

For every row you stop, keep a plain reason that survives the transfer. For example:

  • Geography outside service area
  • Company type excluded from customer profile
  • Employee range below minimum
  • Contact role not connected to the problem
  • Person no longer at company
  • Duplicate account or contact
  • Evidence missing or too old to decide

The wording does not need to be clever. It needs to be clear enough that somebody else can understand the decision without asking the person who made it.

Separate permanent exclusions from records that need another look

One thing I see is teams treating every weak lead the same. That creates two mistakes.

First, they permanently remove records that only needed better information. Second, they keep researching companies that will never fit.

A simple three-part decision works better:

  • Work: the company, person, and likely problem fit well enough to move forward.
  • Review: the answer may change after one reasonable check.
  • Suppress: there is a clear reason not to spend more money or rep time on the row.

The 0-10 fit score can help order the list, but it should not replace this decision.

Suppose a lead scores 6.1 because the company size is missing. If the industry, geography, and contact role fit, send it to review. Now suppose another lead also scores 6.1, but the company is outside your market and the contact has no connection to your offer. That row should probably be suppressed.

Same score. Different decision.

The reason is what makes the difference usable.

Use reason codes your team can apply consistently

Free-text notes are better than nothing, but they get messy quickly.

One rep writes "too small." Another writes "not enough employees." A third writes "bad fit." Those may describe the same issue, but your CRM and reporting will treat them as separate answers.

Start with a short set of reason codes tied to your customer profile. Keep the list manageable. You can always add a code when a real case does not fit.

Your first version might include:

  • GEO_MISMATCH
  • COMPANY_TYPE_MISMATCH
  • SIZE_BELOW_MINIMUM
  • WRONG_CONTACT_ROLE
  • NO_LONGER_AT_COMPANY
  • DUPLICATE_RECORD
  • STALE_OR_MISSING_DATA

Add a short evidence field beside the code. "Head office and all listed locations are outside Ontario" is more useful than "geography failed." "LinkedIn shows the contact left in June" gives the next operator something they can verify.

If the evidence is uncertain, the row belongs in review rather than suppress.

Do not let a fresh export erase an old decision

The practical problem is matching the record when it returns.

Names and titles change. Company domains and LinkedIn URLs are usually more stable. Decide which identifiers your team will use for companies and contacts, then preserve them with the exclusion reason.

When a new list arrives, check it against the suppression file before paying to enrich or verify every row.

For companies, that might mean matching on normalized domain. For people, it could mean LinkedIn URL plus company domain. The exact setup depends on your tools, but the rule is simple: run the check before the next paid step.

This also gives you a way to review old decisions. Some exclusion reasons should expire. A company that was too small two years ago may fit now. A geography mismatch probably has not changed unless your service area expanded.

Set a review date when the reason could become outdated. Keep permanent exclusions separate.

Measure the work you did not have to repeat

The first benefit is easy to see. Fewer bad rows enter the campaign.

The second benefit is repeated savings. Your team does not pay to research, enrich, verify, and review the same poor-fit account every time a new list is built.

Track a few basic numbers:

  • Rows blocked by an existing exclusion reason
  • Rows sent back to review because the old evidence expired
  • Suppression decisions overturned by an operator
  • Duplicate enrichment or rep-review tasks avoided

You do not need a complicated dashboard. A monthly count is enough to show whether the process is working.

Pay attention to overturned decisions. If operators regularly restore leads with the same reason code, the rule may be too strict or the customer profile may have changed. That is useful feedback. The point is not to make suppression permanent at all costs. The point is to stop making the same decision from scratch.

Fix one handoff this week

Take the last 50 leads your team rejected and look at the record that remains.

Can you tell why each lead was stopped? Can another person verify the reason? Will that reason still be attached if the list moves into a different tool?

If the answer is no, add one exclusion-reason field and one evidence field before the next campaign. Then check new lists against those decisions before enrichment.

That is a small change. It also stops yesterday's bad leads from becoming tomorrow's rep work.

FAQ

Should suppressed leads be deleted?

Usually, no. Keep a minimal record with the identifier, exclusion reason, supporting evidence, decision date, and review date if one is needed. Deleting the row removes the information that prevents it from returning.

What is the difference between review and suppress?

Review means the decision could change after a reasonable check because information is missing, stale, or conflicting. Suppress means the available evidence gives you a clear reason not to move the row forward.

How many exclusion reason codes should we use?

Start with the common reasons tied to your customer profile and data-quality rules. Seven to ten codes are usually easier to apply consistently than a long menu. Add a new one only when a recurring case does not fit.

Can a suppressed lead become qualified later?

Yes. Company size, roles, products, and your own customer profile can change. Give time-sensitive reasons a review date. Keep permanent mismatches, such as an excluded company type, separate unless your targeting rules change.

Score your first 10 prospects, free.

No credit card. No sales call. Define your ICP, upload a CSV, see your pipeline scored.