Skip to content
NightBreaker Studio

Guides · n8n automation

Build a hiring watchlist with n8n, Apify and Slack

A starter workflow for collecting job listings, recognizing URLs already seen and checking alerts before scheduling them.

Updated 2026-10-28 · 8 min read

A new job posting can be worth investigating: a team may be expanding, replacing someone or testing a new market. It is a signal to examine, not proof of purchasing intent.

This walkthrough combines Career Pages Jobs Scraper with n8n and Slack. It is a configuration guide to test in your own accounts, not an imported workflow that has already been validated there.

Prepare a small test

You need Apify, n8n and a Slack channel you are allowed to post in. Store the Apify token as an n8n credential; do not put it in a URL or a shared workflow export. Check both platforms’ current plan limits and set an Apify spending cap.

Start with one board and a separate test channel. Keep the workflow unpublished while you check its output.

1. Schedule the check

Add a Schedule Trigger for one daily run at 08:00. Set the workflow timezone explicitly. The n8n schedule documentation explains the timezone and publication requirement: saving an unfinished workflow is not the same as scheduling it.

2. Retrieve a bounded sample

Add an HTTP Request node, method POST, with this URL:

https://api.apify.com/v2/acts/nightbreaker_studio~ats-jobs-scraper/run-sync-get-dataset-items

Use Header Auth with header Authorization and credential value Bearer YOUR_APIFY_TOKEN. Send a JSON body; replace the example board with one you have checked:

{
  "companies": ["https://boards.greenhouse.io/stripe"],
  "includeDescription": false,
  "maxJobsPerCompany": 20,
  "postedWithinDays": 0
}

The 20-result cap is for testing, not complete monitoring. When you expand it, account for the number of returned rows. A date filter can reduce output, but missing dates and a missed run can affect coverage; do not use it as the sole record of what is new.

The synchronous Apify endpoint has a 300-second limit. Set a suitable HTTP timeout for this small test. For longer runs, use an asynchronous run followed by status checks or a completion webhook. After a timeout, check Apify before retrying: a failed HTTP request does not necessarily mean the Actor stopped.

Inspect the HTTP node’s JSON output. The next node needs one job per n8n item. If your response is wrapped in a list field, split that field into items first. Also check the Actor run’s SUMMARY: an empty or partial dataset is not proof that nothing changed.

3. Compare with what you have already seen

With Remove Duplicates, remove repeated url values within the current input first. Then use a second instance for Remove Items Processed in Previous Executions, with Value Is New and {{ $json.url }}.

This is a simple starter approach, not an exactly-once delivery guarantee. History is finite. A downstream Slack failure can occur after a URL has been remembered; a normal rerun may then omit it. For a business-critical feed, keep a persistent delivery record and mark a job delivered only after the destination confirms success.

4. Send a clearly labelled alert

Connect Slack with a credential allowed to post to the test channel, and send a message such as:

New to this watchlist: {{ $json.title }}
Company: {{ $json.company }}
Location: {{ $json.location }}
Source: {{ $json.url }}

“New to this watchlist” is more accurate than “published today.” The first run sees the existing sample as new. You can instead append the fields to Google Sheets, including the source URL and collection time.

5. Test the behaviour, then publish

  1. Run with a fixed sample and confirm one output per distinct URL.
  2. Repeat the same sample: it should produce no new alert while those URLs remain in history.
  3. Add one synthetic test URL in an isolated test input: expect one new alert. Keep test data out of the production watchlist.
  4. Test a destination failure and decide how to recover its undelivered items. Configure an error notification.
  5. Only then publish the workflow and check its first scheduled execution.

Budget repeated collection

At $1.50 per 1,000 results, 200 rows collected every day for 30 days represent 6,000 results, or $9 in result charges, before other applicable charges. Deduplication in n8n happens after collection and does not remove that cost. Add n8n hosting or subscription costs and any model usage separately.

Want help implementing it? Send the boards, expected volume and destination before ordering. We can agree a bounded workflow and acceptance checks through Fiverr.

Discuss an automation
← More guides