🔓 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

Apify + Google Sheets: Upwork leads, neatly tracked

Lisa Granqvist Partner Workflow Automation Expert

Checking Upwork “one more time” turns into a daily routine. You scroll, open tabs, copy links, paste notes, then forget which ones you already reviewed.

This Upwork lead tracking automation hits freelancers first (because time is billable), but agency owners and marketing consultants feel it too. Instead of hunting for jobs, you get a clean list in Google Sheets plus a daily email summary you can act on fast.

Below, you’ll see how the workflow pulls new Upwork jobs via Apify, deduplicates them, updates keyword stats, and sends a simple daily report your brain can actually process.

How This Automation Works

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

n8n Workflow Template: Apify + Google Sheets: Upwork leads, neatly tracked

Why This Matters: Upwork leads get missed (and duplicated)

Upwork lead gen looks simple until you do it every day. You search a handful of keywords, skim the same results, and still worry you missed the one perfect job that was posted overnight. Then comes the messy part: saving listings somewhere useful, remembering why you liked them, and avoiding the classic “I already applied to this… right?” moment. The real cost isn’t just the time. It’s the mental load of tracking leads across tabs, notes, and half-finished spreadsheets, which makes you slower to pitch.

It adds up fast. Here’s where it typically breaks down in real life:

  • Reviewing multiple keywords manually can take about an hour a day, especially when you open and close 20+ job tabs.
  • Duplicates sneak in when a job matches more than one keyword, which makes your “saved leads” sheet noisy and hard to trust.
  • Leads get stale because you don’t have a consistent “posted in the last 24 hours” filter across every search.
  • Without keyword totals and a daily rollup, you keep guessing which niche is actually producing work.

What You’ll Build: Daily Upwork job scraping → Sheet + email recap

This workflow turns Upwork browsing into a repeatable daily intake system. You keep your keyword list in Google Sheets, run the workflow, and n8n loops through each keyword to trigger an Apify scraper. When Apify finishes, the workflow pulls the dataset, filters listings to the last day, and formats each job into clean columns (title, description, budget, rating, link, keyword, timestamps). Then it deduplicates entries so the same job doesn’t clutter your sheet just because it matched two searches. Finally, it calculates summary stats and sends a tidy daily email so you can review leads in minutes and pitch while the job is still fresh.

The workflow starts with your keyword sheet. From there, Apify collects the matching jobs and n8n cleans them up, removes repeats, and updates your daily and summary tabs. The last step is a Gmail send that drops a structured report into your inbox with the key numbers and a link to the sheet.

What You’re Building

Expected Results

Say you track 12 keywords. Manually, you might spend about 5 minutes per keyword between searching, opening postings, and saving the ones worth a pitch, which is roughly an hour a day. With this workflow, you run it once, then skim the email plus the cleaned Google Sheet in about 10 minutes. Even if Apify takes a bit to finish in the background, you are not doing the work. That’s close to an hour back on most weekdays.

Before You Start

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Apify for scraping Upwork job listings
  • Google Sheets to store keywords, jobs, summaries
  • Email account (Gmail/SMTP) to send the daily report
  • Apify API token (get it from Apify Console → Integrations)

Skill level: Beginner. You’ll connect accounts, confirm sheet columns, and paste in one API token.

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

Step by Step

You start the run on demand. The workflow uses a manual trigger, which is perfect for testing and for running whenever you want your latest daily pull. Many teams later switch this to a daily schedule once they trust the results.

Keywords come from Google Sheets. n8n reads your “All Keywords” (or “AI Keywords”) sheet and loops through each active term. That list becomes your control panel, so changing what you scrape is as easy as editing a cell.

Apify scrapes Upwork and returns a dataset. For each keyword, n8n triggers the Apify actor via HTTP request, polls until it’s done, waits briefly, then fetches the dataset. After that, code nodes filter jobs to the last 24 hours and normalize fields like budget, rating, and the job URL.

Clean entries land in Google Sheets and the report goes out. The workflow appends jobs to your daily sheet, removes duplicates by title/description, updates keyword totals and summary stats, then composes an email body and sends it through Gmail.

You can easily modify the filtering rules (budget, client rating, job type) to match your niche. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Manual Trigger

This workflow starts manually so you can control when the scraping and reporting runs.

  1. Add or confirm the Manual Execution Start node as the trigger.
  2. Leave all fields at their defaults since this node has no parameters to configure.
  3. Connect Manual Execution Start to Retrieve Keyword Sheet to kick off keyword loading.

Step 2: Connect Google Sheets

Multiple nodes read and write job data and keyword summaries in Google Sheets.

  1. In Retrieve Keyword Sheet, set Document to [YOUR_ID] and select the Sheet named All Keywords combined.
  2. In Load Daily Job Rows, set Document to [YOUR_ID] and Sheet to 15 July 2025.
  3. In Append Daily Jobs, confirm the column mappings include expressions like {{ $json.title == undefined ? "No records found in last 24 hours": $json.title }} and {{ $('Iterate Keyword List').item.json.Keywords }}.
  4. In Refresh Keyword Totals, set Keywords to {{ $('Iterate Keyword List').item.json.Keywords }} and Total Count 15-07-2025 to {{ $('Filter Recent Jobs').first().json.title == undefined ? "0" : $('Filter Recent Jobs').all().length }}.
  5. In Store Clean Listings and Reload Clean Listings, keep the same Document and Sheet targets to preserve data flow.
  6. In Update Summary Table and Fetch Summary Data, select the All Keywords combined sheet to maintain reporting totals.

Credential Required: Connect your googleApi credentials to all Google Sheets nodes (9+ nodes handle keywords, job rows, and summaries).

Tip: Keep the sheet names consistent across all Google Sheets nodes to prevent data mismatches when appending and updating.

Step 3: Configure the Apify Scraping Requests

These nodes start the Apify actor, poll for completion, wait, and fetch the dataset.

  1. In Start Apify Actor, set URL to https://api.apify.com/v2/acts/[YOUR_ID]/runs and ensure Method is POST.
  2. Set JSON Body in Start Apify Actor to the provided payload, including "query": "{{ $json.Keywords }}" and "maxJobAge": { "value": 23, "unit": "hours" }.
  3. In Poll Actor Status, set URL to https://api.apify.com/v2/actor-runs/{{ $json.data.id }} and keep waitForFinish as 150.
  4. In Pause Before Dataset, set Amount to 20 seconds.
  5. In Get Scraped Dataset, set URL to https://api.apify.com/v2/datasets/{{ $json.data.defaultDatasetId }}/items.

Credential Required: Connect your httpHeaderAuth credentials to Start Apify Actor, Poll Actor Status, and Get Scraped Dataset.

⚠️ Common Pitfall: Replace [YOUR_ID] in the Apify URLs with your actual actor and dataset IDs, or the requests will fail.

Step 4: Set Up Keyword Iteration and Job Filtering

This stage loops through keywords, runs the scrape, filters the results, and writes daily rows.

  1. Connect Retrieve Keyword Sheet to Iterate Keyword List to loop through each keyword.
  2. Iterate Keyword List outputs to both Load Daily Job Rows and Start Apify Actor in parallel.
  3. In Filter Recent Jobs, keep the JavaScript that filters by the last 23 hours to ensure only fresh postings are retained.
  4. In Append Daily Jobs, verify the mapping for Keyword Title uses {{ $('Iterate Keyword List').item.json.Keywords }}.
  5. Confirm the loop back from Refresh Keyword Totals to Iterate Keyword List is intact to process all keywords.

Step 5: Deduplicate and Store Clean Listings

After loading daily rows, duplicates are removed and clean listings are stored and reloaded for statistics.

  1. In Deduplicate Job Posts, keep the Set-based logic that compares title and description and skips “No records found in last 24 hours.”
  2. In Store Clean Listings, ensure the mappings include {{ $json.title }}, {{ $json.description }}, and {{ $json['Keyword Title'] }}.
  3. In Purge Sheet Rows, keep Number to Delete set to {{ $('Load Daily Job Rows').all().length }} to clear old data.
  4. Verify Purge Sheet Rows outputs to Reload Clean Listings for the summary calculation stage.

Tip: If the purge count is zero, check that Load Daily Job Rows is reading from the correct sheet.

Step 6: Build the Summary and Email Report

Aggregate keyword totals, create a report body, and send a daily email.

  1. In Compute Keyword Stats, keep the code that compares $('Reload Clean Listings').all() to $('Store Clean Listings').all().
  2. In Update Summary Table, map Keywords to {{ $json.keyword }} and Total Count 15-07-2025 to {{ $json.count }}.
  3. In Compose Report Body, verify the output structure includes date: "15-07-2025" and counts_by_type.
  4. In Dispatch Daily Email, set Send To to [YOUR_EMAIL], and keep the message expressions such as {{ $('Deduplicate Job Posts').all().length }} and {{ $json.counts_by_type.Web }}.

Credential Required: Connect your gmailOAuth2 credentials to Dispatch Daily Email.

⚠️ Common Pitfall: Update the hard-coded date values (e.g., 15-07-2025) in Compute Keyword Stats, Compose Report Body, and email subject to avoid stale report labeling.

Step 7: Test and Activate Your Workflow

Run the workflow manually to verify data flow, then activate it for production use.

  1. Click Execute Workflow and confirm Manual Execution Start triggers the full sequence.
  2. Check Google Sheets to confirm Append Daily Jobs adds rows and Update Summary Table updates counts.
  3. Verify Dispatch Daily Email sends a message with totals populated from {{ $json.counts_by_type.Web }} and {{ $json.counts_by_type.Mobile }}.
  4. Once confirmed, switch the workflow to Active for production use.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Troubleshooting Tips

  • Google Sheets permissions are the #1 culprit. If rows aren’t writing, open n8n’s Google Sheets credential, re-auth, and confirm it has access to the exact spreadsheet.
  • If you’re using Wait nodes or external scraping, processing times vary. Bump up the wait duration if downstream HTTP requests fail because the Apify dataset isn’t ready yet.
  • Gmail sending can fail if you haven’t enabled the right authentication method. Check your Gmail credential in n8n, and verify the “From” address matches the authorized account.

Quick Answers

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

About 30 minutes if your Sheets and accounts are ready.

Is coding required for this Upwork lead tracking?

No. You’ll mostly connect Apify, Google Sheets, and Gmail, then confirm the sheet columns match what the workflow expects.

Is n8n free to use for this Upwork lead tracking 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 usage, since API calls can add a small daily cost depending on how many keywords you scrape.

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 tracking automation for different use cases?

Yes, and it’s meant for that. Most people start by editing the keyword sheet, then tweak the “Filter Recent Jobs” and “Deduplicate Job Posts” steps to match their niche. Common changes include filtering out low budgets, requiring a minimum client rating, or only keeping fixed-price (or hourly) roles. You can also swap the Gmail send for another email provider without changing the rest of the logic.

Why is my Apify connection failing in this workflow?

Usually it’s an invalid or expired Apify API token. Regenerate the token in Apify, paste it into the n8n HTTP Request credential, then rerun a single keyword to test. If the actor starts but never returns data, check the Apify actor run logs for blocked pages, rate limits, or a misconfigured search input. Also confirm the workflow is polling the correct run ID and fetching the right dataset.

What volume can this Upwork lead tracking automation process?

Plenty for typical daily prospecting: dozens of keywords and hundreds of job rows per day is normal, as long as your Apify plan and your Google Sheets limits can handle it.

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

Often, yes, because this flow has looping, polling, deduplication logic, and multi-step sheet updates that get awkward (and expensive) in simpler tools. n8n also gives you self-hosting, which means you’re not paying per tiny step when you scale. Zapier or Make can still be fine if you’re doing a basic “new row → send email” style automation. But scraping plus cleaning plus summaries is where n8n tends to feel calmer to manage. If you want a second opinion on what’s realistic for your volume, Talk to an automation expert.

Once this is running, you stop “checking Upwork” and start reviewing a short, clean list. The workflow handles the repetitive parts so you can focus on pitching and closing.

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