Upwork Job Alerts in Discord: Webhook Setup Guide
Most people searching for an "Upwork Discord bot" are picturing a public bot they invite to their server. Those exist, and they share the same problems: one generic feed for every server, no sense of what you are good at, rate limits you don't control, and an owner who can shut it down or start posting spam whenever they like.
The sturdier version is a webhook you own. Vibeworker scores every new Upwork job in real time and POSTs the matches to a URL you control; a small relay turns each one into a Discord embed. No bot token, no bot process to host, nothing to babysit — and the feed is filtered to your skills and your quality bar, because it's driven by your filters.
What lands in your channel
Each matching job arrives as an embed within seconds of posting on Upwork: the title links straight to the job, the color tells you at a glance whether it's a clean quick win or merely interesting, and the fields carry the numbers — budget, AI scores, estimated effort. You triage from the channel without opening Upwork at all.
Step 1 — Create the Discord webhook
In your server: channel settings → Integrations → Webhooks → New Webhook. Name it, pick the channel, copy the URL. Unlike Slack, Discord webhooks accept rich embeds directly, and there's no app-approval process — this takes under a minute.
Step 2 — The relay
Discord expects its own embed format, so a ~25-line relay translates Vibeworker's payload. Cloudflare Workers hosts it free:
// Cloudflare Worker — Vibeworker webhook → Discord embed
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;
// green = clean client and quick win; yellow = look closer
const color = match.scoreRedFlags >= 8 && match.scoreQuickWin >= 7 ? 0x22c55e : 0xeab308;
await fetch(env.DISCORD_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
embeds: [{
title: job.title,
url: job.url,
color,
fields: [
{ name: 'Budget', value: job.budget.display, inline: true },
{ name: 'Type', value: job.type ?? '—', inline: true },
{ name: 'Effort', value: `~${match.effortEstimateHours}h`, inline: true },
{ name: 'Quick Win', value: `${match.scoreQuickWin}/10`, inline: true },
{ name: 'Scope', value: `${match.scoreScopeClarity}/10`, inline: true },
{ name: 'Red Flags', value: `${match.scoreRedFlags}/10`, inline: true },
],
footer: { text: `Filter: ${body.filterName} · Client: ${client.location ?? 'n/a'}` },
}],
}),
});
return new Response('ok');
},
};
Deploy with wrangler deploy and set the Discord URL as a secret: wrangler secret put DISCORD_WEBHOOK_URL. Keep your worker URL private — it's the only thing standing between the internet and your channel.
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 — Connect Vibeworker
In the Vibeworker dashboard, open alert settings on the filter you want in Discord, enable the Webhook channel, and paste the worker URL. Hit Preview alert to fire a sample payload right away and confirm the embed renders.
Webhook alerts are a Pro feature. On the free plan you can still see your full scored feed in the dashboard, or poll the REST API on a schedule for the same data.
Agency servers: one channel per niche
This is where the webhook approach beats any public bot outright. An agency or bid team can run one Vibeworker filter per vertical — React work, WordPress, design — and point each at its own webhook and channel: #leads-react, #leads-wordpress, #leads-design. Each filter carries its own quality bar, each channel stays high-signal, and whoever owns that lane watches one channel instead of everyone skimming everything. The relay code doesn't change; you just deploy it once per channel with a different secret.
Why not a public bot?
Worth answering directly, since it's what most people search for. A shared bot can't know your skills, so it posts everything — and a channel that posts everything gets muted within a week. It also lives or dies with someone else's hosting and someone else's judgment about what's worth posting. The webhook version is twenty-five lines, runs on a free tier, and the filtering brain behind it is tuned to you. The comparison of alert tools covers the broader landscape if you're still choosing.
Variations
The same pattern drives Slack with a slightly simpler payload. Telegram needs none of this — Vibeworker sends Telegram alerts natively, no relay required. Build the Discord version when Discord is where you or your team actually look.
Stop refreshing the feed — let scored Upwork jobs come to your server instead. Get started free →

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.
Get started free →Keep reading
n8n Upwork Job Alerts: Webhook → AI Proposal → Gmail (Free Template)
Build an n8n workflow that catches new Upwork jobs via webhook, generates a draft proposal with AI, and emails it to you in under 20 minutes. Free importable template included.
Vibeworker Webhook Quickstart: Real-Time Upwork Job Alerts
Set up Vibeworker webhooks in under five minutes. Full payload reference, security guide, and copy-paste receiver examples for n8n, Cloudflare Workers, Zapier, and curl.
5 Upwork Automations You Can Build This Weekend
Five practical Upwork automations — Slack and Discord job alerts, an n8n filtering bot, a deal-finder script, and a personal market tracker — each buildable in under an hour, with guides and tested starter code.