Weekly email list cleanup with Hunter and Google Sheets
Every Monday morning, verify new and stale addresses in your sheet, mark each one deliverable or not, and post a recap to Slack.
Build a code workflow that cleans up my marketing email list in Google Sheets every Monday at 7am so we don't torch our sender reputation on the next send. This is a deterministic loop with a known per-row schema: read, verify, write back, summarize. It is not a reasoning workflow.
Trigger: cron, every Monday at 7am in my workspace time zone.
Steps:
1) Use Google Sheets Get Values to read every row from the 'list' tab of the spreadsheet I'll point to. The sheet has columns for email, verification_status, confidence, and last_verified_at.
2) For each row, decide whether to verify. Skip rows whose last_verified_at is within the last 90 days (freshness window). Verify rows where verification_status is empty, or last_verified_at is missing, or last_verified_at is older than 90 days. This skip step is important so we don't burn Hunter credits re-verifying the same addresses every week.
3) For each row that needs verification, call Hunter Verify Email Address with the email. Hunter's verifier may return HTTP 202 (verification in progress); if it does, wait a short delay (a few seconds) and retry the same request before writing anything. Read back the deliverability result (deliverable, risky, or undeliverable) and the confidence score from the response.
4) Use Google Sheets Batch Update Values to write the deliverability result, the confidence score, and a fresh last_verified_at timestamp back into the same row. Batch the writes into one update at the end of the run, not one update per row.
5) Use Slack Send a Message to post a summary to the #marketing channel: total rows checked this run, count by status bucket (deliverable / risky / undeliverable), how many rows were skipped because they were already fresh, and a direct link to the sheet so anyone on the team can audit.
Make these things easy to change at the top of the workflow: the schedule, the spreadsheet ID, the tab name, the column names, the freshness window (90 days), and the Slack channel.
Additional information
What does this prompt do?
- Every Monday at 7am, reads your marketing list from Google Sheets and checks each address against Hunter.
- Writes deliverable, risky, or undeliverable back into the same row along with a confidence score and a fresh timestamp.
- Skips addresses already verified in the last 90 days so you don't burn credits re-checking the same people.
- Posts a Slack summary to your marketing channel with totals by status and a direct link to the sheet.
What do I need to use this?
- A Hunter account with API access for email verification.
- A Google account with edit access to the spreadsheet that holds your list.
- A Slack workspace and a channel where the weekly recap should land.
- A sheet with columns for email, verification status, confidence score, and last verified date.
How can I customize it?
- Change when it runs, like a different day of the week, a different time, or a different time zone.
- Adjust the freshness window so addresses are re-checked sooner or later than 90 days.
- Pick a different Slack channel, or send the recap to multiple channels.
- Add filters so only certain segments of your list get verified, like a single campaign tag.
Frequently asked questions
How many email addresses can it handle?
Will it re-verify the same addresses every week?
What do deliverable, risky, and undeliverable mean?
What happens if Hunter is still working on a verification when we check?
Can I use this with Mailchimp, HubSpot, or another list instead of Google Sheets?
Stop letting bouncers tank your sender reputation.
Connect Hunter, Google Sheets, and Slack once, and Geni keeps your marketing list clean every Monday morning.