Nightly hiring signal harvester for target accounts

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

Deterministic Code
AirtopGoogle SheetsSalesLead EnrichmentResearch & Monitoring
PromptCreate

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.

Additional information

What does this prompt do?
  • Runs every night at 2am and reads a Target Accounts tab in Google Sheets to know which careers pages to check.
  • Opens a cloud browser on each careers page and pulls every open role with title, department, location, and posted date.
  • Filters to just the departments that matter for outbound (Sales, RevOps, Marketing, and Customer Success by default).
  • Skips anything already in your Hiring Signals tab, then appends the fresh hits with company, role, location, posted date, source URL, and detected-at timestamp.
What do I need to use this?
  • A Google account with edit access to a spreadsheet that has a Target Accounts tab and a Hiring Signals tab.
  • An Airtop account for the cloud browser that visits each careers page.
  • The list of departments you want to track (Sales, RevOps, Marketing, and Customer Success are pre-filled).
How can I customize it?
  • Change the run time (default 2am nightly) to match when your SDRs review their queue.
  • Edit the list of trigger departments to match your ICP (add Product, drop Marketing, whatever fits your motion).
  • Point the Target Accounts and Hiring Signals tabs at any spreadsheet you own.

Frequently asked questions

What goes in the Target Accounts tab?
One row per company, with the company name in the first column and the URL of their careers or jobs page in the second. The workflow skips the header and any row missing a URL.
How does it avoid duplicates?
Before appending anything, each role is matched against the Hiring Signals tab on company plus role title plus location. Only genuinely new combinations get logged, so re-running the workflow is safe.
Will this work if a careers page uses infinite scroll or a Load More button?
Yes. The cloud browser follows pagination and infinite scroll while pulling structured job data, so pages that reveal roles progressively are handled the same as static lists.
Does it post the results to Slack or email?
No. This workflow is a straight harvester that writes to your Hiring Signals tab. Your SDRs check that tab as their morning queue, and you can layer notifications on top separately if you want them.
How much does it cost to run?
Airtop bills by browser session time, so cost scales with how many careers pages you scan each night. Trimming the Target Accounts tab or narrowing the trigger departments is the easiest way to keep spend down.

Turn every new hire at your target accounts into an outbound trigger.

Let a cloud browser watch careers pages overnight so your SDR queue is ready by morning.