← All posts

Send Upwork Jobs to Slack: Real-Time Alerts in 10 Minutes

Upwork has no Slack integration and no public API. But if you run a freelance team — or you just live in Slack while you work — the place you want new jobs to show up is a channel, not another browser tab you have to remember to refresh.

The fix is a webhook relay. Vibeworker watches the Upwork feed around the clock, scores every job the moment it posts, and fires a POST request to any URL you give it when a job matches your filters. A ~20-line relay reformats that payload for Slack. Total setup is about ten minutes, and the result is a channel where good jobs appear seconds after they go live — already scored, so you're not wading through junk.

This is the difference from piping in a raw RSS feed: every job arrives with AI ratings for quick-win potential, scope clarity, and client red flags. Your channel only sees jobs that cleared your bar.

What you're building

Upwork → Vibeworker (scores the job) → webhook POST → tiny relay → Slack channel

The relay exists because Slack's incoming webhooks expect a { "text": ... } payload, while Vibeworker sends a structured job object. Twenty lines of translation, hosted free.

Step 1 — Create a Slack incoming webhook

In Slack, go to api.slack.com/apps → Create New App → From scratch. Enable Incoming Webhooks, add one to the channel you want, and copy the https://hooks.slack.com/services/... URL.

Step 2 — Deploy the relay

Any serverless host works. Cloudflare Workers is free at this volume and deploys in one command:

// Cloudflare Worker — relay Vibeworker webhooks to Slack
export default {
  async fetch(request, env) {
    const body = await request.json();
    if (body.event !== 'job.matched') return new Response('ok');

    const { job, match, client } = body;
    const text = [
      `*${job.title}*`,
      `${job.budget.display} · ${job.type} · ${client.location ?? 'location n/a'}`,
      `Quick Win ${match.scoreQuickWin}/10 · Scope ${match.scoreScopeClarity}/10 · Red Flags ${match.scoreRedFlags}/10 · ~${match.effortEstimateHours}h`,
      `<${job.url}|View on Upwork>`,
    ].join('\n');

    await fetch(env.SLACK_WEBHOOK_URL, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ text }),
    });
    return new Response('ok');
  },
};

Deploy with wrangler deploy, set SLACK_WEBHOOK_URL as a secret (wrangler secret put SLACK_WEBHOOK_URL), and copy your worker's URL. Treat the worker URL like a password — anyone who has it can post to your channel, so don't publish it anywhere.

Rather hire someone than DIY? I take these gigs myself — yes, the founder of the Upwork tool freelances on the side; it keeps me honest. Email mike@voyagerappstudio.com with what you need and I'll scope it.

Step 3 — Point Vibeworker at it

In your Vibeworker dashboard, open the alert settings on the filter you want piped to Slack, enable the Webhook channel, and paste your worker URL. Then hit Preview alert — Vibeworker sends a real sample payload immediately, so you can confirm the message lands in your channel without waiting for a live job.

From then on, every job that matches that filter posts to Slack within seconds of appearing on Upwork. Webhook alerts are a Pro feature; if you're on the free plan, you can get the same data by polling the REST API on a schedule instead.

Keeping the channel useful

The failure mode of any job alert channel is noise — once people stop reading it, it's dead. You have two places to filter, and the order matters.

Filter in Vibeworker first. Your filter decides which jobs fire the webhook at all, and the scoring means you can set a real quality bar, not just keywords. A filter tuned to your skills with a red-flag floor produces a channel where most posts are worth a click.

The relay is your second pass for team-specific logic. One line drops anything below your bar before it reaches Slack:

if (match.scoreRedFlags < 7 || match.scoreQuickWin < 6) return new Response('ok');

For a team, the cleaner pattern is multiple filters in Vibeworker, each pointed at its own channel — #leads-react and #leads-wordpress with different bars, instead of one channel everyone tunes out.

Other destinations

The same relay pattern works anywhere that accepts a webhook — Discord is a near-identical setup with richer message formatting. Telegram needs no relay at all: Vibeworker sends Telegram alerts natively, so only build this if Slack is where your team already lives. And if you want multi-step logic — logging to a spreadsheet, drafting proposals — that's a job for a workflow tool, which we'll cover in an upcoming n8n guide.


Vibeworker watches the Upwork feed 24/7 and scores every job before it hits your Slack channel. Get started free →


Michael Watkins

Michael Watkins

Founder of Vibeworker. Helping freelancers win the Upwork game through speed and data.

Stop missing the jobs that matter

Vibeworker watches the Upwork feed and alerts you the moment a high-fit job appears — before the proposals pile up.

Start free trial →