← Blog

We cleaned 485,587 HubSpot contacts. The number I'm proudest of is the one we didn't touch.

A name-and-location cleanup across half a million records. 333,667 fixes, zero errors. But the result that matters most is the 90,451 contacts the system refused to decide on.

Klemen Hrovat · CRO, Sellestial·May 19, 2026·2 min read

We ran a name and location cleanup across 485,587 HubSpot contacts.

The interesting part wasn't that Claude did it. Anyone can point an agent at a database now. The interesting part was how the approach changed along the way – and the number we chose not to touch.

It started the obvious, wrong way

I asked Claude to clean up names and locations across the whole portal. Most of those contacts had at least one issue: bad capitalization, emojis in name fields, locations that weren't standardized countries.

It began the way you'd expect – paginating through the HubSpot integration, record by record. Then, around 1,200 contacts in, it stopped and told me the truth:

At this speed, the full job would take hundreds of conversation turns. Wrong tool for the job.

That moment is the whole story in miniature. A headless agent would have ground through all 485,587 the slow way, or timed out, or quietly done a fraction and reported success. This one recognized the approach didn't scale and proposed a better one: write a Python script that uses the API key directly.

Full scan time after the switch: 17 minutes.

We didn't get the rules right on the first pass

Or the second.

This is the part people skip when they tell cleanup stories. The rules are never right immediately, because real names are messier than any rule you'll write on day one. We ran five small batches, and each one caught something the last had missed:

  • "LaTanya" flattened to "Latanya" – over-correction.
  • "Mar'Shon" losing its apostrophe casing.
  • Surnames like Ma, Do, and Co getting falsely flagged as credentials and stripped.

Five passes. 22 tests by the end. Each batch small enough to inspect, so a mistake cost us a few hundred records to review, not half a million to undo.

Final result: 333,667 fixes applied. Zero errors.

The number that matters most

333,667 isn't the figure I care about. This one is: 90,451 contacts left untouched, flagged for a human to review.

The system couldn't make an informed call on them. Is "Kim Thoa" in Helsinki Vietnamese or Finnish? Should the name be reordered, or left as is? There's no rule that answers that correctly every time, and a wrong guess on a person's name is the kind of error that erodes trust in the whole dataset.

So it didn't guess. It set them aside.

That restraint is the entire difference between automation you can run on a production portal and automation you can only run on a demo. AI isn't ready for headless mode, where the AI does all the work and humans are redundant. The win here wasn't the agent's speed. It was a human in the loop using the agent's superpowers in the right place – and the agent knowing where its judgment ran out.

333,667 fixed. 0 broken. 90,451 handed back, on purpose. That last number is the one I'd put on the wall.

Want this running on your HubSpot?

30 minutes. No pitch deck. Just a conversation about your data.

Talk to us →