Weekly website contact enrichment in Google Sheets

Every Monday at 8am, fill in public emails, phone numbers, and social links for every pending domain in your sheet, then post a results summary to Slack.

Deterministic Code
Website Contacts ScraperGoogle SheetsSlackSalesOperationsLead EnrichmentData Sync
PromptCreate

Build a code workflow that runs on a cron trigger every Monday at 8am and bulk enriches a Google Sheet of company domains with public contact info using Website Contacts Scraper. The integrations are website-contacts-scraper, google-sheets, and slack.

Step 1: Call Google Sheets Get Values on the target spreadsheet and tab to read the full lead list (assume columns: Domain, Emails, Primary Email, Phones, LinkedIn, Facebook, Twitter, Instagram, YouTube, Status). Use the spreadsheet ID, sheet/tab name, and the column letters as workflow inputs so the user can point it at any sheet.

Step 2: In code, filter the rows to those that still need enrichment — keep only rows where the Emails column is empty. Record each pending row's original row number so we can write results back to the exact same row. Then group the pending domains into deterministic batches of up to 20.

Step 3: For each batch, call Website Contacts Scraper's Scrape Contacts operation with the batch joined as a single comma-separated query value (the API bills per domain in the query and accepts up to 20). Wait a short, fixed delay between batches (around 1.5 seconds) so we respect the RapidAPI per-second cap and back off cleanly on a 429.

Step 4: Map each domain's response back to its row number and build a Google Sheets Batch Update Values payload covering: Primary Email (first email returned), Emails (all emails, comma-separated), Phones (all phone numbers, comma-separated), LinkedIn, Facebook, Twitter, Instagram, YouTube (each social URL into its own column if present), and Status (set to 'enriched', 'no_contacts', or 'failed'). Send all the row updates in a single Batch Update Values call so the sheet is updated atomically.

Step 5: Compose a short summary string with: total domains processed, count that returned at least one email, count that returned no contacts, and a bullet list of any failed rows by row number with the error reason. Post that summary to Slack via Slack Send a Message to a channel ID provided as a workflow input (default the description to '#lead-ops').

Constraints: batching must be deterministic (sort domains by row number before grouping); never re-enrich rows that already have an email; treat any non-2xx response from Website Contacts Scraper as a per-batch failure and continue with the remaining batches; the Slack post must run even if zero domains needed enrichment (in that case post 'No pending domains this week').

Workflow inputs to expose: spreadsheetId, sheetName, domain column letter (default A), starting data row (default 2), Slack channel ID. Use the trigger time as the run label in the Slack summary.

Additional information

What does this prompt do?
  • Every Monday at 8am, scans your Google Sheet for company domains that still need contact info.
  • Pulls public emails, phone numbers, LinkedIn, and other social profile links for each pending domain.
  • Writes the results back into the matching columns on the same row, so your lead list fills itself in.
  • Posts a short summary to a Slack channel showing how many domains were processed, how many produced an email, and any rows that failed.
What do I need to use this?
  • A Google Sheet with a column of company website domains and empty columns ready to receive emails, phones, and social links.
  • A Google account that can read and write that sheet.
  • A RapidAPI account subscribed to Website Contacts Scraper (a free tier is available).
  • A Slack workspace and a channel where the weekly summary should be posted.
How can I customize it?
  • Change the schedule (daily, twice a week, or a different day and time).
  • Point it at a different sheet, tab, or set of columns to match how your team tracks leads.
  • Swap the Slack channel, or add a second channel for the operations team that fixes failed rows.
  • Adjust which fields get written back (for example, skip phone numbers, or only keep the primary email).

Frequently asked questions

Will it overwrite rows I have already enriched?
No. The workflow only processes rows where the Emails column is empty, so anything you have filled in by hand or from a previous run is left alone.
What happens if a website has no public contacts?
The row is marked as processed but the contact columns stay empty, and the Slack summary tells you how many domains returned no email so you can decide whether to research them manually.
How many domains can it handle in one run?
There is no fixed cap. The workflow batches up to 20 domains per call and spaces the batches out, so a list of several hundred domains finishes comfortably in a single Monday morning run.
What if the scraper hits a rate limit or a domain fails?
Failed rows are listed in the Slack summary by row number so an operations person can review and rerun them. The workflow itself waits between batches to stay inside the provider's limits.
Can I change the channel or the day it runs?
Yes. Both the Slack channel and the schedule are knobs you can change at any time without rewriting the workflow.

Stop hand-enriching lead lists every Monday.

Connect Google Sheets, Slack, and your Website Contacts Scraper key once, and Geni fills in your domains every Monday at 8am.