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
Stage a batch of filings overnight, then approve each completed form from a screenshot before anything is ever submitted.
Review every conversation Fin closed as resolved, judge which ones actually stuck, and see what the gap is worth against your bill.
Work every return, damage and warranty claim in one queue, with the order, the delivery date and a policy-backed recommendation already on screen.
See exactly which ingredients next week needs based on what you actually sold, adjust anything by hand, then build a one-click grocery cart.
See follower growth, posting cadence, format mix and engagement rate for your brand and every competitor you track, side by side on one board.
Open one screen to see how every service in your Jobber price book actually performed: how often it sold, what you charged, and where prices swing.
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.