Nightly hiring signal harvester for target accounts

By General Input

Every night at 2am, scan your target accounts' careers pages and log every new Sales, RevOps, Marketing, or CS opening straight to a spreadsheet.

Integrations

  • Airtop
  • Google Sheets

Type

Deterministic Code

Categories

  • Sales

Every night at 2am, harvest hiring signals from target-account careers pages using an Airtop cloud browser, and log the new roles to a Google Sheet so an SDR has a fresh outbound queue in the morning. This is a pure code workflow: read a sheet, drive a browser, filter by a whitelist, dedupe, and append. No summarization, no ranking, no drafting.

Trigger: cron, nightly at 02:00 in the workspace's timezone.

Step 1. Use Google Sheets Get Values to read the "Target Accounts" tab. Each row is one target company: column A is the company name, column B is the URL of that company's careers or jobs page. Skip the header row and any row missing a URL.

Step 2. Use Google Sheets Get Values again to read the existing "Hiring Signals" tab from the same spreadsheet. Build an in-memory Set of composite dedupe keys shaped `company|role_title|location`, lowercased and trimmed. This is the deterministic dedupe check for step 6. On the first run the tab may be empty (only a header), which is fine.

Step 3. Call Airtop Create Session once at the top of the run and reuse it across all target accounts. At the end of the run (success or failure), call Airtop Terminate Session so we do not leak billed browser time. Wrap the per-company work in try/catch so one bad page cannot orphan the session.

Step 4. For each Target Accounts row, in sequence (one window at a time is fine and easier on plan session limits): call Airtop Create Window with the careers URL, then run Airtop Paginated Extraction against that window with the fixed output schema below. The extraction should follow "next" pagination or infinite scroll where present so we capture every currently open role. Close the window before moving to the next company.

Fixed output schema (pass as `configuration.outputSchema`, serialized as a JSON Schema string): an object with a `roles` array of `{ role_title: string, department: string, location: string, posted_date: string }`. `role_title` is required; `posted_date` should be an ISO date if visible on the page, otherwise the exact string the page shows (e.g. "3 days ago"). Do not ask the model to summarize or reformat anything else.

Step 5. Deterministic filtering (no LLM reasoning). Trigger departments are a configurable list; the default is ["Sales", "RevOps", "Marketing", "Customer Success"]. Match case-insensitively and expand common aliases: "Revenue Operations" and "Rev Ops" match RevOps; "CS" and "Customer Experience" match Customer Success; "Sales Development" and "Business Development" match Sales; "Growth" and "Demand Gen" match Marketing. Drop any role whose department does not match. Then drop any role whose `company|role_title|location` composite key is already in the dedupe Set from step 2, and also drop within-run duplicates by adding each new key to the Set as it is accepted.

Step 6. Use Google Sheets Append Values to append the surviving rows to the "Hiring Signals" tab. Column order: company, role_title, department, location, posted_date, source_url, detected_at. `source_url` is the careers URL from the Target Accounts row. `detected_at` is the workflow run start timestamp in ISO 8601. Use `valueInputOption` = RAW so nothing gets reinterpreted as a formula or date.

Error handling: if a careers page fails to load, or Paginated Extraction returns `meta.status` of `failure`, log the company and URL and continue to the next row. One broken page must not halt the whole run. Rate-limit-style Google Sheets 429s should be retried with exponential backoff.

Explicitly out of scope: no Slack posting, no email, no reasoning, no scoring, no message drafting. The output is exactly the appended rows in the Hiring Signals tab. That tab is the SDR morning queue.

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