# Monthly Salesforce contact refresh on open pipeline with Clay

> On the first Monday of each month, refresh the contacts on your open deals with Clay, fill the gaps in Salesforce, and flag the buyers who have quietly moved on.

- Workflow type: agent
- Services: Clay, Salesforce, Slack Bot
- Categories: Sales, Operations
- Published: 2026-08-14

## What it does

- Finds the contacts on your open deals that are missing a title, phone, or company size, or that have not been updated in more than 90 days.
- Sends them to Clay in batches for enrichment, then waits for every batch to finish before touching your CRM.
- Writes verified values back to Salesforce, filling in blanks and correcting stale fields without ever wiping data you already have.
- Flags open deals where the main contact changed job title or employer, and posts a monthly recap to your revenue operations channel in Slack.

## What you'll need

- A Salesforce login with permission to view opportunities and edit contacts
- A Clay account with an enrichment routine already built, plus that routine's ID copied from your Clay workspace
- A Slack workspace and the channel where the revenue operations recap should land

## Prompt

On the first Monday of every month at 7am, run a data hygiene pass over the contacts attached to my open Salesforce pipeline.

Start in Salesforce. Use Get Many Opportunities (or a SOQL Query) to pull every opportunity that is still open, meaning IsClosed is false, and gather the contacts linked to those deals. Use Get Many Contacts (or a SOQL Query) to load the full contact records. From that set, select the contacts that need attention: any record where a key field such as title, phone, or company size is missing or empty, and any record whose LastModifiedDate is more than 90 days ago. Keep track of which opportunity each contact belongs to, along with the opportunity name, amount, owner, and created date, because I need those later for the summary.

Send the selected contacts into Clay for enrichment using Run a Routine, in batches of up to 100 items per run. I will give you the Clay routine ID. Clay does not expose routine IDs through its public API, so I will paste it in from my Clay workspace UI. Run a Routine is asynchronous and returns a routine_run_id, so for each batch poll Get Routine Run Results with that id until the run reaches a terminal status (complete, failed, or validation_failed), then collect the enriched rows. Space the polls out sensibly rather than hammering the API, and if one batch fails, note it and carry on with the remaining batches instead of aborting the whole run.

Write the verified values back to Salesforce with Update Contact. Be conservative about this. Only overwrite a field when Clay returns a confident value, and never blank out data that already exists. If Clay returns nothing, or a low confidence result for a field, leave the existing Salesforce value untouched. Filling an empty field is always fine. Replacing a field that already has a value should only happen when Clay is confident the current value is wrong.

Separately, flag any contact whose title or employer changed relative to what Salesforce had on record, where the deal was created before that change. A main contact who has moved on is a real risk to an open opportunity, so treat these as findings to report rather than quiet updates.

Finish by posting a summary to my revenue operations channel in Slack with Send a Message. Cover how many contact records were refreshed, which fields changed most often, and a short list of at-risk opportunities where the primary contact appears to have left, including the opportunity name, amount, and owner so the team can act on it. Keep it skimmable, and call out any batches that failed so I know the pass was incomplete.

## How to customize

- Change the timing or the staleness window: run it weekly or quarterly, and treat records as stale after 30, 60, or 180 days instead of 90.
- Change which fields count as gaps. Title, phone, and company size are the defaults, but you can add industry, headcount, or LinkedIn profile.
- Narrow the scope to one sales team, region, or deal size, and choose which channel gets the monthly recap.

## FAQ

### Will this overwrite good data in my CRM?

No. It fills empty fields, and it only replaces a value that is already there when Clay returns a confident result showing the old one is wrong. It never blanks out a field that already has data. Anything uncertain is left alone and mentioned in the recap instead.

### Do I need to set anything up in Clay first?

Yes. You need one enrichment routine built in your Clay workspace, and you paste its ID into the workflow once. Clay does not expose routine IDs through its API, so you copy it from the Clay interface.

### How many contacts can it handle?

Contacts go to Clay in batches of up to 100, and the workflow works through as many batches as your open pipeline needs, waiting for each one to finish before writing anything back.

### Why run it monthly instead of every day?

Business contact data goes stale at roughly 3 to 5 percent per month, so a monthly pass keeps live deals accurate without spending enrichment credits on records that have not had time to change. You can change the schedule to whatever suits your team.

### What counts as an at-risk opportunity?

An open deal where the main contact's job title or employer changed since the deal was created. If your champion has moved on, that deal may have lost the person who was going to sign, which is worth knowing before forecast review.

Use this prompt in General Input: https://www.generalinput.com/prompts/monthly-salesforce-contact-refresh-on-open-pipeline-with-clay