Daily ZoomInfo company enrichment to Google Sheets

By General Input

Every morning at 6am, fill in industry, headcount, revenue, HQ, and tech stack for every pending company in your Google Sheet using ZoomInfo.

Integrations

  • ZoomInfo
  • Google Sheets

Type

Deterministic Code

Categories

  • Operations
  • Sales

Build a code workflow that runs every day at 6am on a cron trigger and enriches a Google Sheet of company domains using ZoomInfo.

Trigger: cron, daily at 06:00 in the user's local timezone.

Step 1. Use the Google Sheets Get Values operation to read the 'To Enrich' tab of a configured spreadsheet. The tab has at least these columns: a 'domain' column with company domains (e.g. acme.com) and a 'status' column. Read the full used range so we can locate rows by their row number.

Step 2. Filter the rows in code to those where status is empty, null, or equal to the string 'pending' (case-insensitive). Keep track of each domain's 1-based row number in the sheet, because we will need it to write the enriched values back to the same row.

Step 3. Group the pending domains into batches of 25. ZoomInfo's Enrich Companies operation accepts up to 25 records per request, so this batch size is a hard ceiling, not a suggestion. If there are 0 pending rows, log a no-op and exit cleanly.

Step 4. For each batch, call ZoomInfo's Enrich Companies operation with the batch of domains as the match input and the following outputFields list: industry (or primaryIndustry), employeeCount, revenue, hqAddress (street, city, state, country, zip), phone, website, and the technographic fields covering technologies used and tech categories. Include any standard company identity fields the downstream sheet wants (company name, ZoomInfo company ID). Re-runs against companies enriched in the last 12 months are credit-free, so we do not need extra dedup logic beyond the status column.

Step 5. For each enrichment response, build a Google Sheets Batch Update Values payload that writes back to the same row in the 'To Enrich' tab:

  • If ZoomInfo returned a match: write the enriched columns (company name, industry, employee count, revenue, HQ city/state/country, phone, website, technologies), stamp an 'enriched_at' column with today's date in ISO format, and set the status column to 'enriched'.

  • If ZoomInfo returned no match for the domain: leave the enrichment columns blank, stamp the 'enriched_at' column with today's date, and set the status column to 'no_match' so the row is skipped on the next run.

Use a single Batch Update Values call per ZoomInfo batch (not per row) so we stay well under Google Sheets' write rate limit. Use USER_ENTERED as the value input option so numbers and dates render correctly.

Step 6. Handle ZoomInfo errors gracefully: on a 429 rate-limit, retry the batch with exponential backoff. On a 401 or 403, fail the run with a clear error. On any other batch-level failure, log the failing batch's domains and continue processing remaining batches so one bad batch does not stall the whole run.

Configuration the user should provide at setup time: the spreadsheet ID, the sheet/tab name (default 'To Enrich'), the name of the domain column, the name of the status column, and the names of the enriched output columns. Default the timezone to America/New_York if not specified.

Integrations: zoominfo (Enrich Companies), google-sheets (Get Values, Batch Update Values).

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet 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 boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads