Weekly website contact enrichment in Google Sheets

By General Input

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.

Integrations

  • Website Contacts Scraper
  • Google Sheets
  • Slack

Type

Deterministic Code

Categories

  • Sales
  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageWin back LiveChat visitors whose chats went unansweredLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardChat quality review board for LiveChat support leadsLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seats