Weekly Attio cleanup workbench for duplicates and blanks

By General Input

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

Integrations

  • Attio
  • Apollo
  • Google Sheets

Type

App

Categories

  • Sales
  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads