# Weekly Attio cleanup workbench for duplicates and blanks

> Work through your messiest Attio records once a week: merge duplicates safely, fill in missing fields, and keep a log of every change.

- Workflow type: app
- Services: Attio, Apollo, Google Sheets
- Categories: Sales, Operations
- Published: 2026-08-16

## What it does

- Opens on three tabs ordered worst first: likely duplicate people and companies, records missing critical details like owner, web domain or stage, and records nobody has touched in months.
- Groups likely duplicates by shared email address or shared web domain, then walks you through a guided merge where you pick the record that survives, review a field by field comparison, and copy the missing details across.
- Deletes the leftover record only after you confirm it by name, because deletion in Attio is permanent and cannot be undone.
- Fills in blanks using enrichment data you approve first, tells you how many records you are about to enrich before you spend anything, and appends every merge, edit, deletion and enrichment to a Google Sheet.

## What you'll need

- An Attio workspace you can edit, with permission to update and delete records
- An Apollo account with enrichment credits available
- A Google account and a spreadsheet to keep the change log in
- A person who owns CRM data quality, since every merge, deletion and enrichment needs someone to approve it

## Prompt

Build me a CRM cleanup workbench for our Attio workspace. Our operations person sits down with it once a week and works through the mess, so everything in it is ordered worst first: the records that are doing the most damage sit at the top of every list, and a short session still fixes the things that matter. The app opens on three tabs: Duplicates, Missing Fields, and Stale Records.

When the app loads, learn our actual schema instead of assuming it. Use Attio List Objects to get every object in the workspace including our custom ones, and List Attributes on each object to learn the real attribute slugs, types and select options. Everything downstream resolves against that live schema, including which attribute counts as owner, which one holds the web domain, and which one holds stage. If we add a custom object or rename a field, the app should pick it up on the next load rather than break.

The Duplicates tab uses List Records to pull people and companies, then groups likely duplicates: people that share an email address, and companies that share a web domain. Show each group as a cluster with the records laid out next to each other and a completeness score for each one, counting how many attributes are filled in, so it is immediately obvious which record is the richest. Sort clusters worst first, meaning the largest clusters and the ones where both records carry real data go to the top, since those are the ones causing reps to work the same account twice.

Attio has no merge action, so duplicates are handled as an assisted merge that I drive. I pick the surviving record from the cluster. The app then shows a field by field comparison across every attribute, clearly marking where the survivor is blank and the other record has a value, and where the two records disagree. On my approval it copies the missing values onto the survivor using Update a Record (Append Multiselect), so multiselect values are added to rather than wiped out. Only after that copy succeeds does it offer to remove the discarded record with Delete a Record, and that sits behind an explicit confirmation step that names the record being deleted and states plainly that deletion is permanent and cannot be undone. Never delete anything without that confirmation, never delete the record I chose as the survivor, and never delete a record whose values have not been copied across yet.

The Missing Fields tab lists records that are missing critical fields: no owner, no web domain on a company, no stage, plus any other attribute I mark as critical in the app. Group them by which field is missing with a count on each group, worst first. From here I can enrich in place using Apollo, with People Enrichment for people matched on email address and Organization Enrichment for companies matched on domain. Suggested values land in a review panel next to the current values, I accept or reject them field by field, and only the accepted ones are written back with Update a Record (Append Multiselect).

Apollo enrichment consumes credits, so the app must never spend them quietly. Before I commit any enrichment run, show me exactly how many records I am about to enrich, and make me confirm that count before anything is sent. There is no background enrichment sweep and no auto enrich on load. If a record already has a value for a field, do not spend a credit refetching it unless I explicitly ask for a refresh.

The Stale Records tab shows records nobody has touched in months, read with List Records and sorted by the last interaction or last updated attribute the schema gives us. Default the staleness threshold to 90 days and let me change it. Show the owner, the last touch date and how many days stale each record is. From the row I can reassign the owner, edit a field inline, or dismiss a record so it stops surfacing. Dismissals persist in the app so next week's pass starts from where I left off rather than showing me the same records again.

Every merge, field edit, deletion and enrichment gets appended to a Google Sheet with Append Values so we have an audit trail of what was changed and by whom. One row per change, written right after the change succeeds, with the timestamp, the signed in user who approved it, the object type, the record id and name, the action type, the field changed, the old value and the new value. For a deletion, also log the id and name of the deleted record and the survivor it was merged into. If the sheet write fails, surface the error in the app rather than swallowing it, because a change we cannot account for is worse than a change we did not make.

Across the top of the app show the outstanding count on each of the three tabs and how many records have been cleaned in this session, so the weekly pass has a visible finish line.

## How to customize

- Change what counts as stale, from a few weeks up to several months, so the third tab matches your sales cycle
- Decide which fields count as critical, such as owner, web domain, stage, or any custom field your team relies on
- Point the change log at a different spreadsheet or tab, and add columns like team or region if you need to slice the history later
- Skip enrichment entirely if you would rather fill blanks by hand and keep your credits

## FAQ

### Does this merge duplicate records in Attio automatically?

No. Attio does not offer a one click merge through its connection, and this app never merges on its own. You choose which record survives, review the differences side by side, and approve the copy. The leftover record is only removed after a separate confirmation step.

### Can it delete the wrong record?

The record you mark as the survivor is never deleted. Deletion only ever applies to the record you discarded, only after its details have been copied onto the survivor, and only after you confirm the deletion by name. Deletion in Attio is permanent, so that confirmation is deliberately hard to click past.

### Will it use up my Apollo credits without asking?

No. Enrichment consumes credits, so before any run the app shows you exactly how many records you are about to enrich and waits for you to confirm. Nothing is sent until you commit, and you review the suggested values before they are saved onto the record.

### Does it work with our custom objects and fields?

Yes. The app reads your workspace structure when it opens, so custom objects and custom fields are picked up alongside the standard people and companies rather than being ignored or hard coded.

### How do we know what was changed and by whom?

Every merge, field edit, deletion and enrichment is appended as a row to a Google Sheet with the time, the person who made the change, the record involved, and the before and after values. That sheet is your audit trail.

### How long does a weekly pass take?

That depends on how messy the workspace is, but the app is ordered worst first on purpose. The biggest duplicate clusters and the records missing the most critical fields sit at the top, so a short session still fixes the records that hurt most.

Use this prompt in General Input: https://www.generalinput.com/prompts/weekly-attio-cleanup-workbench-for-duplicates-and-blanks