Backend Engineering

Upwork Automation — A Developer's Deep Dive

Automated Upwork job-harvesting and AI proposal-drafting pipeline.

2026-09-121 min read

Automated Upwork job-harvesting and AI proposal-generation pipeline.

The problem

Manually refreshing Upwork for new relevant jobs and hand-writing a tailored proposal for each one was slow and inconsistent, and the best jobs disappear fast.

The approach

Built a Laravel + Node.js pipeline that uses Puppeteer to harvest new job postings on a schedule, filters them against relevance criteria, and calls the OpenAI API to draft a tailored proposal for each match — ready for a quick human review before it goes out.

The outcome

Reduced manual Upwork checking by 80-90%; produced consistent AI-generated proposals.

Stack

Laravel, Node.js, Puppeteer, OpenAI API

Live architecture demo

See it move, not just read about it.

Re-using the original animation from the linked project — same diagrams and trace you see on the case-study page.

Upwork AI Proposal Pipeline

STAGE: HARVESTING & DRAFTING
Puppeteer HarvesterCron Schedule
Target:Fullstack Laravel Role ($4k)
Cadence:5m Headless Polling
Laravel OrchestratorFilter & Dispatch
Scoring:Budget Match • Payment Verified
Match State:Qualified (Score: 92/100)
OpenAI APISYNTHESIS
Task:Drafting Pitch
Latency:~1.8s gen
Human DeskAPPROVAL
Queue:Pending
Action:Awaiting Gen
Puppeteer intercepts a live post. Laravel qualifies the criteria and triggers OpenAI API to draft a contextual pitch.

Puppeteer harvests, OpenAI drafts, a human approves before send.

Autopilot Proposal Pipeline

STEP 1/6
Linux Cron • Laravel Scheduler
cron interval fires; Laravel dispatches REST command to Node.js scraper worker • 0 ms
Node.js • Puppeteer Engine
authenticated headless session traverses live feed; extracts job tokens and rate metadata • ~3.2 s
Laravel Core • Filter Engine
verifies budget, client spend, rating, & connects; discards low-intent posts • ~18 ms
MySQL • Laravel Mail (SMTP)
job stored into schema; notification email with match scorecard dispatched to admin
OpenAI API Engine
job context combined with user profile; dynamic prompt generates tailored proposal • ~1.4 s
Bidding Desk Ready
context-aware pitch saved to database; primed for one-click copy & submission • ready

← All posts

Upwork Automation — A Developer's Deep Dive — Parvej Mahmudun Nabi