Find the people in your contacts who never made it to the CRM

Open one console to see who is in your address book but not your CRM, which records disagree, and push only the people you pick.

App
Google ContactsHubSpotApolloSalesOperationsData SyncLead Enrichment
PromptCreate

Build me a reconciliation console that shows the gap between my Google Contacts address book and our HubSpot CRM. The people I actually email and store in my phone are often nowhere in the CRM, and the records we do have go stale. I want to open this app, work through the backlog, and choose every write myself. Nothing here should run on a schedule or fire automatically.

Building the comparison: read my address book with Google Contacts List Contacts and List Other Contacts, requesting the emailAddresses, names, phoneNumbers, organizations and memberships person fields so I get company, title and label membership for every person. Other contacts are the people I have emailed but never saved, and they matter most here, though they often carry an email address only. Then match against HubSpot on email address using HubSpot Batch Read Contacts with email as the unique identity property, chunked at 100 records per request, falling back to HubSpot Search Contacts for lookups Batch Read cannot resolve. Cache the assembled comparison so the app opens fast, and give me a refresh control that rebuilds it on demand.

The app opens on a reconciliation view with three tabs. Missing from CRM lists the people from my address book whose email addresses return no match from HubSpot, showing their company and title so I can judge who is worth adding. Stale in CRM compares the records that exist in both systems and flags where the phone number, job title or company differs, pulling the CRM side with HubSpot Get Contact and showing both values side by side so I choose which system is right. Recently added is a log of everything I have pushed through the app, newest first, with what was written, to which system, and when.

Pushing into the CRM: let me select any number of rows across the first two tabs and push them in one action using HubSpot Batch Upsert Contacts matched on the email property, which is what makes bulk push safe against duplicates. Batch Upsert caps at 100 records per request, so chunk larger selections and report per row whether each one was created, updated or failed. Single row fixes should use HubSpot Update Contact for a record that already exists and HubSpot Create Contact for one that does not. Every push appends to the Recently added log.

Pulling the other direction: when the CRM holds the better value, let me write a corrected phone number back into my address book with Google Contacts Update Contact, and support a multi row version with Google Contacts Batch Update Contacts. Google requires the current etag on every update, so re-fetch the person immediately before writing rather than reusing an etag from the cached comparison, and send mutations for the same user sequentially rather than in parallel. If an etag conflict comes back, re-read and retry that row once, then surface it as a failed row rather than silently dropping it.

Every row gets a Research and file button that kicks off a background agent for that person. The agent enriches them with Apollo People Enrichment to fill in employer, job title and any missing contact detail, looks up that employer with HubSpot Search Companies to see whether we already track the account, creates it with HubSpot Create Company if we do not, files the contact against the company with HubSpot Create Association, picks an owner from HubSpot List Owners and assigns it, then writes a short plain language summary of what it found and what it changed back into the app so the row shows the outcome without me opening HubSpot. Show the row as queued, running, then done or failed, and keep the summary readable on the row afterwards.

Scoping and dismissing: personal contacts like family should be easy to exclude. Load my labels with Google Contacts List Contact Groups and let me filter the whole console by label, saving my chosen scope so it persists between visits. Let me also permanently dismiss any individual row, and keep dismissed rows as app owned state so they stay hidden across refreshes of the comparison, with a way to view and undismiss them. Dismissing must never write anything to Google or HubSpot.

A few things to get right. Match on email case insensitively and handle people with several email addresses, treating a match on any one of them as a match. Do not flag a difference as stale when one side is simply empty; that is a fill, not a conflict, and should be labelled differently. Show me counts on each tab so I can see the size of the backlog. This app works an existing backlog in both directions with user selected writes, so do not build any automatic one way mirroring on top of it.

What does this prompt do?

  • Compares everyone in your Google address book, including the people you only ever emailed and never saved, against the contacts already in your CRM, and lists the ones with no match alongside their company and title so you can judge who is worth adding.
  • Flags records that exist in both places but disagree, showing the phone number, job title and company from each side so you decide which system is right.
  • Lets you select any number of rows and add them to the CRM in one pass, matched on email address so you never create a duplicate, and lets you push a corrected phone number back to your address book too.
  • Gives every row a research button that hands the person to an assistant, which looks them up, checks whether you already track their employer, creates the company if you do not, files the contact against it, assigns an owner, and writes a short summary back into the row.

What do I need to use this?

  • A Google account holding the contacts you want to reconcile
  • A HubSpot login with permission to view and edit contacts and companies
  • An Apollo account if you want the research button to fill in missing employer and job title details
  • A few minutes on first open while the console builds the comparison across both systems

How can I customize it?

  • Choose which contact labels are in scope so family and personal contacts never appear in the list
  • Decide which fields count as out of date; most people start with phone number, job title and company
  • Change how the research assistant picks an owner, or tell it to leave ownership alone entirely

FAQs

Will this create duplicate contacts in my CRM?
No. Everything you push is matched on email address, so a person who already exists gets updated rather than added a second time. That is true whether you push one row or a hundred at once.
Does the app change anything on its own?
No. Nothing is written to either system until you select rows and click push. The console is built for working through a backlog at your own pace, so every change is one you chose.
What about people I have only ever emailed and never actually saved?
They are included. Google keeps those as other contacts, and the console reads them alongside your saved contacts, which is usually where the biggest gaps turn up.
Can I keep family and personal contacts out of this?
Yes. You can filter the list by contact label so only work labels are in scope, and you can permanently dismiss any row you never want to see again.
Will this work on HubSpot Free?
Yes. Contacts and companies are available on every HubSpot plan including free ones. Assigning an owner to a record requires that the person has a seat in your HubSpot account.

Related templates

Client-by-client cold email pipeline review for agencies

Pick a client and a date range to see sent, replies, meetings booked and the real deal value your cold email produced, campaign by campaign.

Instantly
HubSpot
Slack Bot
App
Partner tier review board for quarterly promotion calls

Work every partner tier decision from one board, with the revenue and commission numbers, clear promotion thresholds, and AI review briefs.

Introw
HubSpot
Slack
App
Reconcile partner commissions between HubSpot and Introw

Open one board at month end to find every closed deal missing a commission, every commission with no deal behind it, and every amount that does not add up.

Introw
HubSpot
Slack
App
Hiring signal board for your customers and open pipeline

Open one board each morning to see which of your accounts are hiring, what they are building, and where your product fits the roles they just opened.

JobsPipe
HubSpot
App
Placement pricing desk for recruiting and staffing agencies

Open a live deal, see the market pay range for that role and city, set your markup, and write the agreed numbers straight back onto the deal.

Job Salary Data
HubSpot
App
Instagram comment and DM triage inbox for your team

Work every unanswered Instagram comment, Reel reply and Direct message from one queue, with claimed rows so two people never answer the same person.

Instagram
HubSpot
Slack Bot
App

Stop guessing who is missing from your CRM.

Work the gap between your address book and your CRM one row at a time, and let an assistant handle the research and filing.