# 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.

- Workflow type: app
- Services: Google Contacts, Apollo
- Categories: Operations, Personal Productivity
- Published: 2026-08-24

## What it does

- 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 you'll need

- 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

## Prompt

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.

## How to customize

- 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

## FAQ

### How is this different from Google's own Merge and Fix tool?

Google's built in tool mostly catches near identical duplicates and does not tell you anything about contacts that are simply half empty. This console flags contacts that share a name, an email, or a phone number, and it adds two queues Google does not have: contacts missing key details, and people sitting in Other Contacts who were never properly saved.

### Will merging contacts lose any of my information?

No. A merge combines fields rather than discarding a record, so every number, email, and note from both contacts can be carried into the one that survives. You see both records side by side and pick the value that wins for each field before anything is saved.

### Can it change my contacts without asking me?

No. Every merge and every automatic fill shows you a preview first, and only the fields you approve are written. Nothing is committed until you confirm it.

### What if I approve a merge and then regret it?

Google keeps deleted contacts for 30 days, so a merge you change your mind about can be undone from the Google Contacts trash within that window. The app reminds you of this before you confirm.

### What are Other Contacts and why do they need filing?

Google quietly saves people you have emailed into a separate Other Contacts list, so they never appear as proper contacts with a label or full details. The Unfiled queue shows you those people so you can promote the ones worth keeping and ignore the rest.

### Where do the missing company and job titles come from?

When you hit Fill the gaps, a background lookup matches the person against a business contact database and returns their current company, job title, and role. The match is shown to you as a suggestion, and you decide whether to accept it.

Use this prompt in General Input: https://www.generalinput.com/prompts/google-contacts-cleanup-console-for-duplicates-and-gaps