← All posts

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

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 →