Gmail to Slack, only the best Upwork leads
Your Upwork job alerts are “helpful” until they bury the real opportunities under a pile of almost-right gigs. You scan, you skim, you second-guess, and suddenly 30 minutes is gone with nothing to show for it.
If you’re a freelancer trying to respond fast, this Upwork lead scoring automation is the difference between “I’ll apply later” and “I already sent the best proposal.” Agency owners feel it too, because the best-fit leads are rare and time-sensitive. Even a marketing consultant juggling client work can’t afford endless inbox triage.
This n8n workflow pulls Upwork alert emails from Gmail, extracts what matters, scores the fit with AI, and only then posts the winners into Slack. You’ll see how it works, what you need, and what to tweak so the scoring matches your exact niche.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Gmail to Slack, only the best Upwork leads
flowchart LR
subgraph sg0["Get Filtered Messages Flow"]
direction LR
n0["<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/markdown.dark.svg' width='40' height='40' /></div><br/>Convert To Markdown"]
n1@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Chat Model", pos: "b", h: 48 }
n2@{ icon: "mdi:message-outline", form: "rounded", label: "Mark as Read", pos: "b", h: 48 }
n3@{ icon: "mdi:play-circle", form: "rounded", label: "Get Filtered Messages", 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/slack.svg' width='40' height='40' /></div><br/>Send Slack Alert"]
n5@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Chat Model1", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter By Score", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Opportunity Scorer", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Job Data Extractor", pos: "b", h: 48 }
n6 --> n7
n2 --> n0
n7 --> n4
n9 --> n8
n8 --> n6
n0 --> n9
n3 --> n2
n1 -.-> n9
n5 -.-> n8
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 n3 trigger
class n8,n9 ai
class n1,n5 aiModel
class n7 decision
classDef customIcon fill:none,stroke:none
class n0,n4 customIcon
The Problem: Upwork Alerts Create More Work Than Leads
Upwork alerts sound like an advantage, but the default filters are blunt. You still end up reading dozens of “maybe” jobs to find one that’s actually a match for your skills, rate, and preferred project type. And because Upwork is competitive, the timing hurts almost as much as the noise. You might find the perfect job 40 minutes after it landed, which is usually too late to be early. Meanwhile your actual billable work is sitting there, waiting.
The friction compounds. It’s not one bad alert. It’s 20 small interruptions that break your day apart.
- You waste about 5 minutes per email just to decide “no,” and those minutes stack up fast.
- You miss strong-fit jobs because they look like the rest at a glance, especially when you’re busy.
- Copy-pasting snippets into notes or Slack is tedious, so you don’t track what you’ve already seen.
- When you do spot a good one, you still hesitate because you’re not confident it matches your criteria.
The Solution: Gmail → AI Scoring → Slack for High-Fit Jobs
This workflow watches your Gmail inbox for Upwork job alert emails and does the first round of filtering for you. Every time it finds new alerts, it pulls the email content, turns it into clean text, and extracts key job details like title, description snippet, and metadata. Then an AI “opportunity scorer” compares that job data against the profile and preferences you provide (your bio, tools you know, industries you like, rate boundaries, the kind of work you avoid). If the score clears your threshold, n8n posts a structured Slack message so you can review it immediately and act. If it doesn’t, it stays out of your way. Honestly, that’s the whole point.
The workflow starts with a Gmail trigger that polls for Upwork alerts on a set schedule (10 minutes by default). AI extracts the job details, scores the fit, and assembles a neat summary. Finally, Slack only gets the jobs that pass your minimum rating.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you get about 25 Upwork alerts per day. If you spend even 5 minutes per email to judge fit, that’s roughly 2 hours daily of scanning and second-guessing. With this workflow, you still “receive” those alerts, but you only read the top handful that pass your score threshold in Slack, which might be 3–5 messages. Most days, that’s closer to 10 minutes of review plus a quick apply, instead of losing a big chunk of your morning.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Gmail to read Upwork alert emails.
- Slack to deliver high-fit alerts to a channel.
- LLM provider credentials (set up in OpenRouter or your chosen model provider).
Skill level: Intermediate. You’ll connect accounts, add your profile text into the scoring prompt, and adjust a threshold filter.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Gmail polling trigger. n8n checks your Gmail inbox every 10 minutes (by default) and pulls in Upwork job alert emails that match the trigger’s query.
Email cleanup and parsing. The workflow flags messages as read, renders the email into consistent text, then prepares the content so it’s easier to extract structured fields from messy email formatting.
Job extraction and AI fit scoring. AI nodes extract the job’s title, snippet, and metadata, then score the opportunity against the freelancer bio and criteria you paste into the “Opportunity Scorer” prompt.
Threshold filtering and Slack posting. If the score is high enough, n8n assembles the final fields into a clean message and posts it into your chosen Slack channel.
You can easily modify the score threshold to match your calendar (busy weeks vs. hunting weeks) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Gmail Trigger
Set up the workflow to listen for new Upwork job alert emails and pass them into the processing chain.
- Add and open Retrieve Filtered Emails (gmailTrigger) as the trigger node.
- Credential Required: Connect your gmailOAuth2 credentials.
- Set Filters → Query to
from:([YOUR_EMAIL]) subject:(New job:). - Set the polling schedule to run every
10minutes. - Disable Simple by setting it to
falseso full message data is available.
Step 2: Connect Gmail Actions
Mark each processed email as read and prepare the body content for AI extraction.
- Open Flag Email Read and set Operation to
markAsRead. - Set Message ID to
{{ $json.id }}. - Credential Required: Connect your gmailOAuth2 credentials.
- In Render Markdown Text, set HTML to
{{ $('Retrieve Filtered Emails').item.json.textAsHtml }}and Destination Key tomarkdown.
Step 3: Set Up AI Extraction for Job Details
Extract structured job data from the email content using the language model and schema.
- Open Extract Job Details and set Text to
Below is a job alert email received from Upwork. Please extract the requested information in valid JSON format. Subject: {{ $('Retrieve Filtered Emails').item.json.subject }} Body: {{ $json.markdown }}. - Keep Schema Type as
manualand use the provided JSON schema for fields likejobName,jobType,price, andtags. - Primary Chat Model is connected as the language model for Extract Job Details — Credential Required: Connect your openRouterApi credentials in Primary Chat Model, not in the extractor.
Step 4: Set Up AI Scoring and Result Assembly
Score the job’s fit using your profile, then assemble evaluation and job data into a single object.
- In Assess Opportunity Fit, keep the evaluation prompt in Text and ensure the profile block is customized to your real skills and preferences.
- Confirm the job payload reference in the prompt is
{{ JSON.stringify($json.output, null, 2) }}. - Secondary Chat Model is connected as the language model for Assess Opportunity Fit — Credential Required: Connect your openRouterApi credentials in Secondary Chat Model, not in the extractor.
- In Assemble Result Fields, set evaluation to
{{ $json.output }}and job to{{ $('Extract Job Details').item.json.output }}.
Step 5: Configure Filtering and Slack Output
Filter to only high-scoring opportunities and post formatted alerts to Slack.
- In Filter by Rating, set the condition to Number with Left Value
{{ $json.evaluation.score }}and Operationgtewith Right Value7. - Open Post Slack Notice and set Select to
channel, then pick your target channel ID. - Set Text to the provided multi-line message string, which uses expressions such as
{{ $json.job.jobName.toUpperCase() }}and{{ $json.evaluation.score }}. - Credential Required: Connect your slackApi credentials.
Tip: If no Slack messages appear, verify that the Filter by Rating threshold of 7 isn’t excluding all results during testing.
Step 6: Test and Activate Your Workflow
Validate the end-to-end flow with a real Upwork alert and then activate for continuous monitoring.
- Click Execute Workflow and send a test email matching
from:([YOUR_EMAIL]) subject:(New job:). - Confirm Flag Email Read marks the email as read and Render Markdown Text produces a
markdownfield. - Verify Extract Job Details outputs a structured JSON object and Assess Opportunity Fit returns
scoreandreasoning. - Check that Post Slack Notice sends a message when the score is
7or higher. - Toggle the workflow to Active to run it automatically on the schedule.
Common Gotchas
- Slack credentials can expire or need specific permissions. If things break, check your Slack app scopes (at minimum chat:write.public and channels:read) and confirm the OAuth token is still valid.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if you already have Gmail, Slack, and your model credentials ready.
No. You’ll mostly connect accounts and paste your profile text into the scoring prompt.
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 LLM API costs, which are usually a few dollars a month at typical alert volumes.
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 you should. Update the text inside the
Most of the time it’s an expired or revoked OAuth connection in n8n. Reconnect your Gmail credential, then confirm the trigger query still matches Upwork alerts and the workflow has permission to read and modify messages (it marks emails as read). If it works once and then stops, check Gmail security alerts and any workspace admin restrictions.
Plenty for normal usage. The bigger limiter is your execution volume and LLM usage: on n8n Cloud Starter you get a monthly execution cap, while self-hosting removes that cap and shifts the limit to your server. Practically, most freelancers can process dozens of alerts per day without issues, and you can always reduce polling frequency if you want to spend fewer executions.
For AI-based scoring and more detailed control, n8n is usually the better fit. You can branch, filter, and shape messages without paying extra for every “path,” and self-hosting is there if you outgrow usage limits. Zapier or Make can still work if you only want “Gmail email received → Slack message,” but once you add extraction, scoring, and thresholds, costs and complexity tend to creep up. If you want help choosing, Talk to an automation expert and get a quick recommendation based on your alert volume.
This is what “being early” looks like without living in your inbox. Let the workflow do the sorting so you can spend your attention on the jobs you actually want.
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.