🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Upwork to Google Sheets, leads scored and logged

Lisa Granqvist Partner Workflow Automation Expert

Upwork searching looks simple until you’re doing it every day. Tabs pile up, “maybe” jobs blur together, and you lose good leads because you saw them too late (or forgot where you saved them).

If you’re a freelancer chasing consistent work, you already know the grind. Agency owners tracking multiple categories feel it too, and consultants who need better-fit clients get hit hardest. This Upwork lead scoring automation filters the noise and highlights the opportunities worth replying to.

You’ll set up an n8n workflow that pulls jobs on a schedule, scores them with GPT-4, logs everything in Google Sheets, drafts proposals, and pings you in Telegram so you can act fast.

How This Automation Works

Here’s the complete workflow you’ll be setting up:

n8n Workflow Template: Upwork to Google Sheets, leads scored and logged

Why This Matters: Upwork Search Creates Busywork

Manually hunting for Upwork jobs is deceptively expensive. You read the same vague briefs, open a bunch of “could be good” posts, then realize the budget is wrong or the client history is a mess. Meanwhile, the best projects get 20 proposals before you even notice them. It’s not just time. It’s the mental load of deciding what’s worth your attention, then trying to remember which leads you already reviewed so you don’t waste time re-checking them tomorrow.

The friction compounds. Here’s where it breaks down in real life.

  • You end up scanning the same listings again because there’s no reliable “seen” system tied to a Job ID.
  • Quality gets mixed with junk, which means you spend about an hour a day reading posts you’ll never apply to.
  • Even when you find a strong lead, writing a tailored first draft takes long enough that you reply late.
  • Without a simple log, it’s hard to spot patterns in what you win, what you lose, and what you should stop chasing.

What You’ll Build: Scored Upwork Leads + Draft Proposals in Sheets

This workflow runs automatically every 6 hours (you can change that). It uses an Apify scraper to fetch Upwork jobs that match your criteria, then compares them against the Job IDs already stored in your Google Sheet so you only review new opportunities. Next, GPT-4 evaluates each job for fit, client quality, and budget, and assigns a simple 0–100 score. Anything below your threshold gets dropped. Anything above it moves forward to proposal drafting, so you end up with a ready-to-edit draft and a clean log of what happened. Finally, Telegram sends you a summary notification, so you can jump on the best leads without living inside Upwork all day.

The workflow starts on a schedule, pulls listings, and removes duplicates. Then AI scores and filters the best jobs, drafts proposals for those, logs results into Google Sheets, and sends a Telegram recap so you know exactly what to review.

What You’re Building

Expected Results

Say you check Upwork 4 times a day and spend about 20 minutes each time scanning, opening tabs, and shortlisting. That’s roughly 80 minutes daily, and it still doesn’t produce a proposal draft. With this workflow running every 6 hours, you spend maybe 5 minutes reviewing the Telegram summary and your sheet, then edit the pre-written drafts for the few jobs scoring 60+. Most days, that’s about an hour back.

Before You Start

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Google Sheets to store Job IDs, scores, and drafts.
  • Apify for running an Upwork scraper actor.
  • OpenAI API key (get it from the OpenAI API dashboard)

Skill level: Beginner. You’ll connect accounts, add a Sheet column, and paste a few IDs into environment variables.

Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).

Step by Step

A schedule kicks everything off. n8n runs the workflow every 6 hours, so you’re not relying on “I’ll check later” willpower.

Upwork jobs are collected and cleaned up. Apify pulls listings that match your saved criteria, then the workflow loads your existing Job IDs from Google Sheets and removes anything you’ve already seen.

AI decides what’s worth your attention. GPT-4 evaluates fit, client quality, and budget, then the workflow extracts a 0–100 score and filters to keep only jobs scoring 60+.

Qualified jobs get drafted and logged. For each high-scoring listing, n8n generates a proposal draft, appends the details to your Google Sheet, and calculates run metrics (how many found, how many kept, and so on). Telegram sends you a summary, plus an error notice if something fails.

You can easily modify the scoring threshold (60+) to match how picky you want to be, and adjust the schedule if you want faster alerts. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Schedule Trigger

Set the workflow to run on a fixed schedule to kick off the job scraping cycle.

  1. Add and open Scheduled Automation Start.
  2. Set the schedule rule to run every 6 hours.
  3. Confirm the node connects to Launch Apify Crawl to start the scraping run.

Step 2: Connect Apify Crawling and Dataset Retrieval

Trigger the Apify actor and retrieve the dataset items for evaluation.

  1. Open Launch Apify Crawl and set Method to POST.
  2. Set URL to =https://api.apify.com/v2/acts/{{ $env.APIFY_ACTOR_ID }}/runs?waitForFinish=300.
  3. Enable Send Body and set JSON Body to the provided filter payload (hourly/fixed budgets, categories, limit 100).
  4. Credential Required: Connect your HTTP Header Auth credentials in Launch Apify Crawl.
  5. Open Retrieve Dataset Records and set URL to =https://api.apify.com/v2/datasets/{{ $json.data.defaultDatasetId }}/items?clean=true.
  6. Credential Required: Connect your HTTP Header Auth credentials in Retrieve Dataset Records.

⚠️ Common Pitfall: Ensure APIFY_ACTOR_ID is set in your environment variables or the Apify URL will be invalid.

Step 3: Connect Google Sheets and De-duplicate Jobs

Load existing job IDs from Google Sheets and remove already-seen listings before scoring.

  1. Open Load Stored Job IDs and set Sheet Name to Upwork Jobs.
  2. Set Document ID to ={{ $env.GOOGLE_SHEETS_DOC_ID }}.
  3. Credential Required: Connect your Google Sheets credentials in Load Stored Job IDs.
  4. Review Remove Seen Listings to keep only jobs whose uid is not found in the sheet’s Job ID column.
  5. Open Check For New Jobs and confirm the condition uses ={{ $json.uid }} with notEmpty logic.
  6. Verify the false path routes to No New Roles Path for runs with no new jobs.

⚠️ Common Pitfall: The workflow expects a Job ID column in your sheet—missing or renamed columns will cause duplicates to pass through.

Step 4: Set Up the AI Scoring Pipeline

Normalize job fields, score them with AI, and filter by high-quality opportunities.

  1. Open Standardize Job Fields and keep the code that maps raw job data into normalized fields like jobId, title, and budget.
  2. Configure AI Fit Evaluation to use model gpt-4o.
  3. Credential Required: Connect your OpenAI credentials in AI Fit Evaluation.
  4. Confirm Extract Score Result parses the AI response JSON and maps score, decision, and reasoning.
  5. Open Filter High Scores and set the condition to ={{ $json.score }} gte 60.

Tip: If your AI response formatting changes, update the JSON parsing logic inside Extract Score Result to avoid defaulting scores to 0.

Step 5: Configure Proposal Drafting and Sheet Logging

Batch through qualified jobs, draft proposals, and append results to your log sheet.

  1. Open Iterate Qualified Jobs to split jobs into batches for sequential processing.
  2. Configure Draft Proposal Text with model gpt-4o-mini to generate proposal drafts.
  3. Credential Required: Connect your OpenAI credentials in Draft Proposal Text.
  4. Open Append to Sheet Log and set Operation to append.
  5. Set Sheet Name to Upwork Jobs and Document ID to ={{ $env.GOOGLE_SHEETS_DOC_ID }}.
  6. Credential Required: Connect your Google Sheets credentials in Append to Sheet Log.
  7. Verify the loop: Iterate Qualified Jobs outputs to Draft Proposal Text and then to Append to Sheet Log, which returns to Iterate Qualified Jobs until complete.

Step 6: Configure Run Metrics and Telegram Summary

Summarize the run and send a notification when processing is complete.

  1. Open Batch Loop End and ensure it connects to Calculate Run Metrics.
  2. Review Calculate Run Metrics to compute scraped and passed counts using data from Retrieve Dataset Records and Extract Score Result.
  3. Open Dispatch Telegram Summary and set Text to =✅ Upwork Scraper Done Scraped: {{ $json.scraped }} Passed: {{ $json.passed }}.
  4. Set Chat ID to ={{ $env.TELEGRAM_CHAT_ID }}.
  5. Credential Required: Connect your Telegram credentials in Dispatch Telegram Summary.

⚠️ Common Pitfall: If TELEGRAM_CHAT_ID isn’t set in your environment variables, the summary message will fail to deliver.

Step 7: Add Error Handling

Capture workflow errors and notify your Telegram channel immediately.

  1. Open Error Catch Trigger to ensure it is ready to capture workflow errors.
  2. Configure Send Failure Notice with Text set to =🚨 Error: {{ $json.error?.message || 'Unknown' }}.
  3. Set Chat ID to ={{ $env.TELEGRAM_CHAT_ID }}.
  4. Credential Required: Connect your Telegram credentials in Send Failure Notice.

Step 8: Test and Activate Your Workflow

Run a manual test to confirm each node executes correctly, then activate the schedule.

  1. Click Execute Workflow to trigger Scheduled Automation Start manually.
  2. Confirm Launch Apify Crawl and Retrieve Dataset Records return job data, and that Check For New Jobs routes appropriately.
  3. Verify high-scoring jobs pass through Filter High Scores and log in Append to Sheet Log with drafted proposals.
  4. Check that Dispatch Telegram Summary sends a summary with scraped and passed counts.
  5. Toggle the workflow to Active to enable scheduled runs every 6 hours.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Troubleshooting Tips

  • Google Sheets credentials can expire or need specific permissions. If things break, check the Google connection inside n8n’s Credentials panel first.
  • Apify runs can take longer than expected depending on the dataset size. If “Retrieve Dataset Records” returns empty sometimes, rerun the workflow or add a longer wait before pulling results.
  • Default prompts in AI nodes are generic. Add your niche, proof points, and “how I work” early or you will be editing outputs forever.

Quick Answers

What’s the setup time for this Upwork lead scoring automation?

About 15 minutes if your accounts are ready.

Is coding required for this Upwork lead scoring?

No. You’ll connect credentials and fill in a few IDs and variables inside n8n.

Is n8n free to use for this Upwork lead scoring workflow?

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 Apify + OpenAI usage, which is commonly about $0.50–3.00 per run for this workflow.

Where can I host n8n to run this automation?

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.

Can I modify this Upwork lead scoring workflow for different use cases?

Yes, and you should. Most people start by changing the “runs every 6 hours” schedule, swapping the Apify actor to target different job categories, and adjusting the “60+” filter threshold. You can also rewrite the prompts in the AI Fit Evaluation and Draft Proposal Text nodes to match your niche (e-commerce, SaaS, design, whatever) and your tone. If you want different outputs, log extra columns in the Google Sheets “Append” step, like client spend, timezone, or a risk flag.

Why is my Telegram connection failing in this workflow?

Usually it’s the chat ID or bot permissions. Confirm your TELEGRAM_CHAT_ID environment variable is correct, then check the Telegram credential in n8n and resend a test message. If the workflow can’t message you after an error, you lose the safety net, so it’s worth fixing first.

What volume can this Upwork lead scoring workflow process?

Plenty for a typical freelancer or small agency; the practical limit is your n8n plan and your Apify/OpenAI usage budget.

Is this Upwork lead scoring automation better than using Zapier or Make?

Often, yes, because this workflow benefits from branching, deduping logic, looping through items, and handling errors without paying extra per “path.” n8n also gives you the option to self-host, which can matter if you’re running it 4 times a day and logging lots of rows. Zapier or Make can still work if you only want “scrape → notify” and nothing else. But once you add scoring, filtering, drafting, and structured logging, n8n tends to feel less cramped. Talk to an automation expert if you want help choosing.

Set this up once, and your Upwork feed turns into a prioritized, searchable lead list with drafts attached. Honestly, that’s the difference between “I’ll apply later” and sending strong proposals while the job is still fresh.

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.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal