# A weekly Keap cleanup desk for duplicate contacts and tag sprawl

> See duplicate Keap contacts side by side with their orders and tags in view, merge the right record on purpose, and retire the tags nobody uses.

- Workflow type: app
- Services: Keap, Google Sheets
- Categories: Sales, Operations
- Published: 2026-08-31

## What it does

- Puts likely duplicate contacts side by side with the differing fields highlighted, and shows which record actually carries the orders, the open deals and the tags.
- Finds the duplicates for you in the background and hands over a ranked queue to approve, so nothing is ever merged without a person saying yes.
- Warns you before every merge that appointments and deals do not survive a merge in Keap, and makes you confirm which record lives rather than picking for you.
- Lists every tag with its contact count, flags the ones nobody has applied in months, and writes every merge and bulk tag change to a spreadsheet audit trail.

## What you'll need

- A Keap account you can sign in to, with permission to edit and merge contacts.
- A Google account and a spreadsheet to hold the audit log.
- Someone to run the session, usually an ops person or whoever owns your CRM data.

## Prompt

Build me a Keap data hygiene workbench that my operations person opens for a weekly cleanup session. Keap's native merge tool makes you hunt down and review every duplicate by hand, so this app should do the hunting and the evidence gathering and leave the actual decision to a human. It has two tabs, Duplicates and Tags, plus a running audit log.

The Duplicates tab shows a queue of candidate duplicate pairs ranked by confidence, one card per pair. Each card puts the two contact records side by side and highlights the fields that differ, including email, phone, name, company and address, plus custom field values. Pull the contact data with List Contacts. Custom field values are read and written through the custom_fields array keyed by the field's numeric id, so discover those ids from the contact /model endpoint in order to label each custom field properly in the side by side diff.

Under each record on the card, show the evidence that tells the reviewer which one should survive. Use List orders to show how many orders that contact carries and their total value, List Opportunities to show open and won opportunities, and List Applied Tags (Contact) to show the tags applied to it. A record with order history is almost always the one to keep, so make that obvious at a glance instead of making the reviewer click into anything.

Each pair gets its own Merge button wired to Merge two Contacts. Before any merge runs, show a hard warning that Keap does not carry appointments or deals across a merge: contacts have to be manually added back to any deals, and upcoming appointments need to be cancelled and rescheduled. Where the app already knows about opportunities on the record being merged away, list them by name inside that warning so the reviewer sees exactly what will be lost. The reviewer must explicitly confirm which record is the primary. Never default the primary to the older contact id and never preselect one, and keep the merge button disabled until a primary is chosen. Also give me inline editing on each field wired to Update a Contact, so I can fix a typo or fill in a missing value on the surviving record before merging rather than after.

At the top of the Duplicates tab, a Find duplicates button kicks off a background agent that builds the queue. The agent pages through List Contacts using page_size and page_token, scores candidate pairs on email, phone, name and company similarity, and for each pair recommends a primary based on order history and overall record completeness with a short written reason. It writes the ranked queue back into the app for human approval and must never merge anything itself. Keap allows 1,500 requests per minute, so page steadily and back off exponentially on a 429. Show scan progress and the time of the last completed scan, and keep the previous queue usable while a new scan runs.

The Tags tab is for tag sprawl. List every tag category with List Tag Categories and group the account's tags underneath their category. Build the tag inventory from the applied tag records collected with List Applied Tags (Contact) while the scan pages through contacts, and use List Tagged Contacts when I drill into a single tag to get its exact contact count and the date it was most recently applied. Flag any tag nobody has applied in months as a cleanup candidate and call out tags with zero contacts. From here let me bulk clean: select a set of contacts and apply a standardized tag with Apply Tag, or strip a dead tag from everyone holding it with Remove Tags. The rule I want reflected in the UI is simple: if a tag does not change what happens next, it is clutter.

Every merge and every bulk tag change is appended to a Google Sheets audit log with Append Values, one row each, capturing the timestamp, the reviewer, the action, the contact ids involved, which record was kept and which was merged away, the tag affected and the number of contacts touched. This log is how I prove what changed, so write the row as part of the action, and if a merge or tag change fails, record the failure too rather than silently dropping it.

Persist the candidate queue, each pair's status (merged, dismissed as not a duplicate, or skipped for later) and the scan history inside the app, so a cleanup session can be paused and picked up the following week without rescanning from scratch. Pairs I dismiss as not duplicates should never come back in a later scan.

## How to customize

- How strict the duplicate matching is, from exact email matches only through to looser name and company similarity.
- What counts as a stale tag, for example nobody has applied it in three months instead of six.
- Which spreadsheet the audit log lands in, and which details each row records.

## FAQ

### Will this merge anything automatically?

No. The background scan only builds a ranked list of candidate pairs and recommends which record to keep and why. Nothing merges until you open a pair, confirm the surviving record and press Merge yourself.

### What does Keap actually lose when two contacts are merged?

Keap's own documentation is clear that merging does not bring appointments or deals across. Contacts have to be manually added back to any deals, and upcoming appointments need to be cancelled and rescheduled. The app shows you that warning, along with what the record being merged away is holding, before each merge.

### Can I undo a merge?

Keap merges are not reversible, which is exactly why this app is built around reviewing before you merge. The audit log gives you a permanent record of every merge, including which record was kept and which was merged away.

### How large a contact list can it handle?

The scan works through your contacts in the background in batches and stays inside Keap's rate limits, so a big list takes longer but still finishes. Your ranked queue and progress are saved, so you can leave and come back.

### Do I have to finish the whole cleanup in one sitting?

No. Pairs you skip stay in the queue, pairs you dismiss as not duplicates never come back, and the next session picks up where you left off.

Use this prompt in General Input: https://www.generalinput.com/prompts/a-weekly-keap-cleanup-desk-for-duplicate-contacts-and-tag-sprawl