You know the ritual. Export the contacts, open the spreadsheet, sort and find-and-replace until the worst of it is fixed, re-import keyed on email, and hold your breath before clicking Import. You hold it because HubSpot will not tell you what is about to change. The mapping screen checks your file, flags format errors only in the first 1,000 rows, and at no point puts the value already in the CRM next to the value in your file. Every populated cell overwrites silently. This is the database your pipeline reports and your forecast run on, and the standard advice for doing it safely is a tiny test file, a handful of contacts, then spot-checks. That is sampling, not a preview.
AI on its own does not fix the held breath. Pointed at the API, it writes just as blind, only faster. What fixes it is moving the work off the live CRM: contacts as local files, the agent scripting the mechanical cleanup and using judgment on the messy rest, you reading every changed field before HubSpot hears about any of it. Hold each option below to the question you came with: which of them puts the current value next to the new one before anything writes?
Your options
HubSpot's bulk edit
For one value across many contacts, the index page already does the job. Filter the view, select all, and a property edit applies to every record in the filter, no export, no cap on the count. The catch lives in the word one. A text or single-select edit stamps a single value onto every selected contact, so a job-title cleanup with 40 variants becomes 40 filtered edits, each overwriting silently with no preview and no per-record confirmation. Some bulk actions stop short of the filter: adding to a static list, enrolling in a workflow, and enrolling in a sequence all cap at 100 records. Use it to stamp a lifecycle stage across a list. The moment every contact needs its own correct value, it stops being the tool.
CSV export and re-import
The power-user path, and for good reason: a spreadsheet gives you sorting, find and replace, and a different value in every row. Match on Record ID or email, check "update existing contacts only" so the import cannot create records, and blank cells are ignored rather than wiping fields. What it never gives you is a preview. The mapping screen validates your file, not your CRM: no screen shows the current value next to the incoming one, and any populated cell overwrites. If the run goes wrong, the restore tool reaches back 14 days, needs a Super Admin, and cannot restore selected properties from an import. You restore everything or untangle it by hand.
Workflows and Data Hub automations
Workflows are the right tool for keeping new data clean. On Professional and Enterprise, the Format data action in Data Hub (formerly Operations Hub) can title-case, trim, and reformat values as records enroll, and the native formatting tool can auto-fix capitalization on names and emails as it spots them. As a backfill tool, the fit ends. Each Edit record action writes exactly one property, every enrolled record gets the same transformation, so a title taxonomy becomes a giant branch tree, and the formatting tool watches only 5 standard contact properties. Job title is not one of them. The changes also apply with no preview, and HubSpot's per-record undo does not cover workflow edits.
A data-quality app
A category of apps exists for exactly this job: dedupe, standardization templates, scheduled cleanup runs, and the better ones preview a run before it commits. That is a real step up from the import screen. The trades are the familiar ones. You grant another app write access to the CRM your company runs on, pricing typically scales with the size of your database, and a template does what you configured, no more. The 40 title variants still need a human to write 40 mappings, and the contact whose title reads "Chief Everything Officer" still needs a human to decide.
An AI agent on the CRM API
Wire an agent to HubSpot's CRM API, through an MCP server or a script, and you get real judgment at machine speed, in theory. In practice the API meters every step. Reading 20,000 contacts is 200 paginated calls before the agent has seen the data once, every question it wants to ask of the dataset is another pass, and rate limits sit at 100 to 190 requests per 10 seconds. An agent updating record by record queues 20,000 throttled calls; a well-built script batches that into about 200. So speed is solvable. Supervision is not: every write lands on the live CRM the moment it runs, and HubSpot's restore tool does not list API changes among the sources it can roll back.
Scratch
Scratch is the route that finally puts the current value next to the new one before anything writes. Your contacts come down as files on your laptop, one per record, and the agent gets full read and write on the copy instead of the live CRM. It can grep every job title in seconds, script the mechanical bulk, and use judgment on the remainder, and none of that costs an API call or touches HubSpot. Every changed field comes back per contact as a word-level diff, the preview the import never had. You approve what writes back, and every written contact can be reverted from Scratch afterwards, per record. The cost is your reading time: the review is real reading, and nobody waves 20,000 changes through.
| Option | Per-contact values | Judgment on messy data | Preview before the CRM changes | Undo after the run |
|---|---|---|---|---|
| Bulk edit on the index page | One value for all | No | No | Restore window, 14 days |
| CSV re-import | Yes, row by row | Bring your own | File checks only | Restore window, not per property |
| Workflows and Data Hub | Same rule for all | No | No | Restore window, not per property |
| Data-quality app | Template-mapped | Rules, not judgment | Varies by app | Varies by app |
| Agent on the CRM API | Yes | Yes | Only if you build it | Not covered by restore |
| Scratch | Yes | Yes, your agent | Every field, as a diff | Per contact, even after publish |
How the loop works on your contacts
- Scratch pulls your contacts into files. Every contact lands as its own file in a folder on your laptop, properties and all: job title, phone, country, lifecycle stage, the custom properties your team added over the years. Deals and companies come down as their own files, separate from the pass you are about to run. Nothing in HubSpot has changed, and nothing will until the last step.
- Your AI cleans the records. Point Claude, Codex, Cursor, or Copilot at the folder with the brief. Standardize every job title against our taxonomy, fix the casing on names, put phone numbers in one format, and fill missing countries from what is already on the record. Touch nothing else. The agent starts the way a good analyst would: one grep builds a frequency table of every title variant in the database. A script then handles the mechanical bulk, the casing, the formats, the 600 contacts who are all "vp sales" in some spelling, and the agent reads the strange remainder itself and decides. That is 99% of the work, done on files, with no HubSpot token anywhere in it.
- You review every diff and publish. Scratch shows each contact's changes as a word-level diff, field by field, next to the value currently in HubSpot. Validators run first if you set them: a phone format rule, a banned title, a lifecycle stage the pass is not allowed to touch. The contacts you approve are the only ones Scratch sends back through the CRM API; the rest of the folder stays a draft. The last 1%, deciding what your CRM actually says, stays with you. And the decision is not final: every written contact can be put back from Scratch, per record.
Run it in slices. Pull one list first, a few hundred contacts, and read those diffs end to end. Once the mapping holds, send the agent through the rest. The reading gets faster, because the diffs start looking like the ones you already approved.
What people clean up with it
- Collapse every spelling of the same job title into one taxonomy, so persona and seniority reports stop splitting one audience into 40 rows.
- Fix the casing an old webinar import left behind, JANE SMITH and jane smith both back to Jane Smith.
- Put phone numbers and country fields in one format so territory rules and routing stop missing.
- Fill empty fields from what is already on the record, instead of paying to enrich data you already have.
- Run the same pass on companies, deals, and tickets next. Everything Scratch edits in HubSpot is the full list.
Questions people ask
Can I see exactly what will change before my CRM changes?
Yes. That is the step the import never had. Every contact's changes show up in Scratch as a word-level diff against the value currently in HubSpot, field by field. The write to the CRM happens only after your approval, and the agent's part ends before that: it works on local files and never holds a HubSpot token.
Will it touch deal amounts or pipeline stages?
No. A contact cleanup works on contact files, and deals are separate records in separate files, so the pass does not reach them unless your brief sends it there. If the agent strays anyway, the stray shows up the same way everything else does, as a diff you did not ask for, and you reject it. A validator can flag any field outside the brief, and nothing unapproved writes back.
Will approved updates fire my workflows?
They can. Edits to the local files fire nothing. When you approve a contact, Scratch writes it back like any CRM update, so a workflow watching that property can fire, the same as if you had edited the record by hand. The difference is that you choose which contacts write back, and when, instead of one import tripping every workflow at once. Reporting moves the same way: each write lands in the property history like any edit, so the change stays attributable, and writing in reviewed slices keeps any shift in your reports small enough to trace.
Can I undo a bulk update after it runs?
Yes. In Scratch, per contact. HubSpot's own restore tool reaches back 14 days, needs a Super Admin, cannot restore selected properties from an import, and does not list API changes as a restorable source at all. Scratch does not lean on it. The original value stays next to every written change, and rejecting a published contact puts it back, one record at a time.
Will blank values wipe my fields?
No. Not silently. In the files, clearing a field is an edit like any other, so it shows up in the diff as a deletion before it can ship. The silent version of this failure belongs to the CSV route, where any populated cell overwrites without showing you, and the half-fix, the "Don't overwrite" checkbox, protects any cell that ever held a value, even one that is empty now, instead of letting you choose change by change.
Can it standardize job titles? HubSpot's formatting tool does not cover them.
Yes. The native formatting-issues tool watches 5 standard contact properties, names, email, state, and country, and job title is not among them. On files, no property needs to be on a supported list. The agent greps every variant in the database, maps the common ones with a script, reads the long tail itself, and your taxonomy is whatever the brief says it is.
Do I need Data Hub or a Professional plan?
No. The Professional and Enterprise requirements on this page belong to workflows, the Format data action, and the data quality tools. Scratch is a desktop app, not a HubSpot add-on, and the AI is whichever agent you already use, on your existing plan.
Does the AI get write access to my live CRM?
No. It reads and writes files in a folder on your laptop. There is no HubSpot token in its environment to find, so there is no path from the agent to the CRM. The only write path belongs to Scratch, opens after your approval, and carries only the contacts you approved.
Do I need to be technical?
No. The scripts in step 2 are the agent's job, not yours. You install a desktop app, connect HubSpot, write the brief in plain English, and read a tracked-changes view. The spreadsheet ritual never happens.
See it on your own CRM
The held breath ends the first time a bulk update shows its work before it runs. See it run on your contacts →, or download Scratch free, pull one list this afternoon, and read the first diffs yourself. Scratch is free to try, and the AI is whichever agent you already pay for.