Quick overview
This workflow runs weekly to audit and clean CRM lead data in Google Sheets, optionally revalidating stale emails via NeverBounce, then logs a data quality summary and human-review items back to Google Sheets and can post the report to a configurable webhook.
How it works
- Runs every Sunday at 20:00 to start an out-of-hours data hygiene pass.
- Reads all lead rows from the “Leads” tab in Google Sheets and applies safe, non-destructive fixes like trimming fields, lowercasing emails, normalizing domains, and rebuilding missing lead IDs.
- Flags issues that require human review (for example duplicates, missing domains, malformed emails, unsynced live leads, and missing CRM owners) and compiles an audit summary.
- If write-back is enabled, updates the original rows in the “Leads” sheet in place with the safe fixes; otherwise it performs a dry run and writes nothing.
- If a NeverBounce API key is provided, selects a batch of stale email addresses and rechecks them with NeverBounce, then writes the updated email status back to the “Leads” sheet and suppresses leads that become invalid.
- Builds a weekly quality report, appends aggregate metrics to the “Data Quality Summary” sheet, and appends one row per issue to the “Data Quality” sheet.
- If an alert webhook URL is configured, sends the formatted report text to that webhook endpoint.
Setup
- Create a Google Sheets OAuth credential in n8n and set your spreadsheet ID in the workflow’s config so the “Leads”, “Data Quality Summary”, and “Data Quality” tabs can be read and written.
- Ensure your spreadsheet contains the required columns for each tab (including row data in “Leads” and the metric/review columns described in the workflow notes).
- Review the config values (dry run/write enabled, reverify-after days, and batch size) and keep dry run on until you are comfortable enabling write-back.
- (Optional) Add your NeverBounce API key in the config to enable stale email rechecks.
- (Optional) Set an alert webhook URL in the config and ensure the receiving service accepts JSON with a text/content field.