Upwork to Slack, only new job alerts that matter
Refreshing Upwork all day is a trap. You lose focus, you still miss great posts, and half the “new” jobs you click are ones you already saw yesterday.
This is the exact pain freelancers feel when pipeline is tight. It also hits agency owners trying to keep benches filled, and recruiters juggling too many searches at once. With Upwork Slack alerts, you get only fresh job posts, pushed straight to a channel you already watch.
This workflow pulls Upwork jobs on a schedule, filters duplicates using a database, then posts the new ones to Slack. You’ll see what it does, what you need, and how to make it match your keywords and work hours.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Upwork to Slack, only new job alerts that matter
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign parameters", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Query For Upwork Job Posts"]
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Working Hours", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/mongodb.svg' width='40' height='40' /></div><br/>Find Existing Entries"]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Output New Entries"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/mongodb.svg' width='40' height='40' /></div><br/>Add New Entries To MongoDB"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Send message in #general"]
n3 --> n0
n2 --> n3
n0 --> n1
n5 --> n6
n5 --> n7
n4 --> n5
n1 --> n4
n1 --> n5
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2 trigger
class n3 decision
class n4,n6 database
class n1 api
classDef customIcon fill:none,stroke:none
class n1,n4,n5,n6,n7 customIcon
The Problem: Upwork Monitoring Turns Into Busywork
When you’re trying to win on Upwork, speed matters. But “staying on top of it” usually means opening the same search again and again, scanning titles you’ve already scanned, and hoping the one good opportunity doesn’t show up while you’re in a call. It’s not just time. It’s context switching, second-guessing, and that low-grade stress that you’re always a little late. And if you’re managing multiple keywords or niches, the mess multiplies fast.
It adds up fast. Here’s where it breaks down in real life.
- You end up checking Upwork every 20–30 minutes, which quietly steals about 1–2 hours of a workday.
- Duplicate listings waste attention because the same jobs resurface in search, especially when you tweak filters.
- When you’re busy, you simply forget to refresh, and you find a perfect post an hour after it was published.
- Copying links into Slack (or a notes app) is manual, inconsistent, and easy to abandon after a week.
The Solution: Automatic Upwork Job Fetch + Slack Alerts (No Duplicates)
This workflow watches Upwork for you, on a predictable schedule, and only taps you on the shoulder when something is actually new. Every 20 minutes during your working hours, n8n triggers a run, calls the Apify Upwork API to fetch the latest job listings for your keywords, and then compares those results against what you’ve already seen. Instead of trusting your memory, it stores unique jobs in MongoDB, so duplicates get filtered out automatically. When a brand-new listing appears, the workflow posts a message to Slack with the job details, which means you can review and respond while you’re already in “work mode.”
The workflow starts on a schedule and checks that it’s within your chosen hours (default is 9 AM to 5 PM). Then it pulls listings from Upwork via Apify, compares them to what’s stored in MongoDB, and sends only the new items to Slack. No refreshing. No deja vu posts.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you track 3 Upwork searches (like “n8n”, “Python”, and “automation”) and you check each one about once an hour. If each check takes only 3 minutes to load, scan, and open a couple posts, that’s roughly 24 checks a day, or about 70 minutes of pure scanning. With this workflow, you spend maybe 5 minutes setting keywords and Slack once, then you just react to messages. The run happens every 20 minutes, so you’re usually seeing new posts within the hour without babysitting a browser tab.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Apify to fetch Upwork job listings via API.
- MongoDB to store jobs and remove duplicates.
- Slack to receive new job alerts in a channel.
- Apify token (get it from your Apify account settings).
Skill level: Beginner. You’ll connect accounts, paste a few credentials, and edit keywords and a time window.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled run checks your work window. n8n triggers every 20 minutes, then an “are we within working hours?” rule decides if the workflow should continue.
Your keywords are mapped into the request. A simple “set fields” step loads the search parameters (the workflow uses a start URL list), so you can change what you’re monitoring without rewriting anything.
Upwork listings are fetched and compared to your database. n8n calls Apify to retrieve job posts, then looks up stored records in MongoDB. A merge + filter keeps only the jobs that haven’t been saved before.
New jobs are saved and pushed to Slack. Fresh listings get inserted into MongoDB first (so you don’t get re-alerted), then a Slack message posts the details to your chosen channel.
You can easily modify the keywords and the working-hours logic based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
This workflow starts on a recurring schedule, then checks if the run is within your desired work window.
- Add the Scheduled Run Trigger node and set Rule to run every
10minutes. - Connect Scheduled Run Trigger to Check Work Window.
- In Check Work Window, set the first condition Left Value to
{{ $json.Hour }}with Operationgtand Right Value2. - Add the second condition with Left Value
{{ $json.Hour }}, Operationlt, and Right Value15.
⚠️ Common Pitfall: The Check Work Window node expects an Hour field in the incoming data. Ensure your trigger or an upstream node provides it if you customize this workflow.
Step 2: Connect the Job Data Source
Map input variables for the API call and configure the HTTP request that retrieves job listings.
- In Map Input Variables, set startUrls (type array) to
[{"url":"https://www.upwork.com/nx/search/jobs/?nbs=1&q=python","method":"GET"},{"url":"https://www.upwork.com/nx/search/jobs/?nbs=1&q=java","method":"GET"}]. - Set proxyCountryCode to
FR. - Connect Check Work Window to Map Input Variables, then connect Map Input Variables to Retrieve Job Listings.
- In Retrieve Job Listings, set URL to
=https://api.apify.com/v2/acts/arlusm~upwork-scraper-with-fresh-job-posts/run-sync-get-dataset-itemsand Method toPOST. - Enable Send Body and set body parameters: startUrls to
{{ $json.startUrls }}and proxyCountryCode to{{ $json.proxyCountryCode }}. - Credential Required: Connect your httpQueryAuth credentials in Retrieve Job Listings.
Step 3: Set Up Record Matching and Merging
Check for already stored listings and merge only new records.
- Connect Retrieve Job Listings to both Search Stored Records and Combine Fresh Records in parallel.
- In Search Stored Records, set Collection to
n8nand Query to{ "title": "{{ $json.title }}", "budget": "{{ $json.budget }}" }. - Credential Required: Connect your mongoDb credentials in Search Stored Records.
- In Combine Fresh Records, set Mode to
combine, Join Mode tokeepNonMatches, and Fields To Match totitle, budget. - Connect Search Stored Records to Combine Fresh Records.
Retrieve Job Listings outputs to both Search Stored Records and Combine Fresh Records in parallel to compare new listings and pass raw results for merging.
Step 4: Configure Output Destinations
Save new listings to MongoDB and send Slack alerts for visibility.
- Connect Combine Fresh Records to both Insert New Records and Post Slack Alert in parallel.
- In Insert New Records, set Operation to
insert, Collection ton8n, and Fields totitle,link,paymentType,budget,projectLength,shortBio,skills,publishedDate,normalizedDate,searchUrl. - Credential Required: Connect your mongoDb credentials in Insert New Records.
- In Post Slack Alert, set Text to
Job Title : {{ $json.title }} Published : {{ $json.publishedDate }} Link : {{ $json.link }} Payment Type: {{ $json.paymentType }} Budget: {{ $json.budget }} Skills: {{ $json.skills }} Bio: {{ $json.shortBio }}and select your Channel. - Credential Required: Connect your slackApi credentials in Post Slack Alert.
Combine Fresh Records outputs to both Insert New Records and Post Slack Alert in parallel, so records are saved and announced at the same time.
Step 5: Test and Activate Your Workflow
Validate the complete flow and then enable it for production use.
- Click Execute Workflow to run a manual test starting from Scheduled Run Trigger.
- Confirm that Retrieve Job Listings returns items and that Search Stored Records identifies existing matches.
- Verify new listings are inserted in the
n8ncollection by Insert New Records and that a message appears in Slack from Post Slack Alert. - When successful, toggle the workflow to Active so the schedule runs every 10 minutes.
Common Gotchas
- Apify credentials can expire or the token may not have access to the actor you’re calling. If alerts suddenly stop, check your Apify token and your actor run history first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Slack tokens and workspace permissions can be picky, especially in locked-down orgs. If messages don’t show up, confirm the bot is allowed to post in the channel and reselect the channel ID in the Slack node.
Frequently Asked Questions
About 30 minutes if you already have Apify, MongoDB, and Slack ready.
No. You’ll mostly paste credentials, set your keywords, and choose a Slack channel.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Apify subscription costs and whatever you pay for MongoDB hosting.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s the first thing you should tweak. Update your search keywords in the “Map Input Variables” step (the start URL list), then adjust the “Check Work Window” rules to match your timezone and the hours you actually want notifications. Some people remove the hours filter completely and let it run all day. You can also edit the Slack message text to include extra details like budget, client location, or the direct job URL.
Usually it’s permissions. Reconnect Slack in n8n, confirm the bot is allowed to post in the target channel, and verify the channel ID hasn’t changed (private channels trip people up a lot). If it’s intermittent, you may also be hitting Slack rate limits when many jobs come in at once.
A lot.
Often, yes, because deduping properly usually needs a database lookup plus merge/filter logic, and that gets awkward (and expensive) in some no-code tools. With n8n, you can self-host for unlimited runs, keep your logic in one place, and store “already seen” jobs in MongoDB without weird hacks. Zapier or Make can still work if you’re fine with simpler filtering and fewer searches, and you don’t mind paying more as volume grows. Honestly, the best choice depends on how competitive your niche is and how much you care about duplicates. Talk to an automation expert if you’re not sure which fits.
Once this is running, Upwork becomes a stream you review, not a tab you babysit. The workflow handles the repeatable stuff, so you can spend your attention where it actually wins work.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.