Watch Upwork every three hours and score each job against your profile

Saurabh Agarwal built an n8n workflow that scrapes Upwork every three hours, scores each new job 0-100 with Gemini and only pings Telegram above 95; defaults cost about $49 a month.

Done withn8ninApifyGeminiGoogle SheetsTelegram· Oct 22, 2026

What they did

Agarwal's workflow runs on a three-hour schedule with every setting in one config node. It calls an Apify Upwork scraper over HTTP, drops jobs containing excluded phrases such as no agencies or US only, reads his Google Sheet once and removes jobs already logged by id, then loops one job at a time with a four-second wait to stay inside Gemini's free rate limit. Gemini scores each job from 0 to 100 against a rubric built from his profile. A switch drops anything under 80, saves 80 to 94 to Sheets, and saves plus sends 95 and above to Telegram, capped at five messages per run. An error trigger sends one Telegram message if anything fails.

How it went

He lists the things that tripped him up. The scraper ignores resultsPerQuery and reads maxItems with a minimum of 20 per search term, so his first runs pulled 96 jobs including fixed-price ones. Without sorting by recency the dedupe threw away most of each run, because relevance kept returning the same jobs. Setting the Sheet id by expression was flaky until he picked it from the list in each node. On self-hosted n8n his Google OAuth app had to be published, because sign-in expires after seven days while it is in testing.

Worth knowing

Apify costs about $0.0034 per job, so his defaults of three search terms by 20 jobs every three hours come to roughly $49 a month; one term every 12 hours is about $4 and fits Apify's free credit. He sells a packaged version with a setup guide. He reports no figures on jobs won from the alerts.

Try it

With n8n· 11 parts to fill in

Build me an [n8n] workflow that checks [job board] every [3] hours for new postings matching [my search terms]. Drop any posting containing [excluded phrases]. Keep a sheet of posting ids already seen and skip those, sorting results by most recent so the dedupe does not eat each run. Send each new posting to [Gemini or my model] and have it score 0-100 against this profile: [my skills, rates and the work I want]. Log anything over [80] to the sheet, and message me on [Telegram] only for scores over [95], at most [5] per run. Alert me once if a run fails.

Square brackets are the parts to fill in. The prompt is ours; the story is theirs.

Where they said it

Related