Approve Lusha enrichment field by field before HubSpot saves it

Pick the stale contacts worth enriching, compare every value Lusha returns against what your CRM already holds, and save only the fields you approve.

App
LushaHubSpotGoogle SheetsSalesOperationsLead EnrichmentData Sync
PromptCreate

Build me a review desk for CRM data hygiene where I approve enrichment changes instead of letting a script overwrite my contacts. This is deliberately human in the loop and it is the opposite of a scheduled enrichment job: the app never writes to HubSpot on its own, never enriches a record I did not select, and never applies a value I did not approve. The field level approve and reject step is the whole point of the app, so do not collapse it into a single save button that pushes everything back at once.

The app opens on the hygiene queue. Pull it with HubSpot Search Contacts using a filter group that matches contacts where email is empty, or phone is empty, or job title is empty, or lastmodifieddate is older than a staleness threshold I set at the top of the page, defaulting to six months. Page through results one hundred at a time using the cursor in paging.next.after, and request the properties email, firstname, lastname, phone, mobilephone, jobtitle, company, website, the org's LinkedIn URL property, lastmodifieddate and hubspot_owner_id. Each queue row shows the contact name, company, which fields are missing as small chips, how long since the record was last touched, and the owner name. Resolve owner names once per session with HubSpot List Owners and cache the mapping rather than looking one up per row. Let me sort and filter the queue by gap type, by owner, and by staleness, and select rows with checkboxes that keep a running count and a credit estimate for the current selection.

Clean first, dedupe second, enrich last. Before the Enrich button becomes available for a selection, show me a short pre-flight panel listing the rows the app will skip and why. Skip any contact with no usable identifier, meaning no email, no full name plus a company domain that can be derived from the website or the email domain, and no LinkedIn URL, because there is nothing to match on and enriching it would burn a credit for nothing. Group any obvious duplicates inside the selection, such as two rows with the same email or the same name at the same company, and make me pick one or exclude both rather than paying to enrich the same human twice. The pre-flight panel is informational and fast, so I can adjust my selection and re-check it before spending anything.

When I hit Enrich, the app calls Lusha Enrich People (Bulk) in chunks of up to one hundred contacts, because that endpoint caps at one hundred records per request. Build one person object per contact using the best identifier available in this priority order: the existing email, then full name plus company domain, then full name plus LinkedIn URL. Show progress chunk by chunk, keep the results of chunks that succeeded if a later one fails, and give me a retry action for just the failed chunk instead of re-running the whole batch.

Results land in the diff view, which is where I spend my time. Render one card per contact and, inside it, one line per field: email, mobile phone, phone, job title and company by default, plus any other property I configure. Each line has three columns, the value HubSpot currently holds, the value Lusha returned, and my decision. Classify every line as a Fill when the CRM value is empty, a Change when both sides hold a different non empty value, or a Match when they agree. Collapse Matches by default since there is nothing to decide. Approve and reject are per line, with keyboard friendly controls so I can move down a card quickly. You may offer a bulk helper that approves every Fill in the batch, because filling an empty field is the safe case, but every Change has to be decided individually and must never be swept up by a bulk action.

Make the spend auditable per row. Each record Lusha returns carries an isCreditCharged flag, so badge every contact card with whether a credit was actually charged for it, show the charged count and total for the batch, and keep a running total for my session. A contact Lusha had no data for should read as not found rather than as an error, and should still be visible so I can see what my credits did and did not buy.

Saving writes back only what I approved. Collect the approved lines, group them by contact, and push them with HubSpot Batch Update Contacts in chunks of up to one hundred, matched on the HubSpot record id, carrying only the approved properties and leaving every rejected or undecided field untouched. Immediately after each successful chunk, append the approved changes to my Google Sheet with Append Values, one row per approved field change, carrying the timestamp, the contact id, the contact name, the field name, the old CRM value, the new value, whether a credit was charged for that contact, the reviewer name and the batch id. Use USER_ENTERED so timestamps parse as dates. Show a save summary afterwards including anything HubSpot refused, and keep those rows in the view so I can fix and retry them.

Treat a company change as the most suspicious thing in the diff, not the most exciting. Reviewers regularly report enrichment data still showing an employer someone left six to twelve months ago, so when the Lusha company differs from a non empty CRM company, badge the contact as Moved company, show the CRM last modified date right beside it so I can see how old my own value is, and never let that line be approved by a bulk action. I should be able to reject the company change while still approving the email and phone that came back on the same record.

Every row badged as Moved company also gets a Draft follow-up button, and it stays available whether or not I approve the company field, because I may want to reach out before I am willing to overwrite anything. That button kicks off a background agent that reads the contact record, the old company, the new company and the new job title, and writes a short re-intro note of about four to six sentences that acknowledges the move, references the previous relationship and asks for a short conversation, with no hard pitch. The draft comes back into the app and is shown to me first. I can edit it in place, regenerate it, or discard it. Only when I press File task does the app create it with HubSpot Create Task, putting the note in the task body, associating the task with the contact, setting a due date a couple of days out, and assigning it to the record owner resolved from List Owners, falling back to a default owner I choose in settings when the contact has none.

Persist my decisions per contact and per field, keyed to the batch, so I can leave a review half finished and come back to it without losing my place, and so a second reviewer can see what has already been decided and by whom. Keep a batch history view listing past review sessions with the contacts reviewed, fields approved, fields rejected and credits charged, so the app itself answers what was touched and when. Remember rejected suggestions so the same value does not come back and ask again on the next run for that contact. Respect the rate limits by batching rather than firing one request per row: HubSpot search allows about four requests per second and Lusha enrichment allows about twenty five per second, and on a 429 from either side back off and continue.

What does this prompt do?

  • Builds a review queue of the contacts that actually need work: no email, no phone, no job title, or nothing touched since a date you set, so you decide which records are worth spending enrichment credits on
  • Enriches only the batch you select, then shows every returned value side by side with what your CRM already holds, marked as a gap to fill, a change to your existing data, or a match with nothing to do
  • Lets you approve or reject each field on its own. Only approved values save back to your CRM, and every one is appended to a spreadsheet audit log with the old value, the new value, and who approved it
  • Flags contacts who look like they changed employer and gives you a one click re-intro draft you read and edit before it becomes a task for whoever owns the record

What do I need to use this?

  • A HubSpot login that can view and update contacts and create tasks
  • A Lusha account on a paid plan with API access and credits available
  • A Google account and a spreadsheet to hold the audit log
  • Contacts in HubSpot that carry at least a name plus a company or an email, so there is something to match on

How can I customize it?

  • Set the staleness threshold that puts a contact in the queue, such as anything untouched for six months, and choose which gaps count as worth reviewing
  • Choose which fields appear in the diff, and lock any field you never want an outside source to change, such as an email a rep verified in person
  • Point the audit log at a different spreadsheet or tab and change which columns get written
  • Change the tone and length of the re-intro draft, the due date on the task it creates, and who it falls to when a contact has no owner

FAQs

Will it change anything in my CRM without asking me?
No. Nothing saves until you approve that specific field on that specific contact. Approving a phone number does not approve the job title beside it, and a batch with no approvals writes nothing at all.
How do I know what enrichment is costing me?
Before you run a batch you see how many contacts are selected and what that will cost. After it runs, each contact row shows whether a credit was actually charged for it, with a total for the batch and a running total for your session.
What if the enrichment data is out of date?
That is exactly why this is a review desk. Data providers are known to keep showing an old employer for people who moved six to twelve months ago, so a company change is treated as something to look at rather than a fact. You see it next to what you already hold and decide.
How many contacts can I enrich at once?
Select as many as you like. Lusha accepts one hundred people per request and HubSpot accepts one hundred contacts per save, so the app splits your selection into chunks automatically and reports anything that failed so you can retry just those.
Will this work on the HubSpot Free plan?
Yes on the HubSpot side. Viewing contacts, updating them and creating tasks all work on the free CRM. The paid requirement is Lusha, which only issues API access on a paid plan.
Can I stop half way through a review and come back?
Yes. Your approve and reject decisions are saved per field as you go, so you can leave a batch part reviewed, come back later, and see exactly what has already been decided and what is still waiting.

Related templates

Call overdue Xero customers with an AI collections agent

Every weekday at 10am, an AI voice agent phones your most overdue Xero accounts, logs what each customer promised, and reports back to finance in Slack.

LiveKit
Xero
Deepgram
+2
Agentic Task
Local listing health board for every location you manage

See every Google Maps listing you manage on one screen, ranked worst first, with an audit button that writes the fix list for you.

Local Business Data
Google Sheets
App
Let support send one-off Loops emails without an engineer

Your team picks a template, finds the customer, checks they are safe to email, then sends it, with every send logged where the whole team can see it.

Loops.so
Stripe
Google Sheets
App
Turn Mailjet email clicks into ranked HubSpot follow-ups

Twice a day we spot the people clicking your pricing and demo pages, create a follow-up task for their owner, and post a ranked recap to Slack.

Mailjet
HubSpot
Slack Bot
Agentic Task
Stop cold emails to anyone with a live deal in Pipedrive

Every night at 2am, pull the contacts on your open and won deals and block them from your cold outreach before the next send goes out.

Mailshake
Pipedrive
Google Sheets
Deterministic Code
iMessage campaign console with pre-flight checks and delivery board

Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.

LoopMessage
Google Sheets
HubSpot
App

Stop letting a script overwrite contacts your reps verified.

Build the review desk where an ops person picks the records worth enriching and approves every field before your CRM saves a thing.