Verifyre

How to clean a HubSpot contact list: verify, tag and suppress

A step-by-step guide to cleaning a HubSpot contact list: build the list, verify it through the integration, write the verdict to a custom property, then suppress and set undeliverable contacts to non-marketing.

To clean a HubSpot contact list, build an active list of the contacts you want to check, run it through an email verifier, write each verdict back to a custom contact property, and then use that property to suppress undeliverable contacts and set them to non-marketing. Done properly it takes under an hour for a list of 50,000, and it cuts both your bounce rate and your HubSpot bill, because marketing contact tiers are priced by the number of contacts you can email.

Why does a HubSpot list need cleaning at all?

HubSpot already handles bounces: a contact whose address hard bounces is marked ineligible for marketing email and quietly dropped from future sends. That is reactive protection. By the time HubSpot marks the contact, the bounce has already counted against your sending reputation, and HubSpot's shared sending infrastructure is strict about accounts whose hard bounce rate climbs past the typical 2% warning line, because one bad sender affects everyone on the same pool.

The second reason is money. Marketing Hub pricing is tiered by marketing contacts, and lists typically decay at around 22% a year as people change jobs and abandon mailboxes. A database that grew to 60,000 marketing contacts over three years is likely carrying 10,000 to 15,000 addresses that will never receive another email, each of them occupying a paid seat. Setting those contacts to non-marketing is free and immediate, but you need to know which ones they are first.

The third reason is data quality. Lead scoring, workflows and sales sequences all assume the email on a record works. A sequence firing at a dead address wastes a rep's follow-up tasks and skews the reporting.

Which contacts should you check first?

Do not verify the whole database on day one. Start with the contacts that will actually be emailed:

  • Active marketing contacts who have not opened or clicked in the last 6 months.
  • Any contact created by an import or a form submission in the last 90 days that has never been sent to.
  • Contacts entering a sales sequence or a nurture workflow.

Contacts who opened something last week do not need a check; their engagement is proof enough.

How do you clean the list step by step?

  1. Build an active list in HubSpot. Contacts > Lists > Create list, type Active. Filters that work well: Marketing contact status is Marketing contact, Last engagement date is more than 180 days ago (or unknown), and Email hard bounce reason is unknown so you skip contacts HubSpot has already dropped. Name it something like "Verification queue".
  2. Create a custom property. Settings > Properties > Create property, object Contact, label "Verifyre status", internal name verifyre_status, type Dropdown select with the options deliverable, undeliverable, risky and unknown. Optionally add a number property verifyre_score and a date property verifyre_checked_at.
  3. Create a private app token. Settings > Integrations > Private apps > Create. Give it the scopes crm.objects.contacts.read and crm.objects.contacts.write, plus crm.lists.read so the integration can see your lists. Copy the token; HubSpot shows it only once.
  4. Connect HubSpot in Verifyre. On the HubSpot integration page, paste the token, choose the "Verification queue" list and map the verdict to verifyre_status (and score and date to the optional properties). Verifyre pulls the contacts, verifies each address over SMTP without sending anything, and writes the results back. One credit is charged per unique address, and any address checked in the last 24 hours is free.
  5. Review the breakdown. A typical uncleaned B2B list comes back roughly 70% to 85% deliverable, 5% to 15% undeliverable, 5% to 15% risky and a few percent unknown. If undeliverable is far higher than that, check for an import that went wrong.
  6. Build suppression and re-engagement lists from the property. Create an active list "Undeliverable" where verifyre_status is undeliverable, a list "Risky" for risky, and a list "Verified" for deliverable. Active lists update themselves as the property changes, so future verification runs flow straight into them.
  7. Set undeliverable contacts to non-marketing. Open the Undeliverable list, select all, Actions > Set as non-marketing. The change applies at your next billing update, which is when the seat count drops. Do not delete the records; the sales history and attribution data are still worth keeping.
  8. Add the suppression list to every send. In each email's recipient settings, exclude the Undeliverable list (and, for most campaigns, Risky too) so a stray contact never reaches a send. Workflows can use the same property as an enrolment trigger: if verifyre_status is undeliverable, unenroll from sequences.

What should you do with each verdict?

VerdictScore bandHubSpot action
Deliverable90 to 100Keep as marketing contact, include in all sends
Risky (catch-all, full mailbox, role account)30 to 89Keep, but send low-frequency or re-confirmation only, exclude from cold sequences
Unknown (server would not answer)30 to 89Re-verify after 48 hours; treat as risky if still unknown
Undeliverable0 to 29Set to non-marketing, add to suppression list, unenroll from sequences

The difference between a permanent verdict and a temporary one matters here; hard bounce vs soft bounce explains why a full mailbox is risky rather than dead.

Is there a manual alternative without the integration?

Yes, through CSV:

  1. Export the active list (Lists > Export) with the Email and Record ID columns.
  2. Upload the file to the bulk list cleaning tool. Jobs run up to 50,000 addresses at a time and the results file keeps every original column, with status, score and reason added.
  3. Import the results back into HubSpot (Contacts > Import > File from computer), matching on Record ID or email, and map the status column to verifyre_status.
  4. Build the lists and set non-marketing exactly as above.

The CSV route works fine for a quarterly clean. The integration is better when new contacts arrive daily, because it can be scheduled, and because it never needs an export that goes stale while you are working on it.

How often should you repeat it?

Quarterly for the whole marketing database, and before any large send to a segment that has not been emailed recently. New form submissions are better verified as they arrive, which is what real-time verification on the form does; the rest of the routine is in the email list hygiene checklist.

Key takeaways

  • HubSpot drops hard-bounced contacts after the bounce; verification catches them before the send.
  • Dead marketing contacts cost real money under contact-tier pricing; set them to non-marketing, do not delete them.
  • Store the verdict in a custom property, then drive active lists, suppression and workflows from it.
  • Private app scopes needed: contacts read and write, lists read.
  • Re-run quarterly and verify new signups at the form.

Frequently asked questions

Will verification change anything in HubSpot without my say-so?

No. The integration only writes to the properties you map. Setting contacts to non-marketing, unenrolling them or suppressing them is done by you, through lists and workflows you control.

Does setting a contact to non-marketing lose data?

No. The record, its timeline, deals and attribution stay intact. The contact simply no longer counts towards your marketing contact tier and cannot receive marketing email until you set it back.

Why did a contact come back risky when HubSpot shows past opens?

Usually because the domain is catch-all, so the server could not confirm the specific mailbox even though it exists. Recent engagement outweighs the verdict; keep those contacts on the verified list.

How many credits will a clean use?

One per unique address. A 50,000 contact list with 2,000 duplicates uses 48,000 credits, and anything re-checked within 24 hours is free.

Put it into practice.

100 free verifications on signup. Clean a list, add the widget, or call the API.

Start free See pricing