The Simple Approach
Upwork does not offer a public API. Forget complex integrations. The practical solution is straightforward: pull your Upwork email alerts from Gmail using n8n, parse the job data into a table, and hire a VA to bid on your behalf.
- Outcome: a constantly updated lead database that a VA can work from
- Audience: freelancers and agencies who want to scale without building complex automations
- Stack: n8n, Gmail, Google Sheets or Airtable, and a VA added to your Upwork organization
flowchart TD
A[Upwork Email Alerts] --> B[Gmail]
B --> C[n8n Gmail Node]
C --> D[Parse Job Data]
D --> E[Store in Table]
E --> F[VA Reviews Leads]
F --> G[VA Submits Proposals]
classDef trigger fill:#e1f5fe,stroke:#01579b
classDef process fill:#fff3e0,stroke:#ef6c00
classDef action fill:#e8f5e8,stroke:#2e7d32
class A,B trigger
class C,D,E process
class F,G action
Step 1: Set Up Upwork Saved Searches
Create focused saved searches in Upwork that match your niche.
- Use filters for category, keywords, budget range, and client history
- Enable email alerts for each saved search
- Use distinct subject lines or search names so you can identify which search triggered each alert
Upwork will send you an email every time a new job matches your criteria.
Step 2: Configure the n8n Gmail Node
Set up n8n to pull emails from your Gmail account every minute.
Create the workflow
- Add a Schedule Trigger node set to run every 1 minute
- Add a Gmail node configured to read emails
- Filter for emails from Upwork with your saved search subjects
- Mark emails as read after processing to avoid duplicates
flowchart TD
S[Schedule Every 1 Min] --> G[Gmail Node]
G --> F[Filter Upwork Emails]
F --> P[Parse Content]
classDef trigger fill:#e1f5fe,stroke:#01579b
classDef process fill:#fff3e0,stroke:#ef6c00
class S trigger
class G,F,P process
Gmail node settings
- Operation: Get Many
- Filter by sender:
[email protected]or similar - Filter by label or subject to match your saved searches
- Limit to unread emails to avoid reprocessing
Step 3: Parse the Email Data
Extract the job details from each email and structure them for your database.
Fields to extract
- Job title
- Job URL
- Budget (fixed or hourly range)
- Skills required
- Client info (spend history, rating, location if available)
- Posted date
Use n8n’s Code node or Set node to parse the email body. Upwork emails follow a consistent format, so regex or string splitting works well.
Example parsed record
{
"title": "Build a React dashboard",
"url": "https://www.upwork.com/jobs/~01234567890",
"budget": "$500-$1000",
"skills": ["React", "TypeScript", "Tailwind"],
"client_spend": "$10k+",
"posted_at": "2025-12-16T10:30:00Z"
}
Step 4: Store Leads in a Table
Send the parsed data to Google Sheets, Airtable, or any database.
Recommended columns
| Column | Description |
|---|---|
| Job Title | The job posting title |
| URL | Link to the Upwork job |
| Budget | Fixed price or hourly range |
| Skills | Comma-separated list |
| Client Spend | Total client spend on platform |
| Posted | When the job was posted |
| Status | New, Reviewed, Applied, Won, Lost |
| VA Notes | Space for VA to add notes |
n8n nodes to use
- Google Sheets node to append rows
- Or Airtable node if you prefer that interface
- Add a duplicate check by job URL before inserting
flowchart TD
P[Parsed Data] --> C[Check Duplicate]
C -->|New| I[Insert Row]
C -->|Exists| S[Skip]
classDef process fill:#fff3e0,stroke:#ef6c00
class P,C,I,S process
Step 5: Hire a VA and Add Them to Your Organization
Once your lead table is populating, hire a VA to handle the bidding.
Add the VA to your Upwork agency
- Go to your Upwork agency settings
- Invite the VA as a team member
- They can now submit proposals on behalf of your organization
VA workflow
- VA reviews new leads in the table daily or multiple times per day
- For qualified leads, VA drafts a proposal using your templates
- VA submits the proposal through Upwork under your agency
- VA updates the status column in the table
- You handle interviews and closing
What to give your VA
- Access to the lead table (Sheets or Airtable)
- Two to three proposal templates for different job types
- Guidelines on which leads to prioritize (budget, client spend, skills match)
- A voice guide with your tone and key phrases
Callout: The VA bids through your official Upwork organization, so everything stays compliant with platform rules
Optional: Add AI Draft Assistance
If you want to speed up proposal writing, add an LLM step before the VA review.
Workflow addition
- After parsing, send job details to OpenAI or another LLM
- Generate a draft proposal based on your templates and the job description
- Store the draft in a new column in your table
- VA reviews and edits the draft before submitting
This reduces VA time per proposal while keeping human review in the loop.
flowchart TD
J[Job Data] --> L[LLM Draft]
L --> T[Store Draft in Table]
T --> V[VA Reviews]
V --> S[Submit on Upwork]
classDef process fill:#fff3e0,stroke:#ef6c00
classDef action fill:#e8f5e8,stroke:#2e7d32
class J,L,T,V process
class S action
Keeping It Running
Monitor the workflow
- Check n8n execution logs weekly
- Watch for parsing failures if Upwork changes email format
- Keep Gmail storage clean to avoid sync issues
Track results
Add columns to your table for:
- Proposal sent date
- Interview scheduled
- Contract won
- Contract value
This lets you measure VA performance and ROI over time.
Summary
- Set up Upwork saved searches with email alerts
- Use n8n Gmail node to pull emails every minute
- Parse job data and store in Google Sheets or Airtable
- Hire a VA and add them to your Upwork organization
- VA reviews leads and submits proposals on your behalf
No API needed. No complex webhooks. Just email parsing, a simple table, and a VA who can scale your bidding while you focus on delivery.
Callout: Automate the data capture, delegate the bidding, and spend your time on interviews and client work