Unadhi Guides

Hiring signal sheet for B2B sales and recruitment: which target companies opened new roles this week, and in which team (Greenhouse, Lever, Ashby)

Updated 25 Oct 2026 · Disclosure: the jobs actor linked below is an Unadhi product on the Apify Store. This guide is free, and the sheet layout works with any export that has one row per job with company, department and published date. Current Apify pricing is only on the Store page. This page has no affiliate links and nobody paid to be mentioned.

What you get: a hiring signal sheet in one Google Sheet with one row per target company: how many roles are open, how many were published in the last 7 days, the department hiring most, how many roles are in the team you sell to, the share of remote roles, the share with a published salary, the change since last week and a Hot / Warm / Watch / Quiet status. It is built for B2B sales teams, recruitment agencies and freelancers who want to know which accounts are growing this week. The jobs come from public Greenhouse, Lever and Ashby job boards. The example rows and numbers are made up.

The finished sheet

signals tab (example rows are made up)

CompanyOpen rolesNew in 7 daysTop departmentRoles in your teamRemote shareSalary publishedChange vs last weekStatus
Example Payments426Engineering338%71%+5Hot: call this week
Example Logistics111Sales29%0%+1Warm: your team is hiring
Example Health70Operations00%43%-2Watch
Example Studio000-1Quiet

"Roles in your team" counts jobs whose department contains the word you set (for example Sales if you sell sales tools, Data if you place data engineers).

Who this is for

Step 1: the accounts tab

Add a tab named accounts with A Company, B Board, C Why they matter and D Owner in row 1, then one row per target company. In B Board put the job board address, for example https://job-boards.greenhouse.io/examplepay, https://jobs.lever.co/examplelogistics or https://jobs.ashbyhq.com/examplehealth. You find it by opening the company's careers page and clicking any job: the address bar shows which of the three systems it uses. The actor also accepts a bare company slug or the careers page address and tries to find the board itself.

Step 2: run the jobs pull for every company at once

Open the ATS Jobs API: Greenhouse, Lever & Ashby on the Apify Store. It reads each company's public job board feed and returns one row per open job in the same columns, whichever system the company uses. To build its input from your sheet, put this in any empty cell of a tab named settings, then copy the result into the input's JSON view:

="{""boards"": [" & TEXTJOIN(",", TRUE, ARRAYFORMULA(IF(accounts!B2:B="", "", """" & TRIM(accounts!B2:B) & """"))) & "], ""postedWithinDays"": 0, ""includeDescription"": false}"

When the run finishes, export the dataset as CSV and import it into the same Google Sheet (File → Import → Upload, "Insert new sheet"). Name the tab jobs. Then open the run's key-value store and look at BOARDS_SUMMARY: it lists each board with its status and job count, so you can see which companies returned nothing because the address was wrong or they use a different system.

Step 3: the signals tab

CSV column positions can change between runs, so every formula looks a column up by its header name. Add a tab named signals with these headers: A Company, B Open roles, C New in 7 days, D Top department, E Roles in your team, F Remote share, G Salary published, H Last week, I Change, J Status.

A2, the companies found in this run:

=SORT(UNIQUE(FILTER(INDEX(jobs!A:ZZ, 0, MATCH("company", jobs!$1:$1, 0)), ROW(jobs!A:A)>1, INDEX(jobs!A:ZZ, 0, MATCH("company", jobs!$1:$1, 0))<>"")))

B2, open roles:

=IF(A2="", "", COUNTIF(INDEX(jobs!A:ZZ, 0, MATCH("company", jobs!$1:$1, 0)), A2))

C2, roles published in the last 7 days (the ATS dates are in UTC, written like 2026-10-21T09:30:00Z, so the formula reads the first 10 characters):

=IF(A2="", "", SUMPRODUCT((INDEX(jobs!A:ZZ, 0, MATCH("company", jobs!$1:$1, 0))=A2) * (IFERROR(DATEVALUE(LEFT(INDEX(jobs!A:ZZ, 0, MATCH("publishedAt", jobs!$1:$1, 0)), 10)), 0) >= TODAY()-7)))

D2, the department with the most open roles:

=IF(A2="", "", IFERROR(INDEX(QUERY({INDEX(jobs!A2:ZZ, 0, MATCH("department", jobs!$1:$1, 0)), INDEX(jobs!A2:ZZ, 0, MATCH("company", jobs!$1:$1, 0))}, "select Col1, count(Col2) where Col2 = '" & SUBSTITUTE(A2, "'", "''") & "' and Col1 is not null group by Col1 order by count(Col2) desc limit 1", 0), 2, 1), ""))

E2, roles in the team you set in settings!B1:

=IF(A2="", "", COUNTIFS(INDEX(jobs!A:ZZ, 0, MATCH("company", jobs!$1:$1, 0)), A2, INDEX(jobs!A:ZZ, 0, MATCH("department", jobs!$1:$1, 0)), "*" & settings!$B$1 & "*"))

F2, share of remote roles, and G2, share with a published salary (format both as %):

=IF(OR(A2="", B2=0), "", COUNTIFS(INDEX(jobs!A:ZZ, 0, MATCH("company", jobs!$1:$1, 0)), A2, INDEX(jobs!A:ZZ, 0, MATCH("workplaceType", jobs!$1:$1, 0)), "REMOTE") / B2)
=IF(OR(A2="", B2=0), "", COUNTIFS(INDEX(jobs!A:ZZ, 0, MATCH("company", jobs!$1:$1, 0)), A2, INDEX(jobs!A:ZZ, 0, MATCH("salaryMin", jobs!$1:$1, 0)), "<>") / B2)

H is last week's open roles (see Step 4). I2: =IF(OR(A2="", H2=""), "", B2-H2).

J2, the status. This is a working rule of ours, not an industry standard; change the numbers to suit your market:

=IF(A2="", "", IF(C2>=3, "Hot: call this week", IF(AND(C2>=1, E2>=1), "Warm: your team is hiring", IF(B2=0, "Quiet", "Watch"))))

Companies that use a different system, or whose address was wrong, will not appear in signals at all. Add them back as Quiet by hand only after checking BOARDS_SUMMARY, so a broken address is not mistaken for a company that stopped hiring.

Step 4: the weekly routine

  1. Every Monday, copy column B of signals and paste it as values only into column H, so H holds last week's numbers.
  2. Run the actor again with the same input (you can save it as a task and add a schedule in Apify Console), export the CSV and import it over the jobs tab.
  3. Sort signals by status, then by C. Work the Hot rows first and note what you did in accounts!D.

If a company is missing this week but was there last week, its column A row disappears, so keep a copy of the previous week's tab (right-click the tab, Duplicate) before importing.

A first message you can adapt

Hi [name], I saw [company] has opened [n] [department] roles in the last few weeks, including [job title]. Teams growing that fast usually hit [problem you solve] around now. We help [type of company] with [one-line offer]. Would a 15-minute call next week be useful? If not, no reply needed.

Mention only what the public job post says. Do not guess about funding, layoffs or reasons for hiring.

What this sheet cannot tell you

The three job board feeds are documented and public: the Greenhouse Job Board API says job board data "is publicly available, so authentication is not required" for reading jobs, the Lever Postings API notes that published postings are publicly viewable, and Ashby documents its public job posting API for careers pages.

Related

Questions

How do I know which job system a company uses?

Open any job on its careers page. If the address contains greenhouse.io, lever.co or ashbyhq.com, the sheet works for that company. If not, the company uses another system.

How often should I refresh the sheet?

Once a week is enough for most sales and recruitment work. Hiring plans change over weeks, not hours.

Why does a company show 0 open roles?

Either it has no open jobs, or the board address was wrong. Check the run's BOARDS_SUMMARY: a wrong address shows an error or zero jobs found for that input.

Partner programme opening soon: join the free waitlist. Planned terms are 50% of each referred sale (75% once you have 5+ paying customers), single level, paid through Gumroad only from revenue received. Join the partner waitlist

← All guides

Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.