Upwork to Google Sheets, new job leads in one place
Checking Upwork all day sounds simple until it isn’t. You refresh, you scan, you lose the good posts in a sea of “maybe,” and you still end up copy-pasting links into a messy doc.
This is where freelancers feel the drag first, but agency owners tracking multiple niches and marketing leads teams doing outreach feel it too. With Upwork Sheets automation, you get a clean, searchable log of new jobs without babysitting the platform.
This workflow pulls new Upwork listings on a schedule, formats the details, and appends them into Google Sheets. You’ll see what it does, what you need, and how to make it fit your lead process.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Upwork to Google Sheets, new job leads in one place
flowchart LR
subgraph sg0["Check Upwork Jobs - Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Check Upwork Jobs - Trigger", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Upwork Jobs using Apify"]
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Format scrape Data", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Log Jobs to Google Sheets", pos: "b", h: 48 }
n2 --> n3
n0 --> n1
n1 --> n2
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n3 database
class n1 api
classDef customIcon fill:none,stroke:none
class n1 customIcon
The Problem: Upwork leads are easy to miss (and hard to track)
Upwork moves fast. A great post can be buried in minutes, and “I’ll come back to this later” usually turns into “wait, where did that go?” The manual process is also weirdly expensive: you spend your best focus time reading the same patterns, opening the same tabs, and retyping the same fields into notes. Then you’re making decisions from incomplete info because you didn’t log the budget, the client history, or even the exact title. It’s not difficult work. It’s just constant.
The friction compounds. A clean tracking loop is what separates “I saw it” from “I responded first with the right angle.”
- Refreshing searches and scanning new posts can easily eat about 30 minutes a day.
- Copy-pasting links into docs or Notion creates inconsistent logs, so filtering later becomes a chore.
- Without a single sheet of record, you end up re-checking the same listings and second-guessing what you already reviewed.
- When multiple people track leads, duplicates and missed follow-ups show up fast.
The Solution: Scheduled Upwork scraping to a structured Sheets log
This n8n workflow turns Upwork browsing into a simple, repeatable feed. It starts on a schedule you control, then pulls the latest Upwork listings via an HTTP request (commonly backed by an Apify actor or a scraping endpoint). Once the listings are retrieved, n8n reshapes the raw data into consistent fields like title, link, budget, posted time, and any keywords you care about. Finally, each new result is appended as a row in Google Sheets, creating a living “incoming jobs” database that you can filter, sort, and review in minutes. No extra tabs. No copy-paste. Just a running log you can act on.
The workflow starts with a scheduled trigger. Then it fetches fresh job listings and normalizes the data into clean columns. Google Sheets becomes your single source of truth, so reviewing and triaging leads feels more like processing a queue than hunting for needles.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you track 3 Upwork searches (for 3 services) and you do it twice a day. If each scan takes about 10 minutes and you spend another 10 minutes copying the best posts into a tracker, that’s roughly 1 hour a day. With this workflow, you spend maybe 5 minutes setting or tweaking keywords, then you review a single Google Sheet for 10 minutes. The “searching” part disappears, so you get about 45 minutes back on most days.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing and filtering your job log.
- Upwork scraping source (often Apify) to retrieve listings reliably.
- Apify API token (get it from your Apify account settings).
Skill level: Beginner. You’ll connect accounts, choose a schedule, and map a few fields into your sheet.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled check runs automatically. The workflow begins with a schedule trigger, so you can pull listings every hour, twice a day, or whatever cadence matches your workflow.
Listings are retrieved from Upwork via a scraping endpoint. n8n uses an HTTP request to fetch results (commonly through an Apify actor configured with your keywords, categories, and recency filters).
Raw fields are cleaned and standardized. A “set fields” step reshapes the payload into the columns you actually want in Google Sheets, so each row is consistent even if the source data varies a bit.
New rows are appended to Google Sheets. Your spreadsheet becomes a rolling inbox where you can filter by keyword, budget, time posted, or any other field you choose to capture.
You can easily modify the search terms and sheet columns to match your niche and your qualification process. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Job Monitor Trigger
Set the workflow to run on a schedule so new job listings are collected automatically.
- Add and open Scheduled Job Monitor.
- Set the schedule rule to run every hour by configuring the Interval field with
hours. - Confirm Scheduled Job Monitor is the first node in the flow and connects to Retrieve Upwork Listings.
Step 2: Connect the Upwork Listings API
Configure the HTTP request that triggers the Apify task for Upwork listings.
- Open Retrieve Upwork Listings and set Method to
POST. - Set URL to
https://api.apify.com/v2/actor-tasks/[YOUR_ID]/run-sync-get-dataset-items?token=[CONFIGURE_YOUR_TOKEN]. - Enable Send Body by setting it to
true. - Connect Scheduled Job Monitor to Retrieve Upwork Listings to establish the execution flow.
[YOUR_ID] and [CONFIGURE_YOUR_TOKEN] with your actual Apify task ID and API token, or the request will fail.Step 3: Set Up Transform Listing Fields
Map incoming listing fields to a clean structure before appending to the spreadsheet.
- Open Transform Listing Fields and add assignments for each field.
- Set title to
={{ $json.title }}. - Set description to
={{ $json.description }}. - Set postedDate to
={{ $json.postedDate }}. - Set skills to
={{ $json.skills }}. - Set link to
={{ $json.link }}. - Ensure Retrieve Upwork Listings outputs into Transform Listing Fields.
Step 4: Configure Append to Sheets Log
Append the transformed data to your Google Sheet for tracking.
- Open Append to Sheets Log and set Operation to
append. - Select the target spreadsheet in Document ID and replace
[YOUR_ID]with your actual Sheet ID. - Set Sheet Name to the sheet labeled
Sheet1(valuegid=0). - Map columns as follows: link →
={{ $json.link }}, title →={{ $json.title }}, skills →={{ $json.skills }}, postedDate →={{ $json.postedDate }}, description →={{ $json.description }}. - Connect Transform Listing Fields to Append to Sheets Log.
- Credential Required: Connect your googleSheetsOAuth2Api credentials.
Step 5: Test and Activate Your Workflow
Run a manual test to confirm listings flow into the spreadsheet, then activate for scheduled operation.
- Click Execute Workflow to run the flow manually.
- Verify Retrieve Upwork Listings returns data and Transform Listing Fields outputs clean fields.
- Check your Google Sheet to confirm new rows were appended by Append to Sheets Log.
- Once validated, toggle Active to enable the schedule for production use.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the Google connection in n8n’s Credentials list first.
- If you change your Apify actor (or any scraping endpoint), the response shape can shift. When that happens, revisit your “Transform Listing Fields” mapping before assuming the workflow is “down.”
- AI-based enrichment (if you add it later with an OpenAI node) can drift into generic summaries. Bake your qualification rules into the prompt early or you’ll be editing every row by hand.
Frequently Asked Questions
About 30 minutes if your accounts are ready.
No. You’ll connect credentials and map a few fields into Google Sheets.
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 costs, which depend on how often you scrape and how many results you pull.
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.
Yes, and it’s the whole point. You’ll adjust the query or actor inputs used in Retrieve Upwork Listings, then update Transform Listing Fields to match the fields you want in your sheet. Common customizations include adding a “match score” column, filtering out low budgets, and capturing client signals like country or hire rate when available. If you want an even cleaner review process, add a “status” column (New, Applied, Skipped) and treat the sheet like a pipeline.
Usually it’s expired Google authorization or the spreadsheet permissions changed. Reconnect your Google Sheets credential in n8n, then confirm the target spreadsheet is still accessible to that Google account. Also check that the worksheet/tab name didn’t change, because appends will fail if the workflow points to a tab that no longer exists. If it fails only sometimes, you may be hitting Google API rate limits during busy periods.
A typical setup handles dozens of listings per run comfortably.
Often, yes, because the tricky part here is fetching and shaping the data, not just moving it. n8n is better when you need custom logic around an HTTP request response, and you want to format fields reliably before logging them. You can also self-host for unlimited executions, which matters if you run frequent checks. Zapier and Make can still work if your data source is already clean and you only need a simple “new item → add row.” If you’re unsure, Talk to an automation expert and you’ll get a straight recommendation.
Once this is running, new Upwork posts show up in one place, already organized. Set it up once, then spend your time responding like a pro instead of playing “tab detective.”
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.