Google Contacts cleanup console for duplicates and gaps
Find duplicate and half empty contacts in one console, review every merge side by side, and fill in missing companies and job titles automatically.
Build me an address book cleanup console for my Google Contacts. Google's built in Merge and Fix only catches near identical duplicates and it never tells me which of my contacts are half empty, so I want one screen where I can see the real state of my address book and work through the problems queue by queue.
The app opens on a health dashboard. A handler loads my whole address book with List Contacts, pulls the auto saved people with List Other Contacts, and loads my labels with List Contact Groups. The dashboard shows my total contact count and, next to it, a count for each problem category: how many contacts look like duplicates, how many are missing key details, and how many are sitting unfiled in Other Contacts. Each count is a link into its queue. Reads need a personFields or readMask value or the API returns a 400, so request the fields the UI actually renders: names, emailAddresses, phoneNumbers, organizations, memberships, metadata, biographies, urls, addresses. Paginate with nextPageToken until the whole address book is loaded, and cache the result so switching between queues does not refetch everything.
Queue one is Duplicates. Group contacts that share a normalized name, an email address, or a phone number, so I catch the cases Google misses, like the same person saved once with a work email and once with a mobile number. Present each group as a side by side comparison showing every field from both records, not a summary. For each field I pick which value survives, and where only one record has a value it should be preselected so I am not clicking through empty choices. Show a preview of the merged record before anything commits, because nobody trusts an automated merge. Merging is safe when it combines fields rather than deleting records, so every number, email, and note from both contacts is preserved on the survivor.
When I confirm a merge, the handler writes the combined record onto the surviving contact with Update Contact, then removes the loser with Batch Delete Contacts. Update Contact requires the contact's current etag, so re-fetch the record immediately before writing rather than trusting the etag from the initial page load. If the write comes back 409 the etag went stale, so re-fetch and retry once before showing me an error. Mutate requests for the same user have to go sequentially, never in parallel, so queue the writes if I approve several merges in a row. Mention in the confirmation dialog that Google keeps deleted contacts for 30 days, so a merge I regret can still be undone from the Google Contacts trash.
Queue two is Incomplete: contacts missing a company, a job title, a phone number, or an email. Show them as rows with the missing fields called out, and let me filter by which field is missing. Each row gets a Fill the gaps button that kicks off a background agent for that one contact. The agent looks the person up with Apollo People Enrichment using whatever identifiers I already have, such as their email address and full name, takes the company, job title, and role from the match, and shows me the proposed values as a preview. Only after I approve does it write them back with Update Contact, re-fetching the etag first, and the row refreshes in place so I can keep working down the queue.
The queue also gets a Fill all action that runs the same job across my current selection. It looks people up with Bulk People Enrichment, which takes up to 10 people per request, so chunk the selection and show progress as it goes. Collect all the matches into a single review table where I can see every proposed change and untick any row or field I disagree with, then write the approved ones with Batch Update Contacts. That endpoint caps at 200 records per request and every entry must carry its current etag, so re-fetch the affected contacts in the same pass and chunk the writes. Batch Delete Contacts caps at 500 if I ever bulk remove that many.
Queue three is Unfiled: the people in Other Contacts who were auto saved from an email exchange and never properly added. Show who they are and what little Google has on them, and let me dismiss the ones that are noise so they stop coming back, or promote the ones worth keeping into my real contacts with a label applied.
Across every queue I want to select a batch of contacts and assign them to a label with Modify Contact Group Members, and I want a Create Contact Group action so I can spin up a new label from inside the app without going to Google Contacts. The label picker should list my existing groups from List Contact Groups, and use Get Contact Group when it needs the members of a specific one.
The rule that matters most: every merge and every enrichment gets a preview before it commits, and the app never touches a field I have not approved. If a suggested value would overwrite something I already have, flag it clearly rather than silently replacing it. Keep track of what I have already reviewed so dismissed duplicates and ignored unfiled contacts do not reappear the next time I open the app.
What does this prompt do?
- Opens on a health dashboard showing how many contacts you have and how many need attention, so you know the size of the mess before you start
- Sorts the problems into three queues you work through one at a time: possible duplicates, contacts missing key details, and people auto saved from email who were never properly added
- Shows both records side by side for every suspected duplicate so you choose which name, phone, email, and company survives the merge
- Fills in missing companies and job titles for you by looking the person up, either one contact at a time or across a whole selection
- Lets you tag batches of contacts with a label, or create a brand new label, without leaving the app
What do I need to use this?
- A Google account with contacts you want to clean up
- An Apollo account, used to look up missing company and job title details
- A few minutes to review the queues, since nothing is merged or changed until you approve it
How can I customize it?
- Change what counts as incomplete, for example only flag contacts missing a phone number rather than every missing field
- Loosen or tighten how duplicates are matched, from exact name matches only to anything sharing an email or phone number
- Pick which details the lookup is allowed to fill in, and which fields it should never overwrite
- Set a default label that newly filed contacts get added to
FAQs
How is this different from Google's own Merge and Fix tool?
Will merging contacts lose any of my information?
Can it change my contacts without asking me?
What if I approve a merge and then regret it?
What are Other Contacts and why do they need filing?
Where do the missing company and job titles come from?
Related templates
Open any HeyReach list, see who is already in a campaign or already in your CRM, clean the batch, and enroll only the people you approved.
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.
See which relationships are going cold, set how often you want to reach out to each person, and let the board sort itself from then on.
Work through your messiest Attio records once a week: merge duplicates safely, fill in missing fields, and keep a log of every change.
A morning risk board that ranks every sequence and mailbox by bounce rate, so you can clean up bad contacts before Apollo pauses your outbound for you.
See every Apollo deal laid out by stage with slipped and stale deals flagged, fix them inline during the call, and post a recap to Slack when you finish.
Your address book is probably a mess. Fix it in an afternoon.
Spin up a console that finds every duplicate and half empty contact, then walks you through the cleanup one approval at a time.