Hiring signal sheet for B2B sales and recruitment: which target companies opened new roles this week, and in which team (Greenhouse, Lever, Ashby)
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)
| Company | Open roles | New in 7 days | Top department | Roles in your team | Remote share | Salary published | Change vs last week | Status |
|---|---|---|---|---|---|---|---|---|
| Example Payments | 42 | 6 | Engineering | 3 | 38% | 71% | +5 | Hot: call this week |
| Example Logistics | 11 | 1 | Sales | 2 | 9% | 0% | +1 | Warm: your team is hiring |
| Example Health | 7 | 0 | Operations | 0 | 0% | 43% | -2 | Watch |
| Example Studio | 0 | 0 | 0 | -1 | Quiet |
"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
- B2B sales teams and agencies: a company opening five sales roles this month is a better time to pitch a sales tool, training or a CRM clean-up than a company with none.
- Recruitment agencies: see which client and prospect companies are growing, in which team, and which ones publish pay ranges.
- Job seekers and career coaches: track openings at a shortlist of companies without checking each careers page by hand.
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}"
postedWithinDays: 0returns every open job, which you need for the open-roles count. The 7-day count is worked out in the sheet.includeDescription: falseleaves out the long job text, so the export is small and easy to import.- In the same
settingstab, put the team word you care about inB1(for exampleSales). Step 3 uses it.
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
- Every Monday, copy column B of
signalsand paste it as values only into column H, so H holds last week's numbers. - 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
jobstab. - Sort
signalsby status, then by C. Work the Hot rows first and note what you did inaccounts!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
- Only Greenhouse, Lever and Ashby. Companies on Workday, iCIMS, SuccessFactors or their own careers system are not covered. For Indian companies on Zoho Recruit, Keka or Freshteam, see the India ATS jobs guide.
- A job post is not a buying signal on its own. Some companies leave evergreen posts open all year, and some reposts get a new published date. Treat the status as a reason to look, not a reason to send a message to everyone.
- Department names are the company's own. One company says "Go To Market", another "Revenue". Check the top department column before trusting the team count.
- Salary fields are only filled when the company publishes pay. For Greenhouse, the actor reads the first pay range stated in the job text, which is often the first location only.
- This lists jobs, not people. If you go on to contact someone at the company, the usual email and data protection rules for your country apply (for EU or UK contacts that includes GDPR).
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
- How to run the Greenhouse, Lever and Ashby jobs actor
- India ATS jobs: Zoho Recruit, Keka and Freshteam
- Speculative job application sheet
- Turn a website contact export into a call sheet
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
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.