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.
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.
What does this prompt do?
- 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 do I need to use this?
- 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
How can I customize it?
- 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
FAQs
Does this merge duplicate records in Attio automatically?
Can it delete the wrong record?
Will it use up my Apollo credits without asking?
Does it work with our custom objects and fields?
How do we know what was changed and by whom?
How long does a weekly pass take?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.
See the projected bounce rate for any outbound send before it goes out, and keep the launch button locked until the list is clean enough to be safe.
Pick any date range and see what each device in your home actually cost to run, not just how many kilowatt-hours it used.
Stop letting duplicate records rot in your CRM.
Give your ops team a weekly cleanup pass they can finish in one sitting, with a full record of every change.