A weekly data hygiene desk for the gaps in your CRM

By General Input

See exactly how many contacts and accounts are missing the fields that matter, fix them in place, and watch completeness climb week after week.

Integrations

  • General Input CRM
  • Internet Search

Type

App

Categories

  • Sales
  • Operations

Build me a data hygiene desk for our General Input CRM. Whoever owns RevOps opens it once a week, sees exactly where our records are thin, fixes what they can in place, and hands the rest to a research assistant whose output they review before anything is written back. It is one app: a scoreboard landing screen with drill-in tables behind each tile.

The landing screen is a gap scoreboard. Each tile is one field that actually matters to us, showing the number of records missing it and a completeness percentage (records with the field filled divided by records in scope). For people the tiles are: no job title, no linked company, and one tile per custom field that sits empty on a meaningful share of records. For companies: no industry, no domain or website, and the same treatment for company custom fields. Discover the custom fields by calling List Custom Fields for both the person and company entity types so the tiles reflect our real schema instead of a hardcoded list.

Count the gaps with Search People and Search Companies rather than pulling the whole database down. Both expose per-column filter conditions and facets, so build a filter condition per gap (field is empty) and read the facet counts to get the tile totals. Only fetch actual rows when someone opens a tile, and page through those with keyset pagination by passing the prior response's nextCursor as cursor until it comes back null.

Clicking a tile opens a fixable table of the records in that gap. Show the identifying columns (name, email, company) plus the gap field itself, and let the person edit the gap field inline in the row. Saving a row calls Update Person for people and Update Company for companies, passing expectedUpdatedAt for optimistic concurrency. If the write comes back as a conflict because the record moved underneath us, refresh that row and show what changed instead of silently overwriting someone else's edit.

Every row has a checkbox. With rows selected, show a bulk action bar: set the same value across the selection, or mark the selection reviewed. Bulk saves go through Update People, which is the batch enrichment endpoint built for exactly this, and Update Companies for the company tables. Both apply each item independently and return results in input order, so surface per-row success and failure rather than one all-or-nothing toast.

Clicking a company row opens a detail panel built from Get Company plus List Company People, so someone can see the contacts hanging off a thin account before deciding how to fix it. An account with fifteen people attached and no industry set is worth fixing carefully; one with nobody attached may be worth leaving alone. Let them edit company fields from that panel too, and let them jump from any listed person straight into that person's row.

Add a Research and fill button above the table that acts on the selected rows and kicks off a background agent. For each selected record the agent looks the person or company up with Internet Search Search the Web, using whatever identity we already have (person name plus company, or company name plus domain), reads the results, and proposes a value for each empty field it can actually support. It must propose field by field, attach the source link and a one-line reason to each proposed value, and skip any field it cannot support rather than guessing. Nothing it produces goes near the CRM on its own.

Agent output lands in an approval diff inside the app. Each line shows the record, the field, what the CRM holds now (usually empty), what the agent proposes, and the source behind it. A human accepts or rejects each individual change, not the record as a whole, so they can take the job title and reject the industry. Accepted changes are collected and written with Update People or Update Companies in one batch when they hit apply. Rejected changes are discarded and remembered so the agent does not re-propose the same value next week. Make this structural: there is no code path anywhere in the app that writes agent output to the CRM without a human accept.

Once a record has been worked, stamp it so it does not resurface. On first run, create a tag with Create Tag (something like Hygiene reviewed) and reuse it from then on, then use Assign Tag on the reviewed records, which accepts one or more people or companies at a time. Default every gap table to excluding records carrying that tag, with a toggle to show them again, so next week's open only surfaces records nobody has looked at. Records that get emptied again or created fresh come back into the queue naturally.

Track completeness over time. Every time the scoreboard is computed, save a dated snapshot of each tile's count and percentage in the app's own storage, then show a small trend line on each tile plus a history view of the whole scoreboard week over week. The point of the ritual is that the team can see hygiene actually improving instead of taking it on faith.

Design it for the weekly open. Land on the scoreboard with the biggest gap first, show when the numbers were last refreshed with a refresh button beside them, and keep the path from tile to fixed record short. Show progress while the background research runs and let the person keep working other tiles in the meantime. Anyone on the revenue team can open it and they all see the same numbers and the same reviewed tags; there is no per-person queue. Empty states matter: when a tile reaches a hundred percent, say so and keep it on screen so the win is visible.

Related prompts

Explore more prompts
Track which pages and brands win your buyers' questionsBuild outbound segments and draft a sequence for every personWeekly pipeline review board that captures every commitmentTurn new GoHighLevel bookings into rep-ready pre-call briefsDaily Salesloft meeting prep briefs in your inbox at 7amWeekly stale deal rescue with per-owner Slack shortlistsTurn Typeform demo signups into scored CRM leads with Slack alertsOpen General Input CRM recovery tasks on failed Stripe paymentsDaily sales pipeline digest in SlackUpdate your CRM pipeline card after every Granola meeting